diff options
author | Matt A. Tobin <mattatobin@localhost.localdomain> | 2018-02-02 04:16:08 -0500 |
---|---|---|
committer | Matt A. Tobin <mattatobin@localhost.localdomain> | 2018-02-02 04:16:08 -0500 |
commit | 5f8de423f190bbb79a62f804151bc24824fa32d8 (patch) | |
tree | 10027f336435511475e392454359edea8e25895d /gfx/angle/src/tests | |
parent | 49ee0794b5d912db1f95dce6eb52d781dc210db5 (diff) | |
download | UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.gz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.lz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.xz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.zip |
Add m-esr52 at 52.6.0
Diffstat (limited to 'gfx/angle/src/tests')
227 files changed, 99832 insertions, 0 deletions
diff --git a/gfx/angle/src/tests/BUILD.gn b/gfx/angle/src/tests/BUILD.gn new file mode 100755 index 000000000..cd6c60d82 --- /dev/null +++ b/gfx/angle/src/tests/BUILD.gn @@ -0,0 +1,348 @@ +# Copyright 2015 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. + +import("//testing/test.gni") +import("//build/config/chromecast_build.gni") +import("//third_party/angle/gni/angle.gni") + +unittests_gypi = exec_script("//build/gypi_to_gn.py", + [ + rebase_path("angle_unittests.gypi"), + "--replace=<(angle_path)=.", + ], + "scope", + [ "angle_unittests.gypi" ]) + +test("angle_unittests") { + include_dirs = [ + "testing/gtest/include", + "../../src", + ] + + sources = rebase_path(unittests_gypi.angle_unittests_sources, ".", "../..") + + if (angle_enable_hlsl) { + sources += + rebase_path(unittests_gypi.angle_unittests_hlsl_sources, ".", "../..") + defines = [ "ANGLE_ENABLE_HLSL" ] + } + + sources += [ "//gpu/angle_unittest_main.cc" ] + + deps = [ + "//base", + "//base/test:test_support", + "//testing/gmock", + "//testing/gtest", + "//third_party/angle:libANGLE", + "//third_party/angle:preprocessor", + "//third_party/angle:translator", + ] +} + +if (is_win || is_linux || is_mac || is_android) { + end2end_gypi = exec_script("//build/gypi_to_gn.py", + [ + rebase_path("angle_end2end_tests.gypi"), + "--replace=<(angle_path)=.", + ], + "scope", + [ "angle_end2end_tests.gypi" ]) + + test("angle_end2end_tests") { + include_dirs = [ + "testing/gtest/include", + "../../src/tests", + "../../util", + ] + + if (is_android) { + use_native_activity = true + } + + sources = + rebase_path(end2end_gypi.angle_end2end_tests_sources, ".", "../..") + + if (is_win) { + sources += rebase_path(end2end_gypi.angle_end2end_tests_win_sources, + ".", + "../..") + } + if (use_x11) { + sources += rebase_path(end2end_gypi.angle_end2end_tests_x11_sources, + ".", + "../..") + } + + sources += [ "//gpu/angle_end2end_tests_main.cc" ] + + configs += [ + "//third_party/angle:internal_config", + "//third_party/angle:libANGLE_config", + ] + + if (is_linux && !is_component_build) { + # Set rpath to find libEGL.so and libGLESv2.so even in a non-component build. + configs += [ "//build/config/gcc:rpath_for_built_shared_libraries" ] + } + + deps = [ + "//base", + "//base/test:test_support", + "//testing/gmock", + "//testing/gtest", + "//third_party/angle:angle_util", + "//third_party/angle:libANGLE", + "//third_party/angle:libEGL", + "//third_party/angle:libGLESv2", + "//third_party/angle:preprocessor", + "//third_party/angle:translator", + ] + } +} + +if (is_win) { + perftests_gypi = exec_script("//build/gypi_to_gn.py", + [ + rebase_path("angle_perftests.gypi"), + "--replace=<(angle_path)=.", + ], + "scope", + [ "angle_perftests.gypi" ]) + + test("angle_perftests") { + include_dirs = [ + "testing/gtest/include", + "../../src/tests", + "../../util", + ] + + sources = rebase_path(perftests_gypi.angle_perf_tests_sources, ".", "../..") + + sources += + rebase_path(perftests_gypi.angle_perf_tests_win_sources, ".", "../..") + + sources += [ "//gpu/angle_perftests_main.cc" ] + + configs += [ + "//third_party/angle:internal_config", + "//third_party/angle:libANGLE_config", + ] + + deps = [ + "//base", + "//base/test:test_support", + "//testing/gmock", + "//testing/gtest", + "//third_party/angle:angle_util", + "//third_party/angle:libANGLE", + "//third_party/angle:libEGL", + "//third_party/angle:libGLESv2", + ] + } +} + +###----------------------------------------------------- +### dEQP tests +###----------------------------------------------------- + +declare_args() { + # Don't build dEQP by default. + build_angle_deqp_tests = false +} + +# TODO(jmadill): Other platforms. +if (build_angle_deqp_tests) { + deqp_gypi = exec_script("//build/gypi_to_gn.py", + [ + rebase_path("deqp.gypi"), + "--replace=<(angle_path)=.", + "--replace=<(deqp_path)=../deqp/src", + ], + "scope", + [ "deqp.gypi" ]) + + config("angle_deqp_support") { + include_dirs = rebase_path(deqp_gypi.deqp_include_dirs, ".", "../..") + if (is_win) { + include_dirs += [ "../deqp/src/framework/platform/win32" ] + cflags = deqp_gypi.deqp_win_cflags + } + defines = deqp_gypi.deqp_defines + defines += [ "_MBCS" ] + + # Ask the system headers to expose all the regular function otherwise + # dEQP doesn't compile and produces warnings about implicitly defined + # functions. + if (is_linux) { + # This has to be GNU_SOURCE as on Linux dEQP uses syscall() + defines += [ "_GNU_SOURCE" ] + } + if (is_android) { + # _XOPEN_SOURCE=600 is what is used in deqp/src/Android.mk + defines += [ "_XOPEN_SOURCE=600" ] + } + } + + deqp_undefine_configs = [ + "//build/config/compiler:chromium_code", + "//build/config/compiler:no_rtti", + ] + + if (is_win) { + deqp_undefine_configs += [ + "//build/config/win:lean_and_mean", + "//build/config/win:nominmax", + "//build/config/win:unicode", + ] + } + + if (is_linux || is_android) { + deqp_undefine_configs += [ "//build/config/gcc:no_exceptions" ] + } + + static_library("angle_deqp_decpp") { + configs -= deqp_undefine_configs + public_configs = [ + ":angle_deqp_support", + "//build/config/compiler:no_chromium_code", + "//third_party/angle:internal_config", + ] + sources = rebase_path(deqp_gypi.deqp_libtester_decpp_sources, ".", "../..") + } + + config("angle_deqp_libtester_config") { + defines = [ "ANGLE_DEQP_LIBTESTER_IMPLEMENTATION" ] + + if (is_clang) { + # TODO(jmadill): Remove this once we fix dEQP. + cflags_cc = [ "-Wno-delete-non-virtual-dtor" ] + } + } + + static_library("angle_deqp_libtester") { + public_deps = [ + ":angle_deqp_decpp", + "//third_party/angle:angle_util", + "//third_party/angle:libEGL", + "//third_party/libpng:libpng", + ] + configs -= deqp_undefine_configs + public_configs = [ ":angle_deqp_libtester_config" ] + sources = rebase_path(deqp_gypi.deqp_libtester_sources, ".", "../..") + if (is_win) { + sources += rebase_path(deqp_gypi.deqp_libtester_sources_win, ".", "../..") + } + if (is_linux || is_android) { + sources += + rebase_path(deqp_gypi.deqp_libtester_sources_unix, ".", "../..") + } + if (is_android) { + libs = [ "log" ] + } + } + + config("angle_deqp_gtest_support_config") { + include_dirs = [ "third_party/gpu_test_expectations" ] + } + + source_set("angle_deqp_gtest_support") { + testonly = true + public_deps = [ + "//base", + "//base/test:test_support", + "//testing/gtest", + "//third_party/angle:angle_common", + "//third_party/angle:angle_util", + ] + public_configs = [ ":angle_deqp_gtest_support_config" ] + sources = deqp_gypi.deqp_gpu_test_expectations_sources + sources += [ "//gpu/angle_deqp_tests_main.cc" ] + + # Taken from gpu/BUILD.gn + # TODO(jmadill): this should be in a shared location + if (is_linux && !is_chromecast) { + libs = [ "pci" ] + } + } + + api_names = [ + "gles2", + "gles3", + "gles31", + "egl", + ] + target_defines = [ + "ANGLE_DEQP_GLES2_TESTS", + "ANGLE_DEQP_GLES3_TESTS", + "ANGLE_DEQP_GLES31_TESTS", + "ANGLE_DEQP_EGL_TESTS", + ] + target_sources = [ + deqp_gypi.deqp_gles2_sources, + deqp_gypi.deqp_gles3_sources, + deqp_gypi.deqp_gles31_sources, + deqp_gypi.deqp_egl_sources, + ] + + foreach(index, + [ + 0, + 1, + 2, + 3, + ]) { + api_name = api_names[index] + config_name = "angle_deqp_lib${api_name}_config" + config(config_name) { + defines = [ target_defines[index] ] + } + + shared_library_name = "angle_deqp_lib${api_name}" + shared_library(shared_library_name) { + deps = [ + ":angle_deqp_libtester", + "//third_party/angle:angle_util", + ] + + configs -= deqp_undefine_configs + public_configs = [ ":${config_name}" ] + + sources = rebase_path(target_sources[index], ".", "../..") + sources += [ + "deqp_support/angle_deqp_libtester_main.cpp", + "deqp_support/tcuANGLEPlatform.cpp", + "deqp_support/tcuANGLEPlatform.h", + ] + } + + test_name = "angle_deqp_${api_name}_tests" + test(test_name) { + deps = [ + ":${shared_library_name}", + ":angle_deqp_gtest_support", + ] + + # Must be included outside of the source set for the define + sources = [ + "deqp_support/angle_deqp_gtest.cpp", + ] + + data = [ + "deqp_support/deqp_${api_name}_test_expectations.txt", + "../../../deqp/src/android/cts/master/${api_name}-master.txt", + "../../../deqp/src/data/", + ] + + if (is_linux && !is_component_build) { + # Set rpath to find *.so files even in a non-component build. + configs += [ "//build/config/gcc:rpath_for_built_shared_libraries" ] + } + + if (is_android) { + use_native_activity = true + } + } + } +} diff --git a/gfx/angle/src/tests/WebGL-CTS-known-failures.txt b/gfx/angle/src/tests/WebGL-CTS-known-failures.txt new file mode 100755 index 000000000..c67f3a291 --- /dev/null +++ b/gfx/angle/src/tests/WebGL-CTS-known-failures.txt @@ -0,0 +1,9 @@ +Known failures in the WebGL CTS 1.0.4, using Canary 48.0.2547.0 with ANGLE a33475b36f7b0 +https://www.khronos.org/registry/webgl/sdk/tests/webgl-conformance-tests.html + +conformance/extensions/ext-sRGB.html: 5 tests failed +conformance/glsl/bugs/pow-of-small-constant-in-user-defined-function.html: 1 tests failed +conformance/glsl/bugs/sampler-struct-function-arg.html: 1 tests failed +conformance/textures/misc/cube-incomplete-fbo.html: 1 tests failed +deqp/data/gles2/shaders/functions.html: 8 tests failed +deqp/data/gles2/shaders/scoping.html: 4 tests failed diff --git a/gfx/angle/src/tests/angle_end2end_tests.gypi b/gfx/angle/src/tests/angle_end2end_tests.gypi new file mode 100755 index 000000000..56705ba12 --- /dev/null +++ b/gfx/angle/src/tests/angle_end2end_tests.gypi @@ -0,0 +1,150 @@ +# Copyright (c) 2014 The ANGLE Project Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# This .gypi describes all of the sources and dependencies to build a +# unified "angle_end2end_tests" target, which contains all of the +# tests that exercise the ANGLE implementation. It requires a parent +# target to include this gypi in an executable target containing a +# gtest harness in a main.cpp. + +{ + # Everything below this is duplicated in the GN build. + # If you change anything also change angle/src/tests/BUILD.gn + 'variables': + { + 'angle_end2end_tests_sources': + [ + '<(angle_path)/src/tests/gl_tests/BindGeneratesResourceTest.cpp', + '<(angle_path)/src/tests/gl_tests/BindUniformLocationTest.cpp', + '<(angle_path)/src/tests/gl_tests/BlendMinMaxTest.cpp', + '<(angle_path)/src/tests/gl_tests/BlitFramebufferANGLETest.cpp', + '<(angle_path)/src/tests/gl_tests/BufferDataTest.cpp', + '<(angle_path)/src/tests/gl_tests/BuiltinVariableTest.cpp', + '<(angle_path)/src/tests/gl_tests/ClearTest.cpp', + '<(angle_path)/src/tests/gl_tests/ColorMaskTest.cpp', + '<(angle_path)/src/tests/gl_tests/ComputeShaderTest.cpp', + '<(angle_path)/src/tests/gl_tests/CopyCompressedTextureTest.cpp', + '<(angle_path)/src/tests/gl_tests/CopyTexImageTest.cpp', + '<(angle_path)/src/tests/gl_tests/CopyTextureTest.cpp', + '<(angle_path)/src/tests/gl_tests/CubeMapTextureTest.cpp', + '<(angle_path)/src/tests/gl_tests/DebugMarkerTest.cpp', + '<(angle_path)/src/tests/gl_tests/DebugTest.cpp', + '<(angle_path)/src/tests/gl_tests/DepthStencilFormatsTest.cpp', + '<(angle_path)/src/tests/gl_tests/DiscardFramebufferEXTTest.cpp', + '<(angle_path)/src/tests/gl_tests/DrawBuffersTest.cpp', + '<(angle_path)/src/tests/gl_tests/DrawElementsTest.cpp', + '<(angle_path)/src/tests/gl_tests/DXT1CompressedTextureTest.cpp', + '<(angle_path)/src/tests/gl_tests/ETCTextureTest.cpp', + '<(angle_path)/src/tests/gl_tests/FenceSyncTests.cpp', + '<(angle_path)/src/tests/gl_tests/FramebufferMixedSamplesTest.cpp', + '<(angle_path)/src/tests/gl_tests/FramebufferRenderMipmapTest.cpp', + '<(angle_path)/src/tests/gl_tests/FramebufferTest.cpp', + '<(angle_path)/src/tests/gl_tests/GLSLTest.cpp', + '<(angle_path)/src/tests/gl_tests/ImageTest.cpp', + '<(angle_path)/src/tests/gl_tests/IncompleteTextureTest.cpp', + '<(angle_path)/src/tests/gl_tests/IndexBufferOffsetTest.cpp', + '<(angle_path)/src/tests/gl_tests/IndexedPointsTest.cpp', + '<(angle_path)/src/tests/gl_tests/InstancingTest.cpp', + '<(angle_path)/src/tests/gl_tests/LineLoopTest.cpp', + '<(angle_path)/src/tests/gl_tests/MaxTextureSizeTest.cpp', + '<(angle_path)/src/tests/gl_tests/MipmapTest.cpp', + '<(angle_path)/src/tests/gl_tests/MultisampleCompatibilityTest.cpp', + '<(angle_path)/src/tests/gl_tests/media/pixel.inl', + '<(angle_path)/src/tests/gl_tests/PackUnpackTest.cpp', + '<(angle_path)/src/tests/gl_tests/PathRenderingTest.cpp', + '<(angle_path)/src/tests/gl_tests/PbufferTest.cpp', + '<(angle_path)/src/tests/gl_tests/PBOExtensionTest.cpp', + '<(angle_path)/src/tests/gl_tests/PointSpritesTest.cpp', + '<(angle_path)/src/tests/gl_tests/ProvokingVertexTest.cpp', + '<(angle_path)/src/tests/gl_tests/ObjectAllocationTest.cpp', + '<(angle_path)/src/tests/gl_tests/OcclusionQueriesTest.cpp', + '<(angle_path)/src/tests/gl_tests/ProgramBinaryTest.cpp', + '<(angle_path)/src/tests/gl_tests/ReadPixelsTest.cpp', + '<(angle_path)/src/tests/gl_tests/RendererTest.cpp', + '<(angle_path)/src/tests/gl_tests/RobustClientMemoryTest.cpp', + '<(angle_path)/src/tests/gl_tests/SimpleOperationTest.cpp', + '<(angle_path)/src/tests/gl_tests/SixteenBppTextureTest.cpp', + '<(angle_path)/src/tests/gl_tests/SRGBFramebufferTest.cpp', + '<(angle_path)/src/tests/gl_tests/SRGBTextureTest.cpp', + '<(angle_path)/src/tests/gl_tests/StateChangeTest.cpp', + '<(angle_path)/src/tests/gl_tests/SwizzleTest.cpp', + '<(angle_path)/src/tests/gl_tests/SyncQueriesTest.cpp', + '<(angle_path)/src/tests/gl_tests/TextureTest.cpp', + '<(angle_path)/src/tests/gl_tests/TimerQueriesTest.cpp', + '<(angle_path)/src/tests/gl_tests/TransformFeedbackTest.cpp', + '<(angle_path)/src/tests/gl_tests/UniformBufferTest.cpp', + '<(angle_path)/src/tests/gl_tests/UniformTest.cpp', + '<(angle_path)/src/tests/gl_tests/UnpackAlignmentTest.cpp', + '<(angle_path)/src/tests/gl_tests/UnpackRowLength.cpp', + '<(angle_path)/src/tests/gl_tests/VertexAttributeTest.cpp', + '<(angle_path)/src/tests/gl_tests/ViewportTest.cpp', + '<(angle_path)/src/tests/gl_tests/WebGLCompatibilityTest.cpp', + '<(angle_path)/src/tests/egl_tests/EGLContextCompatibilityTest.cpp', + '<(angle_path)/src/tests/egl_tests/EGLContextSharingTest.cpp', + '<(angle_path)/src/tests/egl_tests/EGLQueryContextTest.cpp', + '<(angle_path)/src/tests/egl_tests/EGLRobustnessTest.cpp', + '<(angle_path)/src/tests/egl_tests/EGLSanityCheckTest.cpp', + '<(angle_path)/src/tests/egl_tests/EGLSurfaceTest.cpp', + '<(angle_path)/src/tests/test_utils/ANGLETest.cpp', + '<(angle_path)/src/tests/test_utils/ANGLETest.h', + '<(angle_path)/src/tests/test_utils/angle_test_configs.cpp', + '<(angle_path)/src/tests/test_utils/angle_test_configs.h', + '<(angle_path)/src/tests/test_utils/angle_test_instantiate.cpp', + '<(angle_path)/src/tests/test_utils/angle_test_instantiate.h', + '<(angle_path)/src/tests/test_utils/gl_raii.h', + ], + 'angle_end2end_tests_win_sources': + [ + '<(angle_path)/src/tests/gl_tests/D3DImageFormatConversionTest.cpp', + '<(angle_path)/src/tests/gl_tests/D3DTextureTest.cpp', + '<(angle_path)/src/tests/gl_tests/D3D11EmulatedIndexedBufferTest.cpp', + '<(angle_path)/src/tests/gl_tests/D3D11FormatTablesTest.cpp', + '<(angle_path)/src/tests/gl_tests/D3D11InputLayoutCacheTest.cpp', + '<(angle_path)/src/tests/egl_tests/EGLDeviceTest.cpp', + '<(angle_path)/src/tests/egl_tests/EGLPresentPathD3D11Test.cpp', + '<(angle_path)/src/tests/egl_tests/EGLStreamTest.cpp', + # TODO(cwallez) for Linux, requires a portable implementation of threads + '<(angle_path)/src/tests/egl_tests/EGLThreadTest.cpp', + '<(angle_path)/src/tests/egl_tests/media/yuvtest.inl', + ], + 'angle_end2end_tests_x11_sources': + [ + '<(angle_path)/src/tests/egl_tests/EGLX11VisualTest.cpp', + ], + }, + 'dependencies': + [ + '<(angle_path)/src/angle.gyp:libANGLE', + '<(angle_path)/src/angle.gyp:libEGL', + '<(angle_path)/src/angle.gyp:libGLESv2', + '<(angle_path)/src/tests/tests.gyp:angle_test_support', + '<(angle_path)/util/util.gyp:angle_util', + ], + 'include_dirs': + [ + '<(angle_path)/include', + '<(angle_path)/src/tests' + ], + 'sources': + [ + '<@(angle_end2end_tests_sources)', + ], + 'conditions': + [ + ['OS=="win"', + { + 'sources': + [ + '<@(angle_end2end_tests_win_sources)', + ], + }], + ['use_x11==1', + { + 'sources': + [ + '<@(angle_end2end_tests_x11_sources)', + ], + }], + ] +} diff --git a/gfx/angle/src/tests/angle_end2end_tests_main.cpp b/gfx/angle/src/tests/angle_end2end_tests_main.cpp new file mode 100755 index 000000000..b4b9f02f4 --- /dev/null +++ b/gfx/angle/src/tests/angle_end2end_tests_main.cpp @@ -0,0 +1,16 @@ +// +// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "gtest/gtest.h" +#include "test_utils/ANGLETest.h" + +int main(int argc, char** argv) +{ + testing::InitGoogleTest(&argc, argv); + testing::AddGlobalTestEnvironment(new ANGLETestEnvironment()); + int rt = RUN_ALL_TESTS(); + return rt; +} diff --git a/gfx/angle/src/tests/angle_perftests.gypi b/gfx/angle/src/tests/angle_perftests.gypi new file mode 100755 index 000000000..6a86da9c0 --- /dev/null +++ b/gfx/angle/src/tests/angle_perftests.gypi @@ -0,0 +1,74 @@ +# Copyright 2015 The ANGLE Project Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +# +# angle_perftests.gypi: +# +# This .gypi describes all of the sources and dependencies to build a +# unified "angle_perftests" target, which contains all of ANGLE's +# performance tests (buffer updates, texture updates, draw calls, etc) +# It requires a parent target to include this gypi in an executable +# target containing a gtest harness in a main.cpp. + +{ + 'variables': + { + 'angle_perf_tests_sources': + [ + '<(angle_path)/src/tests/perf_tests/ANGLEPerfTest.cpp', + '<(angle_path)/src/tests/perf_tests/ANGLEPerfTest.h', + '<(angle_path)/src/tests/perf_tests/BufferSubData.cpp', + '<(angle_path)/src/tests/perf_tests/DrawCallPerf.cpp', + '<(angle_path)/src/tests/perf_tests/DynamicPromotionPerfTest.cpp', + '<(angle_path)/src/tests/perf_tests/EGLInitializePerf.cpp', + '<(angle_path)/src/tests/perf_tests/IndexConversionPerf.cpp', + '<(angle_path)/src/tests/perf_tests/InstancingPerf.cpp', + '<(angle_path)/src/tests/perf_tests/InterleavedAttributeData.cpp', + '<(angle_path)/src/tests/perf_tests/PointSprites.cpp', + '<(angle_path)/src/tests/perf_tests/TexSubImage.cpp', + '<(angle_path)/src/tests/perf_tests/TextureSampling.cpp', + '<(angle_path)/src/tests/perf_tests/TexturesPerf.cpp', + '<(angle_path)/src/tests/perf_tests/UniformsPerf.cpp', + '<(angle_path)/src/tests/perf_tests/third_party/perf/perf_test.cc', + '<(angle_path)/src/tests/perf_tests/third_party/perf/perf_test.h', + '<(angle_path)/src/tests/test_utils/angle_test_configs.cpp', + '<(angle_path)/src/tests/test_utils/angle_test_configs.h', + '<(angle_path)/src/tests/test_utils/angle_test_instantiate.cpp', + '<(angle_path)/src/tests/test_utils/angle_test_instantiate.h', + ], + 'angle_perf_tests_win_sources': + [ + '<(angle_path)/src/tests/perf_tests/IndexDataManagerTest.cpp', + ] + }, + # Everything below (except WinRT-related config) must be also maintained for GN. + # If you change anything below, also update angle/src/tests/BUILD.gn. + 'dependencies': + [ + '<(angle_path)/src/angle.gyp:angle_common', + '<(angle_path)/src/angle.gyp:libANGLE', # for unit testing + '<(angle_path)/src/angle.gyp:libGLESv2', + '<(angle_path)/src/angle.gyp:libEGL', + '<(angle_path)/src/tests/tests.gyp:angle_test_support', + '<(angle_path)/util/util.gyp:angle_util', + ], + 'include_dirs': + [ + '<(angle_path)/include', + '<(angle_path)/src/tests' + ], + 'sources': + [ + '<@(angle_perf_tests_sources)', + ], + 'conditions': + [ + ['OS=="win"', + { + 'sources': + [ + '<@(angle_perf_tests_win_sources)', + ], + }], + ] +} diff --git a/gfx/angle/src/tests/angle_perftests_main.cpp b/gfx/angle/src/tests/angle_perftests_main.cpp new file mode 100755 index 000000000..20f8dac9f --- /dev/null +++ b/gfx/angle/src/tests/angle_perftests_main.cpp @@ -0,0 +1,18 @@ +// +// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// angle_perftests_main.cpp +// Entry point for the gtest-based performance tests. +// + +#include <gtest/gtest.h> + +int main(int argc, char **argv) +{ + testing::InitGoogleTest(&argc, argv); + testing::AddGlobalTestEnvironment(new testing::Environment()); + int rt = RUN_ALL_TESTS(); + return rt; +} diff --git a/gfx/angle/src/tests/angle_unittests.gypi b/gfx/angle/src/tests/angle_unittests.gypi new file mode 100755 index 000000000..b22490173 --- /dev/null +++ b/gfx/angle/src/tests/angle_unittests.gypi @@ -0,0 +1,153 @@ +# Copyright (c) 2015 The ANGLE Project Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# This .gypi describes all of the sources and dependencies to build a +# unified "angle_unittests" target, which contains all of ANGLE's +# tests that don't require a fully functional ANGLE in order to run +# (compiler tests, preprocessor tests, etc.). It requires a parent +# target to include this gypi in an executable target containing a +# gtest harness in a main.cpp. + +{ + 'variables': + { + 'angle_unittests_sources': + [ + '<(angle_path)/src/common/BitSetIterator_unittest.cpp', + '<(angle_path)/src/common/Optional_unittest.cpp', + '<(angle_path)/src/common/mathutil_unittest.cpp', + '<(angle_path)/src/common/matrix_utils_unittest.cpp', + '<(angle_path)/src/common/string_utils_unittest.cpp', + '<(angle_path)/src/common/utilities_unittest.cpp', + '<(angle_path)/src/libANGLE/BinaryStream_unittest.cpp', + '<(angle_path)/src/libANGLE/Config_unittest.cpp', + '<(angle_path)/src/libANGLE/Fence_unittest.cpp', + '<(angle_path)/src/libANGLE/HandleAllocator_unittest.cpp', + '<(angle_path)/src/libANGLE/HandleRangeAllocator_unittest.cpp', + '<(angle_path)/src/libANGLE/Image_unittest.cpp', + '<(angle_path)/src/libANGLE/ImageIndexIterator_unittest.cpp', + '<(angle_path)/src/libANGLE/Program_unittest.cpp', + '<(angle_path)/src/libANGLE/ResourceManager_unittest.cpp', + '<(angle_path)/src/libANGLE/Surface_unittest.cpp', + '<(angle_path)/src/libANGLE/TransformFeedback_unittest.cpp', + '<(angle_path)/src/libANGLE/renderer/BufferImpl_mock.h', + '<(angle_path)/src/libANGLE/renderer/FramebufferImpl_mock.h', + '<(angle_path)/src/libANGLE/renderer/ProgramImpl_mock.h', + '<(angle_path)/src/libANGLE/renderer/RenderbufferImpl_mock.h', + '<(angle_path)/src/libANGLE/renderer/ImageImpl_mock.h', + '<(angle_path)/src/libANGLE/renderer/TextureImpl_mock.h', + '<(angle_path)/src/libANGLE/renderer/TransformFeedbackImpl_mock.h', + '<(angle_path)/src/libANGLE/signal_utils_unittest.cpp', + '<(angle_path)/src/libANGLE/validationES_unittest.cpp', + '<(angle_path)/src/tests/angle_unittests_utils.h', + '<(angle_path)/src/tests/compiler_tests/API_test.cpp', + '<(angle_path)/src/tests/compiler_tests/CollectVariables_test.cpp', + '<(angle_path)/src/tests/compiler_tests/ConstantFolding_test.cpp', + '<(angle_path)/src/tests/compiler_tests/DebugShaderPrecision_test.cpp', + '<(angle_path)/src/tests/compiler_tests/EmulateGLFragColorBroadcast_test.cpp', + '<(angle_path)/src/tests/compiler_tests/ExpressionLimit_test.cpp', + '<(angle_path)/src/tests/compiler_tests/EXT_blend_func_extended_test.cpp', + '<(angle_path)/src/tests/compiler_tests/FragDepth_test.cpp', + '<(angle_path)/src/tests/compiler_tests/GLSLCompatibilityOutput_test.cpp', + '<(angle_path)/src/tests/compiler_tests/IntermNode_test.cpp', + '<(angle_path)/src/tests/compiler_tests/MalformedShader_test.cpp', + '<(angle_path)/src/tests/compiler_tests/NV_draw_buffers_test.cpp', + '<(angle_path)/src/tests/compiler_tests/Pack_Unpack_test.cpp', + '<(angle_path)/src/tests/compiler_tests/PruneEmptyDeclarations_test.cpp', + '<(angle_path)/src/tests/compiler_tests/PruneUnusedFunctions_test.cpp', + '<(angle_path)/src/tests/compiler_tests/QualificationOrderESSL31_test.cpp', + '<(angle_path)/src/tests/compiler_tests/QualificationOrder_test.cpp', + '<(angle_path)/src/tests/compiler_tests/RecordConstantPrecision_test.cpp', + '<(angle_path)/src/tests/compiler_tests/RemovePow_test.cpp', + '<(angle_path)/src/tests/compiler_tests/ShaderExtension_test.cpp', + '<(angle_path)/src/tests/compiler_tests/ShaderImage_test.cpp', + '<(angle_path)/src/tests/compiler_tests/ShaderVariable_test.cpp', + '<(angle_path)/src/tests/compiler_tests/ShCompile_test.cpp', + '<(angle_path)/src/tests/compiler_tests/TypeTracking_test.cpp', + '<(angle_path)/src/tests/compiler_tests/VariablePacker_test.cpp', + '<(angle_path)/src/tests/compiler_tests/WorkGroupSize_test.cpp', + '<(angle_path)/src/tests/preprocessor_tests/char_test.cpp', + '<(angle_path)/src/tests/preprocessor_tests/comment_test.cpp', + '<(angle_path)/src/tests/preprocessor_tests/define_test.cpp', + '<(angle_path)/src/tests/preprocessor_tests/error_test.cpp', + '<(angle_path)/src/tests/preprocessor_tests/extension_test.cpp', + '<(angle_path)/src/tests/preprocessor_tests/identifier_test.cpp', + '<(angle_path)/src/tests/preprocessor_tests/if_test.cpp', + '<(angle_path)/src/tests/preprocessor_tests/input_test.cpp', + '<(angle_path)/src/tests/preprocessor_tests/location_test.cpp', + '<(angle_path)/src/tests/preprocessor_tests/MockDiagnostics.h', + '<(angle_path)/src/tests/preprocessor_tests/MockDirectiveHandler.h', + '<(angle_path)/src/tests/preprocessor_tests/number_test.cpp', + '<(angle_path)/src/tests/preprocessor_tests/operator_test.cpp', + '<(angle_path)/src/tests/preprocessor_tests/pragma_test.cpp', + '<(angle_path)/src/tests/preprocessor_tests/PreprocessorTest.cpp', + '<(angle_path)/src/tests/preprocessor_tests/PreprocessorTest.h', + '<(angle_path)/src/tests/preprocessor_tests/space_test.cpp', + '<(angle_path)/src/tests/preprocessor_tests/token_test.cpp', + '<(angle_path)/src/tests/preprocessor_tests/version_test.cpp', + '<(angle_path)/src/tests/test_utils/compiler_test.cpp', + '<(angle_path)/src/tests/test_utils/compiler_test.h', + ], + # TODO(jmadill): should probably call this windows sources + 'angle_unittests_hlsl_sources': + [ + '<(angle_path)/src/tests/compiler_tests/UnrollFlatten_test.cpp', + ], + }, + # Everything below this but the WinRT configuration is duplicated in the GN build. + # If you change anything also change angle/src/tests/BUILD.gn + 'dependencies': + [ + '<(angle_path)/src/angle.gyp:libANGLE', + '<(angle_path)/src/angle.gyp:preprocessor', + '<(angle_path)/src/angle.gyp:translator', + '<(angle_path)/src/tests/tests.gyp:angle_test_support', + ], + 'include_dirs': + [ + '<(angle_path)/include', + '<(angle_path)/src', + ], + 'sources': + [ + '<@(angle_unittests_sources)', + ], + 'conditions': + [ + ['angle_build_winrt==1', + { + 'sources': + [ + '<(angle_path)/src/libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow_unittest.cpp', + '<(angle_path)/src/libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow_unittest.cpp', + ], + 'defines': + [ + 'ANGLE_ENABLE_D3D11', + ], + 'msvs_settings': + { + 'VCLinkerTool': + { + 'AdditionalDependencies': + [ + 'runtimeobject.lib', + ], + }, + }, + }], + ['OS=="win"', + { + # TODO(cwallez): make this angle_enable_hlsl instead (requires gyp file refactoring) + 'defines': + [ + 'ANGLE_ENABLE_HLSL', + ], + 'sources': + [ + '<@(angle_unittests_hlsl_sources)', + ], + }], + ], +} diff --git a/gfx/angle/src/tests/angle_unittests_main.cpp b/gfx/angle/src/tests/angle_unittests_main.cpp new file mode 100755 index 000000000..1b44dbbcc --- /dev/null +++ b/gfx/angle/src/tests/angle_unittests_main.cpp @@ -0,0 +1,36 @@ +// +// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "gtest/gtest.h" +#include "GLSLANG/ShaderLang.h" + +class CompilerTestEnvironment : public testing::Environment +{ + public: + void SetUp() override + { + if (!sh::Initialize()) + { + FAIL() << "Failed to initialize the compiler."; + } + } + + void TearDown() override + { + if (!sh::Finalize()) + { + FAIL() << "Failed to finalize the compiler."; + } + } +}; + +int main(int argc, char** argv) +{ + testing::InitGoogleTest(&argc, argv); + testing::AddGlobalTestEnvironment(new CompilerTestEnvironment()); + int rt = RUN_ALL_TESTS(); + return rt; +} diff --git a/gfx/angle/src/tests/angle_unittests_utils.h b/gfx/angle/src/tests/angle_unittests_utils.h new file mode 100755 index 000000000..790d3455d --- /dev/null +++ b/gfx/angle/src/tests/angle_unittests_utils.h @@ -0,0 +1,125 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// angle_unittests_utils.h: +// Helpers for mocking and unit testing. + +#ifndef TESTS_ANGLE_UNITTESTS_UTILS_H_ +#define TESTS_ANGLE_UNITTESTS_UTILS_H_ + +#include "libANGLE/Surface.h" +#include "libANGLE/renderer/ContextImpl.h" +#include "libANGLE/renderer/EGLImplFactory.h" +#include "libANGLE/renderer/GLImplFactory.h" + +namespace rx +{ + +// Useful when mocking a part of the GLImplFactory class +class NullFactory : public GLImplFactory +{ + public: + NullFactory() {} + + // Shader creation + CompilerImpl *createCompiler() override { return nullptr; } + ShaderImpl *createShader(const gl::ShaderState &data) override { return nullptr; } + ProgramImpl *createProgram(const gl::ProgramState &data) override { return nullptr; } + + // Framebuffer creation + FramebufferImpl *createFramebuffer(const gl::FramebufferState &data) override + { + return nullptr; + } + + // Texture creation + TextureImpl *createTexture(const gl::TextureState &data) override { return nullptr; } + + // Renderbuffer creation + RenderbufferImpl *createRenderbuffer() override { return nullptr; } + + // Buffer creation + BufferImpl *createBuffer(const gl::BufferState &state) override { return nullptr; } + + // Vertex Array creation + VertexArrayImpl *createVertexArray(const gl::VertexArrayState &data) override + { + return nullptr; + } + + // Query and Fence creation + QueryImpl *createQuery(GLenum type) override { return nullptr; } + FenceNVImpl *createFenceNV() override { return nullptr; } + FenceSyncImpl *createFenceSync() override { return nullptr; } + + // Transform Feedback creation + TransformFeedbackImpl *createTransformFeedback(const gl::TransformFeedbackState &state) override + { + return nullptr; + } + + // Sampler object creation + SamplerImpl *createSampler() override { return nullptr; } + + std::vector<PathImpl *> createPaths(GLsizei range) override + { + return std::vector<PathImpl *>(); + } +}; + +// A class with all the factory methods mocked. +class MockGLFactory : public GLImplFactory +{ + public: + MOCK_METHOD1(createContext, ContextImpl *(const gl::ContextState &)); + MOCK_METHOD0(createCompiler, CompilerImpl *()); + MOCK_METHOD1(createShader, ShaderImpl *(const gl::ShaderState &)); + MOCK_METHOD1(createProgram, ProgramImpl *(const gl::ProgramState &)); + MOCK_METHOD1(createFramebuffer, FramebufferImpl *(const gl::FramebufferState &)); + MOCK_METHOD1(createTexture, TextureImpl *(const gl::TextureState &)); + MOCK_METHOD0(createRenderbuffer, RenderbufferImpl *()); + MOCK_METHOD1(createBuffer, BufferImpl *(const gl::BufferState &)); + MOCK_METHOD1(createVertexArray, VertexArrayImpl *(const gl::VertexArrayState &)); + MOCK_METHOD1(createQuery, QueryImpl *(GLenum type)); + MOCK_METHOD0(createFenceNV, FenceNVImpl *()); + MOCK_METHOD0(createFenceSync, FenceSyncImpl *()); + MOCK_METHOD1(createTransformFeedback, + TransformFeedbackImpl *(const gl::TransformFeedbackState &)); + MOCK_METHOD0(createSampler, SamplerImpl *()); + MOCK_METHOD1(createPaths, std::vector<PathImpl *>(GLsizei)); +}; + +class MockEGLFactory : public EGLImplFactory +{ + public: + MOCK_METHOD4(createWindowSurface, + SurfaceImpl *(const egl::SurfaceState &, + const egl::Config *, + EGLNativeWindowType, + const egl::AttributeMap &)); + MOCK_METHOD3(createPbufferSurface, + SurfaceImpl *(const egl::SurfaceState &, + const egl::Config *, + const egl::AttributeMap &)); + MOCK_METHOD5(createPbufferFromClientBuffer, + SurfaceImpl *(const egl::SurfaceState &, + const egl::Config *, + EGLenum, + EGLClientBuffer, + const egl::AttributeMap &)); + MOCK_METHOD4(createPixmapSurface, + SurfaceImpl *(const egl::SurfaceState &, + const egl::Config *, + NativePixmapType, + const egl::AttributeMap &)); + MOCK_METHOD3(createImage, ImageImpl *(EGLenum, egl::ImageSibling *, const egl::AttributeMap &)); + MOCK_METHOD1(createContext, ContextImpl *(const gl::ContextState &)); + MOCK_METHOD2(createStreamProducerD3DTextureNV12, + StreamProducerImpl *(egl::Stream::ConsumerType, const egl::AttributeMap &)); +}; + +} // namespace rx + +#endif // TESTS_ANGLE_UNITTESTS_UTILS_H_ diff --git a/gfx/angle/src/tests/compiler_tests/API_test.cpp b/gfx/angle/src/tests/compiler_tests/API_test.cpp new file mode 100755 index 000000000..090e31ebc --- /dev/null +++ b/gfx/angle/src/tests/compiler_tests/API_test.cpp @@ -0,0 +1,26 @@ +// +// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// API_test.cpp: +// Some tests for the compiler API. +// + +#include "angle_gl.h" +#include "gtest/gtest.h" +#include "GLSLANG/ShaderLang.h" + +TEST(APITest, CompareShBuiltInResources) +{ + ShBuiltInResources a_resources; + memset(&a_resources, 88, sizeof(a_resources)); + sh::InitBuiltInResources(&a_resources); + + ShBuiltInResources b_resources; + memset(&b_resources, 77, sizeof(b_resources)); + sh::InitBuiltInResources(&b_resources); + + EXPECT_TRUE(memcmp(&a_resources, &b_resources, sizeof(a_resources)) == 0); +} + diff --git a/gfx/angle/src/tests/compiler_tests/CollectVariables_test.cpp b/gfx/angle/src/tests/compiler_tests/CollectVariables_test.cpp new file mode 100755 index 000000000..a93411668 --- /dev/null +++ b/gfx/angle/src/tests/compiler_tests/CollectVariables_test.cpp @@ -0,0 +1,742 @@ +// +// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// CollectVariables_test.cpp: +// Some tests for shader inspection +// + +#include <memory> + +#include "angle_gl.h" +#include "gtest/gtest.h" +#include "GLSLANG/ShaderLang.h" +#include "compiler/translator/TranslatorGLSL.h" + +using namespace sh; + +#define EXPECT_GLENUM_EQ(expected, actual) \ + EXPECT_EQ(static_cast<::GLenum>(expected), static_cast<::GLenum>(actual)) + +class CollectVariablesTest : public testing::Test +{ + public: + CollectVariablesTest(::GLenum shaderType) : mShaderType(shaderType) {} + + protected: + void SetUp() override + { + ShBuiltInResources resources; + InitBuiltInResources(&resources); + resources.MaxDrawBuffers = 8; + + initTranslator(resources); + } + + void initTranslator(const ShBuiltInResources &resources) + { + mTranslator.reset( + new TranslatorGLSL(mShaderType, SH_GLES3_SPEC, SH_GLSL_COMPATIBILITY_OUTPUT)); + ASSERT_TRUE(mTranslator->Init(resources)); + } + + // For use in the gl_DepthRange tests. + void validateDepthRangeShader(const std::string &shaderString) + { + const char *shaderStrings[] = { shaderString.c_str() }; + ASSERT_TRUE(mTranslator->compile(shaderStrings, 1, SH_VARIABLES)); + + const std::vector<Uniform> &uniforms = mTranslator->getUniforms(); + ASSERT_EQ(1u, uniforms.size()); + + const Uniform &uniform = uniforms[0]; + EXPECT_EQ("gl_DepthRange", uniform.name); + ASSERT_TRUE(uniform.isStruct()); + ASSERT_EQ(3u, uniform.fields.size()); + + bool foundNear = false; + bool foundFar = false; + bool foundDiff = false; + + for (const auto &field : uniform.fields) + { + if (field.name == "near") + { + EXPECT_FALSE(foundNear); + foundNear = true; + } + else if (field.name == "far") + { + EXPECT_FALSE(foundFar); + foundFar = true; + } + else + { + ASSERT_EQ("diff", field.name); + EXPECT_FALSE(foundDiff); + foundDiff = true; + } + + EXPECT_EQ(0u, field.arraySize); + EXPECT_FALSE(field.isStruct()); + EXPECT_GLENUM_EQ(GL_HIGH_FLOAT, field.precision); + EXPECT_TRUE(field.staticUse); + EXPECT_GLENUM_EQ(GL_FLOAT, field.type); + } + + EXPECT_TRUE(foundNear && foundFar && foundDiff); + } + + // For use in tests for output varibles. + void validateOutputVariableForShader(const std::string &shaderString, + unsigned int varIndex, + const char *varName, + const OutputVariable **outResult) + { + const char *shaderStrings[] = {shaderString.c_str()}; + ASSERT_TRUE(mTranslator->compile(shaderStrings, 1, SH_VARIABLES)) + << mTranslator->getInfoSink().info.str(); + + const auto &outputVariables = mTranslator->getOutputVariables(); + ASSERT_LT(varIndex, outputVariables.size()); + const OutputVariable &outputVariable = outputVariables[varIndex]; + EXPECT_EQ(-1, outputVariable.location); + EXPECT_TRUE(outputVariable.staticUse); + EXPECT_EQ(varName, outputVariable.name); + *outResult = &outputVariable; + } + + void compile(const std::string &shaderString) + { + const char *shaderStrings[] = {shaderString.c_str()}; + ASSERT_TRUE(mTranslator->compile(shaderStrings, 1, SH_VARIABLES)); + } + + ::GLenum mShaderType; + std::unique_ptr<TranslatorGLSL> mTranslator; +}; + +class CollectVertexVariablesTest : public CollectVariablesTest +{ + public: + CollectVertexVariablesTest() : CollectVariablesTest(GL_VERTEX_SHADER) {} +}; + +class CollectFragmentVariablesTest : public CollectVariablesTest +{ + public: + CollectFragmentVariablesTest() : CollectVariablesTest(GL_FRAGMENT_SHADER) {} +}; + +TEST_F(CollectFragmentVariablesTest, SimpleOutputVar) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 out_fragColor;\n" + "void main() {\n" + " out_fragColor = vec4(1.0);\n" + "}\n"; + + compile(shaderString); + + const auto &outputVariables = mTranslator->getOutputVariables(); + ASSERT_EQ(1u, outputVariables.size()); + + const OutputVariable &outputVariable = outputVariables[0]; + + EXPECT_EQ(0u, outputVariable.arraySize); + EXPECT_EQ(-1, outputVariable.location); + EXPECT_GLENUM_EQ(GL_MEDIUM_FLOAT, outputVariable.precision); + EXPECT_TRUE(outputVariable.staticUse); + EXPECT_GLENUM_EQ(GL_FLOAT_VEC4, outputVariable.type); + EXPECT_EQ("out_fragColor", outputVariable.name); +} + +TEST_F(CollectFragmentVariablesTest, LocationOutputVar) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "layout(location=5) out vec4 out_fragColor;\n" + "void main() {\n" + " out_fragColor = vec4(1.0);\n" + "}\n"; + + compile(shaderString); + + const auto &outputVariables = mTranslator->getOutputVariables(); + ASSERT_EQ(1u, outputVariables.size()); + + const OutputVariable &outputVariable = outputVariables[0]; + + EXPECT_EQ(0u, outputVariable.arraySize); + EXPECT_EQ(5, outputVariable.location); + EXPECT_GLENUM_EQ(GL_MEDIUM_FLOAT, outputVariable.precision); + EXPECT_TRUE(outputVariable.staticUse); + EXPECT_GLENUM_EQ(GL_FLOAT_VEC4, outputVariable.type); + EXPECT_EQ("out_fragColor", outputVariable.name); +} + +TEST_F(CollectVertexVariablesTest, LocationAttribute) +{ + const std::string &shaderString = + "#version 300 es\n" + "layout(location=5) in vec4 in_Position;\n" + "void main() {\n" + " gl_Position = in_Position;\n" + "}\n"; + + compile(shaderString); + + const std::vector<Attribute> &attributes = mTranslator->getAttributes(); + ASSERT_EQ(1u, attributes.size()); + + const Attribute &attribute = attributes[0]; + + EXPECT_EQ(0u, attribute.arraySize); + EXPECT_EQ(5, attribute.location); + EXPECT_GLENUM_EQ(GL_HIGH_FLOAT, attribute.precision); + EXPECT_TRUE(attribute.staticUse); + EXPECT_GLENUM_EQ(GL_FLOAT_VEC4, attribute.type); + EXPECT_EQ("in_Position", attribute.name); +} + +TEST_F(CollectVertexVariablesTest, SimpleInterfaceBlock) +{ + const std::string &shaderString = + "#version 300 es\n" + "uniform b {\n" + " float f;\n" + "};" + "void main() {\n" + " gl_Position = vec4(f, 0.0, 0.0, 1.0);\n" + "}\n"; + + compile(shaderString); + + const std::vector<InterfaceBlock> &interfaceBlocks = mTranslator->getInterfaceBlocks(); + ASSERT_EQ(1u, interfaceBlocks.size()); + + const InterfaceBlock &interfaceBlock = interfaceBlocks[0]; + + EXPECT_EQ(0u, interfaceBlock.arraySize); + EXPECT_FALSE(interfaceBlock.isRowMajorLayout); + EXPECT_EQ(BLOCKLAYOUT_SHARED, interfaceBlock.layout); + EXPECT_EQ("b", interfaceBlock.name); + EXPECT_TRUE(interfaceBlock.staticUse); + + ASSERT_EQ(1u, interfaceBlock.fields.size()); + + const InterfaceBlockField &field = interfaceBlock.fields[0]; + + EXPECT_GLENUM_EQ(GL_HIGH_FLOAT, field.precision); + EXPECT_TRUE(field.staticUse); + EXPECT_GLENUM_EQ(GL_FLOAT, field.type); + EXPECT_EQ("f", field.name); + EXPECT_FALSE(field.isRowMajorLayout); + EXPECT_TRUE(field.fields.empty()); +} + +TEST_F(CollectVertexVariablesTest, SimpleInstancedInterfaceBlock) +{ + const std::string &shaderString = + "#version 300 es\n" + "uniform b {\n" + " float f;\n" + "} blockInstance;" + "void main() {\n" + " gl_Position = vec4(blockInstance.f, 0.0, 0.0, 1.0);\n" + "}\n"; + + compile(shaderString); + + const std::vector<InterfaceBlock> &interfaceBlocks = mTranslator->getInterfaceBlocks(); + ASSERT_EQ(1u, interfaceBlocks.size()); + + const InterfaceBlock &interfaceBlock = interfaceBlocks[0]; + + EXPECT_EQ(0u, interfaceBlock.arraySize); + EXPECT_FALSE(interfaceBlock.isRowMajorLayout); + EXPECT_EQ(BLOCKLAYOUT_SHARED, interfaceBlock.layout); + EXPECT_EQ("b", interfaceBlock.name); + EXPECT_EQ("blockInstance", interfaceBlock.instanceName); + EXPECT_TRUE(interfaceBlock.staticUse); + + ASSERT_EQ(1u, interfaceBlock.fields.size()); + + const InterfaceBlockField &field = interfaceBlock.fields[0]; + + EXPECT_GLENUM_EQ(GL_HIGH_FLOAT, field.precision); + EXPECT_TRUE(field.staticUse); + EXPECT_GLENUM_EQ(GL_FLOAT, field.type); + EXPECT_EQ("f", field.name); + EXPECT_FALSE(field.isRowMajorLayout); + EXPECT_TRUE(field.fields.empty()); +} + +TEST_F(CollectVertexVariablesTest, StructInterfaceBlock) +{ + const std::string &shaderString = + "#version 300 es\n" + "struct st { float f; };" + "uniform b {\n" + " st s;\n" + "};" + "void main() {\n" + " gl_Position = vec4(s.f, 0.0, 0.0, 1.0);\n" + "}\n"; + + compile(shaderString); + + const std::vector<InterfaceBlock> &interfaceBlocks = mTranslator->getInterfaceBlocks(); + ASSERT_EQ(1u, interfaceBlocks.size()); + + const InterfaceBlock &interfaceBlock = interfaceBlocks[0]; + + EXPECT_EQ(0u, interfaceBlock.arraySize); + EXPECT_FALSE(interfaceBlock.isRowMajorLayout); + EXPECT_EQ(BLOCKLAYOUT_SHARED, interfaceBlock.layout); + EXPECT_EQ("b", interfaceBlock.name); + EXPECT_TRUE(interfaceBlock.staticUse); + + ASSERT_EQ(1u, interfaceBlock.fields.size()); + + const InterfaceBlockField &field = interfaceBlock.fields[0]; + + EXPECT_TRUE(field.isStruct()); + EXPECT_TRUE(field.staticUse); + EXPECT_EQ("s", field.name); + EXPECT_FALSE(field.isRowMajorLayout); + + const ShaderVariable &member = field.fields[0]; + + // NOTE: we don't currently mark struct members as statically used or not + EXPECT_FALSE(member.isStruct()); + EXPECT_EQ("f", member.name); + EXPECT_GLENUM_EQ(GL_FLOAT, member.type); + EXPECT_GLENUM_EQ(GL_HIGH_FLOAT, member.precision); +} + +TEST_F(CollectVertexVariablesTest, StructInstancedInterfaceBlock) +{ + const std::string &shaderString = + "#version 300 es\n" + "struct st { float f; };" + "uniform b {\n" + " st s;\n" + "} instanceName;" + "void main() {\n" + " gl_Position = vec4(instanceName.s.f, 0.0, 0.0, 1.0);\n" + "}\n"; + + compile(shaderString); + + const std::vector<InterfaceBlock> &interfaceBlocks = mTranslator->getInterfaceBlocks(); + ASSERT_EQ(1u, interfaceBlocks.size()); + + const InterfaceBlock &interfaceBlock = interfaceBlocks[0]; + + EXPECT_EQ(0u, interfaceBlock.arraySize); + EXPECT_FALSE(interfaceBlock.isRowMajorLayout); + EXPECT_EQ(BLOCKLAYOUT_SHARED, interfaceBlock.layout); + EXPECT_EQ("b", interfaceBlock.name); + EXPECT_EQ("instanceName", interfaceBlock.instanceName); + EXPECT_TRUE(interfaceBlock.staticUse); + + ASSERT_EQ(1u, interfaceBlock.fields.size()); + + const InterfaceBlockField &field = interfaceBlock.fields[0]; + + EXPECT_TRUE(field.isStruct()); + EXPECT_TRUE(field.staticUse); + EXPECT_EQ("s", field.name); + EXPECT_FALSE(field.isRowMajorLayout); + + const ShaderVariable &member = field.fields[0]; + + // NOTE: we don't currently mark struct members as statically used or not + EXPECT_FALSE(member.isStruct()); + EXPECT_EQ("f", member.name); + EXPECT_GLENUM_EQ(GL_FLOAT, member.type); + EXPECT_GLENUM_EQ(GL_HIGH_FLOAT, member.precision); +} + +TEST_F(CollectVertexVariablesTest, NestedStructRowMajorInterfaceBlock) +{ + const std::string &shaderString = + "#version 300 es\n" + "struct st { mat2 m; };" + "layout(row_major) uniform b {\n" + " st s;\n" + "};" + "void main() {\n" + " gl_Position = vec4(s.m);\n" + "}\n"; + + compile(shaderString); + + const std::vector<InterfaceBlock> &interfaceBlocks = mTranslator->getInterfaceBlocks(); + ASSERT_EQ(1u, interfaceBlocks.size()); + + const InterfaceBlock &interfaceBlock = interfaceBlocks[0]; + + EXPECT_EQ(0u, interfaceBlock.arraySize); + EXPECT_TRUE(interfaceBlock.isRowMajorLayout); + EXPECT_EQ(BLOCKLAYOUT_SHARED, interfaceBlock.layout); + EXPECT_EQ("b", interfaceBlock.name); + EXPECT_TRUE(interfaceBlock.staticUse); + + ASSERT_EQ(1u, interfaceBlock.fields.size()); + + const InterfaceBlockField &field = interfaceBlock.fields[0]; + + EXPECT_TRUE(field.isStruct()); + EXPECT_TRUE(field.staticUse); + EXPECT_EQ("s", field.name); + EXPECT_TRUE(field.isRowMajorLayout); + + const ShaderVariable &member = field.fields[0]; + + // NOTE: we don't currently mark struct members as statically used or not + EXPECT_FALSE(member.isStruct()); + EXPECT_EQ("m", member.name); + EXPECT_GLENUM_EQ(GL_FLOAT_MAT2, member.type); + EXPECT_GLENUM_EQ(GL_HIGH_FLOAT, member.precision); +} + +TEST_F(CollectVertexVariablesTest, VaryingInterpolation) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "centroid out float vary;\n" + "void main() {\n" + " gl_Position = vec4(1.0);\n" + " vary = 1.0;\n" + "}\n"; + + compile(shaderString); + + const std::vector<Varying> &varyings = mTranslator->getVaryings(); + ASSERT_EQ(2u, varyings.size()); + + const Varying *varying = &varyings[0]; + + if (varying->name == "gl_Position") + { + varying = &varyings[1]; + } + + EXPECT_EQ(0u, varying->arraySize); + EXPECT_GLENUM_EQ(GL_MEDIUM_FLOAT, varying->precision); + EXPECT_TRUE(varying->staticUse); + EXPECT_GLENUM_EQ(GL_FLOAT, varying->type); + EXPECT_EQ("vary", varying->name); + EXPECT_EQ(INTERPOLATION_CENTROID, varying->interpolation); +} + +// Test for builtin uniform "gl_DepthRange" (Vertex shader) +TEST_F(CollectVertexVariablesTest, DepthRange) +{ + const std::string &shaderString = + "attribute vec4 position;\n" + "void main() {\n" + " gl_Position = position + vec4(gl_DepthRange.near, gl_DepthRange.far, gl_DepthRange.diff, 1.0);\n" + "}\n"; + + validateDepthRangeShader(shaderString); +} + +// Test for builtin uniform "gl_DepthRange" (Fragment shader) +TEST_F(CollectFragmentVariablesTest, DepthRange) +{ + const std::string &shaderString = + "precision mediump float;\n" + "void main() {\n" + " gl_FragColor = vec4(gl_DepthRange.near, gl_DepthRange.far, gl_DepthRange.diff, 1.0);\n" + "}\n"; + + validateDepthRangeShader(shaderString); +} + +// Test that gl_FragColor built-in usage in ESSL1 fragment shader is reflected in the output +// variables list. +TEST_F(CollectFragmentVariablesTest, OutputVarESSL1FragColor) +{ + const std::string &fragColorShader = + "precision mediump float;\n" + "void main() {\n" + " gl_FragColor = vec4(1.0);\n" + "}\n"; + + const OutputVariable *outputVariable = nullptr; + validateOutputVariableForShader(fragColorShader, 0u, "gl_FragColor", &outputVariable); + ASSERT_NE(outputVariable, nullptr); + EXPECT_EQ(0u, outputVariable->arraySize); + EXPECT_GLENUM_EQ(GL_FLOAT_VEC4, outputVariable->type); + EXPECT_GLENUM_EQ(GL_MEDIUM_FLOAT, outputVariable->precision); +} + +// Test that gl_FragData built-in usage in ESSL1 fragment shader is reflected in the output +// variables list. +TEST_F(CollectFragmentVariablesTest, OutputVarESSL1FragData) +{ + const std::string &fragDataShader = + "#extension GL_EXT_draw_buffers : require\n" + "precision mediump float;\n" + "void main() {\n" + " gl_FragData[0] = vec4(1.0);\n" + " gl_FragData[1] = vec4(0.5);\n" + "}\n"; + + ShBuiltInResources resources = mTranslator->getResources(); + resources.EXT_draw_buffers = 1; + const unsigned int kMaxDrawBuffers = 3u; + resources.MaxDrawBuffers = kMaxDrawBuffers; + initTranslator(resources); + + const OutputVariable *outputVariable = nullptr; + validateOutputVariableForShader(fragDataShader, 0u, "gl_FragData", &outputVariable); + ASSERT_NE(outputVariable, nullptr); + EXPECT_EQ(kMaxDrawBuffers, outputVariable->arraySize); + EXPECT_GLENUM_EQ(GL_FLOAT_VEC4, outputVariable->type); + EXPECT_GLENUM_EQ(GL_MEDIUM_FLOAT, outputVariable->precision); +} + +// Test that gl_FragDataEXT built-in usage in ESSL1 fragment shader is reflected in the output +// variables list. Also test that the precision is mediump. +TEST_F(CollectFragmentVariablesTest, OutputVarESSL1FragDepthMediump) +{ + const std::string &fragDepthShader = + "#extension GL_EXT_frag_depth : require\n" + "precision mediump float;\n" + "void main() {\n" + " gl_FragDepthEXT = 0.7;" + "}\n"; + + ShBuiltInResources resources = mTranslator->getResources(); + resources.EXT_frag_depth = 1; + initTranslator(resources); + + const OutputVariable *outputVariable = nullptr; + validateOutputVariableForShader(fragDepthShader, 0u, "gl_FragDepthEXT", &outputVariable); + ASSERT_NE(outputVariable, nullptr); + EXPECT_EQ(0u, outputVariable->arraySize); + EXPECT_GLENUM_EQ(GL_FLOAT, outputVariable->type); + EXPECT_GLENUM_EQ(GL_MEDIUM_FLOAT, outputVariable->precision); +} + +// Test that gl_FragDataEXT built-in usage in ESSL1 fragment shader is reflected in the output +// variables list. Also test that the precision is highp if user requests it. +TEST_F(CollectFragmentVariablesTest, OutputVarESSL1FragDepthHighp) +{ + const std::string &fragDepthHighShader = + "#extension GL_EXT_frag_depth : require\n" + "void main() {\n" + " gl_FragDepthEXT = 0.7;" + "}\n"; + + ShBuiltInResources resources = mTranslator->getResources(); + resources.EXT_frag_depth = 1; + resources.FragmentPrecisionHigh = 1; + initTranslator(resources); + + const OutputVariable *outputVariable = nullptr; + validateOutputVariableForShader(fragDepthHighShader, 0u, "gl_FragDepthEXT", &outputVariable); + ASSERT_NE(outputVariable, nullptr); + EXPECT_EQ(0u, outputVariable->arraySize); + EXPECT_GLENUM_EQ(GL_FLOAT, outputVariable->type); + EXPECT_GLENUM_EQ(GL_HIGH_FLOAT, outputVariable->precision); +} + +// Test that gl_FragData built-in usage in ESSL3 fragment shader is reflected in the output +// variables list. Also test that the precision is highp. +TEST_F(CollectFragmentVariablesTest, OutputVarESSL3FragDepthHighp) +{ + const std::string &fragDepthHighShader = + "#version 300 es\n" + "precision mediump float;\n" + "void main() {\n" + " gl_FragDepth = 0.7;" + "}\n"; + + ShBuiltInResources resources = mTranslator->getResources(); + resources.EXT_frag_depth = 1; + initTranslator(resources); + + const OutputVariable *outputVariable = nullptr; + validateOutputVariableForShader(fragDepthHighShader, 0u, "gl_FragDepth", &outputVariable); + ASSERT_NE(outputVariable, nullptr); + EXPECT_EQ(0u, outputVariable->arraySize); + EXPECT_GLENUM_EQ(GL_FLOAT, outputVariable->type); + EXPECT_GLENUM_EQ(GL_HIGH_FLOAT, outputVariable->precision); +} + +// Test that gl_SecondaryFragColorEXT built-in usage in ESSL1 fragment shader is reflected in the +// output variables list. +TEST_F(CollectFragmentVariablesTest, OutputVarESSL1EXTBlendFuncExtendedSecondaryFragColor) +{ + const char *secondaryFragColorShader = + "#extension GL_EXT_blend_func_extended : require\n" + "precision mediump float;\n" + "void main() {\n" + " gl_FragColor = vec4(1.0);\n" + " gl_SecondaryFragColorEXT = vec4(1.0);\n" + "}\n"; + + const unsigned int kMaxDrawBuffers = 3u; + ShBuiltInResources resources = mTranslator->getResources(); + resources.EXT_blend_func_extended = 1; + resources.EXT_draw_buffers = 1; + resources.MaxDrawBuffers = kMaxDrawBuffers; + resources.MaxDualSourceDrawBuffers = resources.MaxDrawBuffers; + initTranslator(resources); + + const OutputVariable *outputVariable = nullptr; + validateOutputVariableForShader(secondaryFragColorShader, 0u, "gl_FragColor", &outputVariable); + ASSERT_NE(outputVariable, nullptr); + EXPECT_EQ(0u, outputVariable->arraySize); + EXPECT_GLENUM_EQ(GL_FLOAT_VEC4, outputVariable->type); + EXPECT_GLENUM_EQ(GL_MEDIUM_FLOAT, outputVariable->precision); + + outputVariable = nullptr; + validateOutputVariableForShader(secondaryFragColorShader, 1u, "gl_SecondaryFragColorEXT", + &outputVariable); + ASSERT_NE(outputVariable, nullptr); + EXPECT_EQ(0u, outputVariable->arraySize); + EXPECT_GLENUM_EQ(GL_FLOAT_VEC4, outputVariable->type); + EXPECT_GLENUM_EQ(GL_MEDIUM_FLOAT, outputVariable->precision); +} + +// Test that gl_SecondaryFragDataEXT built-in usage in ESSL1 fragment shader is reflected in the +// output variables list. +TEST_F(CollectFragmentVariablesTest, OutputVarESSL1EXTBlendFuncExtendedSecondaryFragData) +{ + const char *secondaryFragDataShader = + "#extension GL_EXT_blend_func_extended : require\n" + "#extension GL_EXT_draw_buffers : require\n" + "precision mediump float;\n" + "void main() {\n" + " gl_FragData[0] = vec4(1.0);\n" + " gl_FragData[1] = vec4(0.5);\n" + " gl_SecondaryFragDataEXT[0] = vec4(1.0);\n" + " gl_SecondaryFragDataEXT[1] = vec4(0.8);\n" + "}\n"; + const unsigned int kMaxDrawBuffers = 3u; + ShBuiltInResources resources = mTranslator->getResources(); + resources.EXT_blend_func_extended = 1; + resources.EXT_draw_buffers = 1; + resources.MaxDrawBuffers = kMaxDrawBuffers; + resources.MaxDualSourceDrawBuffers = resources.MaxDrawBuffers; + initTranslator(resources); + + const OutputVariable *outputVariable = nullptr; + validateOutputVariableForShader(secondaryFragDataShader, 0u, "gl_FragData", &outputVariable); + ASSERT_NE(outputVariable, nullptr); + EXPECT_EQ(kMaxDrawBuffers, outputVariable->arraySize); + EXPECT_GLENUM_EQ(GL_FLOAT_VEC4, outputVariable->type); + EXPECT_GLENUM_EQ(GL_MEDIUM_FLOAT, outputVariable->precision); + + outputVariable = nullptr; + validateOutputVariableForShader(secondaryFragDataShader, 1u, "gl_SecondaryFragDataEXT", + &outputVariable); + ASSERT_NE(outputVariable, nullptr); + EXPECT_EQ(kMaxDrawBuffers, outputVariable->arraySize); + EXPECT_GLENUM_EQ(GL_FLOAT_VEC4, outputVariable->type); + EXPECT_GLENUM_EQ(GL_MEDIUM_FLOAT, outputVariable->precision); +} + +static khronos_uint64_t SimpleTestHash(const char *str, size_t len) +{ + return static_cast<uint64_t>(len); +} + +class CollectHashedVertexVariablesTest : public CollectVertexVariablesTest +{ + protected: + void SetUp() override + { + // Initialize the translate with a hash function + ShBuiltInResources resources; + sh::InitBuiltInResources(&resources); + resources.HashFunction = SimpleTestHash; + initTranslator(resources); + } +}; + +TEST_F(CollectHashedVertexVariablesTest, InstancedInterfaceBlock) +{ + const std::string &shaderString = + "#version 300 es\n" + "uniform blockName {\n" + " float field;\n" + "} blockInstance;" + "void main() {\n" + " gl_Position = vec4(blockInstance.field, 0.0, 0.0, 1.0);\n" + "}\n"; + + compile(shaderString); + + const std::vector<InterfaceBlock> &interfaceBlocks = mTranslator->getInterfaceBlocks(); + ASSERT_EQ(1u, interfaceBlocks.size()); + + const InterfaceBlock &interfaceBlock = interfaceBlocks[0]; + + EXPECT_EQ(0u, interfaceBlock.arraySize); + EXPECT_FALSE(interfaceBlock.isRowMajorLayout); + EXPECT_EQ(BLOCKLAYOUT_SHARED, interfaceBlock.layout); + EXPECT_EQ("blockName", interfaceBlock.name); + EXPECT_EQ("blockInstance", interfaceBlock.instanceName); + EXPECT_EQ("webgl_9", interfaceBlock.mappedName); + EXPECT_TRUE(interfaceBlock.staticUse); + + ASSERT_EQ(1u, interfaceBlock.fields.size()); + + const InterfaceBlockField &field = interfaceBlock.fields[0]; + + EXPECT_GLENUM_EQ(GL_HIGH_FLOAT, field.precision); + EXPECT_TRUE(field.staticUse); + EXPECT_GLENUM_EQ(GL_FLOAT, field.type); + EXPECT_EQ("field", field.name); + EXPECT_EQ("webgl_5", field.mappedName); + EXPECT_FALSE(field.isRowMajorLayout); + EXPECT_TRUE(field.fields.empty()); +} + +TEST_F(CollectHashedVertexVariablesTest, StructUniform) +{ + const std::string &shaderString = + "#version 300 es\n" + "struct sType {\n" + " float field;\n" + "};" + "uniform sType u;" + "void main() {\n" + " gl_Position = vec4(u.field, 0.0, 0.0, 1.0);\n" + "}\n"; + + compile(shaderString); + + const auto &uniforms = mTranslator->getUniforms(); + ASSERT_EQ(1u, uniforms.size()); + + const Uniform &uniform = uniforms[0]; + + EXPECT_EQ(0u, uniform.arraySize); + EXPECT_EQ("u", uniform.name); + EXPECT_EQ("webgl_1", uniform.mappedName); + EXPECT_TRUE(uniform.staticUse); + + ASSERT_EQ(1u, uniform.fields.size()); + + const ShaderVariable &field = uniform.fields[0]; + + EXPECT_GLENUM_EQ(GL_HIGH_FLOAT, field.precision); + // EXPECT_TRUE(field.staticUse); // we don't yet support struct static use + EXPECT_GLENUM_EQ(GL_FLOAT, field.type); + EXPECT_EQ("field", field.name); + EXPECT_EQ("webgl_5", field.mappedName); + EXPECT_TRUE(field.fields.empty()); +} diff --git a/gfx/angle/src/tests/compiler_tests/ConstantFolding_test.cpp b/gfx/angle/src/tests/compiler_tests/ConstantFolding_test.cpp new file mode 100755 index 000000000..4c5baffe7 --- /dev/null +++ b/gfx/angle/src/tests/compiler_tests/ConstantFolding_test.cpp @@ -0,0 +1,1064 @@ +// +// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// ConstantFolding_test.cpp: +// Tests for constant folding +// + +#include <vector> + +#include "angle_gl.h" +#include "gtest/gtest.h" +#include "GLSLANG/ShaderLang.h" +#include "compiler/translator/PoolAlloc.h" +#include "compiler/translator/TranslatorESSL.h" + +using namespace sh; + +template <typename T> +class ConstantFinder : public TIntermTraverser +{ + public: + ConstantFinder(const std::vector<T> &constantVector) + : TIntermTraverser(true, false, false), + mConstantVector(constantVector), + mFaultTolerance(T()), + mFound(false) + {} + + ConstantFinder(const std::vector<T> &constantVector, const T &faultTolerance) + : TIntermTraverser(true, false, false), + mConstantVector(constantVector), + mFaultTolerance(faultTolerance), + mFound(false) + {} + + ConstantFinder(const T &value) + : TIntermTraverser(true, false, false), + mFaultTolerance(T()), + mFound(false) + { + mConstantVector.push_back(value); + } + + void visitConstantUnion(TIntermConstantUnion *node) + { + if (node->getType().getObjectSize() == mConstantVector.size()) + { + bool found = true; + for (size_t i = 0; i < mConstantVector.size(); i++) + { + if (!isEqual(node->getUnionArrayPointer()[i], mConstantVector[i])) + { + found = false; + break; + } + } + if (found) + { + mFound = found; + } + } + } + + bool found() const { return mFound; } + + private: + bool isEqual(const TConstantUnion &node, const float &value) const + { + return mFaultTolerance >= fabsf(node.getFConst() - value); + } + + bool isEqual(const TConstantUnion &node, const int &value) const + { + ASSERT(mFaultTolerance < std::numeric_limits<int>::max()); + // abs() returns 0 at least on some platforms when the minimum int value is passed in (it + // doesn't have a positive counterpart). + return mFaultTolerance >= abs(node.getIConst() - value) && + (node.getIConst() - value) != std::numeric_limits<int>::min(); + } + + bool isEqual(const TConstantUnion &node, const unsigned int &value) const + { + ASSERT(mFaultTolerance < static_cast<unsigned int>(std::numeric_limits<int>::max())); + return static_cast<int>(mFaultTolerance) >= + abs(static_cast<int>(node.getUConst() - value)) && + static_cast<int>(node.getUConst() - value) != std::numeric_limits<int>::min(); + } + + bool isEqual(const TConstantUnion &node, const bool &value) const + { + return node.getBConst() == value; + } + + std::vector<T> mConstantVector; + T mFaultTolerance; + bool mFound; +}; + +class ConstantFoldingTest : public testing::Test +{ + public: + ConstantFoldingTest() {} + + protected: + virtual void SetUp() + { + allocator.push(); + SetGlobalPoolAllocator(&allocator); + ShBuiltInResources resources; + InitBuiltInResources(&resources); + + mTranslatorESSL = new TranslatorESSL(GL_FRAGMENT_SHADER, SH_GLES3_SPEC); + ASSERT_TRUE(mTranslatorESSL->Init(resources)); + } + + virtual void TearDown() + { + delete mTranslatorESSL; + SetGlobalPoolAllocator(NULL); + allocator.pop(); + } + + void compile(const std::string& shaderString) + { + const char *shaderStrings[] = { shaderString.c_str() }; + + mASTRoot = mTranslatorESSL->compileTreeForTesting(shaderStrings, 1, SH_OBJECT_CODE); + if (!mASTRoot) + { + TInfoSink &infoSink = mTranslatorESSL->getInfoSink(); + FAIL() << "Shader compilation into ESSL failed " << infoSink.info.c_str(); + } + } + + template <typename T> + bool constantFoundInAST(T constant) + { + ConstantFinder<T> finder(constant); + mASTRoot->traverse(&finder); + return finder.found(); + } + + template <typename T> + bool constantVectorFoundInAST(const std::vector<T> &constantVector) + { + ConstantFinder<T> finder(constantVector); + mASTRoot->traverse(&finder); + return finder.found(); + } + + template <typename T> + bool constantColumnMajorMatrixFoundInAST(const std::vector<T> &constantMatrix) + { + return constantVectorFoundInAST(constantMatrix); + } + + template <typename T> + bool constantVectorNearFoundInAST(const std::vector<T> &constantVector, const T &faultTolerance) + { + ConstantFinder<T> finder(constantVector, faultTolerance); + mASTRoot->traverse(&finder); + return finder.found(); + } + + private: + TranslatorESSL *mTranslatorESSL; + TIntermNode *mASTRoot; + + TPoolAllocator allocator; +}; + +TEST_F(ConstantFoldingTest, FoldIntegerAdd) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out int my_Int;\n" + "void main() {\n" + " const int i = 1124 + 5;\n" + " my_Int = i;\n" + "}\n"; + compile(shaderString); + ASSERT_FALSE(constantFoundInAST(1124)); + ASSERT_FALSE(constantFoundInAST(5)); + ASSERT_TRUE(constantFoundInAST(1129)); +} + +TEST_F(ConstantFoldingTest, FoldIntegerSub) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out int my_Int;\n" + "void main() {\n" + " const int i = 1124 - 5;\n" + " my_Int = i;\n" + "}\n"; + compile(shaderString); + ASSERT_FALSE(constantFoundInAST(1124)); + ASSERT_FALSE(constantFoundInAST(5)); + ASSERT_TRUE(constantFoundInAST(1119)); +} + +TEST_F(ConstantFoldingTest, FoldIntegerMul) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out int my_Int;\n" + "void main() {\n" + " const int i = 1124 * 5;\n" + " my_Int = i;\n" + "}\n"; + compile(shaderString); + ASSERT_FALSE(constantFoundInAST(1124)); + ASSERT_FALSE(constantFoundInAST(5)); + ASSERT_TRUE(constantFoundInAST(5620)); +} + +TEST_F(ConstantFoldingTest, FoldIntegerDiv) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out int my_Int;\n" + "void main() {\n" + " const int i = 1124 / 5;\n" + " my_Int = i;\n" + "}\n"; + compile(shaderString); + ASSERT_FALSE(constantFoundInAST(1124)); + ASSERT_FALSE(constantFoundInAST(5)); + // Rounding mode of division is undefined in the spec but ANGLE can be expected to round down. + ASSERT_TRUE(constantFoundInAST(224)); +} + +TEST_F(ConstantFoldingTest, FoldIntegerModulus) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out int my_Int;\n" + "void main() {\n" + " const int i = 1124 % 5;\n" + " my_Int = i;\n" + "}\n"; + compile(shaderString); + ASSERT_FALSE(constantFoundInAST(1124)); + ASSERT_FALSE(constantFoundInAST(5)); + ASSERT_TRUE(constantFoundInAST(4)); +} + +TEST_F(ConstantFoldingTest, FoldVectorCrossProduct) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec3 my_Vec3;" + "void main() {\n" + " const vec3 v3 = cross(vec3(1.0f, 1.0f, 1.0f), vec3(1.0f, -1.0f, 1.0f));\n" + " my_Vec3 = v3;\n" + "}\n"; + compile(shaderString); + std::vector<float> input1(3, 1.0f); + ASSERT_FALSE(constantVectorFoundInAST(input1)); + std::vector<float> input2; + input2.push_back(1.0f); + input2.push_back(-1.0f); + input2.push_back(1.0f); + ASSERT_FALSE(constantVectorFoundInAST(input2)); + std::vector<float> result; + result.push_back(2.0f); + result.push_back(0.0f); + result.push_back(-2.0f); + ASSERT_TRUE(constantVectorFoundInAST(result)); +} + +// FoldMxNMatrixInverse tests check if the matrix 'inverse' operation +// on MxN matrix is constant folded when argument is constant expression and also +// checks the correctness of the result returned by the constant folding operation. +// All the matrices including matrices in the shader code are in column-major order. +TEST_F(ConstantFoldingTest, Fold2x2MatrixInverse) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "in float i;\n" + "out vec2 my_Vec;\n" + "void main() {\n" + " const mat2 m2 = inverse(mat2(2.0f, 3.0f,\n" + " 5.0f, 7.0f));\n" + " mat2 m = m2 * mat2(i);\n" + " my_Vec = m[0];\n" + "}\n"; + compile(shaderString); + float inputElements[] = + { + 2.0f, 3.0f, + 5.0f, 7.0f + }; + std::vector<float> input(inputElements, inputElements + 4); + ASSERT_FALSE(constantColumnMajorMatrixFoundInAST(input)); + float outputElements[] = + { + -7.0f, 3.0f, + 5.0f, -2.0f + }; + std::vector<float> result(outputElements, outputElements + 4); + ASSERT_TRUE(constantColumnMajorMatrixFoundInAST(result)); +} + +// Check if the matrix 'inverse' operation on 3x3 matrix is constant folded. +TEST_F(ConstantFoldingTest, Fold3x3MatrixInverse) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "in float i;\n" + "out vec3 my_Vec;\n" + "void main() {\n" + " const mat3 m3 = inverse(mat3(11.0f, 13.0f, 19.0f,\n" + " 23.0f, 29.0f, 31.0f,\n" + " 37.0f, 41.0f, 43.0f));\n" + " mat3 m = m3 * mat3(i);\n" + " my_Vec = m3[0];\n" + "}\n"; + compile(shaderString); + float inputElements[] = + { + 11.0f, 13.0f, 19.0f, + 23.0f, 29.0f, 31.0f, + 37.0f, 41.0f, 43.0f + }; + std::vector<float> input(inputElements, inputElements + 9); + ASSERT_FALSE(constantVectorFoundInAST(input)); + float outputElements[] = + { + 3.0f / 85.0f, -11.0f / 34.0f, 37.0f / 170.0f, + -79.0f / 340.0f, 23.0f / 68.0f, -12.0f / 85.0f, + 13.0f / 68.0f, -3.0f / 68.0f, -1.0f / 34.0f + }; + std::vector<float> result(outputElements, outputElements + 9); + const float floatFaultTolerance = 0.000001f; + ASSERT_TRUE(constantVectorNearFoundInAST(result, floatFaultTolerance)); +} + +// Check if the matrix 'inverse' operation on 4x4 matrix is constant folded. +TEST_F(ConstantFoldingTest, Fold4x4MatrixInverse) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "in float i;\n" + "out vec4 my_Vec;\n" + "void main() {\n" + " const mat4 m4 = inverse(mat4(29.0f, 31.0f, 37.0f, 41.0f,\n" + " 43.0f, 47.0f, 53.0f, 59.0f,\n" + " 61.0f, 67.0f, 71.0f, 73.0f,\n" + " 79.0f, 83.0f, 89.0f, 97.0f));\n" + " mat4 m = m4 * mat4(i);\n" + " my_Vec = m[0];\n" + "}\n"; + compile(shaderString); + float inputElements[] = + { + 29.0f, 31.0f, 37.0f, 41.0f, + 43.0f, 47.0f, 53.0f, 59.0f, + 61.0f, 67.0f, 71.0f, 73.0f, + 79.0f, 83.0f, 89.0f, 97.0f + }; + std::vector<float> input(inputElements, inputElements + 16); + ASSERT_FALSE(constantVectorFoundInAST(input)); + float outputElements[] = + { + 43.0f / 126.0f, -11.0f / 21.0f, -2.0f / 21.0f, 31.0f / 126.0f, + -5.0f / 7.0f, 9.0f / 14.0f, 1.0f / 14.0f, -1.0f / 7.0f, + 85.0f / 126.0f, -11.0f / 21.0f, 43.0f / 210.0f, -38.0f / 315.0f, + -2.0f / 7.0f, 5.0f / 14.0f, -6.0f / 35.0f, 3.0f / 70.0f + }; + std::vector<float> result(outputElements, outputElements + 16); + const float floatFaultTolerance = 0.00001f; + ASSERT_TRUE(constantVectorNearFoundInAST(result, floatFaultTolerance)); +} + +// FoldMxNMatrixDeterminant tests check if the matrix 'determinant' operation +// on MxN matrix is constant folded when argument is constant expression and also +// checks the correctness of the result returned by the constant folding operation. +// All the matrices including matrices in the shader code are in column-major order. +TEST_F(ConstantFoldingTest, Fold2x2MatrixDeterminant) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out float my_Float;" + "void main() {\n" + " const float f = determinant(mat2(2.0f, 3.0f,\n" + " 5.0f, 7.0f));\n" + " my_Float = f;\n" + "}\n"; + compile(shaderString); + float inputElements[] = + { + 2.0f, 3.0f, + 5.0f, 7.0f + }; + std::vector<float> input(inputElements, inputElements + 4); + ASSERT_FALSE(constantColumnMajorMatrixFoundInAST(input)); + ASSERT_TRUE(constantFoundInAST(-1.0f)); +} + +// Check if the matrix 'determinant' operation on 3x3 matrix is constant folded. +TEST_F(ConstantFoldingTest, Fold3x3MatrixDeterminant) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out float my_Float;" + "void main() {\n" + " const float f = determinant(mat3(11.0f, 13.0f, 19.0f,\n" + " 23.0f, 29.0f, 31.0f,\n" + " 37.0f, 41.0f, 43.0f));\n" + " my_Float = f;\n" + "}\n"; + compile(shaderString); + float inputElements[] = + { + 11.0f, 13.0f, 19.0f, + 23.0f, 29.0f, 31.0f, + 37.0f, 41.0f, 43.0f + }; + std::vector<float> input(inputElements, inputElements + 9); + ASSERT_FALSE(constantColumnMajorMatrixFoundInAST(input)); + ASSERT_TRUE(constantFoundInAST(-680.0f)); +} + +// Check if the matrix 'determinant' operation on 4x4 matrix is constant folded. +TEST_F(ConstantFoldingTest, Fold4x4MatrixDeterminant) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out float my_Float;" + "void main() {\n" + " const float f = determinant(mat4(29.0f, 31.0f, 37.0f, 41.0f,\n" + " 43.0f, 47.0f, 53.0f, 59.0f,\n" + " 61.0f, 67.0f, 71.0f, 73.0f,\n" + " 79.0f, 83.0f, 89.0f, 97.0f));\n" + " my_Float = f;\n" + "}\n"; + compile(shaderString); + float inputElements[] = + { + 29.0f, 31.0f, 37.0f, 41.0f, + 43.0f, 47.0f, 53.0f, 59.0f, + 61.0f, 67.0f, 71.0f, 73.0f, + 79.0f, 83.0f, 89.0f, 97.0f + }; + std::vector<float> input(inputElements, inputElements + 16); + ASSERT_FALSE(constantColumnMajorMatrixFoundInAST(input)); + ASSERT_TRUE(constantFoundInAST(-2520.0f)); +} + +// Check if the matrix 'transpose' operation on 3x3 matrix is constant folded. +// All the matrices including matrices in the shader code are in column-major order. +TEST_F(ConstantFoldingTest, Fold3x3MatrixTranspose) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "in float i;\n" + "out vec3 my_Vec;\n" + "void main() {\n" + " const mat3 m3 = transpose(mat3(11.0f, 13.0f, 19.0f,\n" + " 23.0f, 29.0f, 31.0f,\n" + " 37.0f, 41.0f, 43.0f));\n" + " mat3 m = m3 * mat3(i);\n" + " my_Vec = m[0];\n" + "}\n"; + compile(shaderString); + float inputElements[] = + { + 11.0f, 13.0f, 19.0f, + 23.0f, 29.0f, 31.0f, + 37.0f, 41.0f, 43.0f + }; + std::vector<float> input(inputElements, inputElements + 9); + ASSERT_FALSE(constantColumnMajorMatrixFoundInAST(input)); + float outputElements[] = + { + 11.0f, 23.0f, 37.0f, + 13.0f, 29.0f, 41.0f, + 19.0f, 31.0f, 43.0f + }; + std::vector<float> result(outputElements, outputElements + 9); + ASSERT_TRUE(constantColumnMajorMatrixFoundInAST(result)); +} + +// Test that 0xFFFFFFFF wraps to -1 when parsed as integer. +// This is featured in the examples of ESSL3 section 4.1.3. ESSL3 section 12.42 +// means that any 32-bit unsigned integer value is a valid literal. +TEST_F(ConstantFoldingTest, ParseWrappedHexIntLiteral) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "precision highp int;\n" + "uniform int inInt;\n" + "out vec4 my_Vec;\n" + "void main() {\n" + " const int i = 0xFFFFFFFF;\n" + " my_Vec = vec4(i * inInt);\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(constantFoundInAST(-1)); +} + +// Test that 3000000000 wraps to -1294967296 when parsed as integer. +// This is featured in the examples of GLSL 4.5, and ESSL behavior should match +// desktop GLSL when it comes to integer parsing. +TEST_F(ConstantFoldingTest, ParseWrappedDecimalIntLiteral) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "precision highp int;\n" + "uniform int inInt;\n" + "out vec4 my_Vec;\n" + "void main() {\n" + " const int i = 3000000000;\n" + " my_Vec = vec4(i * inInt);\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(constantFoundInAST(-1294967296)); +} + +// Test that 0xFFFFFFFFu is parsed correctly as an unsigned integer literal. +// This is featured in the examples of ESSL3 section 4.1.3. ESSL3 section 12.42 +// means that any 32-bit unsigned integer value is a valid literal. +TEST_F(ConstantFoldingTest, ParseMaxUintLiteral) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "precision highp int;\n" + "uniform uint inInt;\n" + "out vec4 my_Vec;\n" + "void main() {\n" + " const uint i = 0xFFFFFFFFu;\n" + " my_Vec = vec4(i * inInt);\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(constantFoundInAST(0xFFFFFFFFu)); +} + +// Test that unary minus applied to unsigned int is constant folded correctly. +// This is featured in the examples of ESSL3 section 4.1.3. ESSL3 section 12.42 +// means that any 32-bit unsigned integer value is a valid literal. +TEST_F(ConstantFoldingTest, FoldUnaryMinusOnUintLiteral) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "precision highp int;\n" + "uniform uint inInt;\n" + "out vec4 my_Vec;\n" + "void main() {\n" + " const uint i = -1u;\n" + " my_Vec = vec4(i * inInt);\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(constantFoundInAST(0xFFFFFFFFu)); +} + +// Test that constant mat2 initialization with a mat2 parameter works correctly. +TEST_F(ConstantFoldingTest, FoldMat2ConstructorTakingMat2) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform float mult;\n" + "void main() {\n" + " const mat2 cm = mat2(mat2(0.0, 1.0, 2.0, 3.0));\n" + " mat2 m = cm * mult;\n" + " gl_FragColor = vec4(m[0], m[1]);\n" + "}\n"; + compile(shaderString); + float outputElements[] = + { + 0.0f, 1.0f, + 2.0f, 3.0f + }; + std::vector<float> result(outputElements, outputElements + 4); + ASSERT_TRUE(constantColumnMajorMatrixFoundInAST(result)); +} + +// Test that constant mat2 initialization with an int parameter works correctly. +TEST_F(ConstantFoldingTest, FoldMat2ConstructorTakingScalar) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform float mult;\n" + "void main() {\n" + " const mat2 cm = mat2(3);\n" + " mat2 m = cm * mult;\n" + " gl_FragColor = vec4(m[0], m[1]);\n" + "}\n"; + compile(shaderString); + float outputElements[] = + { + 3.0f, 0.0f, + 0.0f, 3.0f + }; + std::vector<float> result(outputElements, outputElements + 4); + ASSERT_TRUE(constantColumnMajorMatrixFoundInAST(result)); +} + +// Test that constant mat2 initialization with a mix of parameters works correctly. +TEST_F(ConstantFoldingTest, FoldMat2ConstructorTakingMix) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform float mult;\n" + "void main() {\n" + " const mat2 cm = mat2(-1, vec2(0.0, 1.0), vec4(2.0));\n" + " mat2 m = cm * mult;\n" + " gl_FragColor = vec4(m[0], m[1]);\n" + "}\n"; + compile(shaderString); + float outputElements[] = + { + -1.0, 0.0f, + 1.0f, 2.0f + }; + std::vector<float> result(outputElements, outputElements + 4); + ASSERT_TRUE(constantColumnMajorMatrixFoundInAST(result)); +} + +// Test that constant mat2 initialization with a mat3 parameter works correctly. +TEST_F(ConstantFoldingTest, FoldMat2ConstructorTakingMat3) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform float mult;\n" + "void main() {\n" + " const mat2 cm = mat2(mat3(0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0));\n" + " mat2 m = cm * mult;\n" + " gl_FragColor = vec4(m[0], m[1]);\n" + "}\n"; + compile(shaderString); + float outputElements[] = + { + 0.0f, 1.0f, + 3.0f, 4.0f + }; + std::vector<float> result(outputElements, outputElements + 4); + ASSERT_TRUE(constantColumnMajorMatrixFoundInAST(result)); +} + +// Test that constant mat4x3 initialization with a mat3x2 parameter works correctly. +TEST_F(ConstantFoldingTest, FoldMat4x3ConstructorTakingMat3x2) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "uniform float mult;\n" + "out vec4 my_FragColor;\n" + "void main() {\n" + " const mat4x3 cm = mat4x3(mat3x2(1.0, 2.0,\n" + " 3.0, 4.0,\n" + " 5.0, 6.0));\n" + " mat4x3 m = cm * mult;\n" + " my_FragColor = vec4(m[0], m[1][0]);\n" + "}\n"; + compile(shaderString); + float outputElements[] = + { + 1.0f, 2.0f, 0.0f, + 3.0f, 4.0f, 0.0f, + 5.0f, 6.0f, 1.0f, + 0.0f, 0.0f, 0.0f + }; + std::vector<float> result(outputElements, outputElements + 12); + ASSERT_TRUE(constantColumnMajorMatrixFoundInAST(result)); +} + + +// Test that constant mat2 initialization with a vec4 parameter works correctly. +TEST_F(ConstantFoldingTest, FoldMat2ConstructorTakingVec4) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform float mult;\n" + "void main() {\n" + " const mat2 cm = mat2(vec4(0.0, 1.0, 2.0, 3.0));\n" + " mat2 m = cm * mult;\n" + " gl_FragColor = vec4(m[0], m[1]);\n" + "}\n"; + compile(shaderString); + float outputElements[] = + { + 0.0f, 1.0f, + 2.0f, 3.0f + }; + std::vector<float> result(outputElements, outputElements + 4); + ASSERT_TRUE(constantColumnMajorMatrixFoundInAST(result)); +} + +// Test that equality comparison of two different structs with a nested struct inside returns false. +TEST_F(ConstantFoldingTest, FoldNestedDifferentStructEqualityComparison) +{ + const std::string &shaderString = + "precision mediump float;\n" + "struct nested {\n" + " float f\n;" + "};\n" + "struct S {\n" + " nested a;\n" + " float f;\n" + "};\n" + "uniform vec4 mult;\n" + "void main()\n" + "{\n" + " const S s1 = S(nested(0.0), 2.0);\n" + " const S s2 = S(nested(0.0), 3.0);\n" + " gl_FragColor = (s1 == s2 ? 1.0 : 0.5) * mult;\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(constantFoundInAST(0.5f)); +} + +// Test that equality comparison of two identical structs with a nested struct inside returns true. +TEST_F(ConstantFoldingTest, FoldNestedIdenticalStructEqualityComparison) +{ + const std::string &shaderString = + "precision mediump float;\n" + "struct nested {\n" + " float f\n;" + "};\n" + "struct S {\n" + " nested a;\n" + " float f;\n" + " int i;\n" + "};\n" + "uniform vec4 mult;\n" + "void main()\n" + "{\n" + " const S s1 = S(nested(0.0), 2.0, 3);\n" + " const S s2 = S(nested(0.0), 2.0, 3);\n" + " gl_FragColor = (s1 == s2 ? 1.0 : 0.5) * mult;\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(constantFoundInAST(1.0f)); +} + +// Test that right elements are chosen from non-square matrix +TEST_F(ConstantFoldingTest, FoldNonSquareMatrixIndexing) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " my_FragColor = mat3x4(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)[1];\n" + "}\n"; + compile(shaderString); + float outputElements[] = {4.0f, 5.0f, 6.0f, 7.0f}; + std::vector<float> result(outputElements, outputElements + 4); + ASSERT_TRUE(constantVectorFoundInAST(result)); +} + +// Test that folding outer product of vectors with non-matching lengths works. +TEST_F(ConstantFoldingTest, FoldNonSquareOuterProduct) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " mat3x2 prod = outerProduct(vec2(2.0, 3.0), vec3(5.0, 7.0, 11.0));\n" + " my_FragColor = vec4(prod[0].x);\n" + "}\n"; + compile(shaderString); + // clang-format off + float outputElements[] = + { + 10.0f, 15.0f, + 14.0f, 21.0f, + 22.0f, 33.0f + }; + // clang-format on + std::vector<float> result(outputElements, outputElements + 6); + ASSERT_TRUE(constantColumnMajorMatrixFoundInAST(result)); +} + +// Test that folding bit shift left with non-matching signedness works. +TEST_F(ConstantFoldingTest, FoldBitShiftLeftDifferentSignedness) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " uint u = 0xffffffffu << 31;\n" + " my_FragColor = vec4(u);\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(constantFoundInAST(0x80000000u)); +} + +// Test that folding bit shift right with non-matching signedness works. +TEST_F(ConstantFoldingTest, FoldBitShiftRightDifferentSignedness) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " uint u = 0xffffffffu >> 30;\n" + " my_FragColor = vec4(u);\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(constantFoundInAST(0x3u)); +} + +// Test that folding signed bit shift right extends the sign bit. +// ESSL 3.00.6 section 5.9 Expressions. +TEST_F(ConstantFoldingTest, FoldBitShiftRightExtendSignBit) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " const int i = 0x8fffe000 >> 6;\n" + " uint u = uint(i);" + " my_FragColor = vec4(u);\n" + "}\n"; + compile(shaderString); + // The bits of the operand are 0x8fffe000 = 1000 1111 1111 1111 1110 0000 0000 0000 + // After shifting, they become 1111 1110 0011 1111 1111 1111 1000 0000 = 0xfe3fff80 + ASSERT_TRUE(constantFoundInAST(0xfe3fff80u)); +} + +// Signed bit shift left should interpret its operand as a bit pattern. As a consequence a number +// may turn from positive to negative when shifted left. +// ESSL 3.00.6 section 5.9 Expressions. +TEST_F(ConstantFoldingTest, FoldBitShiftLeftInterpretedAsBitPattern) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " const int i = 0x1fffffff << 3;\n" + " uint u = uint(i);" + " my_FragColor = vec4(u);\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(constantFoundInAST(0xfffffff8u)); +} + +// Test that dividing the minimum signed integer by -1 works. +// ESSL 3.00.6 section 4.1.3 Integers: +// "However, for the case where the minimum representable value is divided by -1, it is allowed to +// return either the minimum representable value or the maximum representable value." +TEST_F(ConstantFoldingTest, FoldDivideMinimumIntegerByMinusOne) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " int i = 0x80000000 / (-1);\n" + " my_FragColor = vec4(i);\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(constantFoundInAST(0x7fffffff) || constantFoundInAST(-0x7fffffff - 1)); +} + +// Test that folding an unsigned integer addition that overflows works. +// ESSL 3.00.6 section 4.1.3 Integers: +// "For all precisions, operations resulting in overflow or underflow will not cause any exception, +// nor will they saturate, rather they will 'wrap' to yield the low-order n bits of the result where +// n is the size in bits of the integer." +TEST_F(ConstantFoldingTest, FoldUnsignedIntegerAddOverflow) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " uint u = 0xffffffffu + 43u;\n" + " my_FragColor = vec4(u);\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(constantFoundInAST(42u)); +} + +// Test that folding a signed integer addition that overflows works. +// ESSL 3.00.6 section 4.1.3 Integers: +// "For all precisions, operations resulting in overflow or underflow will not cause any exception, +// nor will they saturate, rather they will 'wrap' to yield the low-order n bits of the result where +// n is the size in bits of the integer." +TEST_F(ConstantFoldingTest, FoldSignedIntegerAddOverflow) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " int i = 0x7fffffff + 4;\n" + " my_FragColor = vec4(i);\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(constantFoundInAST(-0x7ffffffd)); +} + +// Test that folding an unsigned integer subtraction that overflows works. +// ESSL 3.00.6 section 4.1.3 Integers: +// "For all precisions, operations resulting in overflow or underflow will not cause any exception, +// nor will they saturate, rather they will 'wrap' to yield the low-order n bits of the result where +// n is the size in bits of the integer." +TEST_F(ConstantFoldingTest, FoldUnsignedIntegerDiffOverflow) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " uint u = 0u - 5u;\n" + " my_FragColor = vec4(u);\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(constantFoundInAST(0xfffffffbu)); +} + +// Test that folding a signed integer subtraction that overflows works. +// ESSL 3.00.6 section 4.1.3 Integers: +// "For all precisions, operations resulting in overflow or underflow will not cause any exception, +// nor will they saturate, rather they will 'wrap' to yield the low-order n bits of the result where +// n is the size in bits of the integer." +TEST_F(ConstantFoldingTest, FoldSignedIntegerDiffOverflow) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " int i = -0x7fffffff - 7;\n" + " my_FragColor = vec4(i);\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(constantFoundInAST(0x7ffffffa)); +} + +// Test that folding an unsigned integer multiplication that overflows works. +// ESSL 3.00.6 section 4.1.3 Integers: +// "For all precisions, operations resulting in overflow or underflow will not cause any exception, +// nor will they saturate, rather they will 'wrap' to yield the low-order n bits of the result where +// n is the size in bits of the integer." +TEST_F(ConstantFoldingTest, FoldUnsignedIntegerMultiplyOverflow) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " uint u = 0xffffffffu * 10u;\n" + " my_FragColor = vec4(u);\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(constantFoundInAST(0xfffffff6u)); +} + +// Test that folding a signed integer multiplication that overflows works. +// ESSL 3.00.6 section 4.1.3 Integers: +// "For all precisions, operations resulting in overflow or underflow will not cause any exception, +// nor will they saturate, rather they will 'wrap' to yield the low-order n bits of the result where +// n is the size in bits of the integer." +TEST_F(ConstantFoldingTest, FoldSignedIntegerMultiplyOverflow) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " int i = 0x7fffffff * 42;\n" + " my_FragColor = vec4(i);\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(constantFoundInAST(-42)); +} + +// Test that folding of negating the minimum representable integer works. Note that in the test +// "0x80000000" is a negative literal, and the minus sign before it is the negation operator. +// ESSL 3.00.6 section 4.1.3 Integers: +// "For all precisions, operations resulting in overflow or underflow will not cause any exception, +// nor will they saturate, rather they will 'wrap' to yield the low-order n bits of the result where +// n is the size in bits of the integer." +TEST_F(ConstantFoldingTest, FoldMinimumSignedIntegerNegation) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " int i = -0x80000000;\n" + " my_FragColor = vec4(i);\n" + "}\n"; + compile(shaderString); + // Negating the minimum signed integer overflows the positive range, so it wraps back to itself. + ASSERT_TRUE(constantFoundInAST(-0x7fffffff - 1)); +} + +// Test that folding of shifting the minimum representable integer works. +TEST_F(ConstantFoldingTest, FoldMinimumSignedIntegerRightShift) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " int i = (0x80000000 >> 1);\n" + " int j = (0x80000000 >> 7);\n" + " my_FragColor = vec4(i, j, i, j);\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(constantFoundInAST(-0x40000000)); + ASSERT_TRUE(constantFoundInAST(-0x01000000)); +} + +// Test that folding of shifting by 0 works. +TEST_F(ConstantFoldingTest, FoldShiftByZero) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " int i = (3 >> 0);\n" + " int j = (73 << 0);\n" + " my_FragColor = vec4(i, j, i, j);\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(constantFoundInAST(3)); + ASSERT_TRUE(constantFoundInAST(73)); +} diff --git a/gfx/angle/src/tests/compiler_tests/DebugShaderPrecision_test.cpp b/gfx/angle/src/tests/compiler_tests/DebugShaderPrecision_test.cpp new file mode 100755 index 000000000..d1bee424a --- /dev/null +++ b/gfx/angle/src/tests/compiler_tests/DebugShaderPrecision_test.cpp @@ -0,0 +1,1047 @@ +// +// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// DebugShaderPrecision_test.cpp: +// Tests for writing the code for shader precision emulation. +// + +#include "angle_gl.h" +#include "gtest/gtest.h" +#include "GLSLANG/ShaderLang.h" +#include "tests/test_utils/compiler_test.h" + +using namespace sh; + +class DebugShaderPrecisionTest : public MatchOutputCodeTest +{ + public: + DebugShaderPrecisionTest() : MatchOutputCodeTest(GL_FRAGMENT_SHADER, 0, SH_ESSL_OUTPUT) + { + addOutputType(SH_GLSL_COMPATIBILITY_OUTPUT); +#if defined(ANGLE_ENABLE_HLSL) + addOutputType(SH_HLSL_4_1_OUTPUT); +#endif + getResources()->WEBGL_debug_shader_precision = 1; + } + + protected: + bool foundInAllGLSLCode(const char *str) + { + return foundInCode(SH_GLSL_COMPATIBILITY_OUTPUT, str) && foundInCode(SH_ESSL_OUTPUT, str); + } + + bool foundInHLSLCode(const char *stringToFind) const + { +#if defined(ANGLE_ENABLE_HLSL) + return foundInCode(SH_HLSL_4_1_OUTPUT, stringToFind); +#else + return true; +#endif + } +}; + +class NoDebugShaderPrecisionTest : public MatchOutputCodeTest +{ + public: + NoDebugShaderPrecisionTest() + : MatchOutputCodeTest(GL_FRAGMENT_SHADER, 0, SH_GLSL_COMPATIBILITY_OUTPUT) + { + } +}; + +TEST_F(DebugShaderPrecisionTest, RoundingFunctionsDefined) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform float u;\n" + "void main() {\n" + " gl_FragColor = vec4(u);\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(foundInESSLCode("highp float angle_frm(in highp float")); + ASSERT_TRUE(foundInESSLCode("highp vec2 angle_frm(in highp vec2")); + ASSERT_TRUE(foundInESSLCode("highp vec3 angle_frm(in highp vec3")); + ASSERT_TRUE(foundInESSLCode("highp vec4 angle_frm(in highp vec4")); + ASSERT_TRUE(foundInESSLCode("highp mat2 angle_frm(in highp mat2")); + ASSERT_TRUE(foundInESSLCode("highp mat3 angle_frm(in highp mat3")); + ASSERT_TRUE(foundInESSLCode("highp mat4 angle_frm(in highp mat4")); + + ASSERT_TRUE(foundInESSLCode("highp float angle_frl(in highp float")); + ASSERT_TRUE(foundInESSLCode("highp vec2 angle_frl(in highp vec2")); + ASSERT_TRUE(foundInESSLCode("highp vec3 angle_frl(in highp vec3")); + ASSERT_TRUE(foundInESSLCode("highp vec4 angle_frl(in highp vec4")); + ASSERT_TRUE(foundInESSLCode("highp mat2 angle_frl(in highp mat2")); + ASSERT_TRUE(foundInESSLCode("highp mat3 angle_frl(in highp mat3")); + ASSERT_TRUE(foundInESSLCode("highp mat4 angle_frl(in highp mat4")); + + ASSERT_TRUE(foundInGLSLCode("float angle_frm(in float")); + ASSERT_TRUE(foundInGLSLCode("vec2 angle_frm(in vec2")); + ASSERT_TRUE(foundInGLSLCode("vec3 angle_frm(in vec3")); + ASSERT_TRUE(foundInGLSLCode("vec4 angle_frm(in vec4")); + ASSERT_TRUE(foundInGLSLCode("mat2 angle_frm(in mat2")); + ASSERT_TRUE(foundInGLSLCode("mat3 angle_frm(in mat3")); + ASSERT_TRUE(foundInGLSLCode("mat4 angle_frm(in mat4")); + + ASSERT_TRUE(foundInGLSLCode("float angle_frl(in float")); + ASSERT_TRUE(foundInGLSLCode("vec2 angle_frl(in vec2")); + ASSERT_TRUE(foundInGLSLCode("vec3 angle_frl(in vec3")); + ASSERT_TRUE(foundInGLSLCode("vec4 angle_frl(in vec4")); + ASSERT_TRUE(foundInGLSLCode("mat2 angle_frl(in mat2")); + ASSERT_TRUE(foundInGLSLCode("mat3 angle_frl(in mat3")); + ASSERT_TRUE(foundInGLSLCode("mat4 angle_frl(in mat4")); + + ASSERT_TRUE(foundInHLSLCode("float1 angle_frm(float1")); + ASSERT_TRUE(foundInHLSLCode("float2 angle_frm(float2")); + ASSERT_TRUE(foundInHLSLCode("float3 angle_frm(float3")); + ASSERT_TRUE(foundInHLSLCode("float4 angle_frm(float4")); + ASSERT_TRUE(foundInHLSLCode("float2x2 angle_frm(float2x2")); + ASSERT_TRUE(foundInHLSLCode("float3x3 angle_frm(float3x3")); + ASSERT_TRUE(foundInHLSLCode("float4x4 angle_frm(float4x4")); + + ASSERT_TRUE(foundInHLSLCode("float1 angle_frl(float1")); + ASSERT_TRUE(foundInHLSLCode("float2 angle_frl(float2")); + ASSERT_TRUE(foundInHLSLCode("float3 angle_frl(float3")); + ASSERT_TRUE(foundInHLSLCode("float4 angle_frl(float4")); + ASSERT_TRUE(foundInHLSLCode("float2x2 angle_frl(float2x2")); + ASSERT_TRUE(foundInHLSLCode("float3x3 angle_frl(float3x3")); + ASSERT_TRUE(foundInHLSLCode("float4x4 angle_frl(float4x4")); + + // Check that ESSL 3.00 rounding functions for non-square matrices are not defined. + ASSERT_TRUE(notFoundInCode("mat2x")); + ASSERT_TRUE(notFoundInCode("mat3x")); + ASSERT_TRUE(notFoundInCode("mat4x")); +} + +// Test that all ESSL 3.00 shaders get rounding function definitions for non-square matrices. +TEST_F(DebugShaderPrecisionTest, NonSquareMatrixRoundingFunctionsDefinedES3) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "uniform float u;\n" + "out vec4 my_FragColor;\n" + "void main() {\n" + " my_FragColor = vec4(u);\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(foundInESSLCode("highp mat2x3 angle_frm(in highp mat2x3")); + ASSERT_TRUE(foundInESSLCode("highp mat2x4 angle_frm(in highp mat2x4")); + ASSERT_TRUE(foundInESSLCode("highp mat3x2 angle_frm(in highp mat3x2")); + ASSERT_TRUE(foundInESSLCode("highp mat3x4 angle_frm(in highp mat3x4")); + ASSERT_TRUE(foundInESSLCode("highp mat4x2 angle_frm(in highp mat4x2")); + ASSERT_TRUE(foundInESSLCode("highp mat4x3 angle_frm(in highp mat4x3")); + + ASSERT_TRUE(foundInESSLCode("highp mat2x3 angle_frl(in highp mat2x3")); + ASSERT_TRUE(foundInESSLCode("highp mat2x4 angle_frl(in highp mat2x4")); + ASSERT_TRUE(foundInESSLCode("highp mat3x2 angle_frl(in highp mat3x2")); + ASSERT_TRUE(foundInESSLCode("highp mat3x4 angle_frl(in highp mat3x4")); + ASSERT_TRUE(foundInESSLCode("highp mat4x2 angle_frl(in highp mat4x2")); + ASSERT_TRUE(foundInESSLCode("highp mat4x3 angle_frl(in highp mat4x3")); + + ASSERT_TRUE(foundInGLSLCode("mat2x3 angle_frm(in mat2x3")); + ASSERT_TRUE(foundInGLSLCode("mat2x4 angle_frm(in mat2x4")); + ASSERT_TRUE(foundInGLSLCode("mat3x2 angle_frm(in mat3x2")); + ASSERT_TRUE(foundInGLSLCode("mat3x4 angle_frm(in mat3x4")); + ASSERT_TRUE(foundInGLSLCode("mat4x2 angle_frm(in mat4x2")); + ASSERT_TRUE(foundInGLSLCode("mat4x3 angle_frm(in mat4x3")); + + ASSERT_TRUE(foundInGLSLCode("mat2x3 angle_frl(in mat2x3")); + ASSERT_TRUE(foundInGLSLCode("mat2x4 angle_frl(in mat2x4")); + ASSERT_TRUE(foundInGLSLCode("mat3x2 angle_frl(in mat3x2")); + ASSERT_TRUE(foundInGLSLCode("mat3x4 angle_frl(in mat3x4")); + ASSERT_TRUE(foundInGLSLCode("mat4x2 angle_frl(in mat4x2")); + ASSERT_TRUE(foundInGLSLCode("mat4x3 angle_frl(in mat4x3")); + + ASSERT_TRUE(foundInHLSLCode("float2x3 angle_frm(float2x3")); + ASSERT_TRUE(foundInHLSLCode("float2x4 angle_frm(float2x4")); + ASSERT_TRUE(foundInHLSLCode("float3x2 angle_frm(float3x2")); + ASSERT_TRUE(foundInHLSLCode("float3x4 angle_frm(float3x4")); + ASSERT_TRUE(foundInHLSLCode("float4x2 angle_frm(float4x2")); + ASSERT_TRUE(foundInHLSLCode("float4x3 angle_frm(float4x3")); + + ASSERT_TRUE(foundInHLSLCode("float2x3 angle_frl(float2x3")); + ASSERT_TRUE(foundInHLSLCode("float2x4 angle_frl(float2x4")); + ASSERT_TRUE(foundInHLSLCode("float3x2 angle_frl(float3x2")); + ASSERT_TRUE(foundInHLSLCode("float3x4 angle_frl(float3x4")); + ASSERT_TRUE(foundInHLSLCode("float4x2 angle_frl(float4x2")); + ASSERT_TRUE(foundInHLSLCode("float4x3 angle_frl(float4x3")); +} + +TEST_F(DebugShaderPrecisionTest, PragmaDisablesEmulation) +{ + const std::string &shaderString = + "#pragma webgl_debug_shader_precision(off)\n" + "precision mediump float;\n" + "uniform float u;\n" + "void main() {\n" + " gl_FragColor = vec4(u);\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(notFoundInCode("angle_frm")); + const std::string &shaderStringPragmaOn = + "#pragma webgl_debug_shader_precision(on)\n" + "precision mediump float;\n" + "uniform float u;\n" + "void main() {\n" + " gl_FragColor = vec4(u);\n" + "}\n"; + compile(shaderStringPragmaOn); + ASSERT_TRUE(foundInCode("angle_frm")); +} + +// Emulation can't be toggled on for only a part of a shader. +// Only the last pragma in the shader has an effect. +TEST_F(DebugShaderPrecisionTest, MultiplePragmas) +{ + const std::string &shaderString = + "#pragma webgl_debug_shader_precision(off)\n" + "precision mediump float;\n" + "uniform float u;\n" + "void main() {\n" + " gl_FragColor = vec4(u);\n" + "}\n" + "#pragma webgl_debug_shader_precision(on)\n"; + compile(shaderString); + ASSERT_TRUE(foundInCode("angle_frm")); +} + +TEST_F(NoDebugShaderPrecisionTest, HelpersWrittenOnlyWithExtension) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform float u;\n" + "void main() {\n" + " gl_FragColor = vec4(u);\n" + "}\n"; + compile(shaderString); + ASSERT_FALSE(foundInCode("angle_frm")); +} + +TEST_F(NoDebugShaderPrecisionTest, PragmaHasEffectsOnlyWithExtension) +{ + const std::string &shaderString = + "#pragma webgl_debug_shader_precision(on)\n" + "precision mediump float;\n" + "uniform float u;\n" + "void main() {\n" + " gl_FragColor = vec4(u);\n" + "}\n"; + compile(shaderString); + ASSERT_FALSE(foundInCode("angle_frm")); +} + +TEST_F(DebugShaderPrecisionTest, DeclarationsAndConstants) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform vec4 f;\n" + "uniform float uu, uu2;\n" + "varying float vv, vv2;\n" + "float gg = 0.0, gg2;\n" + "void main() {\n" + " float aa = 0.0, aa2;\n" + " gl_FragColor = f;\n" + "}\n"; + compile(shaderString); + // Declarations or constants should not have rounding inserted around them + ASSERT_TRUE(notFoundInCode("angle_frm(0")); + ASSERT_TRUE(notFoundInCode("angle_frm(uu")); + ASSERT_TRUE(notFoundInCode("angle_frm(vv")); + ASSERT_TRUE(notFoundInCode("angle_frm(gg")); + ASSERT_TRUE(notFoundInCode("angle_frm(aa")); +} + +// Test that expressions that are part of initialization have rounding. +TEST_F(DebugShaderPrecisionTest, InitializerRounding) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform float u;\n" + "void main() {\n" + " float a = u;\n" + " gl_FragColor = vec4(a);\n" + "}\n"; + compile(shaderString); + // An expression that's part of initialization should have rounding + ASSERT_TRUE(foundInAllGLSLCode("angle_frm(u)")); + ASSERT_TRUE(foundInHLSLCode("angle_frm(_u)")); +} + +// Test that compound additions have rounding in the GLSL translations. +TEST_F(DebugShaderPrecisionTest, CompoundAddFunction) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform vec4 u;\n" + "uniform vec4 u2;\n" + "void main() {\n" + " vec4 v = u;\n" + " v += u2;\n" + " gl_FragColor = v;\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(foundInESSLCode( + "highp vec4 angle_compound_add_frm(inout highp vec4 x, in highp vec4 y) {\n" + " x = angle_frm(angle_frm(x) + y);" + )); + ASSERT_TRUE(foundInGLSLCode( + "vec4 angle_compound_add_frm(inout vec4 x, in vec4 y) {\n" + " x = angle_frm(angle_frm(x) + y);" + )); + ASSERT_TRUE( + foundInHLSLCode("float4 angle_compound_add_frm(inout float4 x, in float4 y) {\n" + " x = angle_frm(angle_frm(x) + y);")); + ASSERT_TRUE(foundInAllGLSLCode("angle_compound_add_frm(v, angle_frm(u2));")); + ASSERT_TRUE(foundInHLSLCode("angle_compound_add_frm(_v, angle_frm(_u2));")); + ASSERT_TRUE(notFoundInCode("+=")); +} + +TEST_F(DebugShaderPrecisionTest, CompoundSubFunction) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform vec4 u;\n" + "uniform vec4 u2;\n" + "void main() {\n" + " vec4 v = u;\n" + " v -= u2;\n" + " gl_FragColor = v;\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(foundInESSLCode( + "highp vec4 angle_compound_sub_frm(inout highp vec4 x, in highp vec4 y) {\n" + " x = angle_frm(angle_frm(x) - y);" + )); + ASSERT_TRUE(foundInGLSLCode( + "vec4 angle_compound_sub_frm(inout vec4 x, in vec4 y) {\n" + " x = angle_frm(angle_frm(x) - y);" + )); + ASSERT_TRUE( + foundInHLSLCode("float4 angle_compound_sub_frm(inout float4 x, in float4 y) {\n" + " x = angle_frm(angle_frm(x) - y);")); + ASSERT_TRUE(foundInAllGLSLCode("angle_compound_sub_frm(v, angle_frm(u2));")); + ASSERT_TRUE(foundInHLSLCode("angle_compound_sub_frm(_v, angle_frm(_u2));")); + ASSERT_TRUE(notFoundInCode("-=")); +} + +TEST_F(DebugShaderPrecisionTest, CompoundDivFunction) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform vec4 u;\n" + "uniform vec4 u2;\n" + "void main() {\n" + " vec4 v = u;\n" + " v /= u2;\n" + " gl_FragColor = v;\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(foundInESSLCode( + "highp vec4 angle_compound_div_frm(inout highp vec4 x, in highp vec4 y) {\n" + " x = angle_frm(angle_frm(x) / y);" + )); + ASSERT_TRUE(foundInGLSLCode( + "vec4 angle_compound_div_frm(inout vec4 x, in vec4 y) {\n" + " x = angle_frm(angle_frm(x) / y);" + )); + ASSERT_TRUE( + foundInHLSLCode("float4 angle_compound_div_frm(inout float4 x, in float4 y) {\n" + " x = angle_frm(angle_frm(x) / y);")); + ASSERT_TRUE(foundInAllGLSLCode("angle_compound_div_frm(v, angle_frm(u2));")); + ASSERT_TRUE(foundInHLSLCode("angle_compound_div_frm(_v, angle_frm(_u2));")); + ASSERT_TRUE(notFoundInCode("/=")); +} + +TEST_F(DebugShaderPrecisionTest, CompoundMulFunction) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform vec4 u;\n" + "uniform vec4 u2;\n" + "void main() {\n" + " vec4 v = u;\n" + " v *= u2;\n" + " gl_FragColor = v;\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(foundInESSLCode( + "highp vec4 angle_compound_mul_frm(inout highp vec4 x, in highp vec4 y) {\n" + " x = angle_frm(angle_frm(x) * y);" + )); + ASSERT_TRUE(foundInGLSLCode( + "vec4 angle_compound_mul_frm(inout vec4 x, in vec4 y) {\n" + " x = angle_frm(angle_frm(x) * y);" + )); + ASSERT_TRUE( + foundInHLSLCode("float4 angle_compound_mul_frm(inout float4 x, in float4 y) {\n" + " x = angle_frm(angle_frm(x) * y);")); + ASSERT_TRUE(foundInAllGLSLCode("angle_compound_mul_frm(v, angle_frm(u2));")); + ASSERT_TRUE(foundInHLSLCode("angle_compound_mul_frm(_v, angle_frm(_u2));")); + ASSERT_TRUE(notFoundInCode("*=")); +} + +TEST_F(DebugShaderPrecisionTest, CompoundAddVectorPlusScalarFunction) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform vec4 u;\n" + "uniform float u2;\n" + "void main() {\n" + " vec4 v = u;\n" + " v += u2;\n" + " gl_FragColor = v;\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(foundInESSLCode( + "highp vec4 angle_compound_add_frm(inout highp vec4 x, in highp float y) {\n" + " x = angle_frm(angle_frm(x) + y);" + )); + ASSERT_TRUE(foundInGLSLCode( + "vec4 angle_compound_add_frm(inout vec4 x, in float y) {\n" + " x = angle_frm(angle_frm(x) + y);" + )); + ASSERT_TRUE( + foundInHLSLCode("float4 angle_compound_add_frm(inout float4 x, in float y) {\n" + " x = angle_frm(angle_frm(x) + y);")); + ASSERT_TRUE(foundInAllGLSLCode("angle_compound_add_frm(v, angle_frm(u2));")); + ASSERT_TRUE(foundInHLSLCode("angle_compound_add_frm(_v, angle_frm(_u2));")); + ASSERT_TRUE(notFoundInCode("+=")); +} + +TEST_F(DebugShaderPrecisionTest, CompoundMatrixTimesMatrixFunction) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform mat4 u;\n" + "uniform mat4 u2;\n" + "void main() {\n" + " mat4 m = u;\n" + " m *= u2;\n" + " gl_FragColor = m[0];\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(foundInESSLCode( + "highp mat4 angle_compound_mul_frm(inout highp mat4 x, in highp mat4 y) {\n" + " x = angle_frm(angle_frm(x) * y);" + )); + ASSERT_TRUE(foundInGLSLCode( + "mat4 angle_compound_mul_frm(inout mat4 x, in mat4 y) {\n" + " x = angle_frm(angle_frm(x) * y);" + )); + ASSERT_TRUE( + foundInHLSLCode("float4x4 angle_compound_mul_frm(inout float4x4 x, in float4x4 y) {\n" + " x = angle_frm(angle_frm(x) * y);")); + ASSERT_TRUE(foundInAllGLSLCode("angle_compound_mul_frm(m, angle_frm(u2));")); + ASSERT_TRUE(foundInHLSLCode("angle_compound_mul_frm(_m, angle_frm(_u2));")); + ASSERT_TRUE(notFoundInCode("*=")); +} + +// Test that compound multiplying a non-square matrix with another matrix gets translated into an +// angle_compound_mul function call. +TEST_F(DebugShaderPrecisionTest, CompoundNonSquareMatrixTimesMatrixFunction) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "uniform mat2x4 u;\n" + "uniform mat2 u2;\n" + "out vec4 my_FragColor;\n" + "void main() {\n" + " mat2x4 m = u;\n" + " m *= u2;\n" + " my_FragColor = m[0];\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(foundInESSLCode( + "highp mat2x4 angle_compound_mul_frm(inout highp mat2x4 x, in highp mat2 y) {\n" + " x = angle_frm(angle_frm(x) * y);")); + ASSERT_TRUE( + foundInGLSLCode("mat2x4 angle_compound_mul_frm(inout mat2x4 x, in mat2 y) {\n" + " x = angle_frm(angle_frm(x) * y);")); + ASSERT_TRUE( + foundInHLSLCode("float2x4 angle_compound_mul_frm(inout float2x4 x, in float2x2 y) {\n" + " x = angle_frm(angle_frm(x) * y);")); + ASSERT_TRUE(foundInAllGLSLCode("angle_compound_mul_frm(m, angle_frm(u2));")); + ASSERT_TRUE(foundInHLSLCode("angle_compound_mul_frm(_m, angle_frm(_u2));")); + ASSERT_TRUE(notFoundInCode("*=")); +} + +TEST_F(DebugShaderPrecisionTest, CompoundMatrixTimesScalarFunction) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform mat4 u;\n" + "uniform float u2;\n" + "void main() {\n" + " mat4 m = u;\n" + " m *= u2;\n" + " gl_FragColor = m[0];\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(foundInESSLCode( + "highp mat4 angle_compound_mul_frm(inout highp mat4 x, in highp float y) {\n" + " x = angle_frm(angle_frm(x) * y);" + )); + ASSERT_TRUE(foundInGLSLCode( + "mat4 angle_compound_mul_frm(inout mat4 x, in float y) {\n" + " x = angle_frm(angle_frm(x) * y);" + )); + ASSERT_TRUE( + foundInHLSLCode("float4x4 angle_compound_mul_frm(inout float4x4 x, in float y) {\n" + " x = angle_frm(angle_frm(x) * y);")); + ASSERT_TRUE(foundInAllGLSLCode("angle_compound_mul_frm(m, angle_frm(u2));")); + ASSERT_TRUE(foundInHLSLCode("angle_compound_mul_frm(_m, angle_frm(_u2));")); + ASSERT_TRUE(notFoundInCode("*=")); +} + +TEST_F(DebugShaderPrecisionTest, CompoundVectorTimesMatrixFunction) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform vec4 u;\n" + "uniform mat4 u2;\n" + "void main() {\n" + " vec4 v = u;\n" + " v *= u2;\n" + " gl_FragColor = v;\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(foundInESSLCode( + "highp vec4 angle_compound_mul_frm(inout highp vec4 x, in highp mat4 y) {\n" + " x = angle_frm(angle_frm(x) * y);" + )); + ASSERT_TRUE(foundInGLSLCode("vec4 angle_compound_mul_frm(inout vec4 x, in mat4 y) {\n" + " x = angle_frm(angle_frm(x) * y);" + )); + ASSERT_TRUE( + foundInHLSLCode("float4 angle_compound_mul_frm(inout float4 x, in float4x4 y) {\n" + " x = angle_frm(angle_frm(x) * y);")); + ASSERT_TRUE(foundInAllGLSLCode("angle_compound_mul_frm(v, angle_frm(u2));")); + ASSERT_TRUE(foundInHLSLCode("angle_compound_mul_frm(_v, angle_frm(_u2));")); + ASSERT_TRUE(notFoundInCode("*=")); +} + +TEST_F(DebugShaderPrecisionTest, CompoundVectorTimesScalarFunction) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform vec4 u;\n" + "uniform float u2;\n" + "void main() {\n" + " vec4 v = u;\n" + " v *= u2;\n" + " gl_FragColor = v;\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(foundInESSLCode( + "highp vec4 angle_compound_mul_frm(inout highp vec4 x, in highp float y) {\n" + " x = angle_frm(angle_frm(x) * y);" + )); + ASSERT_TRUE(foundInGLSLCode( + "vec4 angle_compound_mul_frm(inout vec4 x, in float y) {\n" + " x = angle_frm(angle_frm(x) * y);" + )); + ASSERT_TRUE( + foundInHLSLCode("float4 angle_compound_mul_frm(inout float4 x, in float y) {\n" + " x = angle_frm(angle_frm(x) * y);")); + ASSERT_TRUE(foundInAllGLSLCode("angle_compound_mul_frm(v, angle_frm(u2));")); + ASSERT_TRUE(foundInHLSLCode("angle_compound_mul_frm(_v, angle_frm(_u2));")); + ASSERT_TRUE(notFoundInCode("*=")); +} + +TEST_F(DebugShaderPrecisionTest, BinaryMathRounding) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform vec4 u1;\n" + "uniform vec4 u2;\n" + "uniform vec4 u3;\n" + "uniform vec4 u4;\n" + "uniform vec4 u5;\n" + "void main() {\n" + " vec4 v1 = u1 + u2;\n" + " vec4 v2 = u2 - u3;\n" + " vec4 v3 = u3 * u4;\n" + " vec4 v4 = u4 / u5;\n" + " vec4 v5;\n" + " vec4 v6 = (v5 = u5);\n" + " gl_FragColor = v1 + v2 + v3 + v4;\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(foundInAllGLSLCode("v1 = angle_frm((angle_frm(u1) + angle_frm(u2)))")); + ASSERT_TRUE(foundInAllGLSLCode("v2 = angle_frm((angle_frm(u2) - angle_frm(u3)))")); + ASSERT_TRUE(foundInAllGLSLCode("v3 = angle_frm((angle_frm(u3) * angle_frm(u4)))")); + ASSERT_TRUE(foundInAllGLSLCode("v4 = angle_frm((angle_frm(u4) / angle_frm(u5)))")); + ASSERT_TRUE(foundInAllGLSLCode("v6 = angle_frm((v5 = angle_frm(u5)))")); + + ASSERT_TRUE(foundInHLSLCode("v1 = angle_frm((angle_frm(_u1) + angle_frm(_u2)))")); + ASSERT_TRUE(foundInHLSLCode("v2 = angle_frm((angle_frm(_u2) - angle_frm(_u3)))")); + ASSERT_TRUE(foundInHLSLCode("v3 = angle_frm((angle_frm(_u3) * angle_frm(_u4)))")); + ASSERT_TRUE(foundInHLSLCode("v4 = angle_frm((angle_frm(_u4) / angle_frm(_u5)))")); + ASSERT_TRUE(foundInHLSLCode("v6 = angle_frm((_v5 = angle_frm(_u5)))")); +} + +TEST_F(DebugShaderPrecisionTest, BuiltInMathFunctionRounding) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform vec4 u1;\n" + "uniform vec4 u2;\n" + "uniform vec4 u3;\n" + "uniform float uf;\n" + "uniform float uf2;\n" + "uniform vec3 uf31;\n" + "uniform vec3 uf32;\n" + "uniform mat4 um1;\n" + "uniform mat4 um2;\n" + "void main() {\n" + " vec4 v1 = radians(u1);\n" + " vec4 v2 = degrees(u1);\n" + " vec4 v3 = sin(u1);\n" + " vec4 v4 = cos(u1);\n" + " vec4 v5 = tan(u1);\n" + " vec4 v6 = asin(u1);\n" + " vec4 v7 = acos(u1);\n" + " vec4 v8 = atan(u1);\n" + " vec4 v9 = atan(u1, u2);\n" + " vec4 v10 = pow(u1, u2);\n" + " vec4 v11 = exp(u1);\n" + " vec4 v12 = log(u1);\n" + " vec4 v13 = exp2(u1);\n" + " vec4 v14 = log2(u1);\n" + " vec4 v15 = sqrt(u1);\n" + " vec4 v16 = inversesqrt(u1);\n" + " vec4 v17 = abs(u1);\n" + " vec4 v18 = sign(u1);\n" + " vec4 v19 = floor(u1);\n" + " vec4 v20 = ceil(u1);\n" + " vec4 v21 = fract(u1);\n" + " vec4 v22 = mod(u1, uf);\n" + " vec4 v23 = mod(u1, u2);\n" + " vec4 v24 = min(u1, uf);\n" + " vec4 v25 = min(u1, u2);\n" + " vec4 v26 = max(u1, uf);\n" + " vec4 v27 = max(u1, u2);\n" + " vec4 v28 = clamp(u1, u2, u3);\n" + " vec4 v29 = clamp(u1, uf, uf2);\n" + " vec4 v30 = mix(u1, u2, u3);\n" + " vec4 v31 = mix(u1, u2, uf);\n" + " vec4 v32 = step(u1, u2);\n" + " vec4 v33 = step(uf, u1);\n" + " vec4 v34 = smoothstep(u1, u2, u3);\n" + " vec4 v35 = smoothstep(uf, uf2, u1);\n" + " vec4 v36 = normalize(u1);\n" + " vec4 v37 = faceforward(u1, u2, u3);\n" + " vec4 v38 = reflect(u1, u2);\n" + " vec4 v39 = refract(u1, u2, uf);\n" + + " float f1 = length(u1);\n" + " float f2 = distance(u1, u2);\n" + " float f3 = dot(u1, u2);\n" + " vec3 vf31 = cross(uf31, uf32);\n" + " mat4 m1 = matrixCompMult(um1, um2);\n" + + " gl_FragColor = v1 + v2 + v3 + v4 + v5 + v6 + v7 + v8 + v9 + v10 +" + "v11 + v12 + v13 + v14 + v15 + v16 + v17 + v18 + v19 + v20 +" + "v21 + v22 + v23 + v24 + v25 + v26 + v27 + v28 + v29 + v30 +" + "v31 + v32 + v33 + v34 + v35 + v36 + v37 + v38 + v39 +" + "vec4(f1, f2, f3, 0.0) + vec4(vf31, 0.0) + m1[0];\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(foundInAllGLSLCode("v1 = angle_frm(radians(angle_frm(u1)))")); + ASSERT_TRUE(foundInAllGLSLCode("v2 = angle_frm(degrees(angle_frm(u1)))")); + ASSERT_TRUE(foundInAllGLSLCode("v3 = angle_frm(sin(angle_frm(u1)))")); + ASSERT_TRUE(foundInAllGLSLCode("v4 = angle_frm(cos(angle_frm(u1)))")); + ASSERT_TRUE(foundInAllGLSLCode("v5 = angle_frm(tan(angle_frm(u1)))")); + ASSERT_TRUE(foundInAllGLSLCode("v6 = angle_frm(asin(angle_frm(u1)))")); + ASSERT_TRUE(foundInAllGLSLCode("v7 = angle_frm(acos(angle_frm(u1)))")); + ASSERT_TRUE(foundInAllGLSLCode("v8 = angle_frm(atan(angle_frm(u1)))")); + ASSERT_TRUE(foundInAllGLSLCode("v9 = angle_frm(atan(angle_frm(u1), angle_frm(u2)))")); + ASSERT_TRUE(foundInAllGLSLCode("v10 = angle_frm(pow(angle_frm(u1), angle_frm(u2)))")); + ASSERT_TRUE(foundInAllGLSLCode("v11 = angle_frm(exp(angle_frm(u1)))")); + ASSERT_TRUE(foundInAllGLSLCode("v12 = angle_frm(log(angle_frm(u1)))")); + ASSERT_TRUE(foundInAllGLSLCode("v13 = angle_frm(exp2(angle_frm(u1)))")); + ASSERT_TRUE(foundInAllGLSLCode("v14 = angle_frm(log2(angle_frm(u1)))")); + ASSERT_TRUE(foundInAllGLSLCode("v15 = angle_frm(sqrt(angle_frm(u1)))")); + ASSERT_TRUE(foundInAllGLSLCode("v16 = angle_frm(inversesqrt(angle_frm(u1)))")); + ASSERT_TRUE(foundInAllGLSLCode("v17 = angle_frm(abs(angle_frm(u1)))")); + ASSERT_TRUE(foundInAllGLSLCode("v18 = angle_frm(sign(angle_frm(u1)))")); + ASSERT_TRUE(foundInAllGLSLCode("v19 = angle_frm(floor(angle_frm(u1)))")); + ASSERT_TRUE(foundInAllGLSLCode("v20 = angle_frm(ceil(angle_frm(u1)))")); + ASSERT_TRUE(foundInAllGLSLCode("v21 = angle_frm(fract(angle_frm(u1)))")); + ASSERT_TRUE(foundInAllGLSLCode("v22 = angle_frm(mod(angle_frm(u1), angle_frm(uf)))")); + ASSERT_TRUE(foundInAllGLSLCode("v23 = angle_frm(mod(angle_frm(u1), angle_frm(u2)))")); + ASSERT_TRUE(foundInAllGLSLCode("v24 = angle_frm(min(angle_frm(u1), angle_frm(uf)))")); + ASSERT_TRUE(foundInAllGLSLCode("v25 = angle_frm(min(angle_frm(u1), angle_frm(u2)))")); + ASSERT_TRUE(foundInAllGLSLCode("v26 = angle_frm(max(angle_frm(u1), angle_frm(uf)))")); + ASSERT_TRUE(foundInAllGLSLCode("v27 = angle_frm(max(angle_frm(u1), angle_frm(u2)))")); + ASSERT_TRUE( + foundInAllGLSLCode("v28 = angle_frm(clamp(angle_frm(u1), angle_frm(u2), angle_frm(u3)))")); + ASSERT_TRUE( + foundInAllGLSLCode("v29 = angle_frm(clamp(angle_frm(u1), angle_frm(uf), angle_frm(uf2)))")); + ASSERT_TRUE( + foundInAllGLSLCode("v30 = angle_frm(mix(angle_frm(u1), angle_frm(u2), angle_frm(u3)))")); + ASSERT_TRUE( + foundInAllGLSLCode("v31 = angle_frm(mix(angle_frm(u1), angle_frm(u2), angle_frm(uf)))")); + ASSERT_TRUE(foundInAllGLSLCode("v32 = angle_frm(step(angle_frm(u1), angle_frm(u2)))")); + ASSERT_TRUE(foundInAllGLSLCode("v33 = angle_frm(step(angle_frm(uf), angle_frm(u1)))")); + ASSERT_TRUE(foundInAllGLSLCode( + "v34 = angle_frm(smoothstep(angle_frm(u1), angle_frm(u2), angle_frm(u3)))")); + ASSERT_TRUE(foundInAllGLSLCode( + "v35 = angle_frm(smoothstep(angle_frm(uf), angle_frm(uf2), angle_frm(u1)))")); + ASSERT_TRUE(foundInAllGLSLCode("v36 = angle_frm(normalize(angle_frm(u1)))")); + ASSERT_TRUE(foundInAllGLSLCode( + "v37 = angle_frm(faceforward(angle_frm(u1), angle_frm(u2), angle_frm(u3)))")); + ASSERT_TRUE(foundInAllGLSLCode("v38 = angle_frm(reflect(angle_frm(u1), angle_frm(u2)))")); + ASSERT_TRUE(foundInAllGLSLCode( + "v39 = angle_frm(refract(angle_frm(u1), angle_frm(u2), angle_frm(uf)))")); + + ASSERT_TRUE(foundInAllGLSLCode("f1 = angle_frm(length(angle_frm(u1)))")); + ASSERT_TRUE(foundInAllGLSLCode("f2 = angle_frm(distance(angle_frm(u1), angle_frm(u2)))")); + ASSERT_TRUE(foundInAllGLSLCode("f3 = angle_frm(dot(angle_frm(u1), angle_frm(u2)))")); + ASSERT_TRUE(foundInAllGLSLCode("vf31 = angle_frm(cross(angle_frm(uf31), angle_frm(uf32)))")); + ASSERT_TRUE( + foundInAllGLSLCode("m1 = angle_frm(matrixCompMult(angle_frm(um1), angle_frm(um2)))")); + + ASSERT_TRUE(foundInHLSLCode("v1 = angle_frm(radians(angle_frm(_u1)))")); + ASSERT_TRUE(foundInHLSLCode("v2 = angle_frm(degrees(angle_frm(_u1)))")); + ASSERT_TRUE(foundInHLSLCode("v3 = angle_frm(sin(angle_frm(_u1)))")); + ASSERT_TRUE(foundInHLSLCode("v4 = angle_frm(cos(angle_frm(_u1)))")); + ASSERT_TRUE(foundInHLSLCode("v5 = angle_frm(tan(angle_frm(_u1)))")); + ASSERT_TRUE(foundInHLSLCode("v6 = angle_frm(asin(angle_frm(_u1)))")); + ASSERT_TRUE(foundInHLSLCode("v7 = angle_frm(acos(angle_frm(_u1)))")); + ASSERT_TRUE(foundInHLSLCode("v8 = angle_frm(atan(angle_frm(_u1)))")); + ASSERT_TRUE(foundInHLSLCode("v9 = angle_frm(webgl_atan_emu(angle_frm(_u1), angle_frm(_u2)))")); + ASSERT_TRUE(foundInHLSLCode("v10 = angle_frm(pow(angle_frm(_u1), angle_frm(_u2)))")); + ASSERT_TRUE(foundInHLSLCode("v11 = angle_frm(exp(angle_frm(_u1)))")); + ASSERT_TRUE(foundInHLSLCode("v12 = angle_frm(log(angle_frm(_u1)))")); + ASSERT_TRUE(foundInHLSLCode("v13 = angle_frm(exp2(angle_frm(_u1)))")); + ASSERT_TRUE(foundInHLSLCode("v14 = angle_frm(log2(angle_frm(_u1)))")); + ASSERT_TRUE(foundInHLSLCode("v15 = angle_frm(sqrt(angle_frm(_u1)))")); + ASSERT_TRUE(foundInHLSLCode("v16 = angle_frm(rsqrt(angle_frm(_u1)))")); + ASSERT_TRUE(foundInHLSLCode("v17 = angle_frm(abs(angle_frm(_u1)))")); + ASSERT_TRUE(foundInHLSLCode("v18 = angle_frm(sign(angle_frm(_u1)))")); + ASSERT_TRUE(foundInHLSLCode("v19 = angle_frm(floor(angle_frm(_u1)))")); + ASSERT_TRUE(foundInHLSLCode("v20 = angle_frm(ceil(angle_frm(_u1)))")); + ASSERT_TRUE(foundInHLSLCode("v21 = angle_frm(frac(angle_frm(_u1)))")); + ASSERT_TRUE(foundInHLSLCode("v22 = angle_frm(webgl_mod_emu(angle_frm(_u1), angle_frm(_uf)))")); + ASSERT_TRUE(foundInHLSLCode("v23 = angle_frm(webgl_mod_emu(angle_frm(_u1), angle_frm(_u2)))")); + ASSERT_TRUE(foundInHLSLCode("v24 = angle_frm(min(angle_frm(_u1), angle_frm(_uf)))")); + ASSERT_TRUE(foundInHLSLCode("v25 = angle_frm(min(angle_frm(_u1), angle_frm(_u2)))")); + ASSERT_TRUE(foundInHLSLCode("v26 = angle_frm(max(angle_frm(_u1), angle_frm(_uf)))")); + ASSERT_TRUE(foundInHLSLCode("v27 = angle_frm(max(angle_frm(_u1), angle_frm(_u2)))")); + ASSERT_TRUE( + foundInHLSLCode("v28 = angle_frm(clamp(angle_frm(_u1), angle_frm(_u2), angle_frm(_u3)))")); + ASSERT_TRUE( + foundInHLSLCode("v29 = angle_frm(clamp(angle_frm(_u1), angle_frm(_uf), angle_frm(_uf2)))")); + ASSERT_TRUE( + foundInHLSLCode("v30 = angle_frm(lerp(angle_frm(_u1), angle_frm(_u2), angle_frm(_u3)))")); + ASSERT_TRUE( + foundInHLSLCode("v31 = angle_frm(lerp(angle_frm(_u1), angle_frm(_u2), angle_frm(_uf)))")); + ASSERT_TRUE(foundInHLSLCode("v32 = angle_frm(step(angle_frm(_u1), angle_frm(_u2)))")); + ASSERT_TRUE(foundInHLSLCode("v33 = angle_frm(step(angle_frm(_uf), angle_frm(_u1)))")); + ASSERT_TRUE(foundInHLSLCode( + "v34 = angle_frm(smoothstep(angle_frm(_u1), angle_frm(_u2), angle_frm(_u3)))")); + ASSERT_TRUE(foundInHLSLCode( + "v35 = angle_frm(smoothstep(angle_frm(_uf), angle_frm(_uf2), angle_frm(_u1)))")); + ASSERT_TRUE(foundInHLSLCode("v36 = angle_frm(normalize(angle_frm(_u1)))")); + ASSERT_TRUE(foundInHLSLCode( + "v37 = angle_frm(webgl_faceforward_emu(angle_frm(_u1), angle_frm(_u2), angle_frm(_u3)))")); + ASSERT_TRUE(foundInHLSLCode("v38 = angle_frm(reflect(angle_frm(_u1), angle_frm(_u2)))")); + ASSERT_TRUE(foundInHLSLCode( + "v39 = angle_frm(refract(angle_frm(_u1), angle_frm(_u2), angle_frm(_uf)))")); + + ASSERT_TRUE(foundInHLSLCode("f1 = angle_frm(length(angle_frm(_u1)))")); + ASSERT_TRUE(foundInHLSLCode("f2 = angle_frm(distance(angle_frm(_u1), angle_frm(_u2)))")); + ASSERT_TRUE(foundInHLSLCode("f3 = angle_frm(dot(angle_frm(_u1), angle_frm(_u2)))")); + ASSERT_TRUE(foundInHLSLCode("vf31 = angle_frm(cross(angle_frm(_uf31), angle_frm(_uf32)))")); + ASSERT_TRUE(foundInHLSLCode("m1 = angle_frm((angle_frm(_um1) * angle_frm(_um2)))")); +} + +TEST_F(DebugShaderPrecisionTest, BuiltInRelationalFunctionRounding) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform vec4 u1;\n" + "uniform vec4 u2;\n" + "void main() {\n" + " bvec4 bv1 = lessThan(u1, u2);\n" + " bvec4 bv2 = lessThanEqual(u1, u2);\n" + " bvec4 bv3 = greaterThan(u1, u2);\n" + " bvec4 bv4 = greaterThanEqual(u1, u2);\n" + " bvec4 bv5 = equal(u1, u2);\n" + " bvec4 bv6 = notEqual(u1, u2);\n" + " gl_FragColor = vec4(bv1) + vec4(bv2) + vec4(bv3) + vec4(bv4) + vec4(bv5) + vec4(bv6);\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(foundInAllGLSLCode("bv1 = lessThan(angle_frm(u1), angle_frm(u2))")); + ASSERT_TRUE(foundInAllGLSLCode("bv2 = lessThanEqual(angle_frm(u1), angle_frm(u2))")); + ASSERT_TRUE(foundInAllGLSLCode("bv3 = greaterThan(angle_frm(u1), angle_frm(u2))")); + ASSERT_TRUE(foundInAllGLSLCode("bv4 = greaterThanEqual(angle_frm(u1), angle_frm(u2))")); + ASSERT_TRUE(foundInAllGLSLCode("bv5 = equal(angle_frm(u1), angle_frm(u2))")); + ASSERT_TRUE(foundInAllGLSLCode("bv6 = notEqual(angle_frm(u1), angle_frm(u2))")); + + ASSERT_TRUE(foundInHLSLCode("bv1 = (angle_frm(_u1) < angle_frm(_u2))")); + ASSERT_TRUE(foundInHLSLCode("bv2 = (angle_frm(_u1) <= angle_frm(_u2))")); + ASSERT_TRUE(foundInHLSLCode("bv3 = (angle_frm(_u1) > angle_frm(_u2))")); + ASSERT_TRUE(foundInHLSLCode("bv4 = (angle_frm(_u1) >= angle_frm(_u2))")); + ASSERT_TRUE(foundInHLSLCode("bv5 = (angle_frm(_u1) == angle_frm(_u2))")); + ASSERT_TRUE(foundInHLSLCode("bv6 = (angle_frm(_u1) != angle_frm(_u2))")); +} + +TEST_F(DebugShaderPrecisionTest, ConstructorRounding) +{ + const std::string &shaderString = + "precision mediump float;\n" + "precision mediump int;\n" + "uniform float u1;\n" + "uniform float u2;\n" + "uniform float u3;\n" + "uniform float u4;\n" + "uniform ivec4 uiv;\n" + "void main() {\n" + " vec4 v1 = vec4(u1, u2, u3, u4);\n" + " vec4 v2 = vec4(uiv);\n" + " gl_FragColor = v1 + v2;\n" + "}\n"; + compile(shaderString); + // Note: this is suboptimal for the case taking four floats, but optimizing would be tricky. + ASSERT_TRUE(foundInAllGLSLCode( + "v1 = angle_frm(vec4(angle_frm(u1), angle_frm(u2), angle_frm(u3), angle_frm(u4)))")); + ASSERT_TRUE(foundInAllGLSLCode("v2 = angle_frm(vec4(uiv))")); + + ASSERT_TRUE(foundInHLSLCode( + "v1 = angle_frm(vec4(angle_frm(_u1), angle_frm(_u2), angle_frm(_u3), angle_frm(_u4)))")); + ASSERT_TRUE(foundInHLSLCode("v2 = angle_frm(vec4(_uiv))")); +} + +TEST_F(DebugShaderPrecisionTest, StructConstructorNoRounding) +{ + const std::string &shaderString = + "precision mediump float;\n" + "struct S { mediump vec4 a; };\n" + "uniform vec4 u;\n" + "void main() {\n" + " S s = S(u);\n" + " gl_FragColor = s.a;\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(foundInAllGLSLCode("s = S(angle_frm(u))")); + ASSERT_TRUE(foundInHLSLCode("s = _S_ctor(angle_frm(_u))")); + ASSERT_TRUE(notFoundInCode("angle_frm(S")); +} + +TEST_F(DebugShaderPrecisionTest, SwizzleRounding) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform vec4 u;\n" + "void main() {\n" + " vec4 v = u.xyxy;" + " gl_FragColor = v;\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(foundInAllGLSLCode("v = angle_frm(u).xyxy")); + ASSERT_TRUE(foundInHLSLCode("v = angle_frm(_u).xyxy")); +} + +TEST_F(DebugShaderPrecisionTest, BuiltInTexFunctionRounding) +{ + const std::string &shaderString = + "precision mediump float;\n" + "precision lowp sampler2D;\n" + "uniform vec2 u;\n" + "uniform sampler2D s;\n" + "void main() {\n" + " lowp vec4 v = texture2D(s, u);\n" + " gl_FragColor = v;\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(foundInAllGLSLCode("v = angle_frl(texture2D(s, angle_frm(u)))")); + ASSERT_TRUE(foundInHLSLCode("v = angle_frl(gl_texture2D(_s, angle_frm(_u)))")); +} + +TEST_F(DebugShaderPrecisionTest, FunctionCallParameterQualifiersFromDefinition) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform vec4 u1;\n" + "uniform vec4 u2;\n" + "uniform vec4 u3;\n" + "uniform vec4 u4;\n" + "uniform vec4 u5;\n" + "vec4 add(in vec4 x, in vec4 y) {\n" + " return x + y;\n" + "}\n" + "void compound_add(inout vec4 x, in vec4 y) {\n" + " x = x + y;\n" + "}\n" + "void add_to_last(in vec4 x, in vec4 y, out vec4 z) {\n" + " z = x + y;\n" + "}\n" + "void main() {\n" + " vec4 v = add(u1, u2);\n" + " compound_add(v, u3);\n" + " vec4 v2;\n" + " add_to_last(u4, u5, v2);\n" + " gl_FragColor = v + v2;\n" + "}\n"; + compile(shaderString); + // Note that this is not optimal code, there are redundant frm calls. + // However, getting the implementation working when other operations + // are nested within function calls would be tricky if to get right + // otherwise. + // Test in parameters + ASSERT_TRUE(foundInAllGLSLCode("v = add(angle_frm(u1), angle_frm(u2))")); + ASSERT_TRUE(foundInHLSLCode("v = _add_float4_float4(angle_frm(_u1), angle_frm(_u2))")); + // Test inout parameter + ASSERT_TRUE(foundInAllGLSLCode("compound_add(v, angle_frm(u3))")); + ASSERT_TRUE(foundInHLSLCode("compound_add_float4_float4(_v, angle_frm(_u3))")); + // Test out parameter + ASSERT_TRUE(foundInAllGLSLCode("add_to_last(angle_frm(u4), angle_frm(u5), v2)")); + ASSERT_TRUE( + foundInHLSLCode("add_to_last_float4_float4_float4(angle_frm(_u4), angle_frm(_u5), _v2)")); +} + +TEST_F(DebugShaderPrecisionTest, FunctionCallParameterQualifiersFromPrototype) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform vec4 u1;\n" + "uniform vec4 u2;\n" + "uniform vec4 u3;\n" + "uniform vec4 u4;\n" + "uniform vec4 u5;\n" + "vec4 add(in vec4 x, in vec4 y);\n" + "void compound_add(inout vec4 x, in vec4 y);\n" + "void add_to_last(in vec4 x, in vec4 y, out vec4 z);\n" + "void main() {\n" + " vec4 v = add(u1, u2);\n" + " compound_add(v, u3);\n" + " vec4 v2;\n" + " add_to_last(u4, u5, v2);\n" + " gl_FragColor = v + v2;\n" + "}\n" + "vec4 add(in vec4 x, in vec4 y) {\n" + " return x + y;\n" + "}\n" + "void compound_add(inout vec4 x, in vec4 y) {\n" + " x = x + y;\n" + "}\n" + "void add_to_last(in vec4 x, in vec4 y, out vec4 z) {\n" + " z = x + y;\n" + "}\n"; + compile(shaderString); + // Test in parameters + ASSERT_TRUE(foundInAllGLSLCode("v = add(angle_frm(u1), angle_frm(u2))")); + ASSERT_TRUE(foundInHLSLCode("v = _add_float4_float4(angle_frm(_u1), angle_frm(_u2))")); + // Test inout parameter + ASSERT_TRUE(foundInAllGLSLCode("compound_add(v, angle_frm(u3))")); + ASSERT_TRUE(foundInHLSLCode("compound_add_float4_float4(_v, angle_frm(_u3))")); + // Test out parameter + ASSERT_TRUE(foundInAllGLSLCode("add_to_last(angle_frm(u4), angle_frm(u5), v2)")); + ASSERT_TRUE( + foundInHLSLCode("add_to_last_float4_float4_float4(angle_frm(_u4), angle_frm(_u5), _v2)")); +} + +TEST_F(DebugShaderPrecisionTest, NestedFunctionCalls) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform vec4 u1;\n" + "uniform vec4 u2;\n" + "uniform vec4 u3;\n" + "vec4 add(in vec4 x, in vec4 y) {\n" + " return x + y;\n" + "}\n" + "vec4 compound_add(inout vec4 x, in vec4 y) {\n" + " x = x + y;\n" + " return x;\n" + "}\n" + "void main() {\n" + " vec4 v = u1;\n" + " vec4 v2 = add(compound_add(v, u2), fract(u3));\n" + " gl_FragColor = v + v2;\n" + "}\n"; + compile(shaderString); + // Test nested calls + ASSERT_TRUE(foundInAllGLSLCode( + "v2 = add(compound_add(v, angle_frm(u2)), angle_frm(fract(angle_frm(u3))))")); + ASSERT_TRUE( + foundInHLSLCode("v2 = _add_float4_float4(_compound_add_float4_float4(_v, angle_frm(_u2)), " + "angle_frm(frac(angle_frm(_u3))))")); +} + +// Test that code inside an index of a function out parameter gets processed. +TEST_F(DebugShaderPrecisionTest, OpInIndexOfFunctionOutParameter) +{ + const std::string &shaderString = + "precision mediump float;\n" + "void foo(out vec4 f) { f.x = 0.0; }\n" + "uniform float u2;\n" + "void main() {\n" + " vec4 v[2];\n" + " foo(v[int(exp2(u2))]);\n" + " gl_FragColor = v[0];\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(foundInAllGLSLCode("angle_frm(exp2(angle_frm(u2)))")); + ASSERT_TRUE(foundInHLSLCode("angle_frm(exp2(angle_frm(_u2)))")); +} + +// Test that code inside an index of an l-value gets processed. +TEST_F(DebugShaderPrecisionTest, OpInIndexOfLValue) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform vec4 u1;\n" + "uniform float u2;\n" + "void main() {\n" + " vec4 v[2];\n" + " v[int(exp2(u2))] = u1;\n" + " gl_FragColor = v[0];\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(foundInAllGLSLCode("angle_frm(exp2(angle_frm(u2)))")); + ASSERT_TRUE(foundInHLSLCode("angle_frm(exp2(angle_frm(_u2)))")); +} + +// Test that the out parameter of modf doesn't get rounded +TEST_F(DebugShaderPrecisionTest, ModfOutParameter) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "uniform float u;\n" + "out vec4 my_FragColor;\n" + "void main() {\n" + " float o;\n" + " float f = modf(u, o);\n" + " my_FragColor = vec4(f, o, 0, 1);\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(foundInAllGLSLCode("modf(angle_frm(u), o)")); + ASSERT_TRUE(foundInHLSLCode("modf(angle_frm(_u), _o)")); +} + +#if defined(ANGLE_ENABLE_HLSL) +// Tests precision emulation with HLSL 3.0 output -- should error gracefully. +TEST(DebugShaderPrecisionNegativeTest, HLSL3Unsupported) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform float u;\n" + "void main() {\n" + " gl_FragColor = vec4(u);\n" + "}\n"; + std::string infoLog; + std::string translatedCode; + ShBuiltInResources resources; + sh::InitBuiltInResources(&resources); + resources.WEBGL_debug_shader_precision = 1; + ASSERT_FALSE(compileTestShader(GL_FRAGMENT_SHADER, SH_GLES3_SPEC, SH_HLSL_3_0_OUTPUT, + shaderString, &resources, 0, &translatedCode, &infoLog)); +} +#endif // defined(ANGLE_ENABLE_HLSL) diff --git a/gfx/angle/src/tests/compiler_tests/EXT_blend_func_extended_test.cpp b/gfx/angle/src/tests/compiler_tests/EXT_blend_func_extended_test.cpp new file mode 100755 index 000000000..3ac0ff6d8 --- /dev/null +++ b/gfx/angle/src/tests/compiler_tests/EXT_blend_func_extended_test.cpp @@ -0,0 +1,285 @@ +// +// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// EXT_blend_func_extended.cpp: +// Test for EXT_blend_func_extended_test +// + +#include "angle_gl.h" +#include "gtest/gtest.h" +#include "GLSLANG/ShaderLang.h" + +using testing::Combine; +using testing::Values; +using testing::make_tuple; + +namespace +{ +const char ESSLVersion100[] = "#version 100\n"; +const char ESSLVersion300[] = "#version 300 es\n"; +const char ESSLVersion310[] = "#version 310 es\n"; +const char EXTBFEPragma[] = "#extension GL_EXT_blend_func_extended : require\n"; + +const char ESSL100_SimpleShader1[] = + "precision mediump float;\n" + "void main() { \n" + " gl_FragColor = vec4(1.0);\n" + " gl_SecondaryFragColorEXT = vec4(gl_MaxDualSourceDrawBuffersEXT / 10);\n" + "}\n"; + +// Shader that tests only the access to gl_MaxDualSourceDrawBuffersEXT. +const char ESSL100_MaxDualSourceAccessShader[] = + "precision mediump float;\n" + "void main() { gl_FragColor = vec4(gl_MaxDualSourceDrawBuffersEXT / 10); }\n"; + +// Shader that writes to SecondaryFragData. +const char ESSL100_FragDataShader[] = + "#extension GL_EXT_draw_buffers : require\n" + "precision mediump float;\n" + "void main() {\n" + " gl_FragData[gl_MaxDrawBuffers - 1] = vec4(1.0);\n" + " gl_SecondaryFragDataEXT[gl_MaxDualSourceDrawBuffersEXT - 1] = vec4(0.1);\n" + "}\n"; + +// Shader that writes to SecondaryFragColor and SecondaryFragData does not compile. +const char ESSL100_ColorAndDataWriteFailureShader1[] = + "precision mediump float;\n" + "void main() {\n" + " gl_SecondaryFragColorEXT = vec4(1.0);\n" + " gl_SecondaryFragDataEXT[gl_MaxDualSourceDrawBuffersEXT] = vec4(0.1);\n" + "}\n"; + +// Shader that writes to FragColor and SecondaryFragData does not compile. +const char ESSL100_ColorAndDataWriteFailureShader2[] = + "precision mediump float;\n" + "void main() {\n" + " gl_FragColor = vec4(1.0);\n" + " gl_SecondaryFragDataEXT[gl_MaxDualSourceDrawBuffersEXT] = vec4(0.1);\n" + "}\n"; + +// Shader that writes to FragData and SecondaryFragColor. +const char ESSL100_ColorAndDataWriteFailureShader3[] = + "#extension GL_EXT_draw_buffers : require\n" + "precision mediump float;\n" + "void main() {\n" + " gl_SecondaryFragColorEXT = vec4(1.0);\n" + " gl_FragData[gl_MaxDrawBuffers] = vec4(0.1);\n" + "}\n"; + +// In GLSL version 300 es, the gl_MaxDualSourceDrawBuffersEXT is available. +const char ESSL300_MaxDualSourceAccessShader[] = + "precision mediump float;\n" + "layout(location = 0) out mediump vec4 fragColor;" + "void main() {\n" + " fragColor = vec4(gl_MaxDualSourceDrawBuffersEXT / 10);\n" + "}\n"; + +// In GLSL version 300 es, the only way to write a correct shader is to require the extension and +// then leave the locations unspecified. The caller will then bind the variables with the extension +// binding functions. +const char ESSL300_LocationAndUnspecifiedOutputShader[] = + "precision mediump float;\n" + "layout(location = 0) out mediump vec4 fragColor;" + "out mediump vec4 secondaryFragColor;" + "void main() {\n" + " fragColor = vec4(1.0);\n" + " secondaryFragColor = vec4(1.0);\n" + "}\n"; + +const char ESSL300_TwoUnspecifiedLocationOutputsShader[] = + "precision mediump float;\n" + "out mediump vec4 fragColor;" + "out mediump vec4 secondaryFragColor;" + "void main() {\n" + " fragColor = vec4(1.0);\n" + " secondaryFragColor = vec4(1.0);\n" + "}\n"; + +// Shader that is correct in GLSL ES 3.10 fails when used in version 300 es. +const char ESSL310_LocationIndexShader[] = + "precision mediump float;\n" + "layout(location = 0) out mediump vec4 fragColor;" + "layout(location = 0, index = 1) out mediump vec4 secondaryFragColor;" + "void main() {\n" + " fragColor = vec4(1);\n" + " secondaryFragColor = vec4(1);\n" + "}\n"; + +// Shader that specifies index layout qualifier but not location fails to compile. Currently fails +// to compile due to version 310 es not being supported. +const char ESSL310_LocationIndexFailureShader[] = + "precision mediump float;\n" + "layout(location = 0) out mediump vec4 fragColor;" + "layout(index = 1) out mediump vec4 secondaryFragColor;" + "void main() {\n" + " fragColor = vec4(1.0);\n" + " secondaryFragColor = vec4(1.0);\n" + "}\n"; + +class EXTBlendFuncExtendedTest + : public testing::TestWithParam<testing::tuple<ShShaderSpec, const char *, const char *>> +{ + protected: + virtual void SetUp() + { + sh::InitBuiltInResources(&mResources); + // EXT_draw_buffers is used in some of the shaders for test purposes. + mResources.EXT_draw_buffers = 1; + mResources.NV_draw_buffers = 2; + + mCompiler = NULL; + } + + virtual void TearDown() { DestroyCompiler(); } + void DestroyCompiler() + { + if (mCompiler) + { + sh::Destruct(mCompiler); + mCompiler = NULL; + } + } + + void InitializeCompiler() + { + DestroyCompiler(); + mCompiler = sh::ConstructCompiler(GL_FRAGMENT_SHADER, testing::get<0>(GetParam()), + SH_GLSL_COMPATIBILITY_OUTPUT, &mResources); + ASSERT_TRUE(mCompiler != NULL) << "Compiler could not be constructed."; + } + + testing::AssertionResult TestShaderCompile(const char *pragma) + { + return TestShaderCompile(testing::get<1>(GetParam()), // Version. + pragma, + testing::get<2>(GetParam()) // Shader. + ); + } + + testing::AssertionResult TestShaderCompile(const char *version, + const char *pragma, + const char *shader) + { + const char *shaderStrings[] = {version, pragma, shader}; + bool success = sh::Compile(mCompiler, shaderStrings, 3, 0); + if (success) + { + return ::testing::AssertionSuccess() << "Compilation success"; + } + return ::testing::AssertionFailure() << sh::GetInfoLog(mCompiler); + } + + protected: + ShBuiltInResources mResources; + ShHandle mCompiler; +}; + +// Extension flag is required to compile properly. Expect failure when it is +// not present. +TEST_P(EXTBlendFuncExtendedTest, CompileFailsWithoutExtension) +{ + mResources.EXT_blend_func_extended = 0; + InitializeCompiler(); + EXPECT_FALSE(TestShaderCompile(EXTBFEPragma)); +} + +// Extension directive is required to compile properly. Expect failure when +// it is not present. +TEST_P(EXTBlendFuncExtendedTest, CompileFailsWithExtensionWithoutPragma) +{ + mResources.EXT_blend_func_extended = 1; + mResources.MaxDualSourceDrawBuffers = 1; + InitializeCompiler(); + EXPECT_FALSE(TestShaderCompile("")); +} + +// With extension flag and extension directive, compiling succeeds. +// Also test that the extension directive state is reset correctly. +TEST_P(EXTBlendFuncExtendedTest, CompileSucceedsWithExtensionAndPragma) +{ + mResources.EXT_blend_func_extended = 1; + mResources.MaxDualSourceDrawBuffers = 1; + InitializeCompiler(); + EXPECT_TRUE(TestShaderCompile(EXTBFEPragma)); + // Test reset functionality. + EXPECT_FALSE(TestShaderCompile("")); + EXPECT_TRUE(TestShaderCompile(EXTBFEPragma)); +} + +// The SL #version 100 shaders that are correct work similarly +// in both GL2 and GL3, with and without the version string. +INSTANTIATE_TEST_CASE_P(CorrectESSL100Shaders, + EXTBlendFuncExtendedTest, + Combine(Values(SH_GLES2_SPEC, SH_GLES3_SPEC), + Values("", ESSLVersion100), + Values(ESSL100_SimpleShader1, + ESSL100_MaxDualSourceAccessShader, + ESSL100_FragDataShader))); + +INSTANTIATE_TEST_CASE_P(CorrectESSL300Shaders, + EXTBlendFuncExtendedTest, + Combine(Values(SH_GLES3_SPEC), + Values(ESSLVersion300), + Values(ESSL300_MaxDualSourceAccessShader, + ESSL300_LocationAndUnspecifiedOutputShader, + ESSL300_TwoUnspecifiedLocationOutputsShader))); + +class EXTBlendFuncExtendedCompileFailureTest : public EXTBlendFuncExtendedTest +{ +}; + +TEST_P(EXTBlendFuncExtendedCompileFailureTest, CompileFails) +{ + // Expect compile failure due to shader error, with shader having correct pragma. + mResources.EXT_blend_func_extended = 1; + mResources.MaxDualSourceDrawBuffers = 1; + InitializeCompiler(); + EXPECT_FALSE(TestShaderCompile(EXTBFEPragma)); +} + +// Incorrect #version 100 shaders fail. +INSTANTIATE_TEST_CASE_P(IncorrectESSL100Shaders, + EXTBlendFuncExtendedCompileFailureTest, + Combine(Values(SH_GLES2_SPEC), + Values(ESSLVersion100), + Values(ESSL100_ColorAndDataWriteFailureShader1, + ESSL100_ColorAndDataWriteFailureShader2, + ESSL100_ColorAndDataWriteFailureShader3))); + +// Correct #version 300 es shaders fail in GLES2 context, regardless of version string. +INSTANTIATE_TEST_CASE_P(CorrectESSL300Shaders, + EXTBlendFuncExtendedCompileFailureTest, + Combine(Values(SH_GLES2_SPEC), + Values("", ESSLVersion100, ESSLVersion300), + Values(ESSL300_LocationAndUnspecifiedOutputShader, + ESSL300_TwoUnspecifiedLocationOutputsShader))); + +// Correct #version 100 shaders fail when used with #version 300 es. +INSTANTIATE_TEST_CASE_P(CorrectESSL100Shaders, + EXTBlendFuncExtendedCompileFailureTest, + Combine(Values(SH_GLES3_SPEC), + Values(ESSLVersion300), + Values(ESSL100_SimpleShader1, ESSL100_FragDataShader))); + +// Incorrect #version 310 es always fails. +INSTANTIATE_TEST_CASE_P(IncorrectESSL310Shaders, + EXTBlendFuncExtendedCompileFailureTest, + Combine(Values(SH_GLES3_SPEC), + Values(ESSLVersion300, ESSLVersion310), + Values(ESSL310_LocationIndexFailureShader))); + +// Correct #version 310 es fails in #version 300 es. +INSTANTIATE_TEST_CASE_P( + CorrectESSL310ShadersInESSL300, + EXTBlendFuncExtendedCompileFailureTest, + Values(make_tuple(SH_GLES3_SPEC, &ESSLVersion300[0], &ESSL310_LocationIndexShader[0]))); + +// Correct #version 310 es fails in #version 310 es, due to 3.1 not being supported. +INSTANTIATE_TEST_CASE_P( + CorrectESSL310Shaders, + EXTBlendFuncExtendedCompileFailureTest, + Values(make_tuple(SH_GLES3_SPEC, &ESSLVersion310[0], &ESSL310_LocationIndexShader[0]))); + +} // namespace diff --git a/gfx/angle/src/tests/compiler_tests/EmulateGLFragColorBroadcast_test.cpp b/gfx/angle/src/tests/compiler_tests/EmulateGLFragColorBroadcast_test.cpp new file mode 100755 index 000000000..07cf3fd68 --- /dev/null +++ b/gfx/angle/src/tests/compiler_tests/EmulateGLFragColorBroadcast_test.cpp @@ -0,0 +1,81 @@ +// +// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// EmulateGLFragColorBroadcast_test.cpp: +// Tests for gl_FragColor broadcast behavior emulation. +// + +#include "angle_gl.h" +#include "gtest/gtest.h" +#include "GLSLANG/ShaderLang.h" +#include "tests/test_utils/compiler_test.h" + +using namespace sh; + +namespace +{ + +const int kMaxDrawBuffers = 2; + +class EmulateGLFragColorBroadcastTest : public MatchOutputCodeTest +{ + public: + EmulateGLFragColorBroadcastTest() + : MatchOutputCodeTest(GL_FRAGMENT_SHADER, + 0, // compile options + SH_GLSL_COMPATIBILITY_OUTPUT) + { + getResources()->MaxDrawBuffers = kMaxDrawBuffers; + getResources()->EXT_draw_buffers = 1; + } +}; + +// Verifies that without explicitly enabling GL_EXT_draw_buffers extension +// in the shader, no broadcast emulation. +TEST_F(EmulateGLFragColorBroadcastTest, FragColorNoBroadcast) +{ + const std::string shaderString = + "void main()\n" + "{\n" + " gl_FragColor = vec4(1, 0, 0, 0);\n" + "}\n"; + compile(shaderString); + EXPECT_TRUE(foundInCode("gl_FragColor")); + EXPECT_FALSE(foundInCode("gl_FragData[0]")); + EXPECT_FALSE(foundInCode("gl_FragData[1]")); +} + +// Verifies that with explicitly enabling GL_EXT_draw_buffers extension +// in the shader, broadcast is emualted by replacing gl_FragColor with gl_FragData. +TEST_F(EmulateGLFragColorBroadcastTest, FragColorBroadcast) +{ + const std::string shaderString = + "#extension GL_EXT_draw_buffers : require\n" + "void main()\n" + "{\n" + " gl_FragColor = vec4(1, 0, 0, 0);\n" + "}\n"; + compile(shaderString); + EXPECT_FALSE(foundInCode("gl_FragColor")); + EXPECT_TRUE(foundInCode("gl_FragData[0]")); + EXPECT_TRUE(foundInCode("gl_FragData[1]")); +} + +// Verifies that with explicitly enabling GL_EXT_draw_buffers extension +// in the shader with an empty main(), anothing happens. +TEST_F(EmulateGLFragColorBroadcastTest, EmptyMain) +{ + const std::string shaderString = + "#extension GL_EXT_draw_buffers : require\n" + "void main()\n" + "{\n" + "}\n"; + compile(shaderString); + EXPECT_FALSE(foundInCode("gl_FragColor")); + EXPECT_FALSE(foundInCode("gl_FragData[0]")); + EXPECT_FALSE(foundInCode("gl_FragData[1]")); +} + +} // namespace anonymous diff --git a/gfx/angle/src/tests/compiler_tests/ExpressionLimit_test.cpp b/gfx/angle/src/tests/compiler_tests/ExpressionLimit_test.cpp new file mode 100755 index 000000000..8f7d7ef4f --- /dev/null +++ b/gfx/angle/src/tests/compiler_tests/ExpressionLimit_test.cpp @@ -0,0 +1,557 @@ +// +// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +#include <sstream> +#include <string> +#include <vector> +#include "angle_gl.h" +#include "gtest/gtest.h" +#include "GLSLANG/ShaderLang.h" + +#define SHADER(Src) #Src + +class ExpressionLimitTest : public testing::Test { +protected: + static const int kMaxExpressionComplexity = 16; + static const int kMaxCallStackDepth = 16; + static const int kMaxFunctionParameters = 16; + static const char* kExpressionTooComplex; + static const char* kCallStackTooDeep; + static const char* kHasRecursion; + static const char *kTooManyParameters; + + virtual void SetUp() + { + memset(&resources, 0, sizeof(resources)); + + GenerateResources(&resources); + } + + // Set up the per compile resources + static void GenerateResources(ShBuiltInResources *res) + { + sh::InitBuiltInResources(res); + + res->MaxVertexAttribs = 8; + res->MaxVertexUniformVectors = 128; + res->MaxVaryingVectors = 8; + res->MaxVertexTextureImageUnits = 0; + res->MaxCombinedTextureImageUnits = 8; + res->MaxTextureImageUnits = 8; + res->MaxFragmentUniformVectors = 16; + res->MaxDrawBuffers = 1; + + res->OES_standard_derivatives = 0; + res->OES_EGL_image_external = 0; + + res->MaxExpressionComplexity = kMaxExpressionComplexity; + res->MaxCallStackDepth = kMaxCallStackDepth; + res->MaxFunctionParameters = kMaxFunctionParameters; + } + + void GenerateLongExpression(int length, std::stringstream* ss) + { + for (int ii = 0; ii < length; ++ii) { + *ss << "+ vec4(" << ii << ")"; + } + } + + std::string GenerateShaderWithLongExpression(int length) + { + static const char* shaderStart = SHADER( + precision mediump float; + uniform vec4 u_color; + void main() + { + gl_FragColor = u_color + ); + + std::stringstream ss; + ss << shaderStart; + GenerateLongExpression(length, &ss); + ss << "; }"; + + return ss.str(); + } + + std::string GenerateShaderWithUnusedLongExpression(int length) + { + static const char* shaderStart = SHADER( + precision mediump float; + uniform vec4 u_color; + void main() + { + gl_FragColor = u_color; + } + vec4 someFunction() { + return u_color + ); + + std::stringstream ss; + + ss << shaderStart; + GenerateLongExpression(length, &ss); + ss << "; }"; + + return ss.str(); + } + + void GenerateDeepFunctionStack(int length, std::stringstream* ss) + { + static const char* shaderStart = SHADER( + precision mediump float; + uniform vec4 u_color; + vec4 function0() { + return u_color; + } + ); + + *ss << shaderStart; + for (int ii = 0; ii < length; ++ii) { + *ss << "vec4 function" << (ii + 1) << "() {\n" + << " return function" << ii << "();\n" + << "}\n"; + } + } + + std::string GenerateShaderWithDeepFunctionStack(int length) + { + std::stringstream ss; + + GenerateDeepFunctionStack(length, &ss); + + ss << "void main() {\n" + << " gl_FragColor = function" << length << "();\n" + << "}"; + + return ss.str(); + } + + std::string GenerateShaderWithUnusedDeepFunctionStack(int length) + { + std::stringstream ss; + + GenerateDeepFunctionStack(length, &ss); + + ss << "void main() {\n" + << " gl_FragColor = vec4(0,0,0,0);\n" + << "}"; + + + return ss.str(); + } + + std::string GenerateShaderWithFunctionParameters(int parameters) + { + std::stringstream ss; + + ss << "precision mediump float;\n" + << "\n" + << "float foo("; + for (int i = 0; i < parameters; ++i) + { + ss << "float f" << i; + if (i + 1 < parameters) + { + ss << ", "; + } + } + ss << ")\n" + << "{\n" + << " return f0;\n" + << "}\n" + << "\n" + << "void main()\n" + << "{\n" + << " gl_FragColor = vec4(0,0,0,0);\n" + << "}"; + + return ss.str(); + } + + // Compiles a shader and if there's an error checks for a specific + // substring in the error log. This way we know the error is specific + // to the issue we are testing. + bool CheckShaderCompilation(ShHandle compiler, + const char *source, + ShCompileOptions compileOptions, + const char *expected_error) + { + bool success = sh::Compile(compiler, &source, 1, compileOptions) != 0; + if (success) + { + success = !expected_error; + } + else + { + std::string log = sh::GetInfoLog(compiler); + if (expected_error) + success = log.find(expected_error) != std::string::npos; + + EXPECT_TRUE(success) << log << "\n----shader----\n" << source; + } + return success; + } + + ShBuiltInResources resources; +}; + +const char* ExpressionLimitTest::kExpressionTooComplex = + "Expression too complex"; +const char* ExpressionLimitTest::kCallStackTooDeep = + "Call stack too deep"; +const char* ExpressionLimitTest::kHasRecursion = + "Function recursion detected"; +const char* ExpressionLimitTest::kTooManyParameters = + "Function has too many parameters"; + +TEST_F(ExpressionLimitTest, ExpressionComplexity) +{ + ShShaderSpec spec = SH_WEBGL_SPEC; + ShShaderOutput output = SH_ESSL_OUTPUT; + ShHandle vertexCompiler = sh::ConstructCompiler(GL_FRAGMENT_SHADER, spec, output, &resources); + ShCompileOptions compileOptions = SH_LIMIT_EXPRESSION_COMPLEXITY; + + // Test expression under the limit passes. + EXPECT_TRUE(CheckShaderCompilation( + vertexCompiler, + GenerateShaderWithLongExpression( + kMaxExpressionComplexity - 10).c_str(), + compileOptions, NULL)); + // Test expression over the limit fails. + EXPECT_TRUE(CheckShaderCompilation( + vertexCompiler, + GenerateShaderWithLongExpression( + kMaxExpressionComplexity + 10).c_str(), + compileOptions, kExpressionTooComplex)); + // Test expression over the limit without a limit does not fail. + EXPECT_TRUE(CheckShaderCompilation( + vertexCompiler, + GenerateShaderWithLongExpression( + kMaxExpressionComplexity + 10).c_str(), + compileOptions & ~SH_LIMIT_EXPRESSION_COMPLEXITY, NULL)); + sh::Destruct(vertexCompiler); +} + +TEST_F(ExpressionLimitTest, UnusedExpressionComplexity) +{ + ShShaderSpec spec = SH_WEBGL_SPEC; + ShShaderOutput output = SH_ESSL_OUTPUT; + ShHandle vertexCompiler = sh::ConstructCompiler(GL_FRAGMENT_SHADER, spec, output, &resources); + ShCompileOptions compileOptions = SH_LIMIT_EXPRESSION_COMPLEXITY; + + // Test expression under the limit passes. + EXPECT_TRUE(CheckShaderCompilation( + vertexCompiler, + GenerateShaderWithUnusedLongExpression( + kMaxExpressionComplexity - 10).c_str(), + compileOptions, NULL)); + // Test expression over the limit fails. + EXPECT_TRUE(CheckShaderCompilation( + vertexCompiler, + GenerateShaderWithUnusedLongExpression( + kMaxExpressionComplexity + 10).c_str(), + compileOptions, kExpressionTooComplex)); + // Test expression over the limit without a limit does not fail. + EXPECT_TRUE(CheckShaderCompilation( + vertexCompiler, + GenerateShaderWithUnusedLongExpression( + kMaxExpressionComplexity + 10).c_str(), + compileOptions & ~SH_LIMIT_EXPRESSION_COMPLEXITY, NULL)); + sh::Destruct(vertexCompiler); +} + +TEST_F(ExpressionLimitTest, CallStackDepth) +{ + ShShaderSpec spec = SH_WEBGL_SPEC; + ShShaderOutput output = SH_ESSL_OUTPUT; + ShHandle vertexCompiler = sh::ConstructCompiler(GL_FRAGMENT_SHADER, spec, output, &resources); + ShCompileOptions compileOptions = SH_LIMIT_CALL_STACK_DEPTH; + + // Test call stack under the limit passes. + EXPECT_TRUE(CheckShaderCompilation( + vertexCompiler, + GenerateShaderWithDeepFunctionStack( + kMaxCallStackDepth - 10).c_str(), + compileOptions, NULL)); + // Test call stack over the limit fails. + EXPECT_TRUE(CheckShaderCompilation( + vertexCompiler, + GenerateShaderWithDeepFunctionStack( + kMaxCallStackDepth + 10).c_str(), + compileOptions, kCallStackTooDeep)); + // Test call stack over the limit without limit does not fail. + EXPECT_TRUE(CheckShaderCompilation( + vertexCompiler, + GenerateShaderWithDeepFunctionStack( + kMaxCallStackDepth + 10).c_str(), + compileOptions & ~SH_LIMIT_CALL_STACK_DEPTH, NULL)); + sh::Destruct(vertexCompiler); +} + +TEST_F(ExpressionLimitTest, UnusedCallStackDepth) +{ + ShShaderSpec spec = SH_WEBGL_SPEC; + ShShaderOutput output = SH_ESSL_OUTPUT; + ShHandle vertexCompiler = sh::ConstructCompiler(GL_FRAGMENT_SHADER, spec, output, &resources); + ShCompileOptions compileOptions = SH_LIMIT_CALL_STACK_DEPTH; + + // Test call stack under the limit passes. + EXPECT_TRUE(CheckShaderCompilation( + vertexCompiler, + GenerateShaderWithUnusedDeepFunctionStack( + kMaxCallStackDepth - 10).c_str(), + compileOptions, NULL)); + // Test call stack over the limit fails. + EXPECT_TRUE(CheckShaderCompilation( + vertexCompiler, + GenerateShaderWithUnusedDeepFunctionStack( + kMaxCallStackDepth + 10).c_str(), + compileOptions, kCallStackTooDeep)); + // Test call stack over the limit without limit does not fail. + EXPECT_TRUE(CheckShaderCompilation( + vertexCompiler, + GenerateShaderWithUnusedDeepFunctionStack( + kMaxCallStackDepth + 10).c_str(), + compileOptions & ~SH_LIMIT_CALL_STACK_DEPTH, NULL)); + sh::Destruct(vertexCompiler); +} + +TEST_F(ExpressionLimitTest, Recursion) +{ + ShShaderSpec spec = SH_WEBGL_SPEC; + ShShaderOutput output = SH_ESSL_OUTPUT; + ShHandle vertexCompiler = sh::ConstructCompiler(GL_FRAGMENT_SHADER, spec, output, &resources); + ShCompileOptions compileOptions = 0; + + static const char* shaderWithRecursion0 = SHADER( + precision mediump float; + uniform vec4 u_color; + vec4 someFunc() { + return someFunc(); + } + + void main() { + gl_FragColor = u_color * someFunc(); + } + ); + + static const char* shaderWithRecursion1 = SHADER( + precision mediump float; + uniform vec4 u_color; + + vec4 someFunc(); + + vec4 someFunc1() { + return someFunc(); + } + + vec4 someFunc() { + return someFunc1(); + } + + void main() { + gl_FragColor = u_color * someFunc(); + } + ); + + static const char* shaderWithRecursion2 = SHADER( + precision mediump float; + uniform vec4 u_color; + vec4 someFunc() { + if (u_color.x > 0.5) { + return someFunc(); + } else { + return vec4(1); + } + } + + void main() { + gl_FragColor = someFunc(); + } + ); + + static const char* shaderWithRecursion3 = SHADER( + precision mediump float; + uniform vec4 u_color; + vec4 someFunc() { + if (u_color.x > 0.5) { + return vec4(1); + } else { + return someFunc(); + } + } + + void main() { + gl_FragColor = someFunc(); + } + ); + + static const char* shaderWithRecursion4 = SHADER( + precision mediump float; + uniform vec4 u_color; + vec4 someFunc() { + return (u_color.x > 0.5) ? vec4(1) : someFunc(); + } + + void main() { + gl_FragColor = someFunc(); + } + ); + + static const char* shaderWithRecursion5 = SHADER( + precision mediump float; + uniform vec4 u_color; + vec4 someFunc() { + return (u_color.x > 0.5) ? someFunc() : vec4(1); + } + + void main() { + gl_FragColor = someFunc(); + } + ); + + static const char* shaderWithRecursion6 = SHADER( + precision mediump float; + uniform vec4 u_color; + vec4 someFunc() { + return someFunc(); + } + + void main() { + gl_FragColor = u_color; + } + ); + + static const char* shaderWithNoRecursion = SHADER( + precision mediump float; + uniform vec4 u_color; + + vec3 rgb(int r, int g, int b) { + return vec3(float(r) / 255.0, float(g) / 255.0, float(b) / 255.0); + } + + void main() { + vec3 hairColor0 = rgb(151, 200, 234); + vec3 faceColor2 = rgb(183, 148, 133); + gl_FragColor = u_color + vec4(hairColor0 + faceColor2, 0); + } + ); + + static const char* shaderWithRecursion7 = SHADER( + precision mediump float; + uniform vec4 u_color; + + vec4 function2() { + return u_color; + } + + vec4 function1() { + vec4 a = function2(); + vec4 b = function1(); + return a + b; + } + + void main() { + gl_FragColor = function1(); + } + ); + + static const char* shaderWithRecursion8 = SHADER( + precision mediump float; + uniform vec4 u_color; + + vec4 function1(); + + vec4 function3() { + return function1(); + } + + vec4 function2() { + return function3(); + } + + vec4 function1() { + return function2(); + } + + void main() { + gl_FragColor = function1(); + } + ); + + // Check simple recursions fails. + EXPECT_TRUE(CheckShaderCompilation( + vertexCompiler, shaderWithRecursion0, + compileOptions, kHasRecursion)); + // Check simple recursions fails. + EXPECT_TRUE(CheckShaderCompilation( + vertexCompiler, shaderWithRecursion1, + compileOptions, kHasRecursion)); + // Check if recursions fails. + EXPECT_TRUE(CheckShaderCompilation( + vertexCompiler, shaderWithRecursion2, + compileOptions, kHasRecursion)); + // Check if recursions fails. + EXPECT_TRUE(CheckShaderCompilation( + vertexCompiler, shaderWithRecursion3, + compileOptions, kHasRecursion)); + // Check ternary recursions fails. + EXPECT_TRUE(CheckShaderCompilation( + vertexCompiler, shaderWithRecursion4, + compileOptions, kHasRecursion)); + // Check ternary recursions fails. + EXPECT_TRUE(CheckShaderCompilation( + vertexCompiler, shaderWithRecursion5, + compileOptions, kHasRecursion)); + + // Check some more forms of recursion + EXPECT_TRUE(CheckShaderCompilation( + vertexCompiler, shaderWithRecursion6, + compileOptions, kHasRecursion)); + EXPECT_TRUE(CheckShaderCompilation( + vertexCompiler, shaderWithRecursion7, + compileOptions, kHasRecursion)); + EXPECT_TRUE(CheckShaderCompilation( + vertexCompiler, shaderWithRecursion8, + compileOptions, kHasRecursion)); + // Check unused recursions fails if limiting call stack + // since we check all paths. + EXPECT_TRUE(CheckShaderCompilation( + vertexCompiler, shaderWithRecursion6, + compileOptions | SH_LIMIT_CALL_STACK_DEPTH, kHasRecursion)); + + // Check unused recursions passes. + EXPECT_TRUE(CheckShaderCompilation( + vertexCompiler, shaderWithNoRecursion, + compileOptions, NULL)); + // Check unused recursions passes if limiting call stack. + EXPECT_TRUE(CheckShaderCompilation( + vertexCompiler, shaderWithNoRecursion, + compileOptions | SH_LIMIT_CALL_STACK_DEPTH, NULL)); + sh::Destruct(vertexCompiler); +} + +TEST_F(ExpressionLimitTest, FunctionParameterCount) +{ + ShShaderSpec spec = SH_WEBGL_SPEC; + ShShaderOutput output = SH_ESSL_OUTPUT; + ShHandle compiler = sh::ConstructCompiler(GL_FRAGMENT_SHADER, spec, output, &resources); + ShCompileOptions compileOptions = SH_LIMIT_EXPRESSION_COMPLEXITY; + + // Test parameters under the limit succeeds. + EXPECT_TRUE(CheckShaderCompilation( + compiler, GenerateShaderWithFunctionParameters(kMaxFunctionParameters).c_str(), + compileOptions, nullptr)); + // Test parameters over the limit fails. + EXPECT_TRUE(CheckShaderCompilation( + compiler, GenerateShaderWithFunctionParameters(kMaxFunctionParameters + 1).c_str(), + compileOptions, kTooManyParameters)); + // Test parameters over the limit without limit does not fail. + EXPECT_TRUE(CheckShaderCompilation( + compiler, GenerateShaderWithFunctionParameters(kMaxFunctionParameters + 1).c_str(), + compileOptions & ~SH_LIMIT_EXPRESSION_COMPLEXITY, nullptr)); + sh::Destruct(compiler); +} diff --git a/gfx/angle/src/tests/compiler_tests/FragDepth_test.cpp b/gfx/angle/src/tests/compiler_tests/FragDepth_test.cpp new file mode 100755 index 000000000..1d3e358ca --- /dev/null +++ b/gfx/angle/src/tests/compiler_tests/FragDepth_test.cpp @@ -0,0 +1,119 @@ +// +// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// FragDepth_test.cpp: +// Test for GLES SL 3.0 gl_FragDepth variable implementation. +// + +#include "angle_gl.h" +#include "gtest/gtest.h" +#include "GLSLANG/ShaderLang.h" + +namespace +{ +const char ESSLVersion100[] = "#version 100\n"; +const char ESSLVersion300[] = "#version 300 es\n"; +const char EXTFDPragma[] = "#extension GL_EXT_frag_depth : require\n"; +} // namespace + +class FragDepthTest : public testing::TestWithParam<bool> +{ + protected: + void SetUp() override + { + sh::InitBuiltInResources(&mResources); + mCompiler = nullptr; + mResources.EXT_frag_depth = GetParam(); + } + + void TearDown() override { DestroyCompiler(); } + void DestroyCompiler() + { + if (mCompiler) + { + sh::Destruct(mCompiler); + mCompiler = nullptr; + } + } + + void InitializeCompiler() + { + DestroyCompiler(); + mCompiler = sh::ConstructCompiler(GL_FRAGMENT_SHADER, SH_GLES3_SPEC, + SH_GLSL_COMPATIBILITY_OUTPUT, &mResources); + ASSERT_TRUE(mCompiler != nullptr) << "Compiler could not be constructed."; + } + + testing::AssertionResult TestShaderCompile(const char *version, + const char *pragma, + const char *shader) + { + const char *shaderStrings[] = {version, pragma, shader}; + bool success = sh::Compile(mCompiler, shaderStrings, 3, 0); + if (success) + { + return ::testing::AssertionSuccess() << "Compilation success"; + } + return ::testing::AssertionFailure() << sh::GetInfoLog(mCompiler); + } + + protected: + ShBuiltInResources mResources; + ShHandle mCompiler; +}; + +// The GLES SL 3.0 built-in variable gl_FragDepth fails to compile with GLES SL 1.0. +TEST_P(FragDepthTest, CompileFailsESSL100) +{ + static const char shaderString[] = + "precision mediump float;\n" + "void main() { \n" + " gl_FragDepth = 1.0;\n" + "}\n"; + + InitializeCompiler(); + EXPECT_FALSE(TestShaderCompile(ESSLVersion100, "", shaderString)); + EXPECT_FALSE(TestShaderCompile("", "", shaderString)); + EXPECT_FALSE(TestShaderCompile("", EXTFDPragma, shaderString)); +} + +// The GLES SL 3.0 built-in variable gl_FragDepth compiles with GLES SL 3.0. +TEST_P(FragDepthTest, CompileSucceedsESSL300) +{ + static const char shaderString[] = + "precision mediump float;\n" + "void main() { \n" + " gl_FragDepth = 1.0;\n" + "}\n"; + InitializeCompiler(); + EXPECT_TRUE(TestShaderCompile(ESSLVersion300, "", shaderString)); +} + +// Using #extension GL_EXT_frag_depth in GLSL ES 3.0 shader fails to compile. +TEST_P(FragDepthTest, ExtensionFDFailsESSL300) +{ + static const char shaderString[] = + "precision mediump float;\n" + "out vec4 fragColor;\n" + "void main() { \n" + " fragColor = vec4(1.0);\n" + "}\n"; + InitializeCompiler(); + if (mResources.EXT_frag_depth == 1) + { + // TODO(kkinnunen, geofflang): this should fail. Extensions need to have similar level + // system to SymbolTable. The biggest task is to implement version-aware preprocessor, so + // that the extension defines can be defined depending on the version that the preprocessor + // saw or did not see. + EXPECT_TRUE(TestShaderCompile(ESSLVersion300, EXTFDPragma, shaderString)); + } + else + { + EXPECT_FALSE(TestShaderCompile(ESSLVersion300, EXTFDPragma, shaderString)); + } +} + +// The tests should pass regardless whether the EXT_frag_depth is on or not. +INSTANTIATE_TEST_CASE_P(FragDepthTests, FragDepthTest, testing::Values(false, true)); diff --git a/gfx/angle/src/tests/compiler_tests/GLSLCompatibilityOutput_test.cpp b/gfx/angle/src/tests/compiler_tests/GLSLCompatibilityOutput_test.cpp new file mode 100755 index 000000000..8adec774a --- /dev/null +++ b/gfx/angle/src/tests/compiler_tests/GLSLCompatibilityOutput_test.cpp @@ -0,0 +1,35 @@ +// +// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// GLSLCompatibilityOutputTest.cpp +// Test compiler output for glsl compatibility mode +// + +#include "angle_gl.h" +#include "gtest/gtest.h" +#include "GLSLANG/ShaderLang.h" +#include "tests/test_utils/compiler_test.h" + +using namespace sh; + +class GLSLCompatibilityOutputTest : public MatchOutputCodeTest +{ + public: + GLSLCompatibilityOutputTest() + : MatchOutputCodeTest(GL_VERTEX_SHADER, SH_VARIABLES, SH_GLSL_COMPATIBILITY_OUTPUT) + { + } +}; + +// Verify gl_Position is written when compiling in compatibility mode +TEST_F(GLSLCompatibilityOutputTest, GLPositionWrittenTest) +{ + const std::string &shaderString = + "precision mediump float;\n" + "void main() {\n" + "}"; + compile(shaderString); + EXPECT_TRUE(foundInCode("gl_Position")); +}
\ No newline at end of file diff --git a/gfx/angle/src/tests/compiler_tests/IntermNode_test.cpp b/gfx/angle/src/tests/compiler_tests/IntermNode_test.cpp new file mode 100755 index 000000000..1a14ad86c --- /dev/null +++ b/gfx/angle/src/tests/compiler_tests/IntermNode_test.cpp @@ -0,0 +1,232 @@ +// +// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// IntermNode_test.cpp: +// Unit tests for the AST node classes. +// + +#include "angle_gl.h" +#include "gtest/gtest.h" +#include "compiler/translator/InfoSink.h" +#include "compiler/translator/IntermNode.h" +#include "compiler/translator/PoolAlloc.h" + +using namespace sh; + +class IntermNodeTest : public testing::Test +{ + public: + IntermNodeTest() : mUniqueIndex(0) {} + + protected: + void SetUp() override + { + allocator.push(); + SetGlobalPoolAllocator(&allocator); + } + + void TearDown() override + { + SetGlobalPoolAllocator(nullptr); + allocator.pop(); + } + + TIntermSymbol *createTestSymbol(const TType &type) + { + TInfoSinkBase symbolNameOut; + symbolNameOut << "test" << mUniqueIndex; + TString symbolName = symbolNameOut.c_str(); + ++mUniqueIndex; + + TIntermSymbol *node = new TIntermSymbol(0, symbolName, type); + node->setLine(createUniqueSourceLoc()); + node->setInternal(true); + node->getTypePointer()->setQualifier(EvqTemporary); + return node; + } + + TIntermSymbol *createTestSymbol() + { + TType type(EbtFloat, EbpHigh); + return createTestSymbol(type); + } + + void checkTypeEqualWithQualifiers(const TType &original, const TType ©) + { + ASSERT_EQ(original, copy); + ASSERT_EQ(original.getPrecision(), copy.getPrecision()); + ASSERT_EQ(original.getQualifier(), copy.getQualifier()); + } + + void checkSymbolCopy(TIntermNode *aOriginal, TIntermNode *aCopy) + { + ASSERT_NE(aOriginal, aCopy); + TIntermSymbol *copy = aCopy->getAsSymbolNode(); + TIntermSymbol *original = aOriginal->getAsSymbolNode(); + ASSERT_NE(nullptr, copy); + ASSERT_NE(nullptr, original); + ASSERT_NE(original, copy); + ASSERT_EQ(original->getId(), copy->getId()); + ASSERT_EQ(original->getName().getString(), copy->getName().getString()); + ASSERT_EQ(original->getName().isInternal(), copy->getName().isInternal()); + checkTypeEqualWithQualifiers(original->getType(), copy->getType()); + ASSERT_EQ(original->getLine().first_file, copy->getLine().first_file); + ASSERT_EQ(original->getLine().first_line, copy->getLine().first_line); + ASSERT_EQ(original->getLine().last_file, copy->getLine().last_file); + ASSERT_EQ(original->getLine().last_line, copy->getLine().last_line); + } + + TSourceLoc createUniqueSourceLoc() + { + TSourceLoc loc; + loc.first_file = mUniqueIndex; + loc.first_line = mUniqueIndex + 1; + loc.last_file = mUniqueIndex + 2; + loc.last_line = mUniqueIndex + 3; + ++mUniqueIndex; + return loc; + } + + static TSourceLoc getTestSourceLoc() + { + TSourceLoc loc; + loc.first_file = 1; + loc.first_line = 2; + loc.last_file = 3; + loc.last_line = 4; + return loc; + } + + static void checkTestSourceLoc(const TSourceLoc &loc) + { + ASSERT_EQ(1, loc.first_file); + ASSERT_EQ(2, loc.first_line); + ASSERT_EQ(3, loc.last_file); + ASSERT_EQ(4, loc.last_line); + } + + private: + TPoolAllocator allocator; + int mUniqueIndex; +}; + +// Check that the deep copy of a symbol node is an actual copy with the same attributes as the +// original. +TEST_F(IntermNodeTest, DeepCopySymbolNode) +{ + TType type(EbtInt, EbpHigh); + TIntermSymbol *original = new TIntermSymbol(0, TString("name"), type); + original->setLine(getTestSourceLoc()); + original->setInternal(true); + TIntermTyped *copy = original->deepCopy(); + checkSymbolCopy(original, copy); + checkTestSourceLoc(copy->getLine()); +} + +// Check that the deep copy of a constant union node is an actual copy with the same attributes as +// the original. +TEST_F(IntermNodeTest, DeepCopyConstantUnionNode) +{ + TType type(EbtInt, EbpHigh); + TConstantUnion *constValue = new TConstantUnion[1]; + constValue[0].setIConst(101); + TIntermConstantUnion *original = new TIntermConstantUnion(constValue, type); + original->setLine(getTestSourceLoc()); + TIntermTyped *copyTyped = original->deepCopy(); + TIntermConstantUnion *copy = copyTyped->getAsConstantUnion(); + ASSERT_NE(nullptr, copy); + ASSERT_NE(original, copy); + checkTestSourceLoc(copy->getLine()); + checkTypeEqualWithQualifiers(original->getType(), copy->getType()); + ASSERT_EQ(101, copy->getIConst(0)); +} + +// Check that the deep copy of a binary node is an actual copy with the same attributes as the +// original. Child nodes also need to be copies with the same attributes as the original children. +TEST_F(IntermNodeTest, DeepCopyBinaryNode) +{ + TType type(EbtFloat, EbpHigh); + + TIntermBinary *original = new TIntermBinary(EOpAdd, createTestSymbol(), createTestSymbol()); + original->setLine(getTestSourceLoc()); + TIntermTyped *copyTyped = original->deepCopy(); + TIntermBinary *copy = copyTyped->getAsBinaryNode(); + ASSERT_NE(nullptr, copy); + ASSERT_NE(original, copy); + checkTestSourceLoc(copy->getLine()); + checkTypeEqualWithQualifiers(original->getType(), copy->getType()); + + checkSymbolCopy(original->getLeft(), copy->getLeft()); + checkSymbolCopy(original->getRight(), copy->getRight()); +} + +// Check that the deep copy of a unary node is an actual copy with the same attributes as the +// original. The child node also needs to be a copy with the same attributes as the original child. +TEST_F(IntermNodeTest, DeepCopyUnaryNode) +{ + TType type(EbtFloat, EbpHigh); + + TIntermUnary *original = new TIntermUnary(EOpPreIncrement, createTestSymbol()); + original->setLine(getTestSourceLoc()); + TIntermTyped *copyTyped = original->deepCopy(); + TIntermUnary *copy = copyTyped->getAsUnaryNode(); + ASSERT_NE(nullptr, copy); + ASSERT_NE(original, copy); + checkTestSourceLoc(copy->getLine()); + checkTypeEqualWithQualifiers(original->getType(), copy->getType()); + + checkSymbolCopy(original->getOperand(), copy->getOperand()); +} + +// Check that the deep copy of an aggregate node is an actual copy with the same attributes as the +// original. Child nodes also need to be copies with the same attributes as the original children. +TEST_F(IntermNodeTest, DeepCopyAggregateNode) +{ + TType type(EbtFloat, EbpHigh); + + TIntermAggregate *original = new TIntermAggregate(EOpMix); + original->setLine(getTestSourceLoc()); + TIntermSequence *originalSeq = original->getSequence(); + originalSeq->push_back(createTestSymbol()); + originalSeq->push_back(createTestSymbol()); + originalSeq->push_back(createTestSymbol()); + TIntermTyped *copyTyped = original->deepCopy(); + TIntermAggregate *copy = copyTyped->getAsAggregate(); + ASSERT_NE(nullptr, copy); + ASSERT_NE(original, copy); + checkTestSourceLoc(copy->getLine()); + checkTypeEqualWithQualifiers(original->getType(), copy->getType()); + + ASSERT_EQ(original->getSequence()->size(), copy->getSequence()->size()); + TIntermSequence::size_type i = 0; + for (auto *copyChild : *copy->getSequence()) + { + TIntermNode *originalChild = originalSeq->at(i); + checkSymbolCopy(originalChild, copyChild); + ++i; + } +} + +// Check that the deep copy of a ternary node is an actual copy with the same attributes as the +// original. Child nodes also need to be copies with the same attributes as the original children. +TEST_F(IntermNodeTest, DeepCopyTernaryNode) +{ + TType type(EbtFloat, EbpHigh); + + TIntermTernary *original = new TIntermTernary(createTestSymbol(TType(EbtBool, EbpUndefined)), + createTestSymbol(), createTestSymbol()); + original->setLine(getTestSourceLoc()); + TIntermTyped *copyTyped = original->deepCopy(); + TIntermTernary *copy = copyTyped->getAsTernaryNode(); + ASSERT_NE(nullptr, copy); + ASSERT_NE(original, copy); + checkTestSourceLoc(copy->getLine()); + checkTypeEqualWithQualifiers(original->getType(), copy->getType()); + + checkSymbolCopy(original->getCondition(), copy->getCondition()); + checkSymbolCopy(original->getTrueExpression(), copy->getTrueExpression()); + checkSymbolCopy(original->getFalseExpression(), copy->getFalseExpression()); +} + diff --git a/gfx/angle/src/tests/compiler_tests/MalformedShader_test.cpp b/gfx/angle/src/tests/compiler_tests/MalformedShader_test.cpp new file mode 100755 index 000000000..e84fc7014 --- /dev/null +++ b/gfx/angle/src/tests/compiler_tests/MalformedShader_test.cpp @@ -0,0 +1,3158 @@ +// +// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// MalformedShader_test.cpp: +// Tests that malformed shaders fail compilation. +// + +#include "angle_gl.h" +#include "gtest/gtest.h" +#include "GLSLANG/ShaderLang.h" +#include "compiler/translator/TranslatorESSL.h" + +using namespace sh; + +class MalformedShaderTest : public testing::Test +{ + public: + MalformedShaderTest() : mExtraCompileOptions(0) {} + + protected: + virtual void SetUp() + { + ShBuiltInResources resources; + sh::InitBuiltInResources(&resources); + + mTranslator = new TranslatorESSL(GL_FRAGMENT_SHADER, SH_GLES3_SPEC); + ASSERT_TRUE(mTranslator->Init(resources)); + } + + virtual void TearDown() + { + delete mTranslator; + } + + // Return true when compilation succeeds + bool compile(const std::string& shaderString) + { + const char *shaderStrings[] = { shaderString.c_str() }; + bool compilationSuccess = + mTranslator->compile(shaderStrings, 1, SH_INTERMEDIATE_TREE | mExtraCompileOptions); + TInfoSink &infoSink = mTranslator->getInfoSink(); + mInfoLog = infoSink.info.c_str(); + return compilationSuccess; + } + + bool hasWarning() const + { + return mInfoLog.find("WARNING: ") != std::string::npos; + } + + protected: + std::string mInfoLog; + TranslatorESSL *mTranslator; + ShCompileOptions mExtraCompileOptions; +}; + +class MalformedVertexShaderTest : public MalformedShaderTest +{ + public: + MalformedVertexShaderTest() {} + + protected: + void SetUp() override + { + ShBuiltInResources resources; + sh::InitBuiltInResources(&resources); + + mTranslator = new TranslatorESSL(GL_VERTEX_SHADER, SH_GLES3_SPEC); + ASSERT_TRUE(mTranslator->Init(resources)); + } +}; + +class MalformedWebGL2ShaderTest : public MalformedShaderTest +{ + public: + MalformedWebGL2ShaderTest() {} + + protected: + void SetUp() override + { + ShBuiltInResources resources; + sh::InitBuiltInResources(&resources); + + mTranslator = new TranslatorESSL(GL_FRAGMENT_SHADER, SH_WEBGL2_SPEC); + ASSERT_TRUE(mTranslator->Init(resources)); + } +}; + +class MalformedWebGL1ShaderTest : public MalformedShaderTest +{ + public: + MalformedWebGL1ShaderTest() {} + + protected: + void SetUp() override + { + ShBuiltInResources resources; + sh::InitBuiltInResources(&resources); + + mTranslator = new TranslatorESSL(GL_FRAGMENT_SHADER, SH_WEBGL_SPEC); + ASSERT_TRUE(mTranslator->Init(resources)); + } +}; + +class MalformedVertexShaderGLES31Test : public MalformedShaderTest +{ + public: + MalformedVertexShaderGLES31Test() {} + + private: + void SetUp() override + { + ShBuiltInResources resources; + sh::InitBuiltInResources(&resources); + mTranslator = new TranslatorESSL(GL_VERTEX_SHADER, SH_GLES3_1_SPEC); + ASSERT_TRUE(mTranslator->Init(resources)); + } +}; + +class MalformedFragmentShaderGLES31Test : public MalformedShaderTest +{ + public: + MalformedFragmentShaderGLES31Test() {} + + private: + void SetUp() override + { + ShBuiltInResources resources; + sh::InitBuiltInResources(&resources); + mTranslator = new TranslatorESSL(GL_FRAGMENT_SHADER, SH_GLES3_1_SPEC); + ASSERT_TRUE(mTranslator->Init(resources)); + } +}; + +class MalformedComputeShaderTest : public MalformedShaderTest +{ + public: + MalformedComputeShaderTest() {} + + private: + void SetUp() override + { + ShBuiltInResources resources; + sh::InitBuiltInResources(&resources); + mTranslator = new TranslatorESSL(GL_COMPUTE_SHADER, SH_GLES3_1_SPEC); + ASSERT_TRUE(mTranslator->Init(resources)); + } +}; + +class UnrollForLoopsTest : public MalformedShaderTest +{ + public: + UnrollForLoopsTest() { mExtraCompileOptions = SH_UNROLL_FOR_LOOP_WITH_INTEGER_INDEX; } +}; + +// This is a test for a bug that used to exist in ANGLE: +// Calling a function with all parameters missing should not succeed. +TEST_F(MalformedShaderTest, FunctionParameterMismatch) +{ + const std::string &shaderString = + "precision mediump float;\n" + "float fun(float a) {\n" + " return a * 2.0;\n" + "}\n" + "void main() {\n" + " float ff = fun();\n" + " gl_FragColor = vec4(ff);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Functions can't be redeclared as variables in the same scope (ESSL 1.00 section 4.2.7) +TEST_F(MalformedShaderTest, RedeclaringFunctionAsVariable) +{ + const std::string &shaderString = + "precision mediump float;\n" + "float fun(float a) {\n" + " return a * 2.0;\n" + "}\n" + "float fun;\n" + "void main() {\n" + " gl_FragColor = vec4(0.0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Functions can't be redeclared as structs in the same scope (ESSL 1.00 section 4.2.7) +TEST_F(MalformedShaderTest, RedeclaringFunctionAsStruct) +{ + const std::string &shaderString = + "precision mediump float;\n" + "float fun(float a) {\n" + " return a * 2.0;\n" + "}\n" + "struct fun { float a; };\n" + "void main() {\n" + " gl_FragColor = vec4(0.0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Functions can't be redeclared with different qualifiers (ESSL 1.00 section 6.1.0) +TEST_F(MalformedShaderTest, RedeclaringFunctionWithDifferentQualifiers) +{ + const std::string &shaderString = + "precision mediump float;\n" + "float fun(out float a);\n" + "float fun(float a) {\n" + " return a * 2.0;\n" + "}\n" + "void main() {\n" + " gl_FragColor = vec4(0.0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Assignment and equality are undefined for structures containing arrays (ESSL 1.00 section 5.7) +TEST_F(MalformedShaderTest, CompareStructsContainingArrays) +{ + const std::string &shaderString = + "precision mediump float;\n" + "struct s { float a[3]; };\n" + "void main() {\n" + " s a;\n" + " s b;\n" + " bool c = (a == b);\n" + " gl_FragColor = vec4(c ? 1.0 : 0.0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Assignment and equality are undefined for structures containing arrays (ESSL 1.00 section 5.7) +TEST_F(MalformedShaderTest, AssignStructsContainingArrays) +{ + const std::string &shaderString = + "precision mediump float;\n" + "struct s { float a[3]; };\n" + "void main() {\n" + " s a;\n" + " s b;\n" + " b.a[0] = 0.0;\n" + " a = b;\n" + " gl_FragColor = vec4(a.a[0]);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Assignment and equality are undefined for structures containing samplers (ESSL 1.00 sections 5.7 and 5.9) +TEST_F(MalformedShaderTest, CompareStructsContainingSamplers) +{ + const std::string &shaderString = + "precision mediump float;\n" + "struct s { sampler2D foo; };\n" + "uniform s a;\n" + "uniform s b;\n" + "void main() {\n" + " bool c = (a == b);\n" + " gl_FragColor = vec4(c ? 1.0 : 0.0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Samplers are not allowed as l-values (ESSL 3.00 section 4.1.7), our interpretation is that this +// extends to structs containing samplers. ESSL 1.00 spec is clearer about this. +TEST_F(MalformedShaderTest, AssignStructsContainingSamplers) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "struct s { sampler2D foo; };\n" + "uniform s a;\n" + "out vec4 my_FragColor;\n" + "void main() {\n" + " s b;\n" + " b = a;\n" + " my_FragColor = vec4(1.0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// This is a regression test for a particular bug that was in ANGLE. +// It also verifies that ESSL3 functionality doesn't leak to ESSL1. +TEST_F(MalformedShaderTest, ArrayWithNoSizeInInitializerList) +{ + const std::string &shaderString = + "precision mediump float;\n" + "void main() {\n" + " float a[2], b[];\n" + " gl_FragColor = vec4(1.0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Const variables need an initializer. +TEST_F(MalformedShaderTest, ConstVarNotInitialized) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main() {\n" + " const float a;\n" + " my_FragColor = vec4(1.0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Const variables need an initializer. In ESSL1 const structs containing +// arrays are not allowed at all since it's impossible to initialize them. +// Even though this test is for ESSL3 the only thing that's critical for +// ESSL1 is the non-initialization check that's used for both language versions. +// Whether ESSL1 compilation generates the most helpful error messages is a +// secondary concern. +TEST_F(MalformedShaderTest, ConstStructNotInitialized) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "struct S {\n" + " float a[3];\n" + "};\n" + "out vec4 my_FragColor;\n" + "void main() {\n" + " const S b;\n" + " my_FragColor = vec4(1.0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Const variables need an initializer. In ESSL1 const arrays are not allowed +// at all since it's impossible to initialize them. +// Even though this test is for ESSL3 the only thing that's critical for +// ESSL1 is the non-initialization check that's used for both language versions. +// Whether ESSL1 compilation generates the most helpful error messages is a +// secondary concern. +TEST_F(MalformedShaderTest, ConstArrayNotInitialized) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main() {\n" + " const float a[3];\n" + " my_FragColor = vec4(1.0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Block layout qualifiers can't be used on non-block uniforms (ESSL 3.00 section 4.3.8.3) +TEST_F(MalformedShaderTest, BlockLayoutQualifierOnRegularUniform) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "layout(packed) uniform mat2 x;\n" + "out vec4 my_FragColor;\n" + "void main() {\n" + " my_FragColor = vec4(1.0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Block layout qualifiers can't be used on non-block uniforms (ESSL 3.00 section 4.3.8.3) +TEST_F(MalformedShaderTest, BlockLayoutQualifierOnUniformWithEmptyDecl) +{ + // Yes, the comma in the declaration below is not a typo. + // Empty declarations are allowed in GLSL. + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "layout(packed) uniform mat2, x;\n" + "out vec4 my_FragColor;\n" + "void main() {\n" + " my_FragColor = vec4(1.0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Arrays of arrays are not allowed (ESSL 3.00 section 4.1.9) +TEST_F(MalformedShaderTest, ArraysOfArrays1) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main() {\n" + " float[5] a[3];\n" + " my_FragColor = vec4(1.0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Arrays of arrays are not allowed (ESSL 3.00 section 4.1.9) +TEST_F(MalformedShaderTest, ArraysOfArrays2) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main() {\n" + " float[2] a, b[3];\n" + " my_FragColor = vec4(1.0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Implicitly sized arrays need to be initialized (ESSL 3.00 section 4.1.9) +TEST_F(MalformedShaderTest, UninitializedImplicitArraySize) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main() {\n" + " float[] a;\n" + " my_FragColor = vec4(1.0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// An operator can only form a constant expression if all the operands are constant expressions +// - even operands of ternary operator that are never evaluated. (ESSL 3.00 section 4.3.3) +TEST_F(MalformedShaderTest, TernaryOperatorNotConstantExpression) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "uniform bool u;\n" + "void main() {\n" + " const bool a = true ? true : u;\n" + " my_FragColor = vec4(1.0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Ternary operator can't operate on arrays (ESSL 3.00 section 5.7) +TEST_F(MalformedShaderTest, TernaryOperatorOnArrays) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main() {\n" + " float[1] a = float[1](0.0);\n" + " float[1] b = float[1](1.0);\n" + " float[1] c = true ? a : b;\n" + " my_FragColor = vec4(1.0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Ternary operator can't operate on structs (ESSL 3.00 section 5.7) +TEST_F(MalformedShaderTest, TernaryOperatorOnStructs) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "struct S { float foo; };\n" + "void main() {\n" + " S a = S(0.0);\n" + " S b = S(1.0);\n" + " S c = true ? a : b;\n" + " my_FragColor = vec4(1.0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Array length() returns a constant signed integral expression (ESSL 3.00 section 4.1.9) +// Assigning it to unsigned should result in an error. +TEST_F(MalformedShaderTest, AssignArrayLengthToUnsigned) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main() {\n" + " int[1] arr;\n" + " uint l = arr.length();\n" + " my_FragColor = vec4(float(l));\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Global variable initializers need to be constant expressions (ESSL 1.00 section 4.3) +// Initializing with a varying should be an error. +TEST_F(MalformedShaderTest, AssignVaryingToGlobal) +{ + const std::string &shaderString = + "precision mediump float;\n" + "varying float a;\n" + "float b = a * 2.0;\n" + "void main() {\n" + " gl_FragColor = vec4(b);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Global variable initializers need to be constant expressions (ESSL 3.00 section 4.3) +// Initializing with an uniform should be an error. +TEST_F(MalformedShaderTest, AssignUniformToGlobalESSL3) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "uniform float a;\n" + "float b = a * 2.0;\n" + "out vec4 my_FragColor;\n" + "void main() {\n" + " my_FragColor = vec4(b);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Global variable initializers need to be constant expressions (ESSL 1.00 section 4.3) +// Initializing with an uniform should generate a warning +// (we don't generate an error on ESSL 1.00 because of legacy compatibility) +TEST_F(MalformedShaderTest, AssignUniformToGlobalESSL1) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform float a;\n" + "float b = a * 2.0;\n" + "void main() {\n" + " gl_FragColor = vec4(b);\n" + "}\n"; + if (compile(shaderString)) + { + if (!hasWarning()) + { + FAIL() << "Shader compilation succeeded without warnings, expecting warning " << mInfoLog; + } + } + else + { + FAIL() << "Shader compilation failed, expecting success with warning " << mInfoLog; + } +} + +// Global variable initializers need to be constant expressions (ESSL 1.00 section 4.3) +// Initializing with an user-defined function call should be an error. +TEST_F(MalformedShaderTest, AssignFunctionCallToGlobal) +{ + const std::string &shaderString = + "precision mediump float;\n" + "float foo() { return 1.0; }\n" + "float b = foo();\n" + "void main() {\n" + " gl_FragColor = vec4(b);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Global variable initializers need to be constant expressions (ESSL 1.00 section 4.3) +// Initializing with an assignment to another global should be an error. +TEST_F(MalformedShaderTest, AssignAssignmentToGlobal) +{ + const std::string &shaderString = + "precision mediump float;\n" + "float c = 1.0;\n" + "float b = (c = 0.0);\n" + "void main() {\n" + " gl_FragColor = vec4(b);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Global variable initializers need to be constant expressions (ESSL 1.00 section 4.3) +// Initializing with incrementing another global should be an error. +TEST_F(MalformedShaderTest, AssignIncrementToGlobal) +{ + const std::string &shaderString = + "precision mediump float;\n" + "float c = 1.0;\n" + "float b = (c++);\n" + "void main() {\n" + " gl_FragColor = vec4(b);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Global variable initializers need to be constant expressions (ESSL 1.00 section 4.3) +// Initializing with a texture lookup function call should be an error. +TEST_F(MalformedShaderTest, AssignTexture2DToGlobal) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform mediump sampler2D s;\n" + "float b = texture2D(s, vec2(0.5, 0.5)).x;\n" + "void main() {\n" + " gl_FragColor = vec4(b);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Global variable initializers need to be constant expressions (ESSL 3.00 section 4.3) +// Initializing with a non-constant global should be an error. +TEST_F(MalformedShaderTest, AssignNonConstGlobalToGlobal) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "float a = 1.0;\n" + "float b = a * 2.0;\n" + "out vec4 my_FragColor;\n" + "void main() {\n" + " my_FragColor = vec4(b);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Global variable initializers need to be constant expressions (ESSL 3.00 section 4.3) +// Initializing with a constant global should be fine. +TEST_F(MalformedShaderTest, AssignConstGlobalToGlobal) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "const float a = 1.0;\n" + "float b = a * 2.0;\n" + "out vec4 my_FragColor;\n" + "void main() {\n" + " my_FragColor = vec4(b);\n" + "}\n"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// Statically assigning to both gl_FragData and gl_FragColor is forbidden (ESSL 1.00 section 7.2) +TEST_F(MalformedShaderTest, WriteBothFragDataAndFragColor) +{ + const std::string &shaderString = + "precision mediump float;\n" + "void foo() {\n" + " gl_FragData[0].a++;\n" + "}\n" + "void main() {\n" + " gl_FragColor.x += 0.0;\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Version directive must be on the first line (ESSL 3.00 section 3.3) +TEST_F(MalformedShaderTest, VersionOnSecondLine) +{ + const std::string &shaderString = + "\n" + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main() {\n" + " my_FragColor = vec4(0.0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Layout qualifier can only appear in global scope (ESSL 3.00 section 4.3.8) +TEST_F(MalformedShaderTest, LayoutQualifierInCondition) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "uniform vec4 u;\n" + "out vec4 my_FragColor;\n" + "void main() {\n" + " int i = 0;\n" + " for (int j = 0; layout(location = 0) bool b = false; ++j) {\n" + " ++i;\n" + " }\n" + " my_FragColor = u;\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Layout qualifier can only appear where specified (ESSL 3.00 section 4.3.8) +TEST_F(MalformedShaderTest, LayoutQualifierInFunctionReturnType) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "uniform vec4 u;\n" + "out vec4 my_FragColor;\n" + "layout(location = 0) vec4 foo() {\n" + " return u;\n" + "}\n" + "void main() {\n" + " my_FragColor = foo();\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// If there is more than one output, the location must be specified for all outputs. +// (ESSL 3.00.04 section 4.3.8.2) +TEST_F(MalformedShaderTest, TwoOutputsNoLayoutQualifiers) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "uniform vec4 u;\n" + "out vec4 my_FragColor;\n" + "out vec4 my_SecondaryFragColor;\n" + "void main() {\n" + " my_FragColor = vec4(1.0);\n" + " my_SecondaryFragColor = vec4(0.5);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// (ESSL 3.00.04 section 4.3.8.2) +TEST_F(MalformedShaderTest, TwoOutputsFirstLayoutQualifier) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "uniform vec4 u;\n" + "layout(location = 0) out vec4 my_FragColor;\n" + "out vec4 my_SecondaryFragColor;\n" + "void main() {\n" + " my_FragColor = vec4(1.0);\n" + " my_SecondaryFragColor = vec4(0.5);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// (ESSL 3.00.04 section 4.3.8.2) +TEST_F(MalformedShaderTest, TwoOutputsSecondLayoutQualifier) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "uniform vec4 u;\n" + "out vec4 my_FragColor;\n" + "layout(location = 0) out vec4 my_SecondaryFragColor;\n" + "void main() {\n" + " my_FragColor = vec4(1.0);\n" + " my_SecondaryFragColor = vec4(0.5);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Uniforms can be arrays (ESSL 3.00 section 4.3.5) +TEST_F(MalformedShaderTest, UniformArray) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "uniform vec4[2] u;\n" + "out vec4 my_FragColor;\n" + "void main() {\n" + " my_FragColor = u[0];\n" + "}\n"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// Fragment shader input variables cannot be arrays of structs (ESSL 3.00 section 4.3.4) +TEST_F(MalformedShaderTest, FragmentInputArrayOfStructs) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "struct S {\n" + " vec4 foo;\n" + "};\n" + "in S i[2];\n" + "out vec4 my_FragColor;\n" + "void main() {\n" + " my_FragColor = i[0].foo;\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Vertex shader inputs can't be arrays (ESSL 3.00 section 4.3.4) +// This test is testing the case where the array brackets are after the variable name, so +// the arrayness isn't known when the type and qualifiers are initially parsed. +TEST_F(MalformedVertexShaderTest, VertexShaderInputArray) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "in vec4 i[2];\n" + "void main() {\n" + " gl_Position = i[0];\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Vertex shader inputs can't be arrays (ESSL 3.00 section 4.3.4) +// This test is testing the case where the array brackets are after the type. +TEST_F(MalformedVertexShaderTest, VertexShaderInputArrayType) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "in vec4[2] i;\n" + "void main() {\n" + " gl_Position = i[0];\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Fragment shader inputs can't contain booleans (ESSL 3.00 section 4.3.4) +TEST_F(MalformedShaderTest, FragmentShaderInputStructWithBool) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "struct S {\n" + " bool foo;\n" + "};\n" + "in S s;\n" + "out vec4 my_FragColor;\n" + "void main() {\n" + " my_FragColor = vec4(0.0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Fragment shader inputs without a flat qualifier can't contain integers (ESSL 3.00 section 4.3.4) +TEST_F(MalformedShaderTest, FragmentShaderInputStructWithInt) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "struct S {\n" + " int foo;\n" + "};\n" + "in S s;\n" + "out vec4 my_FragColor;\n" + "void main() {\n" + " my_FragColor = vec4(0.0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Selecting a field of a vector that's the result of dynamic indexing a constant array should work. +TEST_F(MalformedShaderTest, ShaderSelectingFieldOfVectorIndexedFromArray) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "uniform int i;\n" + "void main() {\n" + " float f = vec2[1](vec2(0.0, 0.1))[i].x;\n" + " my_FragColor = vec4(f);\n" + "}\n"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// Passing an array into a function and then passing a value from that array into another function +// should work. This is a regression test for a bug where the mangled name of a TType was not +// properly updated when determining the type resulting from array indexing. +TEST_F(MalformedShaderTest, ArrayValueFromFunctionParameterAsParameter) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform float u;\n" + "float foo(float f) {\n" + " return f * 2.0;\n" + "}\n" + "float bar(float[2] f) {\n" + " return foo(f[0]);\n" + "}\n" + "void main()\n" + "{\n" + " float arr[2];\n" + " arr[0] = u;\n" + " gl_FragColor = vec4(bar(arr));\n" + "}\n"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// Test that out-of-range integer literal generates an error in ESSL 3.00. +TEST_F(MalformedShaderTest, OutOfRangeIntegerLiteral) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "precision highp int;\n" + "out vec4 my_FragColor;\n" + "void main() {\n" + " my_FragColor = vec4(0x100000000);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Test that vector field selection from a value taken from an array constructor is accepted as a +// constant expression. +TEST_F(MalformedShaderTest, FieldSelectionFromVectorArrayConstructorIsConst) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " const float f = vec2[1](vec2(0.0, 1.0))[0].x;\n" + " my_FragColor = vec4(f);\n" + "}\n"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// Test that structure field selection from a value taken from an array constructor is accepted as a +// constant expression. +TEST_F(MalformedShaderTest, FieldSelectionFromStructArrayConstructorIsConst) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "struct S { float member; };\n" + "void main()\n" + "{\n" + " const float f = S[1](S(0.0))[0].member;\n" + " my_FragColor = vec4(f);\n" + "}\n"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// Test that a reference to a const array is accepted as a constant expression. +TEST_F(MalformedShaderTest, ArraySymbolIsConst) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " const float[2] arr = float[2](0.0, 1.0);\n" + " const float f = arr[0];\n" + " my_FragColor = vec4(f);\n" + "}\n"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// Test that using an array constructor in a parameter to a built-in function is accepted as a +// constant expression. +TEST_F(MalformedShaderTest, BuiltInFunctionAppliedToArrayConstructorIsConst) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " const float f = sin(float[2](0.0, 1.0)[0]);\n" + " my_FragColor = vec4(f);\n" + "}\n"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// Test that using an array constructor in a parameter to a built-in function is accepted as a +// constant expression. +TEST_F(MalformedShaderTest, BuiltInFunctionWithMultipleParametersAppliedToArrayConstructorIsConst) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " const float f = pow(1.0, float[2](0.0, 1.0)[0]);\n" + " my_FragColor = vec4(f);\n" + "}\n"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// Test that using an array constructor in a parameter to a constructor is accepted as a constant +// expression. +TEST_F(MalformedShaderTest, ConstructorWithMultipleParametersAppliedToArrayConstructorIsConst) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " const vec2 f = vec2(1.0, float[2](0.0, 1.0)[0]);\n" + " my_FragColor = vec4(f.x);\n" + "}\n"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// Test that using an array constructor in an operand of the ternary selection operator is accepted +// as a constant expression. +TEST_F(MalformedShaderTest, TernaryOperatorAppliedToArrayConstructorIsConst) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " const float f = true ? float[2](0.0, 1.0)[0] : 1.0;\n" + " my_FragColor = vec4(f);\n" + "}\n"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// Test that a ternary operator with one unevaluated non-constant operand is not a constant +// expression. +TEST_F(MalformedShaderTest, TernaryOperatorNonConstantOperand) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform float u;\n" + "void main()\n" + "{\n" + " const float f = true ? 1.0 : u;\n" + " gl_FragColor = vec4(f);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Test that a sampler can't be used in constructor argument list +TEST_F(MalformedShaderTest, SamplerInConstructorArguments) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform sampler2D s;\n" + "void main()\n" + "{\n" + " vec2 v = vec2(0.0, s);\n" + " gl_FragColor = vec4(v, 0.0, 0.0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Test that void can't be used in constructor argument list +TEST_F(MalformedShaderTest, VoidInConstructorArguments) +{ + const std::string &shaderString = + "precision mediump float;\n" + "void foo() {}\n" + "void main()\n" + "{\n" + " vec2 v = vec2(0.0, foo());\n" + " gl_FragColor = vec4(v, 0.0, 0.0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Test that a shader passing a struct into a constructor of array of structs with 1 element works. +TEST_F(MalformedShaderTest, SingleStructArrayConstructor) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "uniform float u;\n" + "struct S { float member; };\n" + "void main()\n" + "{\n" + " S[1] sarr = S[1](S(u));\n" + " my_FragColor = vec4(sarr[0].member);\n" + "}\n"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// Test that a shader with empty constructor parameter list is not accepted. +TEST_F(MalformedShaderTest, EmptyArrayConstructor) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "uniform float u;\n" + "const float[] f = f[]();\n" + "void main()\n" + "{\n" + " my_FragColor = vec4(0.0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Test that indexing fragment outputs with a non-constant expression is forbidden, even if ANGLE +// is able to constant fold the index expression. ESSL 3.00 section 4.3.6. +TEST_F(MalformedShaderTest, DynamicallyIndexedFragmentOutput) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "uniform int a;\n" + "out vec4[2] my_FragData;\n" + "void main()\n" + "{\n" + " my_FragData[true ? 0 : a] = vec4(0.0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Test that indexing an interface block array with a non-constant expression is forbidden, even if +// ANGLE is able to constant fold the index expression. ESSL 3.00 section 4.3.7. +TEST_F(MalformedShaderTest, DynamicallyIndexedInterfaceBlock) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "uniform int a;\n" + "uniform B\n" + "{\n" + " vec4 f;\n" + "}\n" + "blocks[2];\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " my_FragColor = blocks[true ? 0 : a].f;\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Test that a shader that uses a struct definition in place of a struct constructor does not +// compile. See GLSL ES 1.00 section 5.4.3. +TEST_F(MalformedShaderTest, StructConstructorWithStructDefinition) +{ + const std::string &shaderString = + "precision mediump float;\n" + "void main()\n" + "{\n" + " struct s { float f; } (0.0);\n" + " gl_FragColor = vec4(0.0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Test that indexing gl_FragData with a non-constant expression is forbidden in WebGL 2.0, even +// when ANGLE is able to constant fold the index. +// WebGL 2.0 spec section 'GLSL ES 1.00 Fragment Shader Output' +TEST_F(MalformedWebGL2ShaderTest, IndexFragDataWithNonConstant) +{ + const std::string &shaderString = + "precision mediump float;\n" + "void main()\n" + "{\n" + " for (int i = 0; i < 2; ++i) {\n" + " gl_FragData[true ? 0 : i] = vec4(0.0);\n" + " }\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Test that a non-constant texture offset is not accepted for textureOffset. +// ESSL 3.00 section 8.8 +TEST_F(MalformedShaderTest, TextureOffsetNonConst) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "uniform vec3 u_texCoord;\n" + "uniform mediump sampler3D u_sampler;\n" + "uniform int x;\n" + "void main()\n" + "{\n" + " my_FragColor = textureOffset(u_sampler, u_texCoord, ivec3(x, 3, -8));\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Test that a non-constant texture offset is not accepted for textureProjOffset with bias. +// ESSL 3.00 section 8.8 +TEST_F(MalformedShaderTest, TextureProjOffsetNonConst) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "uniform vec4 u_texCoord;\n" + "uniform mediump sampler3D u_sampler;\n" + "uniform int x;\n" + "void main()\n" + "{\n" + " my_FragColor = textureProjOffset(u_sampler, u_texCoord, ivec3(x, 3, -8), 0.0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Test that an out-of-range texture offset is not accepted. +// GLES 3.0.4 section 3.8.10 specifies that out-of-range offset has undefined behavior. +TEST_F(MalformedShaderTest, TextureLodOffsetOutOfRange) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "uniform vec3 u_texCoord;\n" + "uniform mediump sampler3D u_sampler;\n" + "void main()\n" + "{\n" + " my_FragColor = textureLodOffset(u_sampler, u_texCoord, 0.0, ivec3(0, 0, 8));\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Test that default precision qualifier for uint is not accepted. +// ESSL 3.00.4 section 4.5.4: Only allowed for float, int and sampler types. +TEST_F(MalformedShaderTest, DefaultPrecisionUint) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "precision mediump uint;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " my_FragColor = vec4(0.0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Test that sampler3D needs to be precision qualified. +// ESSL 3.00.4 section 4.5.4: New ESSL 3.00 sampler types don't have predefined precision. +TEST_F(MalformedShaderTest, NoPrecisionSampler3D) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "uniform sampler3D s;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " my_FragColor = vec4(0.0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Test that using a non-constant expression in a for loop initializer is forbidden in WebGL 1.0, +// even when ANGLE is able to constant fold the initializer. +// ESSL 1.00 Appendix A. +TEST_F(MalformedWebGL1ShaderTest, NonConstantLoopIndex) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform int u;\n" + "void main()\n" + "{\n" + " for (int i = (true ? 1 : u); i < 5; ++i) {\n" + " gl_FragColor = vec4(0.0);\n" + " }\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Regression test for an old crash bug in ANGLE. +// ForLoopUnroll used to crash when it encountered a while loop. +TEST_F(UnrollForLoopsTest, WhileLoop) +{ + const std::string &shaderString = + "precision mediump float;\n" + "void main()\n" + "{\n" + " while (true) {\n" + " gl_FragColor = vec4(0.0);\n" + " break;\n" + " }\n" + "}\n"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// Regression test for an old crash bug in ANGLE. +// ForLoopUnroll used to crash when it encountered a loop that didn't fit the ESSL 1.00 +// Appendix A limitations. +TEST_F(UnrollForLoopsTest, UnlimitedForLoop) +{ + const std::string &shaderString = + "precision mediump float;\n" + "void main()\n" + "{\n" + " for (;true;) {\n" + " gl_FragColor = vec4(0.0);\n" + " break;\n" + " }\n" + "}\n"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// Check that indices that are not integers are rejected. +// The check should be done even if ESSL 1.00 Appendix A limitations are not applied. +TEST_F(MalformedShaderTest, NonIntegerIndex) +{ + const std::string &shaderString = + "precision mediump float;\n" + "void main()\n" + "{\n" + " float f[3];\n" + " const float i = 2.0;\n" + " gl_FragColor = vec4(f[i]);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// ESSL1 shaders with a duplicate function prototype should be rejected. +// ESSL 1.00.17 section 4.2.7. +TEST_F(MalformedShaderTest, DuplicatePrototypeESSL1) +{ + const std::string &shaderString = + "precision mediump float;\n" + "void foo();\n" + "void foo();\n" + "void foo() {}\n" + "void main()\n" + "{\n" + " gl_FragColor = vec4(0.0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// ESSL3 shaders with a duplicate function prototype should be allowed. +// ESSL 3.00.4 section 4.2.3. +TEST_F(MalformedShaderTest, DuplicatePrototypeESSL3) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void foo();\n" + "void foo();\n" + "void foo() {}\n" + "void main()\n" + "{\n" + " my_FragColor = vec4(0.0);\n" + "}\n"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// Shaders with a local function prototype should be rejected. +// ESSL 3.00.4 section 4.2.4. +TEST_F(MalformedShaderTest, LocalFunctionPrototype) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " void foo();\n" + " my_FragColor = vec4(0.0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// ESSL 3.00 fragment shaders can not use #pragma STDGL invariant(all). +// ESSL 3.00.4 section 4.6.1. Does not apply to other versions of ESSL. +TEST_F(MalformedShaderTest, ESSL300FragmentInvariantAll) +{ + const std::string &shaderString = + "#version 300 es\n" + "#pragma STDGL invariant(all)\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " my_FragColor = vec4(0.0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Built-in functions can be overloaded in ESSL 1.00. +TEST_F(MalformedShaderTest, ESSL100BuiltInFunctionOverload) +{ + const std::string &shaderString = + "precision mediump float;\n" + "int sin(int x)\n" + "{\n" + " return int(sin(float(x)));\n" + "}\n" + "void main()\n" + "{\n" + " gl_FragColor = vec4(sin(1));" + "}\n"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// Built-in functions can not be overloaded in ESSL 3.00. +TEST_F(MalformedShaderTest, ESSL300BuiltInFunctionOverload) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "int sin(int x)\n" + "{\n" + " return int(sin(float(x)));\n" + "}\n" + "void main()\n" + "{\n" + " my_FragColor = vec4(sin(1));" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Multiplying a 4x2 matrix with a 4x2 matrix should not work. +TEST_F(MalformedShaderTest, CompoundMultiplyMatrixIdenticalNonSquareDimensions) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " mat4x2 foo;\n" + " foo *= mat4x2(4.0);\n" + " my_FragColor = vec4(0.0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Multiplying a matrix with 2 columns and 4 rows with a 2x2 matrix should work. +TEST_F(MalformedShaderTest, CompoundMultiplyMatrixValidNonSquareDimensions) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " mat2x4 foo;\n" + " foo *= mat2x2(4.0);\n" + " my_FragColor = vec4(0.0);\n" + "}\n"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// Covers a bug where we would set the incorrect result size on an out-of-bounds vector swizzle. +TEST_F(MalformedShaderTest, OutOfBoundsVectorSwizzle) +{ + const std::string &shaderString = + "void main() {\n" + " vec2(0).qq;\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Covers a bug where strange preprocessor defines could trigger asserts. +TEST_F(MalformedShaderTest, DefineWithSemicolon) +{ + const std::string &shaderString = + "#define Def; highp\n" + "uniform Def vec2 a;\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Covers a bug in our parsing of malformed shift preprocessor expressions. +TEST_F(MalformedShaderTest, LineDirectiveUndefinedShift) +{ + const std::string &shaderString = "#line x << y"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Covers a bug in our parsing of malformed shift preprocessor expressions. +TEST_F(MalformedShaderTest, LineDirectiveNegativeShift) +{ + const std::string &shaderString = "#line x << -1"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// gl_MaxImageUnits is only available in ES 3.1 shaders. +TEST_F(MalformedShaderTest, MaxImageUnitsInES3Shader) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 myOutput;" + "void main() {\n" + " float ff = float(gl_MaxImageUnits);\n" + " myOutput = vec4(ff);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// struct += struct is an invalid operation. +TEST_F(MalformedShaderTest, StructCompoundAssignStruct) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 myOutput;\n" + "struct S { float foo; };\n" + "void main() {\n" + " S a, b;\n" + " a += b;\n" + " myOutput = vec4(0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// struct == different struct is an invalid operation. +TEST_F(MalformedShaderTest, StructEqDifferentStruct) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 myOutput;\n" + "struct S { float foo; };\n" + "struct S2 { float foobar; };\n" + "void main() {\n" + " S a;\n" + " S2 b;\n" + " a == b;\n" + " myOutput = vec4(0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Compute shaders are not supported in versions lower than 310. +TEST_F(MalformedComputeShaderTest, Version100) +{ + const std::string &shaderString = + "void main()\n" + "layout(local_size_x=1) in;\n" + "{\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Compute shaders are not supported in versions lower than 310. +TEST_F(MalformedComputeShaderTest, Version300) +{ + const std::string &shaderString = + "#version 300 es\n" + "void main()\n" + "layout(local_size_x=1) in;\n" + "{\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Compute shaders should have work group size specified. However, it is not a compile time error +// to not have the size specified, but rather a link time one. +// GLSL ES 3.10 Revision 4, 4.4.1.1 Compute Shader Inputs +TEST_F(MalformedComputeShaderTest, NoWorkGroupSizeSpecified) +{ + const std::string &shaderString = + "#version 310 es\n" + "void main()\n" + "{\n" + "}\n"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// Work group size is less than 1. It should be at least 1. +// GLSL ES 3.10 Revision 4, 7.1.3 Compute Shader Special Variables +// The spec is not clear whether having a local size qualifier equal zero +// is correct. +// TODO (mradev): Ask people from Khronos to clarify the spec. +TEST_F(MalformedComputeShaderTest, WorkGroupSizeTooSmallXdimension) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 0) in;\n" + "void main()\n" + "{\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Work group size is correct for the x and y dimensions, but not for the z dimension. +// GLSL ES 3.10 Revision 4, 7.1.3 Compute Shader Special Variables +TEST_F(MalformedComputeShaderTest, WorkGroupSizeTooSmallZDimension) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 4, local_size_y = 6, local_size_z = 0) in;\n" + "void main()\n" + "{\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Work group size is bigger than the minimum in the x dimension. +// GLSL ES 3.10 Revision 4, 4.4.1.1 Compute Shader Inputs +TEST_F(MalformedComputeShaderTest, WorkGroupSizeTooBigXDimension) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 9989899) in;\n" + "void main()\n" + "{\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Work group size is bigger than the minimum in the y dimension. +// GLSL ES 3.10 Revision 4, 4.4.1.1 Compute Shader Inputs +TEST_F(MalformedComputeShaderTest, WorkGroupSizeTooBigYDimension) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 5, local_size_y = 9989899) in;\n" + "void main()\n" + "{\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Work group size is definitely bigger than the minimum in the z dimension. +// GLSL ES 3.10 Revision 4, 4.4.1.1 Compute Shader Inputs +TEST_F(MalformedComputeShaderTest, WorkGroupSizeTooBigZDimension) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 5, local_size_y = 5, local_size_z = 9989899) in;\n" + "void main()\n" + "{\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Work group size specified through macro expansion. +TEST_F(MalformedComputeShaderTest, WorkGroupSizeMacro) +{ + const std::string &shaderString = + "#version 310 es\n" + "#define MYDEF(x) x" + "layout(local_size_x = MYDEF(127)) in;\n" + "void main()\n" + "{\n" + "}\n"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// Work group size specified as an unsigned integer. +TEST_F(MalformedComputeShaderTest, WorkGroupSizeUnsignedInteger) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 123u) in;\n" + "void main()\n" + "{\n" + "}\n"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// Work group size specified in hexadecimal. +TEST_F(MalformedComputeShaderTest, WorkGroupSizeHexadecimal) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 0x3A) in;\n" + "void main()\n" + "{\n" + "}\n"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// local_size_x is -1 in hexadecimal format. +// -1 is used as unspecified value in the TLayoutQualifier structure. +TEST_F(MalformedComputeShaderTest, WorkGroupSizeMinusOneHexadecimal) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 0xFFFFFFFF) in;\n" + "void main()\n" + "{\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Work group size specified in octal. +TEST_F(MalformedComputeShaderTest, WorkGroupSizeOctal) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 013) in;\n" + "void main()\n" + "{\n" + "}\n"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// Work group size is negative. It is specified in hexadecimal. +TEST_F(MalformedComputeShaderTest, WorkGroupSizeNegativeHexadecimal) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 0xFFFFFFEC) in;\n" + "void main()\n" + "{\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Multiple work group layout qualifiers with differing values. +// GLSL ES 3.10 Revision 4, 4.4.1.1 Compute Shader Inputs +TEST_F(MalformedComputeShaderTest, DifferingLayoutQualifiers) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 5, local_size_x = 6) in;\n" + "void main()\n" + "{\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Multiple work group input variables with differing local size values. +// GLSL ES 3.10 Revision 4, 4.4.1.1 Compute Shader Inputs +TEST_F(MalformedComputeShaderTest, MultipleInputVariablesDifferingLocalSize) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 5, local_size_y = 6) in;\n" + "layout(local_size_x = 5, local_size_y = 7) in;\n" + "void main()\n" + "{\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Multiple work group input variables with differing local size values. +// GLSL ES 3.10 Revision 4, 4.4.1.1 Compute Shader Inputs +TEST_F(MalformedComputeShaderTest, MultipleInputVariablesDifferingLocalSize2) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 5) in;\n" + "layout(local_size_x = 5, local_size_y = 7) in;\n" + "void main()\n" + "{\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Multiple work group input variables with the same local size values. It should compile. +// GLSL ES 3.10 Revision 4, 4.4.1.1 Compute Shader Inputs +TEST_F(MalformedComputeShaderTest, MultipleInputVariablesSameLocalSize) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 5, local_size_y = 6) in;\n" + "layout(local_size_x = 5, local_size_y = 6) in;\n" + "void main()\n" + "{\n" + "}\n"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// Multiple work group input variables with the same local size values. It should compile. +// Since the default value is 1, it should compile. +// GLSL ES 3.10 Revision 4, 4.4.1.1 Compute Shader Inputs +TEST_F(MalformedComputeShaderTest, MultipleInputVariablesSameLocalSize2) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 5) in;\n" + "layout(local_size_x = 5, local_size_y = 1) in;\n" + "void main()\n" + "{\n" + "}\n"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// Multiple work group input variables with the same local size values. It should compile. +// Since the default value is 1, it should compile. +// GLSL ES 3.10 Revision 4, 4.4.1.1 Compute Shader Inputs +TEST_F(MalformedComputeShaderTest, MultipleInputVariablesSameLocalSize3) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 5, local_size_y = 1) in;\n" + "layout(local_size_x = 5) in;\n" + "void main()\n" + "{\n" + "}\n"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// Specifying row_major qualifier in a work group size layout. +// GLSL ES 3.10 Revision 4, 4.4.1.1 Compute Shader Inputs +TEST_F(MalformedComputeShaderTest, RowMajorInComputeInputLayout) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 5, row_major) in;\n" + "void main()\n" + "{\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// local size layout can be used only with compute input variables +// GLSL ES 3.10 Revision 4, 4.4.1.1 Compute Shader Inputs +TEST_F(MalformedComputeShaderTest, UniformComputeInputLayout) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 5) uniform;\n" + "void main()\n" + "{\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// local size layout can be used only with compute input variables +// GLSL ES 3.10 Revision 4, 4.4.1.1 Compute Shader Inputs +TEST_F(MalformedComputeShaderTest, UniformBufferComputeInputLayout) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 5) uniform SomeBuffer { vec4 something; };\n" + "void main()\n" + "{\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// local size layout can be used only with compute input variables +// GLSL ES 3.10 Revision 4, 4.4.1.1 Compute Shader Inputs +TEST_F(MalformedComputeShaderTest, StructComputeInputLayout) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 5) struct SomeBuffer { vec4 something; };\n" + "void main()\n" + "{\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// local size layout can be used only with compute input variables +// GLSL ES 3.10 Revision 4, 4.4.1.1 Compute Shader Inputs +TEST_F(MalformedComputeShaderTest, StructBodyComputeInputLayout) +{ + const std::string &shaderString = + "#version 310 es\n" + "struct S {\n" + " layout(local_size_x = 12) vec4 foo;\n" + "};\n" + "void main()" + "{" + "}"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// local size layout can be used only with compute input variables +// GLSL ES 3.10 Revision 4, 4.4.1.1 Compute Shader Inputs +TEST_F(MalformedComputeShaderTest, TypeComputeInputLayout) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 5) vec4;\n" + "void main()\n" + "{\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Invalid use of the out storage qualifier in a compute shader. +// GLSL ES 3.10 Revision 4, 4.4.1.1 Compute Shader Inputs +TEST_F(MalformedComputeShaderTest, InvalidOutStorageQualifier) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 15) in;\n" + "out vec4 myOutput;\n" + "void main() {\n" + "}\n"; + + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Invalid use of the out storage qualifier in a compute shader. +// GLSL ES 3.10 Revision 4, 4.4.1.1 Compute Shader Inputs +TEST_F(MalformedComputeShaderTest, InvalidOutStorageQualifier2) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 15) in;\n" + "out myOutput;\n" + "void main() {\n" + "}\n"; + + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Invalid use of the in storage qualifier. Can be only used to describe the local block size. +// GLSL ES 3.10 Revision 4, 4.4.1.1 Compute Shader Inputs +TEST_F(MalformedComputeShaderTest, InvalidInStorageQualifier) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 15) in;\n" + "in vec4 myInput;\n" + "void main() {\n" + "}\n"; + + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Invalid use of the in storage qualifier. Can be only used to describe the local block size. +// The test checks a different part of the GLSL grammar than what InvalidInStorageQualifier checks. +// GLSL ES 3.10 Revision 4, 4.4.1.1 Compute Shader Inputs +TEST_F(MalformedComputeShaderTest, InvalidInStorageQualifier2) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 15) in;\n" + "in myInput;\n" + "void main() {\n" + "}\n"; + + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// The local_size layout qualifier is only available in compute shaders. +TEST_F(MalformedVertexShaderGLES31Test, InvalidUseOfLocalSizeX) +{ + const std::string &shaderString = + "#version 310 es\n" + "precision mediump float;\n" + "layout(local_size_x = 15) in vec4 myInput;\n" + "out vec4 myOutput;\n" + "void main() {\n" + " myOutput = myInput;\n" + "}\n"; + + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// The local_size layout qualifier is only available in compute shaders. +TEST_F(MalformedFragmentShaderGLES31Test, InvalidUseOfLocalSizeX) +{ + const std::string &shaderString = + "#version 310 es\n" + "precision mediump float;\n" + "layout(local_size_x = 15) in vec4 myInput;\n" + "out vec4 myOutput;\n" + "void main() {\n" + " myOutput = myInput;\n" + "}\n"; + + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// It is a compile time error to use the gl_WorkGroupSize constant if +// the local size has not been declared yet. +// GLSL ES 3.10 Revision 4, 7.1.3 Compute Shader Special Variables +TEST_F(MalformedComputeShaderTest, InvalidUsageOfWorkGroupSize) +{ + const std::string &shaderString = + "#version 310 es\n" + "void main()\n" + "{\n" + " uvec3 WorkGroupSize = gl_WorkGroupSize;\n" + "}\n" + "layout(local_size_x = 12) in;\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// The test covers the compute shader built-in variables and constants. +TEST_F(MalformedComputeShaderTest, CorrectUsageOfComputeBuiltins) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 12) in;\n" + "void main()\n" + "{\n" + " uvec3 NumWorkGroups = gl_NumWorkGroups;\n" + " uvec3 WorkGroupSize = gl_WorkGroupSize;\n" + " uvec3 WorkGroupID = gl_WorkGroupID;\n" + " uvec3 GlobalInvocationID = gl_GlobalInvocationID;\n" + " uvec3 LocalInvocationID = gl_LocalInvocationID;\n" + " uint LocalInvocationIndex = gl_LocalInvocationIndex;\n" + "}\n"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// It is illegal to write to a special variable. +TEST_F(MalformedComputeShaderTest, SpecialVariableNumWorkGroups) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 12) in;\n" + "void main()\n" + "{\n" + " gl_NumWorkGroups = uvec3(1); \n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// It is illegal to write to a special variable. +TEST_F(MalformedComputeShaderTest, SpecialVariableWorkGroupID) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 12) in;\n" + "void main()\n" + "{\n" + " gl_WorkGroupID = uvec3(1); \n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// It is illegal to write to a special variable. +TEST_F(MalformedComputeShaderTest, SpecialVariableLocalInvocationID) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 12) in;\n" + "void main()\n" + "{\n" + " gl_LocalInvocationID = uvec3(1); \n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// It is illegal to write to a special variable. +TEST_F(MalformedComputeShaderTest, SpecialVariableGlobalInvocationID) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 12) in;\n" + "void main()\n" + "{\n" + " gl_GlobalInvocationID = uvec3(1); \n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// It is illegal to write to a special variable. +TEST_F(MalformedComputeShaderTest, SpecialVariableLocalInvocationIndex) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 12) in;\n" + "void main()\n" + "{\n" + " gl_LocalInvocationIndex = 1; \n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// It is illegal to write to a special variable. +TEST_F(MalformedComputeShaderTest, SpecialVariableWorkGroupSize) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 12) in;\n" + "void main()\n" + "{\n" + " gl_WorkGroupSize = uvec3(1); \n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// It is illegal to apply an unary operator to a sampler. +TEST_F(MalformedShaderTest, SamplerUnaryOperator) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform sampler2D s;\n" + "void main()\n" + "{\n" + " -s;\n" + " gl_FragColor = vec4(0);\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Invariant cannot be used with a work group size declaration. +TEST_F(MalformedComputeShaderTest, InvariantBlockSize) +{ + const std::string &shaderString = + "#version 310 es\n" + "invariant layout(local_size_x = 15) in;\n" + "void main() {\n" + "}\n"; + + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Invariant cannot be used with a non-output variable in ESSL3. +TEST_F(MalformedShaderTest, InvariantNonOuput) +{ + const std::string &shaderString = + "#version 300 es\n" + "invariant int value;\n" + "void main() {\n" + "}\n"; + + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Invariant declaration should follow the following format "invariant <out variable name>". +// Test having an incorrect qualifier in the invariant declaration. +TEST_F(MalformedShaderTest, InvariantDeclarationWithStorageQualifier) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 foo;\n" + "invariant centroid foo;\n" + "void main() {\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Invariant declaration should follow the following format "invariant <out variable name>". +// Test having an incorrect precision qualifier in the invariant declaration. +TEST_F(MalformedShaderTest, InvariantDeclarationWithPrecisionQualifier) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 foo;\n" + "invariant highp foo;\n" + "void main() {\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Invariant declaration should follow the following format "invariant <out variable name>". +// Test having an incorrect layout qualifier in the invariant declaration. +TEST_F(MalformedShaderTest, InvariantDeclarationWithLayoutQualifier) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 foo;\n" + "invariant layout(location=0) foo;\n" + "void main() {\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Variable declaration with both invariant and layout qualifiers is not valid in the formal grammar +// provided in the ESSL 3.00 spec. ESSL 3.10 starts allowing this combination, but ESSL 3.00 should +// still disallow it. +TEST_F(MalformedShaderTest, VariableDeclarationWithInvariantAndLayoutQualifierESSL300) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "invariant layout(location = 0) out vec4 my_FragColor;\n" + "void main() {\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Bit shift with a rhs value > 31 has an undefined result in the GLSL spec. We disallow it. +// ESSL 3.00.6 section 5.9. +TEST_F(MalformedShaderTest, ShiftBy32) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "void main() {\n" + " uint u = 1u << 32u;\n" + "}\n"; + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Test that deferring global variable init works with an empty main(). +TEST_F(MalformedShaderTest, DeferGlobalVariableInitWithEmptyMain) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform float u;\n" + "float foo = u;\n" + "void main() {}\n"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// Test that pruning empty declarations from loop init expression works. +TEST_F(MalformedShaderTest, EmptyDeclarationAsLoopInit) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " int i = 0;\n" + " for (int; i < 3; i++)\n" + " {\n" + " my_FragColor = vec4(i);\n" + " }\n" + "}\n"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} +// r32f, r32i, r32ui do not require either the writeonly or readonly memory qualifiers. +// GLSL ES 3.10, Revision 4, 4.9 Memory Access Qualifiers +TEST_F(MalformedFragmentShaderGLES31Test, ImageR32FNoMemoryQualifier) +{ + const std::string &shaderString = + "#version 310 es\n" + "precision mediump float;\n" + "precision mediump image2D;\n" + "in vec4 myInput;\n" + "layout(r32f) uniform image2D myImage;\n" + "void main() {\n" + "}\n"; + + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// Images which do not have r32f, r32i or r32ui as internal format, must have readonly or writeonly +// specified. +// GLSL ES 3.10, Revision 4, 4.9 Memory Access Qualifiers +TEST_F(MalformedFragmentShaderGLES31Test, ImageR32FWithCorrectMemoryQualifier) +{ + const std::string &shaderString = + "#version 310 es\n" + "precision mediump float;\n" + "precision mediump image2D;\n" + "in vec4 myInput;\n" + "layout(rgba32f) uniform image2D myImage;\n" + "void main() {\n" + "}\n"; + + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// It is a compile-time error to call imageStore when the image is qualified as readonly. +// GLSL ES 3.10 Revision 4, 4.9 Memory Access Qualifiers +TEST_F(MalformedFragmentShaderGLES31Test, StoreInReadOnlyImage) +{ + const std::string &shaderString = + "#version 310 es\n" + "precision mediump float;\n" + "precision mediump image2D;\n" + "in vec4 myInput;\n" + "layout(r32f) uniform readonly image2D myImage;\n" + "void main() {\n" + " imageStore(myImage, ivec2(0), vec4(1.0));\n" + "}\n"; + + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// It is a compile-time error to call imageLoad when the image is qualified as writeonly. +// GLSL ES 3.10 Revision 4, 4.9 Memory Access Qualifiers +TEST_F(MalformedFragmentShaderGLES31Test, LoadFromWriteOnlyImage) +{ + const std::string &shaderString = + "#version 310 es\n" + "precision mediump float;\n" + "precision mediump image2D;\n" + "in vec4 myInput;\n" + "layout(r32f) uniform writeonly image2D myImage;\n" + "void main() {\n" + " imageLoad(myImage, ivec2(0));\n" + "}\n"; + + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// A valid declaration and usage of an image3D. +TEST_F(MalformedFragmentShaderGLES31Test, ValidImage3D) +{ + const std::string &shaderString = + "#version 310 es\n" + "precision mediump float;\n" + "precision mediump image3D;\n" + "in vec4 myInput;\n" + "layout(rgba32f) uniform readonly image3D myImage;\n" + "void main() {\n" + " imageLoad(myImage, ivec3(0));\n" + "}\n"; + + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// A valid declaration and usage of an imageCube. +TEST_F(MalformedFragmentShaderGLES31Test, ValidImageCube) +{ + const std::string &shaderString = + "#version 310 es\n" + "precision mediump float;\n" + "precision mediump imageCube;\n" + "in vec4 myInput;\n" + "layout(rgba32f) uniform readonly imageCube myImage;\n" + "void main() {\n" + " imageLoad(myImage, ivec3(0));\n" + "}\n"; + + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// A valid declaration and usage of an image2DArray. +TEST_F(MalformedFragmentShaderGLES31Test, ValidImage2DArray) +{ + const std::string &shaderString = + "#version 310 es\n" + "precision mediump float;\n" + "precision mediump image2DArray;\n" + "in vec4 myInput;\n" + "layout(rgba32f) uniform readonly image2DArray myImage;\n" + "void main() {\n" + " imageLoad(myImage, ivec3(0));\n" + "}\n"; + + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// Images cannot be l-values. +// GLSL ES 3.10 Revision 4, 4.1.7 Opaque Types +TEST_F(MalformedFragmentShaderGLES31Test, ImageLValueFunctionDefinitionInOut) +{ + const std::string &shaderString = + "#version 310 es\n" + "precision mediump float;\n" + "precision mediump image2D;\n" + "void myFunc(inout image2D someImage) {}\n" + "void main() {\n" + "}\n"; + + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Cannot assign to images. +// GLSL ES 3.10 Revision 4, 4.1.7 Opaque Types +TEST_F(MalformedFragmentShaderGLES31Test, ImageAssignment) +{ + const std::string &shaderString = + "#version 310 es\n" + "precision mediump float;\n" + "precision mediump image2D;\n" + "layout(rgba32f) uniform readonly image2D myImage;\n" + "layout(rgba32f) uniform readonly image2D myImage2;\n" + "void main() {\n" + " myImage = myImage2;\n" + "}\n"; + + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Passing an image qualifier to a function should not be able to discard the readonly qualifier. +// GLSL ES 3.10 Revision 4, 4.9 Memory Access Qualifiers +TEST_F(MalformedFragmentShaderGLES31Test, ReadOnlyQualifierMissingInFunctionArgument) +{ + const std::string &shaderString = + "#version 310 es\n" + "precision mediump float;\n" + "precision mediump image2D;\n" + "layout(rgba32f) uniform readonly image2D myImage;\n" + "void myFunc(in image2D someImage) {}\n" + "void main() {\n" + " myFunc(myImage);\n" + "}\n"; + + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Passing an image qualifier to a function should not be able to discard the writeonly qualifier. +// GLSL ES 3.10 Revision 4, 4.9 Memory Access Qualifiers +TEST_F(MalformedFragmentShaderGLES31Test, WriteOnlyQualifierMissingInFunctionArgument) +{ + const std::string &shaderString = + "#version 310 es\n" + "precision mediump float;\n" + "precision mediump image2D;\n" + "layout(rgba32f) uniform writeonly image2D myImage;\n" + "void myFunc(in image2D someImage) {}\n" + "void main() {\n" + " myFunc(myImage);\n" + "}\n"; + + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Passing an image parameter as an argument to another function should not be able to discard the +// writeonly qualifier. +// GLSL ES 3.10 Revision 4, 4.9 Memory Access Qualifiers +TEST_F(MalformedFragmentShaderGLES31Test, DiscardWriteonlyInFunctionBody) +{ + const std::string &shaderString = + "#version 310 es\n" + "precision mediump float;\n" + "precision mediump image2D;\n" + "layout(rgba32f) uniform writeonly image2D myImage;\n" + "void myFunc1(in image2D someImage) {}\n" + "void myFunc2(in writeonly image2D someImage) { myFunc1(someImage); }\n" + "void main() {\n" + " myFunc2(myImage);\n" + "}\n"; + + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// The memory qualifiers for the image declaration and function argument match and the test should +// pass. +TEST_F(MalformedFragmentShaderGLES31Test, CorrectImageMemoryQualifierSpecified) +{ + const std::string &shaderString = + "#version 310 es\n" + "precision mediump float;\n" + "precision mediump image2D;\n" + "layout(r32f) uniform image2D myImage;\n" + "void myFunc(in image2D someImage) {}\n" + "void main() {\n" + " myFunc(myImage);\n" + "}\n"; + + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// The test adds additional qualifiers to the argument in the function header. +// This is correct since no memory qualifiers are discarded upon the function call. +// GLSL ES 3.10 Revision 4, 4.9 Memory Access Qualifiers +TEST_F(MalformedFragmentShaderGLES31Test, CorrectImageMemoryQualifierSpecified2) +{ + const std::string &shaderString = + "#version 310 es\n" + "precision mediump float;\n" + "precision mediump image2D;\n" + "layout(r32f) uniform image2D myImage;\n" + "void myFunc(in readonly writeonly image2D someImage) {}\n" + "void main() {\n" + " myFunc(myImage);\n" + "}\n"; + + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// Images are not allowed in structs. +// GLSL ES 3.10 Revision 4, 4.1.8 Structures +TEST_F(MalformedFragmentShaderGLES31Test, ImageInStruct) +{ + const std::string &shaderString = + "#version 310 es\n" + "precision mediump float;\n" + "precision mediump image2D;\n" + "struct myStruct { layout(r32f) image2D myImage; };\n" + "void main() {\n" + "}\n"; + + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Images are not allowed in interface blocks. +// GLSL ES 3.10 Revision 4, 4.3.9 Interface Blocks +TEST_F(MalformedFragmentShaderGLES31Test, ImageInInterfaceBlock) +{ + const std::string &shaderString = + "#version 310 es\n" + "precision mediump float;\n" + "precision mediump image2D;\n" + "uniform myBlock { layout(r32f) image2D myImage; };\n" + "void main() {\n" + "}\n"; + + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Readonly used with an interface block. +TEST_F(MalformedFragmentShaderGLES31Test, ReadonlyWithInterfaceBlock) +{ + const std::string &shaderString = + "#version 310 es\n" + "precision mediump float;\n" + "uniform readonly myBlock { float something; };\n" + "void main() {\n" + "}\n"; + + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Readonly used with an invariant. +TEST_F(MalformedFragmentShaderGLES31Test, ReadonlyWithInvariant) +{ + const std::string &shaderString = + "#version 310 es\n" + "precision mediump float;\n" + "out vec4 something;\n" + "invariant readonly something;\n" + "void main() {\n" + "}\n"; + + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Readonly used with a member of a structure. +TEST_F(MalformedFragmentShaderGLES31Test, ReadonlyWithStructMember) +{ + const std::string &shaderString = + "#version 310 es\n" + "precision mediump float;\n" + "out vec4 something;\n" + "struct MyStruct { readonly float myMember; };\n" + "void main() {\n" + "}\n"; + + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// It should not be possible to use an internal format layout qualifier with an interface block. +TEST_F(MalformedFragmentShaderGLES31Test, ImageInternalFormatWithInterfaceBlock) +{ + const std::string &shaderString = + "#version 310 es\n" + "precision mediump float;\n" + "out vec4 something;\n" + "layout(rgba32f) uniform MyStruct { float myMember; };\n" + "void main() {\n" + "}\n"; + + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// It should not be possible to use an internal format layout qualifier with a uniform without a +// type. +TEST_F(MalformedFragmentShaderGLES31Test, ImageInternalFormatInGlobalLayoutQualifier) +{ + const std::string &shaderString = + "#version 310 es\n" + "precision mediump float;\n" + "out vec4 something;\n" + "layout(rgba32f) uniform;\n" + "void main() {\n" + "}\n"; + + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// ESSL 1.00 section 4.1.7. +// Samplers are not allowed as operands for most operations. Test this for ternary operator. +TEST_F(MalformedShaderTest, SamplerAsTernaryOperand) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform bool u;\n" + "uniform sampler2D s1;\n" + "uniform sampler2D s2;\n" + "void main() {\n" + " gl_FragColor = texture2D(u ? s1 : s2, vec2(0, 0));\n" + "}\n"; + + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// ESSL 1.00.17 section 4.5.2. +// ESSL 3.00.6 section 4.5.3. +// Precision must be specified for floats. Test this with a declaration with no qualifiers. +TEST_F(MalformedShaderTest, FloatDeclarationNoQualifiersNoPrecision) +{ + const std::string &shaderString = + "vec4 foo = vec4(0.0);\n" + "void main()\n" + "{\n" + " gl_FragColor = foo;\n" + "}\n"; + + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Check compiler doesn't crash on incorrect unsized array declarations. +TEST_F(MalformedShaderTest, IncorrectUnsizedArray) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "float foo[] = 0.0;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " foo[0] = 1.0;\n" + " my_FragColor = vec4(foo[0]);\n" + "}\n"; + + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Check compiler doesn't crash when a bvec is on the right hand side of a logical operator. +// ESSL 3.00.6 section 5.9. +TEST_F(MalformedShaderTest, LogicalOpRHSIsBVec) +{ + const std::string &shaderString = + "#version 300 es\n" + "void main()\n" + "{\n" + " bool b;\n" + " bvec3 b3;\n" + " b && b3;\n" + "}\n"; + + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Check compiler doesn't crash when there's an unsized array constructor with no parameters. +// ESSL 3.00.6 section 4.1.9: Array size must be greater than zero. +TEST_F(MalformedShaderTest, UnsizedArrayConstructorNoParameters) +{ + const std::string &shaderString = + "#version 300 es\n" + "void main()\n" + "{\n" + " int[]();\n" + "}\n"; + + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Passing an image parameter as an argument to another function should not be able to discard the +// coherent qualifier. +TEST_F(MalformedFragmentShaderGLES31Test, CoherentQualifierMissingInFunctionArgument) +{ + const std::string &shaderString = + "#version 310 es\n" + "precision mediump float;\n" + "precision mediump image2D;\n" + "layout(r32f) uniform coherent image2D myImage;\n" + "void myFunc(in image2D someImage) {}\n" + "void main() {\n" + " myFunc(myImage);\n" + "}\n"; + + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Passing an image parameter as an argument to another function should not be able to discard the +// volatile qualifier. +TEST_F(MalformedFragmentShaderGLES31Test, VolatileQualifierMissingInFunctionArgument) +{ + const std::string &shaderString = + "#version 310 es\n" + "precision mediump float;\n" + "precision mediump image2D;\n" + "layout(r32f) uniform volatile image2D myImage;\n" + "void myFunc(in image2D someImage) {}\n" + "void main() {\n" + " myFunc(myImage);\n" + "}\n"; + + if (compile(shaderString)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// The restrict qualifier can be discarded from a function argument. +// GLSL ES 3.10 Revision 4, 4.9 Memory Access Qualifiers +TEST_F(MalformedFragmentShaderGLES31Test, RestrictQualifierDiscardedInFunctionArgument) +{ + const std::string &shaderString = + "#version 310 es\n" + "precision mediump float;\n" + "precision mediump image2D;\n" + "layout(r32f) uniform restrict image2D myImage;\n" + "void myFunc(in image2D someImage) {}\n" + "void main() {\n" + " myFunc(myImage);\n" + "}\n"; + + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +} + +// Function image arguments can be overqualified. +// GLSL ES 3.10 Revision 4, 4.9 Memory Access Qualifiers +TEST_F(MalformedFragmentShaderGLES31Test, OverqualifyingImageParameter) +{ + const std::string &shaderString = + "#version 310 es\n" + "precision mediump float;\n" + "precision mediump image2D;\n" + "layout(r32f) uniform image2D myImage;\n" + "void myFunc(in coherent volatile image2D someImage) {}\n" + "void main() {\n" + " myFunc(myImage);\n" + "}\n"; + + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success " << mInfoLog; + } +}
\ No newline at end of file diff --git a/gfx/angle/src/tests/compiler_tests/NV_draw_buffers_test.cpp b/gfx/angle/src/tests/compiler_tests/NV_draw_buffers_test.cpp new file mode 100755 index 000000000..13a44fd59 --- /dev/null +++ b/gfx/angle/src/tests/compiler_tests/NV_draw_buffers_test.cpp @@ -0,0 +1,41 @@ +// +// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// NV_draw_buffers_test.cpp: +// Test for NV_draw_buffers setting +// + +#include "angle_gl.h" +#include "gtest/gtest.h" +#include "GLSLANG/ShaderLang.h" +#include "tests/test_utils/compiler_test.h" + +using namespace sh; + +class NVDrawBuffersTest : public MatchOutputCodeTest +{ + public: + NVDrawBuffersTest() : MatchOutputCodeTest(GL_FRAGMENT_SHADER, 0, SH_ESSL_OUTPUT) + { + ShBuiltInResources *resources = getResources(); + resources->MaxDrawBuffers = 8; + resources->EXT_draw_buffers = 1; + resources->NV_draw_buffers = 1; + } +}; + +TEST_F(NVDrawBuffersTest, NVDrawBuffers) +{ + const std::string &shaderString = + "#extension GL_EXT_draw_buffers : require\n" + "precision mediump float;\n" + "void main() {\n" + " gl_FragData[0] = vec4(1.0);\n" + " gl_FragData[1] = vec4(0.0);\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(foundInCode("GL_NV_draw_buffers")); + ASSERT_FALSE(foundInCode("GL_EXT_draw_buffers")); +} diff --git a/gfx/angle/src/tests/compiler_tests/Pack_Unpack_test.cpp b/gfx/angle/src/tests/compiler_tests/Pack_Unpack_test.cpp new file mode 100755 index 000000000..a6333e78e --- /dev/null +++ b/gfx/angle/src/tests/compiler_tests/Pack_Unpack_test.cpp @@ -0,0 +1,122 @@ +// +// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// Pack_Unpack_test.cpp: +// Tests for the emulating pack_unpack functions for GLSL. +// + +#include "angle_gl.h" +#include "gtest/gtest.h" +#include "GLSLANG/ShaderLang.h" +#include "tests/test_utils/compiler_test.h" + +using namespace sh; + +namespace +{ + +class PackUnpackTest : public MatchOutputCodeTest +{ + public: + PackUnpackTest() : MatchOutputCodeTest(GL_FRAGMENT_SHADER, 0, SH_GLSL_400_CORE_OUTPUT) {} +}; + +// Check if PackSnorm2x16 Emulation for GLSL < 4.2 compile correctly. +TEST_F(PackUnpackTest, PackSnorm2x16Emulation) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "layout(location = 0) out mediump vec4 fragColor;" + "void main() {\n" + " vec2 v;\n" + " uint u = packSnorm2x16(v);\n" + " fragColor = vec4(0.0);\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(foundInCode("uint webgl_packSnorm2x16_emu(vec2 v)")); +} + +// Check if UnpackSnorm2x16 Emulation for GLSL < 4.2 compile correctly. +TEST_F(PackUnpackTest, UnpackSnorm2x16Emulation) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "layout(location = 0) out mediump vec4 fragColor;" + "void main() {\n" + " uint u;\n" + " vec2 v=unpackSnorm2x16(u);\n" + " fragColor = vec4(0.0);\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(foundInCode("vec2 webgl_unpackSnorm2x16_emu(uint u)")); +} + +// Check if PackUnorm2x16 Emulation for GLSL < 4.1 compiles correctly. +TEST_F(PackUnpackTest, PackUnorm2x16Emulation) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "layout(location = 0) out mediump vec4 fragColor;" + "void main() {\n" + " vec2 v;\n" + " uint u = packUnorm2x16(v);\n" + " fragColor = vec4(0.0);\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(foundInCode("uint webgl_packUnorm2x16_emu(vec2 v)")); +} + +// Check if UnpackSnorm2x16 Emulation for GLSL < 4.1 compiles correctly. +TEST_F(PackUnpackTest, UnpackUnorm2x16Emulation) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "layout(location = 0) out mediump vec4 fragColor;" + "void main() {\n" + " uint u;\n" + " vec2 v=unpackUnorm2x16(u);\n" + " fragColor = vec4(0.0);\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(foundInCode("vec2 webgl_unpackUnorm2x16_emu(uint u)")); +} + +// Check if PackHalf2x16 Emulation for GLSL < 4.2 compiles correctly. +TEST_F(PackUnpackTest, PackHalf2x16Emulation) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "layout(location = 0) out mediump vec4 fragColor;" + "void main() {\n" + " vec2 v;\n" + " uint u=packHalf2x16(v);\n" + " fragColor = vec4(0.0);\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(foundInCode("uint webgl_packHalf2x16_emu(vec2 v)")); +} + +// Check if UnpackHalf2x16 Emulation for GLSL < 4.2 compiles correctly. +TEST_F(PackUnpackTest, UnpackHalf2x16Emulation) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "layout(location = 0) out mediump vec4 fragColor;" + "void main() {\n" + " uint u;\n" + " vec2 v=unpackHalf2x16(u);\n" + " fragColor = vec4(0.0);\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(foundInCode("vec2 webgl_unpackHalf2x16_emu(uint u)")); +} + +} // namespace diff --git a/gfx/angle/src/tests/compiler_tests/PruneEmptyDeclarations_test.cpp b/gfx/angle/src/tests/compiler_tests/PruneEmptyDeclarations_test.cpp new file mode 100755 index 000000000..6b59e0cd5 --- /dev/null +++ b/gfx/angle/src/tests/compiler_tests/PruneEmptyDeclarations_test.cpp @@ -0,0 +1,60 @@ +// +// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// PruneEmptyDeclarations_test.cpp: +// Tests for pruning empty declarations. +// + +#include "angle_gl.h" +#include "gtest/gtest.h" +#include "GLSLANG/ShaderLang.h" +#include "tests/test_utils/compiler_test.h" + +using namespace sh; + +namespace +{ + +class PruneEmptyDeclarationsTest : public MatchOutputCodeTest +{ + public: + PruneEmptyDeclarationsTest() + : MatchOutputCodeTest(GL_VERTEX_SHADER, 0, SH_GLSL_COMPATIBILITY_OUTPUT) + { + } +}; + +TEST_F(PruneEmptyDeclarationsTest, EmptyDeclarationStartsDeclaratorList) +{ + const std::string shaderString = + "precision mediump float;\n" + "uniform float u;\n" + "void main()\n" + "{\n" + " float, f;\n" + " gl_Position = vec4(u * f);\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(foundInCode("float f")); + ASSERT_TRUE(notFoundInCode("float, f")); +} + +TEST_F(PruneEmptyDeclarationsTest, EmptyStructDeclarationWithQualifiers) +{ + const std::string shaderString = + "precision mediump float;\n" + "const struct S { float f; };\n" + "uniform S s;" + "void main()\n" + "{\n" + " gl_Position = vec4(s.f);\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(foundInCode("struct S")); + ASSERT_TRUE(foundInCode("uniform S")); + ASSERT_TRUE(notFoundInCode("const struct S")); +} + +} // namespace diff --git a/gfx/angle/src/tests/compiler_tests/PruneUnusedFunctions_test.cpp b/gfx/angle/src/tests/compiler_tests/PruneUnusedFunctions_test.cpp new file mode 100755 index 000000000..fe710d8e6 --- /dev/null +++ b/gfx/angle/src/tests/compiler_tests/PruneUnusedFunctions_test.cpp @@ -0,0 +1,93 @@ +// +// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// PruneUnusedFunctions_test.cpp: +// Test for the pruning of unused function with the SH_PRUNE_UNUSED_FUNCTIONS compile flag +// + +#include "angle_gl.h" +#include "gtest/gtest.h" +#include "GLSLANG/ShaderLang.h" +#include "tests/test_utils/compiler_test.h" + +using namespace sh; + +namespace +{ + +class PruneUnusedFunctionsTest : public MatchOutputCodeTest +{ + public: + PruneUnusedFunctionsTest() : MatchOutputCodeTest(GL_FRAGMENT_SHADER, 0, SH_ESSL_OUTPUT) {} + + protected: + void compile(const std::string &shaderString, bool prune) + { + int compilationFlags = SH_VARIABLES | (prune ? 0 : SH_DONT_PRUNE_UNUSED_FUNCTIONS); + MatchOutputCodeTest::compile(shaderString, compilationFlags); + } +}; + +// Check that unused function and prototypes are removed iff the options is set +TEST_F(PruneUnusedFunctionsTest, UnusedFunctionAndProto) +{ + const std::string &shaderString = + "precision mediump float;\n" + "float unused(float a);\n" + "void main() {\n" + " gl_FragColor = vec4(1.0);\n" + "}\n" + "float unused(float a) {\n" + " return a;\n" + "}\n"; + compile(shaderString, true); + EXPECT_TRUE(notFoundInCode("unused(")); + EXPECT_TRUE(foundInCode("main(", 1)); + + compile(shaderString, false); + EXPECT_TRUE(foundInCode("unused(", 2)); + EXPECT_TRUE(foundInCode("main(", 1)); +} + +// Check that unimplemented prototypes are removed iff the options is set +TEST_F(PruneUnusedFunctionsTest, UnimplementedPrototype) +{ + const std::string &shaderString = + "precision mediump float;\n" + "float unused(float a);\n" + "void main() {\n" + " gl_FragColor = vec4(1.0);\n" + "}\n"; + compile(shaderString, true); + EXPECT_TRUE(notFoundInCode("unused(")); + EXPECT_TRUE(foundInCode("main(", 1)); + + compile(shaderString, false); + EXPECT_TRUE(foundInCode("unused(", 1)); + EXPECT_TRUE(foundInCode("main(", 1)); +} + +// Check that used functions are not prunued (duh) +TEST_F(PruneUnusedFunctionsTest, UsedFunction) +{ + const std::string &shaderString = + "precision mediump float;\n" + "float used(float a);\n" + "void main() {\n" + " gl_FragColor = vec4(used(1.0));\n" + "}\n" + "float used(float a) {\n" + " return a;\n" + "}\n"; + compile(shaderString, true); + EXPECT_TRUE(foundInCode("used(", 3)); + EXPECT_TRUE(foundInCode("main(", 1)); + + compile(shaderString, false); + EXPECT_TRUE(foundInCode("used(", 3)); + EXPECT_TRUE(foundInCode("main(", 1)); +} + +} diff --git a/gfx/angle/src/tests/compiler_tests/QualificationOrderESSL31_test.cpp b/gfx/angle/src/tests/compiler_tests/QualificationOrderESSL31_test.cpp new file mode 100644 index 000000000..dd3aa9a65 --- /dev/null +++ b/gfx/angle/src/tests/compiler_tests/QualificationOrderESSL31_test.cpp @@ -0,0 +1,184 @@ +// +// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// QualificationOrderESSL31_test.cpp: +// OpenGL ES 3.1 removes the strict order of qualifiers imposed by the grammar. +// This file contains tests for invalid order and usage of qualifiers in GLSL ES 3.10. + +#include "gtest/gtest.h" + +#include "angle_gl.h" +#include "compiler/translator/TranslatorESSL.h" +#include "GLSLANG/ShaderLang.h" +#include "tests/test_utils/compiler_test.h" + +using namespace sh; + +class QualificationVertexShaderTestESSL31 : public testing::Test +{ + public: + QualificationVertexShaderTestESSL31() {} + protected: + virtual void SetUp() + { + ShBuiltInResources resources; + InitBuiltInResources(&resources); + + mTranslator = new TranslatorESSL(GL_VERTEX_SHADER, SH_GLES3_1_SPEC); + ASSERT_TRUE(mTranslator->Init(resources)); + } + + virtual void TearDown() { delete mTranslator; } + + // Return true when compilation succeeds + bool compile(const std::string &shaderString) + { + const char *shaderStrings[] = {shaderString.c_str()}; + mASTRoot = mTranslator->compileTreeForTesting(shaderStrings, 1, + SH_INTERMEDIATE_TREE | SH_VARIABLES); + TInfoSink &infoSink = mTranslator->getInfoSink(); + mInfoLog = infoSink.info.c_str(); + return mASTRoot != nullptr; + } + + const TIntermSymbol *findSymbolInAST(const TString &symbolName, TBasicType basicType) + { + return FindSymbolNode(mASTRoot, symbolName, basicType); + } + + protected: + TranslatorESSL *mTranslator; + TIntermNode *mASTRoot; + std::string mInfoLog; +}; + +// GLSL ES 3.10 has relaxed checks on qualifier order. Any order is correct. +TEST_F(QualificationVertexShaderTestESSL31, CentroidOut) +{ + const std::string &shaderString = + "#version 310 es\n" + "precision lowp float;\n" + "out centroid float something;\n" + "void main(){\n" + " something = 1.0;\n" + "}\n"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success" << mInfoLog; + } + else + { + const TIntermSymbol *node = findSymbolInAST("something", EbtFloat); + ASSERT_NE(nullptr, node); + + const TType &type = node->getType(); + EXPECT_EQ(EvqCentroidOut, type.getQualifier()); + } +} + +// GLSL ES 3.10 has relaxed checks on qualifier order. Any order is correct. +TEST_F(QualificationVertexShaderTestESSL31, AllQualifiersMixed) +{ + const std::string &shaderString = + "#version 310 es\n" + "precision lowp float;\n" + "highp out invariant centroid flat vec4 something;\n" + "void main(){\n" + "}\n"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success" << mInfoLog; + } + else + { + const TIntermSymbol *node = findSymbolInAST("something", EbtFloat); + ASSERT_NE(nullptr, node); + + const TType &type = node->getType(); + EXPECT_TRUE(type.isInvariant()); + EXPECT_EQ(EvqFlatOut, type.getQualifier()); + EXPECT_EQ(EbpHigh, type.getPrecision()); + } +} + +// GLSL ES 3.10 allows multiple layout qualifiers to be specified. +TEST_F(QualificationVertexShaderTestESSL31, MultipleLayouts) +{ + const std::string &shaderString = + "#version 310 es\n" + "precision lowp float;\n" + "in layout(location=1) layout(location=2) vec4 something;\n" + "void main(){\n" + "}\n"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success" << mInfoLog; + } + else + { + const TIntermSymbol *node = findSymbolInAST("something", EbtFloat); + ASSERT_NE(nullptr, node); + + const TType &type = node->getType(); + EXPECT_EQ(EvqVertexIn, type.getQualifier()); + EXPECT_EQ(2, type.getLayoutQualifier().location); + } +} + +// The test checks layout qualifier overriding when multiple layouts are specified. +TEST_F(QualificationVertexShaderTestESSL31, MultipleLayoutsInterfaceBlock) +{ + const std::string &shaderString = + "#version 310 es\n" + "precision lowp float;\n" + "out float someValue;\n" + "layout(shared) layout(std140) layout(column_major) uniform MyInterface\n" + "{ vec4 something; } MyInterfaceName;\n" + "void main(){\n" + " someValue = MyInterfaceName.something.r;\n" + "}\n"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success" << mInfoLog; + } + else + { + const TIntermSymbol *node = findSymbolInAST("MyInterfaceName", EbtInterfaceBlock); + ASSERT_NE(nullptr, node); + + const TType &type = node->getType(); + TLayoutQualifier layoutQualifier = type.getLayoutQualifier(); + EXPECT_EQ(EbsStd140, layoutQualifier.blockStorage); + EXPECT_EQ(EmpColumnMajor, layoutQualifier.matrixPacking); + } +} + +// The test checks layout qualifier overriding when multiple layouts are specified. +TEST_F(QualificationVertexShaderTestESSL31, MultipleLayoutsInterfaceBlock2) +{ + const std::string &shaderString = + "#version 310 es\n" + "precision lowp float;\n" + "out float someValue;\n" + "layout(row_major) layout(std140) layout(shared) uniform MyInterface\n" + "{ vec4 something; } MyInterfaceName;\n" + "void main(){\n" + " someValue = MyInterfaceName.something.r;\n" + "}\n"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed, expecting success" << mInfoLog; + } + else + { + const TIntermSymbol *node = findSymbolInAST("MyInterfaceName", EbtInterfaceBlock); + ASSERT_NE(nullptr, node); + + const TType &type = node->getType(); + TLayoutQualifier layoutQualifier = type.getLayoutQualifier(); + EXPECT_EQ(EbsShared, layoutQualifier.blockStorage); + EXPECT_EQ(EmpRowMajor, layoutQualifier.matrixPacking); + } +} diff --git a/gfx/angle/src/tests/compiler_tests/QualificationOrder_test.cpp b/gfx/angle/src/tests/compiler_tests/QualificationOrder_test.cpp new file mode 100644 index 000000000..33ecbf77d --- /dev/null +++ b/gfx/angle/src/tests/compiler_tests/QualificationOrder_test.cpp @@ -0,0 +1,571 @@ +// +// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// QualificationOrder_test.cpp: +// OpenGL ES 3.1 removes the strict order of qualifiers imposed by the grammar. +// This file contains tests for invalid order and usage of qualifiers. + +#include "angle_gl.h" +#include "gtest/gtest.h" +#include "GLSLANG/ShaderLang.h" +#include "compiler/translator/TranslatorESSL.h" + +using namespace sh; + +class QualificationOrderShaderTest : public testing::Test +{ + public: + QualificationOrderShaderTest() {} + + protected: + virtual void SetUp() {} + + virtual void TearDown() {} + + // Return true when compilation succeeds + bool compile(const std::string &shaderString, ::GLenum shaderType, ShShaderSpec spec) + { + ShBuiltInResources resources; + InitBuiltInResources(&resources); + resources.MaxDrawBuffers = (spec == SH_GLES2_SPEC) ? 1 : 8; + + TranslatorESSL *translator = new TranslatorESSL(shaderType, spec); + EXPECT_TRUE(translator->Init(resources)); + + const char *shaderStrings[] = {shaderString.c_str()}; + bool compilationSuccess = translator->compile(shaderStrings, 1, SH_INTERMEDIATE_TREE); + TInfoSink &infoSink = translator->getInfoSink(); + mInfoLog = infoSink.info.c_str(); + + delete translator; + + return compilationSuccess; + } + + protected: + std::string mInfoLog; +}; + +// Repeating centroid qualifier is invalid. +TEST_F(QualificationOrderShaderTest, RepeatingCentroid) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "flat centroid centroid in float myValue;\n" + "void main() {\n" + "}\n"; + + if (compile(shaderString, GL_FRAGMENT_SHADER, SH_GLES3_1_SPEC)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Repeating uniform storage qualifiers is invalid. +TEST_F(QualificationOrderShaderTest, RepeatingUniforms) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "uniform uniform float myValue;\n" + "void main() {\n" + "}\n"; + + if (compile(shaderString, GL_FRAGMENT_SHADER, SH_GLES3_1_SPEC)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Repeating varying storage qualifiers is invalid. +TEST_F(QualificationOrderShaderTest, RepeatingVaryings) +{ + const std::string &shaderString = + "precision mediump float;\n" + "varying varying vec4 myColor;\n" + "void main() {\n" + "}\n"; + + if (compile(shaderString, GL_FRAGMENT_SHADER, SH_GLES3_1_SPEC)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Layout qualifier should be before the storage qualifiers. +TEST_F(QualificationOrderShaderTest, WrongOrderQualifiers) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out layout(location=1) vec4 myColor;\n" + "void main() {\n" + "}\n"; + + if (compile(shaderString, GL_FRAGMENT_SHADER, SH_GLES3_1_SPEC)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Centroid out is the correct order. Out centroid is incorrect. +TEST_F(QualificationOrderShaderTest, WrongOrderCentroidOut) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "in vec4 uv;\n" + "out centroid vec4 position;\n" + "void main() {\n" + "position = uv;\n" + "gl_Position = uv;\n" + "}\n"; + + if (compile(shaderString, GL_VERTEX_SHADER, SH_GLES3_SPEC)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Centroid in is the correct order. In centroid is incorrect. +TEST_F(QualificationOrderShaderTest, WrongOrderCentroidIn) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "in centroid vec4 colorIN;\n" + "out vec4 colorOUT;\n" + "void main() {\n" + "colorOUT = colorIN;\n" + "}\n"; + + if (compile(shaderString, GL_FRAGMENT_SHADER, SH_GLES3_SPEC)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Type cannot be before the storage qualifier. +TEST_F(QualificationOrderShaderTest, WrongOrderTypeStorage) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "centroid in vec4 colorIN;\n" + "vec4 out colorOUT;\n" + "void main() {\n" + "colorOUT = colorIN;\n" + "}\n"; + + if (compile(shaderString, GL_FRAGMENT_SHADER, SH_GLES3_SPEC)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// A variable cannot have two conflicting storage qualifiers. +TEST_F(QualificationOrderShaderTest, RepeatingDifferentStorageQualifiers) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "centroid in vec4 colorIN;\n" + "uniform out vec4 colorOUT;\n" + "void main() {\n" + "colorOUT = colorIN;\n" + "}\n"; + + if (compile(shaderString, GL_FRAGMENT_SHADER, SH_GLES3_SPEC)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// A variable cannot have two different layout qualifiers. +TEST_F(QualificationOrderShaderTest, RepeatingLayoutQualifiers) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "in vec4 colorIN;\n" + "layout(location=0) layout(location=0) out vec4 colorOUT;\n" + "void main() {\n" + "colorOUT = colorIN;\n" + "}\n"; + + if (compile(shaderString, GL_FRAGMENT_SHADER, SH_GLES3_SPEC)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// A variable cannot have repeating invariant qualifiers. +TEST_F(QualificationOrderShaderTest, RepeatingInvariantQualifiers) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "in vec4 colorIN;\n" + "invariant invariant out vec4 colorOUT;\n" + "void main() {\n" + "colorOUT = colorIN;\n" + "}\n"; + + if (compile(shaderString, GL_FRAGMENT_SHADER, SH_GLES3_SPEC)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// A variable cannot have repeating storage qualifiers. +TEST_F(QualificationOrderShaderTest, RepeatingAttributes) +{ + const std::string &shaderString = + "precision mediump float;\n" + "attribute attribute vec4 positionIN;\n" + "void main() {\n" + "gl_Position = positionIN;\n" + "}\n"; + + if (compile(shaderString, GL_VERTEX_SHADER, SH_GLES3_SPEC)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Wrong order for invariant varying. It should be 'invariant varying', not 'varying invariant'. +TEST_F(QualificationOrderShaderTest, VaryingInvariantWrongOrder) +{ + const std::string &shaderString = + "precision mediump float;\n" + "attribute vec4 positionIN;\n" + "varying invariant vec4 dataOUT;\n" + "void main() {\n" + "gl_Position = positionIN;\n" + "dataOUT = 0.5 * dataOUT + vec4(0.5);\n" + "}\n"; + + if (compile(shaderString, GL_VERTEX_SHADER, SH_GLES3_SPEC)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// A variable cannot have repeating storage qualifiers. +TEST_F(QualificationOrderShaderTest, AttributeVaryingMix) +{ + const std::string &shaderString1 = + "precision mediump float;\n" + "attribute varying vec4 positionIN;\n" + "void main() {\n" + "gl_Position = positionIN;\n" + "}\n"; + + const std::string &shaderString2 = + "precision mediump float;\n" + "varying attribute vec4 positionIN;\n" + "void main() {\n" + "gl_Position = positionIN;\n" + "}\n"; + + if (compile(shaderString1, GL_VERTEX_SHADER, SH_GLES3_SPEC)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } + + if (compile(shaderString2, GL_VERTEX_SHADER, SH_GLES3_SPEC)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// A variable cannot have repeating interpolation qualifiers. +TEST_F(QualificationOrderShaderTest, RepeatingInterpolationQualifiers) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "in vec4 positionIN;\n" + "flat flat out vec4 dataOUT;\n" + "void main() {\n" + "gl_Position = positionIN;\n" + "dataOUT = 0.5 * dataOUT + vec4(0.5);\n" + "}\n"; + + if (compile(shaderString, GL_VERTEX_SHADER, SH_GLES3_SPEC)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Wrong order for the interpolation and storage qualifier. The correct order is interpolation +// qualifier and then storage qualifier. +TEST_F(QualificationOrderShaderTest, WrongOrderInterpolationStorageQualifiers) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "in vec4 positionIN;\n" + "out flat vec4 dataOUT;\n" + "void main() {\n" + "gl_Position = positionIN;\n" + "dataOUT = 0.5 * dataOUT + vec4(0.5);\n" + "}\n"; + + if (compile(shaderString, GL_VERTEX_SHADER, SH_GLES3_SPEC)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// The correct order is invariant, interpolation, storage. +TEST_F(QualificationOrderShaderTest, WrongOrderInvariantInterpolationStorageQualifiers) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "in vec4 positionIN;\n" + "flat invariant out vec4 dataOUT;\n" + "void main() {\n" + "gl_Position = positionIN;\n" + "dataOUT = 0.5 * dataOUT + vec4(0.5);\n" + "}\n"; + + if (compile(shaderString, GL_VERTEX_SHADER, SH_GLES3_SPEC)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// The invariant qualifer has to be before the storage qualifiers. +TEST_F(QualificationOrderShaderTest, WrongOrderInvariantNotFirst) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "in vec4 positionIN;\n" + "centroid out invariant vec4 dataOUT;\n" + "void main() {\n" + "gl_Position = positionIN;\n" + "dataOUT = 0.5 * dataOUT + vec4(0.5);\n" + "}\n"; + + if (compile(shaderString, GL_VERTEX_SHADER, SH_GLES3_SPEC)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// The precision qualifier is after the storage qualifiers. +TEST_F(QualificationOrderShaderTest, WrongOrderPrecision) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "in vec4 positionIN;\n" + "highp centroid out vec4 dataOUT;\n" + "void main() {\n" + "gl_Position = positionIN;\n" + "dataOUT = 0.5 * dataOUT + vec4(0.5);\n" + "}\n"; + + if (compile(shaderString, GL_VERTEX_SHADER, SH_GLES3_SPEC)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// A variable cannot have multiple declarations of the 'in' storage qualifier. +TEST_F(QualificationOrderShaderTest, RepeatingInQualifier) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "in in vec4 positionIN;\n" + "void main() {\n" + "gl_Position = positionIN;\n" + "}\n"; + + if (compile(shaderString, GL_VERTEX_SHADER, SH_GLES3_SPEC)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// A variable cannot have multiple declarations of the 'attribute' storage qualifier. +TEST_F(QualificationOrderShaderTest, RepeatingAttributeQualifier) +{ + const std::string &shaderString = + "precision mediump float;\n" + "attribute attribute vec4 positionIN;\n" + "void main() {\n" + "gl_Position = positionIN;\n" + "}\n"; + + if (compile(shaderString, GL_VERTEX_SHADER, SH_GLES3_SPEC)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Vertex input cannot be qualified with invariant. +TEST_F(QualificationOrderShaderTest, InvariantVertexInput) +{ + const std::string &shaderString = + "precision mediump float;\n" + "invariant attribute vec4 positionIN;\n" + "void main() {\n" + "gl_Position = positionIN;\n" + "}\n"; + + if (compile(shaderString, GL_VERTEX_SHADER, SH_GLES3_SPEC)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} + +// Cannot have a function parameter with the invariant qualifier. +TEST_F(QualificationOrderShaderTest, InvalidFunctionParametersInvariant) +{ + const std::string &shaderString = + "precision lowp float;\n" + "varying float value;\n" + "float foo0 (invariant in float x) {\n" + " return 2.0*x;\n" + "}\n" + "void main()\n" + "{\n" + " gl_FragColor = vec4(foo0(value));\n" + "}\n"; + + if (compile(shaderString, GL_FRAGMENT_SHADER, SH_GLES3_SPEC)) + { + FAIL() << "Shader compilation succeeded, expecting failure" << mInfoLog; + } +} + +// Cannot have a function parameter with the attribute qualifier. +TEST_F(QualificationOrderShaderTest, InvalidFunctionParametersAttribute) +{ + const std::string &shaderString = + "precision lowp float;\n" + "varying float value;\n" + "float foo0 (attribute float x) {\n" + " return 2.0*x;\n" + "}\n" + "void main()\n" + "{\n" + " gl_FragColor = vec4(foo0(value));\n" + "}\n"; + + if (compile(shaderString, GL_FRAGMENT_SHADER, SH_GLES3_SPEC)) + { + FAIL() << "Shader compilation succeeded, expecting failure" << mInfoLog; + } +} + +// Cannot have a function parameter with the varying qualifier. +TEST_F(QualificationOrderShaderTest, InvalidFunctionParametersVarying) +{ + const std::string &shaderString = + "precision lowp float;\n" + "varying float value;\n" + "float foo0 (varying float x) {\n" + " return 2.0*x;\n" + "}\n" + "void main()\n" + "{\n" + " gl_FragColor = vec4(foo0(value));\n" + "}\n"; + + if (compile(shaderString, GL_FRAGMENT_SHADER, SH_GLES3_SPEC)) + { + FAIL() << "Shader compilation succeeded, expecting failure" << mInfoLog; + } +} + +// Cannot have a function parameter with the layout qualifier +TEST_F(QualificationOrderShaderTest, InvalidFunctionParametersLayout) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision lowp float;\n" + "in float value;\n" + "float foo0 (layout(location = 3) in float x) {\n" + " return 2.0*x;\n" + "}\n" + "out vec4 colorOUT;\n" + "void main()\n" + "{\n" + " colorOUT = vec4(foo0(value));\n" + "}\n"; + + if (compile(shaderString, GL_FRAGMENT_SHADER, SH_GLES3_SPEC)) + { + FAIL() << "Shader compilation succeeded, expecting failure" << mInfoLog; + } +} + +// Cannot have a function parameter with the centroid qualifier +TEST_F(QualificationOrderShaderTest, InvalidFunctionParametersCentroidIn) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision lowp float;\n" + "in float value;\n" + "float foo0 (centroid in float x) {\n" + " return 2.0*x;\n" + "}\n" + "out vec4 colorOUT;\n" + "void main()\n" + "{\n" + " colorOUT = vec4(foo0(value));\n" + "}\n"; + + if (compile(shaderString, GL_FRAGMENT_SHADER, SH_GLES3_SPEC)) + { + FAIL() << "Shader compilation succeeded, expecting failure" << mInfoLog; + } +} + +// Cannot have a function parameter with the flat qualifier +TEST_F(QualificationOrderShaderTest, InvalidFunctionParametersFlatIn) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision lowp float;\n" + "in float value;\n" + "float foo0 (flat in float x) {\n" + " return 2.0*x;\n" + "}\n" + "out vec4 colorOUT;\n" + "void main()\n" + "{\n" + " colorOUT = vec4(foo0(value));\n" + "}\n"; + + if (compile(shaderString, GL_FRAGMENT_SHADER, SH_GLES3_SPEC)) + { + FAIL() << "Shader compilation succeeded, expecting failure" << mInfoLog; + } +} + +// Output layout location qualifier can't appear more than once within a declaration. +// GLSL ES 3.00.6 section 4.3.8.2 Output Layout Qualifiers. +TEST_F(QualificationOrderShaderTest, TwoOutputLocations) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "layout(location=1, location=2) out vec4 myColor;\n" + "void main() {\n" + "}\n"; + + if (compile(shaderString, GL_FRAGMENT_SHADER, SH_GLES3_SPEC)) + { + FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; + } +} diff --git a/gfx/angle/src/tests/compiler_tests/RecordConstantPrecision_test.cpp b/gfx/angle/src/tests/compiler_tests/RecordConstantPrecision_test.cpp new file mode 100755 index 000000000..2cd2bfdf4 --- /dev/null +++ b/gfx/angle/src/tests/compiler_tests/RecordConstantPrecision_test.cpp @@ -0,0 +1,95 @@ +// +// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// RecordConstantPrecision_test.cpp: +// Test for recording constant variable precision when it affects consuming expression. +// + +#include "angle_gl.h" +#include "gtest/gtest.h" +#include "GLSLANG/ShaderLang.h" +#include "tests/test_utils/compiler_test.h" + +using namespace sh; + +class RecordConstantPrecisionTest : public MatchOutputCodeTest +{ + public: + RecordConstantPrecisionTest() : MatchOutputCodeTest(GL_FRAGMENT_SHADER, 0, SH_ESSL_OUTPUT) {} +}; + +// The constant cannot be folded if its precision is higher than the other operands, since it +// increases the precision of the consuming expression. +TEST_F(RecordConstantPrecisionTest, HigherPrecisionConstantAsParameter) +{ + const std::string &shaderString = + "uniform mediump float u;" + "void main()\n" + "{\n" + " const highp float a = 4096.5;\n" + " mediump float b = fract(a + u);\n" + " gl_FragColor = vec4(b);\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(foundInCode("const highp float webgl_angle_s")); + ASSERT_FALSE(foundInCode("fract(4096.5")); + ASSERT_FALSE(foundInCode("fract((4096.5")); +} + +// The constant can be folded if its precision is equal to the other operands, as it does not +// increase the precision of the consuming expression. +TEST_F(RecordConstantPrecisionTest, EqualPrecisionConstantAsParameter) +{ + const std::string &shaderString = + "uniform mediump float u;" + "void main()\n" + "{\n" + " const mediump float a = 4096.5;\n" + " mediump float b = fract(a + u);\n" + " gl_FragColor = vec4(b);\n" + "}\n"; + compile(shaderString); + ASSERT_FALSE(foundInCode("const mediump float webgl_angle_s")); + ASSERT_TRUE(foundInCode("fract((4096.5")); +} + +// The constant cannot be folded if its precision is higher than the other operands, since it +// increases the precision of the consuming expression. This applies also when the constant is +// part of a constant expression that can be folded. +TEST_F(RecordConstantPrecisionTest, FoldedBinaryConstantPrecisionIsHigher) +{ + const std::string &shaderString = + "uniform mediump float u;" + "void main()\n" + "{\n" + " const highp float a = 4095.5;\n" + " mediump float b = fract((a + 1.0) + u);\n" + " gl_FragColor = vec4(b);\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(foundInCode("const highp float webgl_angle_s")); + ASSERT_FALSE(foundInCode("fract(4096.5")); + ASSERT_FALSE(foundInCode("fract((4096.5")); +} + + +// The constant cannot be folded if its precision is higher than the other operands, since it +// increases the precision of the consuming expression. This applies also when the constant is +// part of a constant expression that can be folded. +TEST_F(RecordConstantPrecisionTest, FoldedUnaryConstantPrecisionIsHigher) +{ + const std::string &shaderString = + "uniform mediump float u;" + "void main()\n" + "{\n" + " const highp float a = 0.5;\n" + " mediump float b = sin(fract(a) + u);\n" + " gl_FragColor = vec4(b);\n" + "}\n"; + compile(shaderString); + ASSERT_TRUE(foundInCode("const highp float webgl_angle_s")); + ASSERT_FALSE(foundInCode("sin(0.5")); + ASSERT_FALSE(foundInCode("sin((0.5")); +} diff --git a/gfx/angle/src/tests/compiler_tests/RemovePow_test.cpp b/gfx/angle/src/tests/compiler_tests/RemovePow_test.cpp new file mode 100755 index 000000000..8367ac745 --- /dev/null +++ b/gfx/angle/src/tests/compiler_tests/RemovePow_test.cpp @@ -0,0 +1,158 @@ +// +// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// RemovePow_test.cpp: +// Tests for removing pow() function calls from the AST. +// + +#include "angle_gl.h" +#include "gtest/gtest.h" +#include "GLSLANG/ShaderLang.h" +#include "compiler/translator/NodeSearch.h" +#include "compiler/translator/TranslatorGLSL.h" + +using namespace sh; + +class RemovePowTest : public testing::Test +{ + public: + RemovePowTest() {} + + protected: + void SetUp() override + { + allocator.push(); + SetGlobalPoolAllocator(&allocator); + ShBuiltInResources resources; + sh::InitBuiltInResources(&resources); + mTranslatorGLSL = + new sh::TranslatorGLSL(GL_FRAGMENT_SHADER, SH_GLES2_SPEC, SH_GLSL_COMPATIBILITY_OUTPUT); + ASSERT_TRUE(mTranslatorGLSL->Init(resources)); + } + + void TearDown() override + { + SafeDelete(mTranslatorGLSL); + SetGlobalPoolAllocator(nullptr); + allocator.pop(); + } + + void compile(const std::string& shaderString) + { + const char *shaderStrings[] = { shaderString.c_str() }; + mASTRoot = mTranslatorGLSL->compileTreeForTesting(shaderStrings, 1, + SH_OBJECT_CODE | SH_REMOVE_POW_WITH_CONSTANT_EXPONENT); + if (!mASTRoot) + { + TInfoSink &infoSink = mTranslatorGLSL->getInfoSink(); + FAIL() << "Shader compilation into ESSL failed " << infoSink.info.c_str(); + } + } + + template <class T> + bool foundInAST() + { + return T::search(mASTRoot); + } + + private: + sh::TranslatorGLSL *mTranslatorGLSL; + TIntermNode *mASTRoot; + + TPoolAllocator allocator; +}; + +// Check if there's a pow() node anywhere in the tree. +class FindPow : public sh::NodeSearchTraverser<FindPow> +{ + public: + bool visitBinary(Visit visit, TIntermBinary *node) override + { + if (node->getOp() == EOpPow) + { + mFound = true; + } + return !mFound; + } +}; + +// Check if the tree starting at node corresponds to exp2(y * log2(x)) +// If the tree matches, set base to the node corresponding to x. +bool IsPowWorkaround(TIntermNode *node, TIntermNode **base) +{ + TIntermUnary *exp = node->getAsUnaryNode(); + if (exp != nullptr && exp->getOp() == EOpExp2) + { + TIntermBinary *mul = exp->getOperand()->getAsBinaryNode(); + if (mul != nullptr && mul->isMultiplication()) + { + TIntermUnary *log = mul->getRight()->getAsUnaryNode(); + if (mul->getLeft()->getAsConstantUnion() && log != nullptr) + { + if (log->getOp() == EOpLog2) + { + if (base) + *base = log->getOperand(); + return true; + } + } + } + } + return false; +} + +// Check if there's a node with the correct workaround to pow anywhere in the tree. +class FindPowWorkaround : public sh::NodeSearchTraverser<FindPowWorkaround> +{ + public: + bool visitUnary(Visit visit, TIntermUnary *node) override + { + mFound = IsPowWorkaround(node, nullptr); + return !mFound; + } +}; + +// Check if there's a node with the correct workaround to pow with another workaround to pow +// nested within it anywhere in the tree. +class FindNestedPowWorkaround : public sh::NodeSearchTraverser<FindNestedPowWorkaround> +{ + public: + bool visitUnary(Visit visit, TIntermUnary *node) override + { + TIntermNode *base = nullptr; + bool oneFound = IsPowWorkaround(node, &base); + if (oneFound && base) + mFound = IsPowWorkaround(base, nullptr); + return !mFound; + } +}; + +TEST_F(RemovePowTest, PowWithConstantExponent) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform float u;\n" + "void main() {\n" + " gl_FragColor = pow(vec4(u), vec4(0.5));\n" + "}\n"; + compile(shaderString); + ASSERT_FALSE(foundInAST<FindPow>()); + ASSERT_TRUE(foundInAST<FindPowWorkaround>()); + ASSERT_FALSE(foundInAST<FindNestedPowWorkaround>()); +} + +TEST_F(RemovePowTest, NestedPowWithConstantExponent) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform float u;\n" + "void main() {\n" + " gl_FragColor = pow(pow(vec4(u), vec4(2.0)), vec4(0.5));\n" + "}\n"; + compile(shaderString); + ASSERT_FALSE(foundInAST<FindPow>()); + ASSERT_TRUE(foundInAST<FindNestedPowWorkaround>()); +} + diff --git a/gfx/angle/src/tests/compiler_tests/ShCompile_test.cpp b/gfx/angle/src/tests/compiler_tests/ShCompile_test.cpp new file mode 100755 index 000000000..21e4a3cbe --- /dev/null +++ b/gfx/angle/src/tests/compiler_tests/ShCompile_test.cpp @@ -0,0 +1,83 @@ +// +// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// ShCompile_test.cpp +// Test the sh::Compile interface with different parameters. +// + +#include "angle_gl.h" +#include "gtest/gtest.h" +#include "GLSLANG/ShaderLang.h" + +class ShCompileTest : public testing::Test +{ + public: + ShCompileTest() {} + + protected: + void SetUp() override + { + sh::InitBuiltInResources(&mResources); + mCompiler = sh::ConstructCompiler(GL_FRAGMENT_SHADER, SH_WEBGL_SPEC, + SH_GLSL_COMPATIBILITY_OUTPUT, &mResources); + ASSERT_TRUE(mCompiler != nullptr) << "Compiler could not be constructed."; + } + + void TearDown() override + { + if (mCompiler) + { + sh::Destruct(mCompiler); + mCompiler = nullptr; + } + } + + void testCompile(const char **shaderStrings, int stringCount, bool expectation) + { + bool success = sh::Compile(mCompiler, shaderStrings, stringCount, 0); + const std::string &compileLog = sh::GetInfoLog(mCompiler); + EXPECT_EQ(expectation, success) << compileLog; + } + + private: + ShBuiltInResources mResources; + ShHandle mCompiler; +}; + +// Test calling sh::Compile with more than one shader source string. +TEST_F(ShCompileTest, MultipleShaderStrings) +{ + const std::string &shaderString1 = + "precision mediump float;\n" + "void main() {\n"; + const std::string &shaderString2 = + " gl_FragColor = vec4(0.0);\n" + "}"; + + const char *shaderStrings[] = {shaderString1.c_str(), shaderString2.c_str()}; + + testCompile(shaderStrings, 2, true); +} + +// Test calling sh::Compile with a tokens split into different shader source strings. +TEST_F(ShCompileTest, TokensSplitInShaderStrings) +{ + const std::string &shaderString1 = + "precision mediump float;\n" + "void ma"; + const std::string &shaderString2 = + "in() {\n" + "#i"; + const std::string &shaderString3 = + "f 1\n" + " gl_FragColor = vec4(0.0);\n" + "#endif\n" + "}"; + + const char *shaderStrings[] = {shaderString1.c_str(), shaderString2.c_str(), + shaderString3.c_str()}; + + testCompile(shaderStrings, 3, true); +} diff --git a/gfx/angle/src/tests/compiler_tests/ShaderExtension_test.cpp b/gfx/angle/src/tests/compiler_tests/ShaderExtension_test.cpp new file mode 100755 index 000000000..eb2d9b9bd --- /dev/null +++ b/gfx/angle/src/tests/compiler_tests/ShaderExtension_test.cpp @@ -0,0 +1,218 @@ +// +// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// Extension_test.cpp +// Test that shaders need various extensions to be compiled. +// + +#include "angle_gl.h" +#include "gtest/gtest.h" +#include "GLSLANG/ShaderLang.h" + +static const char *FragDepthExtShdr[] = +{ + // First string of the shader. The required pragma declaration. + "#extension GL_EXT_frag_depth : enable\n", + + // Second string of the shader. The rest of the shader body. + "void main() { gl_FragDepthEXT = 1.0; }\n" +}; + +static const char *StandDerivExtShdr[] = +{ + // First string of the shader. The required pragma declaration. + "#extension GL_OES_standard_derivatives : enable\n", + + // Second string of the shader. The rest of the shader body. + "precision mediump float;\n" + "varying vec2 texCoord;\n" + "void main() { gl_FragColor = vec4(dFdx(texCoord.x), dFdy(texCoord.y), fwidth(texCoord.x), 1.0); }\n" +}; + +static const char *TextureLODShdr[] = +{ + // First string of the shader. The required pragma declaration. + "#extension GL_EXT_shader_texture_lod : enable\n", + + // Second string of the shader. The rest of the shader body. + "precision mediump float;\n" + "varying vec2 texCoord0v;\n" + "uniform float lod;\n" + "uniform sampler2D tex;\n" + "void main() { vec4 color = texture2DLodEXT(tex, texCoord0v, lod); }\n" +}; + +class ShaderExtensionTest : public testing::Test +{ + public: + ShaderExtensionTest() {} + + protected: + virtual void SetUp() + { + sh::InitBuiltInResources(&mResources); + mCompiler = NULL; + } + + virtual void TearDown() + { + DestroyCompiler(); + } + + void DestroyCompiler() + { + if (mCompiler) + { + sh::Destruct(mCompiler); + mCompiler = NULL; + } + } + + void InitializeCompiler() + { + DestroyCompiler(); + mCompiler = sh::ConstructCompiler(GL_FRAGMENT_SHADER, SH_WEBGL_SPEC, + SH_GLSL_COMPATIBILITY_OUTPUT, &mResources); + ASSERT_TRUE(mCompiler != NULL) << "Compiler could not be constructed."; + } + + void TestShaderExtension(const char **shaderStrings, int stringCount, bool expectation) + { + bool success = sh::Compile(mCompiler, shaderStrings, stringCount, 0); + const std::string &compileLog = sh::GetInfoLog(mCompiler); + EXPECT_EQ(expectation, success) << compileLog; + } + + protected: + ShBuiltInResources mResources; + ShHandle mCompiler; +}; + +TEST_F(ShaderExtensionTest, FragDepthExtRequiresExt) +{ + // Extension is required to compile properly. + mResources.EXT_frag_depth = 0; + InitializeCompiler(); + TestShaderExtension(FragDepthExtShdr, 2, false); +} + +TEST_F(ShaderExtensionTest, FragDepthExtRequiresPragma) +{ + // Pragma is required to compile properly. + mResources.EXT_frag_depth = 1; + InitializeCompiler(); + TestShaderExtension(&FragDepthExtShdr[1], 1, false); +} + +TEST_F(ShaderExtensionTest, FragDepthExtCompiles) +{ + // Test that it compiles properly with extension enabled. + mResources.EXT_frag_depth = 1; + InitializeCompiler(); + TestShaderExtension(FragDepthExtShdr, 2, true); +} + +TEST_F(ShaderExtensionTest, FragDepthExtResetsInternalStates) +{ + // Test that extension internal states are reset properly between compiles. + mResources.EXT_frag_depth = 1; + InitializeCompiler(); + + TestShaderExtension(FragDepthExtShdr, 2, true); + TestShaderExtension(&FragDepthExtShdr[1], 1, false); + TestShaderExtension(FragDepthExtShdr, 2, true); +} + +TEST_F(ShaderExtensionTest, StandDerivExtRequiresExt) +{ + // Extension is required to compile properly. + mResources.OES_standard_derivatives = 0; + InitializeCompiler(); + TestShaderExtension(StandDerivExtShdr, 2, false); +} + +TEST_F(ShaderExtensionTest, StandDerivExtRequiresPragma) +{ + // Pragma is required to compile properly. + mResources.OES_standard_derivatives = 1; + InitializeCompiler(); + TestShaderExtension(&StandDerivExtShdr[1], 1, false); +} + +TEST_F(ShaderExtensionTest, StandDerivExtCompiles) +{ + // Test that it compiles properly with extension enabled. + mResources.OES_standard_derivatives = 1; + InitializeCompiler(); + TestShaderExtension(StandDerivExtShdr, 2, true); +} + +TEST_F(ShaderExtensionTest, StandDerivExtResetsInternalStates) +{ + // Test that extension internal states are reset properly between compiles. + mResources.OES_standard_derivatives = 1; + InitializeCompiler(); + + TestShaderExtension(StandDerivExtShdr, 2, true); + TestShaderExtension(&StandDerivExtShdr[1], 1, false); + TestShaderExtension(StandDerivExtShdr, 2, true); + TestShaderExtension(&StandDerivExtShdr[1], 1, false); +} + +TEST_F(ShaderExtensionTest, TextureLODExtRequiresExt) +{ + // Extension is required to compile properly. + mResources.EXT_shader_texture_lod = 0; + InitializeCompiler(); + TestShaderExtension(TextureLODShdr, 2, false); +} + +TEST_F(ShaderExtensionTest, TextureLODExtRequiresPragma) +{ + // Pragma is required to compile properly. + mResources.EXT_shader_texture_lod = 1; + InitializeCompiler(); + TestShaderExtension(&TextureLODShdr[1], 1, false); +} + +TEST_F(ShaderExtensionTest, TextureLODExtCompiles) +{ + // Test that it compiles properly with extension enabled. + mResources.EXT_shader_texture_lod = 1; + InitializeCompiler(); + TestShaderExtension(TextureLODShdr, 2, true); +} + +TEST_F(ShaderExtensionTest, TextureLODExtResetsInternalStates) +{ + // Test that extension internal states are reset properly between compiles. + mResources.EXT_shader_texture_lod = 1; + InitializeCompiler(); + + TestShaderExtension(&TextureLODShdr[1], 1, false); + TestShaderExtension(TextureLODShdr, 2, true); + TestShaderExtension(&TextureLODShdr[1], 1, false); + TestShaderExtension(TextureLODShdr, 2, true); +} + +// Test a bug where we could modify the value of a builtin variable. +TEST_F(ShaderExtensionTest, BuiltinRewritingBug) +{ + mResources.MaxDrawBuffers = 4; + mResources.EXT_draw_buffers = 1; + InitializeCompiler(); + + const std::string &shaderString = + "#extension GL_EXT_draw_buffers : require\n" + "precision mediump float;\n" + "void main() {\n" + " gl_FragData[gl_MaxDrawBuffers] = vec4(0.0);\n" + "}"; + + const char *shaderStrings[] = { shaderString.c_str() }; + + TestShaderExtension(shaderStrings, 1, false); + TestShaderExtension(shaderStrings, 1, false); +} diff --git a/gfx/angle/src/tests/compiler_tests/ShaderImage_test.cpp b/gfx/angle/src/tests/compiler_tests/ShaderImage_test.cpp new file mode 100644 index 000000000..b069c6547 --- /dev/null +++ b/gfx/angle/src/tests/compiler_tests/ShaderImage_test.cpp @@ -0,0 +1,259 @@ +// +// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// ShaderImage_test.cpp: +// Tests for images +// + +#include "angle_gl.h" +#include "gtest/gtest.h" +#include "GLSLANG/ShaderLang.h" +#include "compiler/translator/TranslatorESSL.h" +#include "tests/test_utils/compiler_test.h" + +using namespace sh; + +namespace +{ + +// Checks that the imageStore call with mangled name imageStoreMangledName exists in the AST. +// Further each argument is checked whether it matches the expected properties given the compiled +// shader. +void CheckImageStoreCall(TIntermNode *astRoot, + const TString &imageStoreMangledName, + TBasicType imageType, + int storeLocationNominalSize, + TBasicType storeValueType, + int storeValueNominalSize) +{ + const TIntermAggregate *imageStoreFunctionCall = + FindFunctionCallNode(astRoot, imageStoreMangledName); + ASSERT_NE(nullptr, imageStoreFunctionCall); + + const TIntermSequence *storeArguments = imageStoreFunctionCall->getSequence(); + ASSERT_EQ(3u, storeArguments->size()); + + const TIntermTyped *storeArgument1Typed = (*storeArguments)[0]->getAsTyped(); + ASSERT_EQ(imageType, storeArgument1Typed->getBasicType()); + + const TIntermTyped *storeArgument2Typed = (*storeArguments)[1]->getAsTyped(); + ASSERT_EQ(EbtInt, storeArgument2Typed->getBasicType()); + ASSERT_EQ(storeLocationNominalSize, storeArgument2Typed->getNominalSize()); + + const TIntermTyped *storeArgument3Typed = (*storeArguments)[2]->getAsTyped(); + ASSERT_EQ(storeValueType, storeArgument3Typed->getBasicType()); + ASSERT_EQ(storeValueNominalSize, storeArgument3Typed->getNominalSize()); +} + +// Checks that the imageLoad call with mangled name imageLoadMangledName exists in the AST. +// Further each argument is checked whether it matches the expected properties given the compiled +// shader. +void CheckImageLoadCall(TIntermNode *astRoot, + const TString &imageLoadMangledName, + TBasicType imageType, + int loadLocationNominalSize) +{ + const TIntermAggregate *imageLoadFunctionCall = + FindFunctionCallNode(astRoot, imageLoadMangledName); + ASSERT_NE(nullptr, imageLoadFunctionCall); + + const TIntermSequence *loadArguments = imageLoadFunctionCall->getSequence(); + ASSERT_EQ(2u, loadArguments->size()); + + const TIntermTyped *loadArgument1Typed = (*loadArguments)[0]->getAsTyped(); + ASSERT_EQ(imageType, loadArgument1Typed->getBasicType()); + + const TIntermTyped *loadArgument2Typed = (*loadArguments)[1]->getAsTyped(); + ASSERT_EQ(EbtInt, loadArgument2Typed->getBasicType()); + ASSERT_EQ(loadLocationNominalSize, loadArgument2Typed->getNominalSize()); +} + +// Checks whether the image is properly exported as a uniform by the compiler. +void CheckExportedImageUniform(const std::vector<sh::Uniform> &uniforms, + size_t uniformIndex, + ::GLenum imageTypeGL, + const TString &imageName) +{ + ASSERT_EQ(1u, uniforms.size()); + + const auto &imageUniform = uniforms[uniformIndex]; + ASSERT_EQ(imageTypeGL, imageUniform.type); + ASSERT_STREQ(imageUniform.name.c_str(), imageName.c_str()); +} + +// Checks whether the image is saved in the AST as a node with the correct properties given the +// shader. +void CheckImageDeclaration(TIntermNode *astRoot, + const TString &imageName, + TBasicType imageType, + TLayoutImageInternalFormat internalFormat, + bool readonly, + bool writeonly, + bool coherent, + bool restrictQualifier, + bool volatileQualifier) +{ + const TIntermSymbol *myImageNode = FindSymbolNode(astRoot, imageName, imageType); + ASSERT_NE(nullptr, myImageNode); + + const TType &myImageType = myImageNode->getType(); + TLayoutQualifier myImageLayoutQualifier = myImageType.getLayoutQualifier(); + ASSERT_EQ(internalFormat, myImageLayoutQualifier.imageInternalFormat); + TMemoryQualifier myImageMemoryQualifier = myImageType.getMemoryQualifier(); + ASSERT_EQ(readonly, myImageMemoryQualifier.readonly); + ASSERT_EQ(writeonly, myImageMemoryQualifier.writeonly); + ASSERT_EQ(coherent, myImageMemoryQualifier.coherent); + ASSERT_EQ(restrictQualifier, myImageMemoryQualifier.restrictQualifier); + ASSERT_EQ(volatileQualifier, myImageMemoryQualifier.volatileQualifier); +} + +} // namespace + +class ShaderImageTest : public testing::Test +{ + public: + ShaderImageTest() {} + + protected: + virtual void SetUp() + { + ShBuiltInResources resources; + sh::InitBuiltInResources(&resources); + + mTranslator = new sh::TranslatorESSL(GL_COMPUTE_SHADER, SH_GLES3_1_SPEC); + ASSERT_TRUE(mTranslator->Init(resources)); + } + + virtual void TearDown() { delete mTranslator; } + + // Return true when compilation succeeds + bool compile(const std::string &shaderString) + { + const char *shaderStrings[] = {shaderString.c_str()}; + mASTRoot = mTranslator->compileTreeForTesting(shaderStrings, 1, + SH_INTERMEDIATE_TREE | SH_VARIABLES); + TInfoSink &infoSink = mTranslator->getInfoSink(); + mInfoLog = infoSink.info.c_str(); + return mASTRoot != nullptr; + } + + protected: + std::string mTranslatedCode; + std::string mInfoLog; + sh::TranslatorESSL *mTranslator; + TIntermNode *mASTRoot; +}; + +// Test that an image2D is properly parsed and exported as a uniform. +TEST_F(ShaderImageTest, Image2DDeclaration) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 4) in;\n" + "layout(rgba32f) uniform highp readonly image2D myImage;\n" + "void main() {\n" + " ivec2 sz = imageSize(myImage);\n" + "}"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed" << mInfoLog; + } + + CheckExportedImageUniform(mTranslator->getUniforms(), 0, GL_IMAGE_2D, "myImage"); + CheckImageDeclaration(mASTRoot, "myImage", EbtImage2D, EiifRGBA32F, true, false, false, false, + false); +} + +// Test that an image3D is properly parsed and exported as a uniform. +TEST_F(ShaderImageTest, Image3DDeclaration) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 4) in;\n" + "layout(rgba32ui) uniform highp writeonly readonly uimage3D myImage;\n" + "void main() {\n" + " ivec3 sz = imageSize(myImage);\n" + "}"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed" << mInfoLog; + } + + CheckExportedImageUniform(mTranslator->getUniforms(), 0, GL_UNSIGNED_INT_IMAGE_3D, "myImage"); + CheckImageDeclaration(mASTRoot, "myImage", EbtUImage3D, EiifRGBA32UI, true, true, false, false, + false); +} + +// Check that imageLoad calls get correctly parsed. +TEST_F(ShaderImageTest, ImageLoad) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 4) in;\n" + "layout(rgba32f) uniform highp readonly image2D my2DImageInput;\n" + "layout(rgba32i) uniform highp readonly iimage3D my3DImageInput;\n" + "void main() {\n" + " vec4 result = imageLoad(my2DImageInput, ivec2(gl_LocalInvocationID.xy));\n" + " ivec4 result2 = imageLoad(my3DImageInput, ivec3(gl_LocalInvocationID.xyz));\n" + "}"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed" << mInfoLog; + } + + // imageLoad call with image2D passed + CheckImageLoadCall(mASTRoot, "imageLoad(im21;vi2;", EbtImage2D, 2); + + // imageLoad call with image3D passed + CheckImageLoadCall(mASTRoot, "imageLoad(iim31;vi3;", EbtIImage3D, 3); +} + +// Check that imageStore calls get correctly parsed. +TEST_F(ShaderImageTest, ImageStore) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 4) in;\n" + "layout(rgba32f) uniform highp writeonly image2D my2DImageOutput;\n" + "layout(rgba32ui) uniform highp writeonly uimage2DArray my2DImageArrayOutput;\n" + "void main() {\n" + " imageStore(my2DImageOutput, ivec2(gl_LocalInvocationID.xy), vec4(0.0));\n" + " imageStore(my2DImageArrayOutput, ivec3(gl_LocalInvocationID.xyz), uvec4(0));\n" + "}"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed" << mInfoLog; + } + + // imageStore call with image2D + CheckImageStoreCall(mASTRoot, "imageStore(im21;vi2;vf4;", EbtImage2D, 2, EbtFloat, 4); + + // imageStore call with image2DArray + CheckImageStoreCall(mASTRoot, "imageStore(uim2a1;vi3;vu4;", EbtUImage2DArray, 3, EbtUInt, 4); +} + +// Check that memory qualifiers are correctly parsed. +TEST_F(ShaderImageTest, ImageMemoryQualifiers) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x = 4) in;" + "layout(rgba32f) uniform highp coherent readonly image2D image1;\n" + "layout(rgba32f) uniform highp volatile writeonly image2D image2;\n" + "layout(rgba32f) uniform highp volatile restrict readonly writeonly image2D image3;\n" + "void main() {\n" + "}"; + if (!compile(shaderString)) + { + FAIL() << "Shader compilation failed" << mInfoLog; + } + + CheckImageDeclaration(mASTRoot, "image1", EbtImage2D, EiifRGBA32F, true, false, true, false, + false); + CheckImageDeclaration(mASTRoot, "image2", EbtImage2D, EiifRGBA32F, false, true, true, false, + true); + CheckImageDeclaration(mASTRoot, "image3", EbtImage2D, EiifRGBA32F, true, true, true, true, + true); +} diff --git a/gfx/angle/src/tests/compiler_tests/ShaderVariable_test.cpp b/gfx/angle/src/tests/compiler_tests/ShaderVariable_test.cpp new file mode 100755 index 000000000..53dd93fe4 --- /dev/null +++ b/gfx/angle/src/tests/compiler_tests/ShaderVariable_test.cpp @@ -0,0 +1,421 @@ +// +// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// CollectVariables_test.cpp: +// Some tests for shader inspection +// + +#include "angle_gl.h" +#include "compiler/translator/Compiler.h" +#include "gtest/gtest.h" +#include "GLSLANG/ShaderLang.h" + +namespace sh +{ + +TEST(ShaderVariableTest, FindInfoByMappedName) +{ + // struct A { + // float x[2]; + // vec3 y; + // }; + // struct B { + // A a[3]; + // }; + // B uni[2]; + ShaderVariable uni; + uni.arraySize = 2; + uni.name = "uni"; + uni.mappedName = "m_uni"; + uni.structName = "B"; + { + ShaderVariable a; + a.arraySize = 3; + a.name = "a"; + a.mappedName = "m_a"; + a.structName = "A"; + { + ShaderVariable x(GL_FLOAT, 2); + x.name = "x"; + x.mappedName = "m_x"; + a.fields.push_back(x); + + ShaderVariable y(GL_FLOAT_VEC3, 0); + y.name = "y"; + y.mappedName = "m_y"; + a.fields.push_back(y); + } + uni.fields.push_back(a); + } + + const ShaderVariable *leafVar = nullptr; + std::string originalFullName; + + std::string mappedFullName = "wrongName"; + EXPECT_FALSE(uni.findInfoByMappedName( + mappedFullName, &leafVar, &originalFullName)); + + mappedFullName = "m_uni"; + EXPECT_TRUE(uni.findInfoByMappedName( + mappedFullName, &leafVar, &originalFullName)); + EXPECT_EQ(&uni, leafVar); + EXPECT_STREQ("uni", originalFullName.c_str()); + + mappedFullName = "m_uni[0].m_a[1].wrongName"; + EXPECT_FALSE(uni.findInfoByMappedName( + mappedFullName, &leafVar, &originalFullName)); + + mappedFullName = "m_uni[0].m_a[1].m_x"; + EXPECT_TRUE(uni.findInfoByMappedName( + mappedFullName, &leafVar, &originalFullName)); + EXPECT_EQ(&(uni.fields[0].fields[0]), leafVar); + EXPECT_STREQ("uni[0].a[1].x", originalFullName.c_str()); + + mappedFullName = "m_uni[0].m_a[1].m_x[0]"; + EXPECT_TRUE(uni.findInfoByMappedName( + mappedFullName, &leafVar, &originalFullName)); + EXPECT_EQ(&(uni.fields[0].fields[0]), leafVar); + EXPECT_STREQ("uni[0].a[1].x[0]", originalFullName.c_str()); + + mappedFullName = "m_uni[0].m_a[1].m_y"; + EXPECT_TRUE(uni.findInfoByMappedName( + mappedFullName, &leafVar, &originalFullName)); + EXPECT_EQ(&(uni.fields[0].fields[1]), leafVar); + EXPECT_STREQ("uni[0].a[1].y", originalFullName.c_str()); +} + +TEST(ShaderVariableTest, IsSameUniformWithDifferentFieldOrder) +{ + // struct A { + // float x; + // float y; + // }; + // uniform A uni; + Uniform vx_a; + vx_a.arraySize = 0; + vx_a.name = "uni"; + vx_a.mappedName = "m_uni"; + vx_a.structName = "A"; + { + ShaderVariable x(GL_FLOAT, 0); + x.name = "x"; + x.mappedName = "m_x"; + vx_a.fields.push_back(x); + + ShaderVariable y(GL_FLOAT, 0); + y.name = "y"; + y.mappedName = "m_y"; + vx_a.fields.push_back(y); + } + + // struct A { + // float y; + // float x; + // }; + // uniform A uni; + Uniform fx_a; + fx_a.arraySize = 0; + fx_a.name = "uni"; + fx_a.mappedName = "m_uni"; + fx_a.structName = "A"; + { + ShaderVariable y(GL_FLOAT, 0); + y.name = "y"; + y.mappedName = "m_y"; + fx_a.fields.push_back(y); + + ShaderVariable x(GL_FLOAT, 0); + x.name = "x"; + x.mappedName = "m_x"; + fx_a.fields.push_back(x); + } + + EXPECT_FALSE(vx_a.isSameUniformAtLinkTime(fx_a)); +} + +TEST(ShaderVariableTest, IsSameUniformWithDifferentStructNames) +{ + // struct A { + // float x; + // float y; + // }; + // uniform A uni; + Uniform vx_a; + vx_a.arraySize = 0; + vx_a.name = "uni"; + vx_a.mappedName = "m_uni"; + vx_a.structName = "A"; + { + ShaderVariable x(GL_FLOAT, 0); + x.name = "x"; + x.mappedName = "m_x"; + vx_a.fields.push_back(x); + + ShaderVariable y(GL_FLOAT, 0); + y.name = "y"; + y.mappedName = "m_y"; + vx_a.fields.push_back(y); + } + + // struct B { + // float x; + // float y; + // }; + // uniform B uni; + Uniform fx_a; + fx_a.arraySize = 0; + fx_a.name = "uni"; + fx_a.mappedName = "m_uni"; + { + ShaderVariable x(GL_FLOAT, 0); + x.name = "x"; + x.mappedName = "m_x"; + fx_a.fields.push_back(x); + + ShaderVariable y(GL_FLOAT, 0); + y.name = "y"; + y.mappedName = "m_y"; + fx_a.fields.push_back(y); + } + + fx_a.structName = "B"; + EXPECT_FALSE(vx_a.isSameUniformAtLinkTime(fx_a)); + + fx_a.structName = "A"; + EXPECT_TRUE(vx_a.isSameUniformAtLinkTime(fx_a)); + + fx_a.structName = ""; + EXPECT_FALSE(vx_a.isSameUniformAtLinkTime(fx_a)); +} + +TEST(ShaderVariableTest, IsSameVaryingWithDifferentInvariance) +{ + // invariant varying float vary; + Varying vx; + vx.type = GL_FLOAT; + vx.arraySize = 0; + vx.precision = GL_MEDIUM_FLOAT; + vx.name = "vary"; + vx.mappedName = "m_vary"; + vx.staticUse = true; + vx.isInvariant = true; + + // varying float vary; + Varying fx; + fx.type = GL_FLOAT; + fx.arraySize = 0; + fx.precision = GL_MEDIUM_FLOAT; + fx.name = "vary"; + fx.mappedName = "m_vary"; + fx.staticUse = true; + fx.isInvariant = false; + + // Default to ESSL1 behavior: invariance must match + EXPECT_FALSE(vx.isSameVaryingAtLinkTime(fx)); + EXPECT_FALSE(vx.isSameVaryingAtLinkTime(fx, 100)); + // ESSL3 behavior: invariance doesn't need to match + EXPECT_TRUE(vx.isSameVaryingAtLinkTime(fx, 300)); + + // invariant varying float vary; + fx.isInvariant = true; + EXPECT_TRUE(vx.isSameVaryingAtLinkTime(fx)); + EXPECT_TRUE(vx.isSameVaryingAtLinkTime(fx, 100)); + EXPECT_TRUE(vx.isSameVaryingAtLinkTime(fx, 300)); +} + +// Test that using invariant varyings doesn't trigger a double delete. +TEST(ShaderVariableTest, InvariantDoubleDeleteBug) +{ + ShBuiltInResources resources; + sh::InitBuiltInResources(&resources); + + ShHandle compiler = sh::ConstructCompiler(GL_VERTEX_SHADER, SH_GLES2_SPEC, + SH_GLSL_COMPATIBILITY_OUTPUT, &resources); + EXPECT_NE(static_cast<ShHandle>(0), compiler); + + const char *program[] = + { + "attribute vec4 position;\n" + "varying float v;\n" + "invariant v;\n" + "void main() {\n" + " v = 1.0;\n" + " gl_Position = position;\n" + "}" + }; + + EXPECT_TRUE(sh::Compile(compiler, program, 1, SH_OBJECT_CODE)); + EXPECT_TRUE(sh::Compile(compiler, program, 1, SH_OBJECT_CODE)); + sh::Destruct(compiler); +} + +TEST(ShaderVariableTest, IllegalInvariantVarying) +{ + ShBuiltInResources resources; + sh::InitBuiltInResources(&resources); + + ShHandle compiler = sh::ConstructCompiler(GL_VERTEX_SHADER, SH_GLES2_SPEC, + SH_GLSL_COMPATIBILITY_OUTPUT, &resources); + EXPECT_NE(static_cast<ShHandle>(0), compiler); + + const char *program1[] = + { + "void foo() {\n" + " vec4 v;\n" + "}\n" + "varying vec4 v_varying;\n" + "invariant v_varying;\n" + "void main() {\n" + " foo();\n" + " gl_Position = v_varying;\n" + "}" + }; + const char *program2[] = + { + "varying vec4 v_varying;\n" + "void foo() {\n" + " invariant v_varying;\n" + "}\n" + "void main() {\n" + " foo();\n" + " gl_Position = v_varying;\n" + "}" + }; + + EXPECT_TRUE(sh::Compile(compiler, program1, 1, SH_VARIABLES)); + EXPECT_FALSE(sh::Compile(compiler, program2, 1, SH_VARIABLES)); +} + +TEST(ShaderVariableTest, InvariantLeakAcrossShaders) +{ + ShBuiltInResources resources; + sh::InitBuiltInResources(&resources); + + ShHandle compiler = sh::ConstructCompiler(GL_VERTEX_SHADER, SH_GLES2_SPEC, + SH_GLSL_COMPATIBILITY_OUTPUT, &resources); + EXPECT_NE(static_cast<ShHandle>(0), compiler); + + const char *program1[] = + { + "varying vec4 v_varying;\n" + "invariant v_varying;\n" + "void main() {\n" + " gl_Position = v_varying;\n" + "}" + }; + const char *program2[] = + { + "varying vec4 v_varying;\n" + "void main() {\n" + " gl_Position = v_varying;\n" + "}" + }; + + EXPECT_TRUE(sh::Compile(compiler, program1, 1, SH_VARIABLES)); + const std::vector<sh::Varying> *varyings = sh::GetVaryings(compiler); + for (const sh::Varying &varying : *varyings) + { + if (varying.name == "v_varying") + EXPECT_TRUE(varying.isInvariant); + } + EXPECT_TRUE(sh::Compile(compiler, program2, 1, SH_VARIABLES)); + varyings = sh::GetVaryings(compiler); + for (const sh::Varying &varying : *varyings) + { + if (varying.name == "v_varying") + EXPECT_FALSE(varying.isInvariant); + } +} + +TEST(ShaderVariableTest, GlobalInvariantLeakAcrossShaders) +{ + ShBuiltInResources resources; + sh::InitBuiltInResources(&resources); + + ShHandle compiler = sh::ConstructCompiler(GL_VERTEX_SHADER, SH_GLES2_SPEC, + SH_GLSL_COMPATIBILITY_OUTPUT, &resources); + EXPECT_NE(static_cast<ShHandle>(0), compiler); + + const char *program1[] = + { + "#pragma STDGL invariant(all)\n" + "varying vec4 v_varying;\n" + "void main() {\n" + " gl_Position = v_varying;\n" + "}" + }; + const char *program2[] = + { + "varying vec4 v_varying;\n" + "void main() {\n" + " gl_Position = v_varying;\n" + "}" + }; + + EXPECT_TRUE(sh::Compile(compiler, program1, 1, SH_VARIABLES)); + const std::vector<sh::Varying> *varyings = sh::GetVaryings(compiler); + for (const sh::Varying &varying : *varyings) + { + if (varying.name == "v_varying") + EXPECT_TRUE(varying.isInvariant); + } + EXPECT_TRUE(sh::Compile(compiler, program2, 1, SH_VARIABLES)); + varyings = sh::GetVaryings(compiler); + for (const sh::Varying &varying : *varyings) + { + if (varying.name == "v_varying") + EXPECT_FALSE(varying.isInvariant); + } +} + +TEST(ShaderVariableTest, BuiltinInvariantVarying) +{ + + ShBuiltInResources resources; + sh::InitBuiltInResources(&resources); + + ShHandle compiler = sh::ConstructCompiler(GL_VERTEX_SHADER, SH_GLES2_SPEC, + SH_GLSL_COMPATIBILITY_OUTPUT, &resources); + EXPECT_NE(static_cast<ShHandle>(0), compiler); + + const char *program1[] = + { + "invariant gl_Position;\n" + "void main() {\n" + " gl_Position = vec4(0, 0, 0, 0);\n" + "}" + }; + const char *program2[] = + { + "void main() {\n" + " gl_Position = vec4(0, 0, 0, 0);\n" + "}" + }; + const char *program3[] = + { + "void main() {\n" + " invariant gl_Position;\n" + " gl_Position = vec4(0, 0, 0, 0);\n" + "}" + }; + + EXPECT_TRUE(sh::Compile(compiler, program1, 1, SH_VARIABLES)); + const std::vector<sh::Varying> *varyings = sh::GetVaryings(compiler); + for (const sh::Varying &varying : *varyings) + { + if (varying.name == "gl_Position") + EXPECT_TRUE(varying.isInvariant); + } + EXPECT_TRUE(sh::Compile(compiler, program2, 1, SH_VARIABLES)); + varyings = sh::GetVaryings(compiler); + for (const sh::Varying &varying : *varyings) + { + if (varying.name == "gl_Position") + EXPECT_FALSE(varying.isInvariant); + } + EXPECT_FALSE(sh::Compile(compiler, program3, 1, SH_VARIABLES)); +} + +} // namespace sh diff --git a/gfx/angle/src/tests/compiler_tests/TypeTracking_test.cpp b/gfx/angle/src/tests/compiler_tests/TypeTracking_test.cpp new file mode 100755 index 000000000..ac8ee70f6 --- /dev/null +++ b/gfx/angle/src/tests/compiler_tests/TypeTracking_test.cpp @@ -0,0 +1,456 @@ +// +// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// TypeTracking_test.cpp: +// Test for tracking types resulting from math operations, including their +// precision. +// + +#include "angle_gl.h" +#include "gtest/gtest.h" +#include "GLSLANG/ShaderLang.h" +#include "compiler/translator/TranslatorESSL.h" + +using namespace sh; + +class TypeTrackingTest : public testing::Test +{ + public: + TypeTrackingTest() {} + + protected: + void SetUp() override + { + ShBuiltInResources resources; + InitBuiltInResources(&resources); + resources.FragmentPrecisionHigh = 1; + + mTranslator = new TranslatorESSL(GL_FRAGMENT_SHADER, SH_GLES3_SPEC); + ASSERT_TRUE(mTranslator->Init(resources)); + } + + void TearDown() override { delete mTranslator; } + + void compile(const std::string& shaderString) + { + const char *shaderStrings[] = { shaderString.c_str() }; + bool compilationSuccess = mTranslator->compile(shaderStrings, 1, SH_INTERMEDIATE_TREE); + TInfoSink &infoSink = mTranslator->getInfoSink(); + mInfoLog = RemoveSymbolIdsFromInfoLog(infoSink.info.c_str()); + if (!compilationSuccess) + FAIL() << "Shader compilation failed " << mInfoLog; + } + + bool foundErrorInIntermediateTree() const + { + return foundInIntermediateTree("ERROR:"); + } + + bool foundInIntermediateTree(const char* stringToFind) const + { + return mInfoLog.find(stringToFind) != std::string::npos; + } + + private: + // Remove symbol ids from info log - the tests don't care about them. + static std::string RemoveSymbolIdsFromInfoLog(const char *infoLog) + { + std::string filteredLog(infoLog); + size_t idPrefixPos = 0u; + do + { + idPrefixPos = filteredLog.find(" (symbol id"); + if (idPrefixPos != std::string::npos) + { + size_t idSuffixPos = filteredLog.find(")", idPrefixPos); + filteredLog.erase(idPrefixPos, idSuffixPos - idPrefixPos + 1u); + } + } while (idPrefixPos != std::string::npos); + return filteredLog; + } + + TranslatorESSL *mTranslator; + std::string mInfoLog; +}; + +TEST_F(TypeTrackingTest, FunctionPrototypeMangling) +{ + const std::string &shaderString = + "precision mediump float;\n" + "float fun(float a);\n" + "uniform float f;\n" + "void main() {\n" + " float ff = fun(f);\n" + " gl_FragColor = vec4(ff);\n" + "}\n" + "float fun(float a) {\n" + " return a * 2.0;\n" + "}\n"; + compile(shaderString); + ASSERT_FALSE(foundErrorInIntermediateTree()); + ASSERT_TRUE(foundInIntermediateTree("Function Prototype: fun(f1;")); + ASSERT_TRUE(foundInIntermediateTree("Function Definition: fun(f1;")); +} + +TEST_F(TypeTrackingTest, BuiltInFunctionResultPrecision) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform float f;\n" + "void main() {\n" + " float ff = sin(f);\n" + " gl_FragColor = vec4(ff);\n" + "}\n"; + compile(shaderString); + ASSERT_FALSE(foundErrorInIntermediateTree()); + ASSERT_TRUE(foundInIntermediateTree("sine (mediump float)")); +} + +TEST_F(TypeTrackingTest, BinaryMathResultPrecision) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform float f;\n" + "void main() {\n" + " float ff = f * 0.5;\n" + " gl_FragColor = vec4(ff);\n" + "}\n"; + compile(shaderString); + ASSERT_FALSE(foundErrorInIntermediateTree()); + ASSERT_TRUE(foundInIntermediateTree("multiply (mediump float)")); +} + +TEST_F(TypeTrackingTest, BuiltInVecFunctionResultTypeAndPrecision) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform vec2 a;\n" + "void main() {\n" + " float b = length(a);\n" + " float c = dot(a, vec2(0.5));\n" + " float d = distance(vec2(0.5), a);\n" + " gl_FragColor = vec4(b, c, d, 1.0);\n" + "}\n"; + compile(shaderString); + ASSERT_FALSE(foundErrorInIntermediateTree()); + ASSERT_TRUE(foundInIntermediateTree("length (mediump float)")); + ASSERT_TRUE(foundInIntermediateTree("dot-product (mediump float)")); + ASSERT_TRUE(foundInIntermediateTree("distance (mediump float)")); +} + +TEST_F(TypeTrackingTest, BuiltInMatFunctionResultTypeAndPrecision) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "uniform mat4 m;\n" + "void main() {\n" + " mat3x2 tmp32 = mat3x2(m);\n" + " mat2x3 tmp23 = mat2x3(m);\n" + " mat4x2 tmp42 = mat4x2(m);\n" + " mat2x4 tmp24 = mat2x4(m);\n" + " mat4x3 tmp43 = mat4x3(m);\n" + " mat3x4 tmp34 = mat3x4(m);\n" + " my_FragColor = vec4(tmp32[2][1] * tmp23[1][2], tmp42[3][1] * tmp24[1][3], tmp43[3][2] * tmp34[2][3], 1.0);\n" + "}\n"; + compile(shaderString); + ASSERT_FALSE(foundErrorInIntermediateTree()); + ASSERT_TRUE(foundInIntermediateTree("Construct mat2x3 (mediump 2X3 matrix of float)")); + ASSERT_TRUE(foundInIntermediateTree("Construct mat3x2 (mediump 3X2 matrix of float)")); + ASSERT_TRUE(foundInIntermediateTree("Construct mat2x4 (mediump 2X4 matrix of float)")); + ASSERT_TRUE(foundInIntermediateTree("Construct mat4x2 (mediump 4X2 matrix of float)")); + ASSERT_TRUE(foundInIntermediateTree("Construct mat3x4 (mediump 3X4 matrix of float)")); + ASSERT_TRUE(foundInIntermediateTree("Construct mat4x3 (mediump 4X3 matrix of float)")); +} + +TEST_F(TypeTrackingTest, BuiltInFunctionChoosesHigherPrecision) +{ + const std::string &shaderString = + "precision lowp float;\n" + "uniform mediump vec2 a;\n" + "uniform lowp vec2 b;\n" + "void main() {\n" + " float c = dot(a, b);\n" + " float d = distance(b, a);\n" + " gl_FragColor = vec4(c, d, 0.0, 1.0);\n" + "}\n"; + compile(shaderString); + ASSERT_FALSE(foundErrorInIntermediateTree()); + ASSERT_TRUE(foundInIntermediateTree("dot-product (mediump float)")); + ASSERT_TRUE(foundInIntermediateTree("distance (mediump float)")); +} + +TEST_F(TypeTrackingTest, BuiltInBoolFunctionResultType) +{ + const std::string &shaderString = + "uniform bvec4 bees;\n" + "void main() {\n" + " bool b = any(bees);\n" + " bool c = all(bees);\n" + " bvec4 d = not(bees);\n" + " gl_FragColor = vec4(b ? 1.0 : 0.0, c ? 1.0 : 0.0, d.x ? 1.0 : 0.0, 1.0);\n" + "}\n"; + compile(shaderString); + ASSERT_FALSE(foundErrorInIntermediateTree()); + ASSERT_TRUE(foundInIntermediateTree("any (bool)")); + ASSERT_TRUE(foundInIntermediateTree("all (bool)")); + ASSERT_TRUE(foundInIntermediateTree("Negate conditional (4-component vector of bool)")); +} + +TEST_F(TypeTrackingTest, BuiltInVecToBoolFunctionResultType) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform vec2 apples;\n" + "uniform vec2 oranges;\n" + "uniform ivec2 foo;\n" + "uniform ivec2 bar;\n" + "void main() {\n" + " bvec2 a = lessThan(apples, oranges);\n" + " bvec2 b = greaterThan(foo, bar);\n" + " gl_FragColor = vec4(any(a) ? 1.0 : 0.0, any(b) ? 1.0 : 0.0, 0.0, 1.0);\n" + "}\n"; + compile(shaderString); + ASSERT_FALSE(foundErrorInIntermediateTree()); + ASSERT_TRUE(foundInIntermediateTree("Less Than (2-component vector of bool)")); + ASSERT_TRUE(foundInIntermediateTree("Greater Than (2-component vector of bool)")); +} + +TEST_F(TypeTrackingTest, Texture2DResultTypeAndPrecision) +{ + // ESSL spec section 4.5.3: sampler2D and samplerCube are lowp by default + // ESSL spec section 8: For the texture functions, the precision of the return type matches the precision of the sampler type. + const std::string &shaderString = + "precision mediump float;\n" + "uniform sampler2D s;\n" + "uniform vec2 a;\n" + "void main() {\n" + " vec4 c = texture2D(s, a);\n" + " gl_FragColor = c;\n" + "}\n"; + compile(shaderString); + ASSERT_FALSE(foundErrorInIntermediateTree()); + ASSERT_TRUE(foundInIntermediateTree("texture2D(s21;vf2; (lowp 4-component vector of float)")); +} + +TEST_F(TypeTrackingTest, TextureCubeResultTypeAndPrecision) +{ + // ESSL spec section 4.5.3: sampler2D and samplerCube are lowp by default + // ESSL spec section 8: For the texture functions, the precision of the return type matches the precision of the sampler type. + const std::string &shaderString = + "precision mediump float;\n" + "uniform samplerCube sc;\n" + "uniform vec3 a;\n" + "void main() {\n" + " vec4 c = textureCube(sc, a);\n" + " gl_FragColor = c;\n" + "}\n"; + compile(shaderString); + ASSERT_FALSE(foundErrorInIntermediateTree()); + ASSERT_TRUE(foundInIntermediateTree("textureCube(sC1;vf3; (lowp 4-component vector of float)")); +} + +TEST_F(TypeTrackingTest, TextureSizeResultTypeAndPrecision) +{ + // ESSL 3.0 spec section 8: textureSize has predefined precision highp + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "uniform sampler2D s;\n" + "void main() {\n" + " ivec2 size = textureSize(s, 0);\n" + " if (size.x > 100) {\n" + " my_FragColor = vec4(0.0, 1.0, 0.0, 1.0);\n" + " } else {\n" + " my_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n" + " }\n" + "}\n"; + compile(shaderString); + ASSERT_FALSE(foundErrorInIntermediateTree()); + ASSERT_TRUE(foundInIntermediateTree("textureSize(s21;i1; (highp 2-component vector of int)")); +} + +TEST_F(TypeTrackingTest, BuiltInConstructorResultTypeAndPrecision) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform float u1;\n" + "uniform float u2;\n" + "uniform float u3;\n" + "uniform float u4;\n" + "void main() {\n" + " vec4 a = vec4(u1, u2, u3, u4);\n" + " gl_FragColor = a;\n" + "}\n"; + compile(shaderString); + ASSERT_FALSE(foundErrorInIntermediateTree()); + ASSERT_TRUE(foundInIntermediateTree("Construct vec4 (mediump 4-component vector of float)")); +} + +TEST_F(TypeTrackingTest, StructConstructorResultNoPrecision) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform vec4 u1;\n" + "uniform vec4 u2;\n" + "struct S { highp vec4 a; highp vec4 b; };\n" + "void main() {\n" + " S s = S(u1, u2);\n" + " gl_FragColor = s.a;\n" + "}\n"; + compile(shaderString); + ASSERT_FALSE(foundErrorInIntermediateTree()); + ASSERT_TRUE(foundInIntermediateTree("Construct structure (structure)")); +} + +TEST_F(TypeTrackingTest, PackResultTypeAndPrecision) +{ + // ESSL 3.0 spec section 8.4: pack functions have predefined precision highp + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "precision mediump int;\n" + "uniform vec2 uv;\n" + "out vec4 my_FragColor;\n" + "void main() {\n" + " uint u0 = packSnorm2x16(uv);\n" + " uint u1 = packUnorm2x16(uv);\n" + " uint u2 = packHalf2x16(uv);\n" + " if (u0 + u1 + u2 > 100u) {\n" + " my_FragColor = vec4(0.0, 1.0, 0.0, 1.0);\n" + " } else {\n" + " my_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n" + " }\n" + "}\n"; + compile(shaderString); + ASSERT_FALSE(foundErrorInIntermediateTree()); + ASSERT_TRUE(foundInIntermediateTree("pack Snorm 2x16 (highp uint)")); + ASSERT_TRUE(foundInIntermediateTree("pack Unorm 2x16 (highp uint)")); + ASSERT_TRUE(foundInIntermediateTree("pack half 2x16 (highp uint)")); +} + +TEST_F(TypeTrackingTest, UnpackNormResultTypeAndPrecision) +{ + // ESSL 3.0 spec section 8.4: unpack(S/U)norm2x16 has predefined precision highp + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "precision mediump int;\n" + "uniform uint uu;\n" + "out vec4 my_FragColor;\n" + "void main() {\n" + " vec2 v0 = unpackSnorm2x16(uu);\n" + " vec2 v1 = unpackUnorm2x16(uu);\n" + " if (v0.x * v1.x > 1.0) {\n" + " my_FragColor = vec4(0.0, 1.0, 0.0, 1.0);\n" + " } else {\n" + " my_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n" + " }\n" + "}\n"; + compile(shaderString); + ASSERT_FALSE(foundErrorInIntermediateTree()); + ASSERT_TRUE(foundInIntermediateTree("unpack Snorm 2x16 (highp 2-component vector of float)")); + ASSERT_TRUE(foundInIntermediateTree("unpack Unorm 2x16 (highp 2-component vector of float)")); +} + +TEST_F(TypeTrackingTest, UnpackHalfResultTypeAndPrecision) +{ + // ESSL 3.0 spec section 8.4: unpackHalf2x16 has predefined precision mediump + const std::string &shaderString = + "#version 300 es\n" + "precision highp float;\n" + "precision highp int;\n" + "uniform uint uu;\n" + "out vec4 my_FragColor;\n" + "void main() {\n" + " vec2 v = unpackHalf2x16(uu);\n" + " if (v.x > 1.0) {\n" + " my_FragColor = vec4(0.0, 1.0, 0.0, 1.0);\n" + " } else {\n" + " my_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n" + " }\n" + "}\n"; + compile(shaderString); + ASSERT_FALSE(foundErrorInIntermediateTree()); + ASSERT_TRUE(foundInIntermediateTree("unpack half 2x16 (mediump 2-component vector of float)")); +} + +TEST_F(TypeTrackingTest, BuiltInAbsSignFunctionFloatResultTypeAndPrecision) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform float fval1;\n" + "void main() {\n" + " float fval2 = abs(fval1);\n" + " float fval3 = sign(fval1);\n" + " gl_FragColor = vec4(fval1, 0.0, 0.0, 1.0); \n" + "}\n"; + compile(shaderString); + ASSERT_FALSE(foundErrorInIntermediateTree()); + ASSERT_TRUE(foundInIntermediateTree("Absolute value (mediump float)")); + ASSERT_TRUE(foundInIntermediateTree("Sign (mediump float)")); +} + +TEST_F(TypeTrackingTest, BuiltInAbsSignFunctionIntResultTypeAndPrecision) +{ + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "precision mediump int;\n" + "uniform int ival1;\n" + "out vec4 my_FragColor;\n" + "void main() {\n" + " int ival2 = abs(ival1);\n" + " int ival3 = sign(ival1);\n" + " my_FragColor = vec4(0.0, 0.0, 0.0, 1.0); \n" + "}\n"; + compile(shaderString); + ASSERT_FALSE(foundErrorInIntermediateTree()); + ASSERT_TRUE(foundInIntermediateTree("Absolute value (mediump int)")); + ASSERT_TRUE(foundInIntermediateTree("Sign (mediump int)")); +} + +TEST_F(TypeTrackingTest, BuiltInFloatBitsToIntResultTypeAndPrecision) +{ + // ESSL 3.00 section 8.3: floatBitsTo(U)int returns a highp value. + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "precision mediump int;\n" + "uniform float f;\n" + "out vec4 my_FragColor;\n" + "void main() {\n" + " int i = floatBitsToInt(f);\n" + " uint u = floatBitsToUint(f);\n" + " my_FragColor = vec4(0.0, 0.0, 0.0, 1.0); \n" + "}\n"; + compile(shaderString); + ASSERT_FALSE(foundErrorInIntermediateTree()); + ASSERT_TRUE(foundInIntermediateTree("float bits to int (highp int)")); + ASSERT_TRUE(foundInIntermediateTree("float bits to uint (highp uint)")); +} + +TEST_F(TypeTrackingTest, BuiltInIntBitsToFloatResultTypeAndPrecision) +{ + // ESSL 3.00 section 8.3: (u)intBitsToFloat returns a highp value. + const std::string &shaderString = + "#version 300 es\n" + "precision mediump float;\n" + "precision mediump int;\n" + "uniform int i;\n" + "uniform uint u;\n" + "out vec4 my_FragColor;\n" + "void main() {\n" + " float f1 = intBitsToFloat(i);\n" + " float f2 = uintBitsToFloat(u);\n" + " my_FragColor = vec4(f1, f2, 0.0, 1.0); \n" + "}\n"; + compile(shaderString); + ASSERT_FALSE(foundErrorInIntermediateTree()); + ASSERT_TRUE(foundInIntermediateTree("int bits to float (highp float)")); + ASSERT_TRUE(foundInIntermediateTree("uint bits to float (highp float)")); +} diff --git a/gfx/angle/src/tests/compiler_tests/UnrollFlatten_test.cpp b/gfx/angle/src/tests/compiler_tests/UnrollFlatten_test.cpp new file mode 100755 index 000000000..78f388a44 --- /dev/null +++ b/gfx/angle/src/tests/compiler_tests/UnrollFlatten_test.cpp @@ -0,0 +1,209 @@ +// +// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// UnrollFlatten_test.cpp: +// Test for the outputting of [[unroll]] and [[flatten]] for the D3D compiler. +// This test can only be enabled when HLSL support is enabled. +// + +#include "angle_gl.h" +#include "common/angleutils.h" +#include "gtest/gtest.h" +#include "GLSLANG/ShaderLang.h" +#include "tests/test_utils/compiler_test.h" + +using namespace sh; + +namespace +{ + +class UnrollFlattenTest : public testing::Test +{ + public: + UnrollFlattenTest() {} + + protected: + void compile(const std::string &shaderString) + { + std::string infoLog; + bool compilationSuccess = + compileTestShader(GL_FRAGMENT_SHADER, SH_GLES2_SPEC, SH_HLSL_4_1_OUTPUT, shaderString, + SH_VARIABLES, &mTranslatedSource, &infoLog); + if (!compilationSuccess) + { + FAIL() << "Shader compilation failed " << infoLog; + } + // Ignore the beginning of the shader to avoid the definitions of LOOP and FLATTEN + mCurrentPosition = static_cast<int>(mTranslatedSource.find("GL_USES_FRAG_COLOR")); + } + + void expect(const char *patterns[], size_t count) + { + const char *badPatterns[] = { UNROLL, FLATTEN }; + for (size_t i = 0; i < count; i++) + { + const char *pattern = patterns[i]; + auto position = mTranslatedSource.find(pattern, mCurrentPosition); + if (position == std::string::npos) + { + FAIL() << "Couldn't find '" << pattern << "' after expectations '" + << mExpectationList << "' in translated source:\n" << mTranslatedSource; + } + + for (size_t j = 0; j < ArraySize(badPatterns); j++) + { + const char *badPattern = badPatterns[j]; + if (pattern != badPattern && + mTranslatedSource.find(badPattern, mCurrentPosition) < position) + { + FAIL() << "Found '" << badPattern << "' before '" << pattern << "' after expectations '" + << mExpectationList << "' in translated source:\n" << mTranslatedSource; + } + } + mExpectationList += " - " + std::string(pattern); + mCurrentPosition = static_cast<int>(position) + 1; + } + } + + static const char *UNROLL; + static const char *FLATTEN; + + private: + std::string mTranslatedSource; + + int mCurrentPosition; + std::string mExpectationList; +}; + +const char *UnrollFlattenTest::UNROLL = "LOOP"; +const char *UnrollFlattenTest::FLATTEN = "FLATTEN"; + +// Check that the nothing is added if there is no gradient operation +// even when there is ifs and discontinuous loops +TEST_F(UnrollFlattenTest, NoGradient) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform float f;\n" + "float fun(float a){\n" // 1 + " if (a > 1.0) {return f;}\n" // 2 + " else {return a + 1.0;}\n" + "}\n" + "float fun2(float a){\n" // 3 + " for (int i = 0; i < 10; i++) {\n" // 4 + " if (a > 1.0) {break;}\n" // 5 + " a = fun(a);\n" // 6 + " }\n" + " return a;\n" + "}\n" + "void main() {\n" + " float accum = 0.0;\n" + " if (f < 5.0) {accum = fun2(accum);}\n" // 7 + " gl_FragColor = vec4(accum);\n" + "}\n"; + compile(shaderString); + // 1 - shouldn't get a Lod0 version generated + // 2 - no FLATTEN because does not contain discont loop + // 3 - shouldn't get a Lod0 version generated + // 4 - no LOOP because discont, and also no gradient + // 5 - no FLATTEN because does not contain loop with a gradient + // 6 - call non-Lod0 version + // 7 - no FLATTEN + const char *expectations[] = + { + "fun(", "if", + "fun2(", "for", "if", "break", "fun(", + "main(", "if", "fun2(" + }; + expect(expectations, ArraySize(expectations)); +} + +// Check that when we have a gradient in a non-discontinuous loop +// we use the regular version of the functions. Also checks that +// LOOP is generated for the loop containing the gradient. +TEST_F(UnrollFlattenTest, GradientNotInDiscont) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform float f;\n" + "uniform sampler2D tex;" + "float fun(float a){\n" // 1 + " return texture2D(tex, vec2(0.5, f)).x;\n" // 2 + "}\n" + "float fun2(float a){\n" // 3 + " for (int i = 0; i < 10; i++) {\n" // 4 + " if (a > 1.0) {}\n" // 5 + " a = fun(a);\n" // 6 + " a += texture2D(tex, vec2(a, 0.0)).x;" // 7 + " }\n" + " return a;\n" + "}\n" + "void main() {\n" + " float accum = 0.0;\n" + " if (f < 5.0) {accum = fun2(accum);}\n" // 8 + " gl_FragColor = vec4(accum);\n" + "}\n"; + // 1 - shouldn't get a Lod0 version generated + // 2 - no Lod0 version generated + // 3 - shouldn't get a Lod0 version generated (not in discont loop) + // 4 - should have LOOP because it contains a gradient operation (even if Lod0) + // 5 - no FLATTEN because doesn't contain loop with a gradient + // 6 - call non-Lod0 version + // 7 - call non-Lod0 version + // 8 - FLATTEN because it contains a loop with a gradient + compile(shaderString); + const char *expectations[] = + { + "fun(", "texture2D(", + "fun2(", "LOOP", "for", "if", "fun(", "texture2D(", + "main(", "FLATTEN", "if", "fun2(" + }; + expect(expectations, ArraySize(expectations)); +} + +// Check that when we have a gradient in a discontinuous loop +// we use the Lod0 version of the functions. +TEST_F(UnrollFlattenTest, GradientInDiscont) +{ + const std::string &shaderString = + "precision mediump float;\n" + "uniform float f;\n" + "uniform sampler2D tex;" + "float fun(float a){\n" // 1 + " return texture2D(tex, vec2(0.5, f)).x;\n" // 2 + "}\n" + "float fun2(float a){\n" // 3 + " for (int i = 0; i < 10; i++) {\n" // 4 + " if (a > 1.0) {break;}\n" // 5 + " a = fun(a);\n" // 6 + " a += texture2D(tex, vec2(a, 0.0)).x;" // 7 + " }\n" + " return a;\n" + "}\n" + "void main() {\n" + " float accum = 0.0;\n" + " if (f < 5.0) {accum = fun2(accum);}\n" // 8 + " gl_FragColor = vec4(accum);\n" + "}\n"; + // 1 - should get a Lod0 version generated (gradient + discont loop) + // 2 - will get the Lod0 if in funLod0 + // 3 - shouldn't get a Lod0 version generated (not in discont loop) + // 4 - should have LOOP because it contains a gradient operation (even if Lod0) + // 5 - no FLATTEN because doesn't contain a loop with a gradient + // 6 - call Lod0 version + // 7 - call Lod0 version + // 8 - FLATTEN because it contains a loop with a gradient + compile(shaderString); + const char *expectations[] = + { + "fun(", "texture2D(", + "funLod0(", "texture2DLod0(", + "fun2(", "LOOP", "for", "if", "break", "funLod0(", "texture2DLod0", + "main(", "FLATTEN", "if", "fun2(" + }; + expect(expectations, ArraySize(expectations)); +} + +} diff --git a/gfx/angle/src/tests/compiler_tests/VariablePacker_test.cpp b/gfx/angle/src/tests/compiler_tests/VariablePacker_test.cpp new file mode 100755 index 000000000..dd9b0b5b6 --- /dev/null +++ b/gfx/angle/src/tests/compiler_tests/VariablePacker_test.cpp @@ -0,0 +1,237 @@ +// +// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +#include "gtest/gtest.h" +#include "angle_gl.h" +#include "common/utilities.h" +#include "common/angleutils.h" +#include "compiler/translator/VariablePacker.h" + +static sh::GLenum types[] = { + GL_FLOAT_MAT4, // 0 + GL_FLOAT_MAT2, // 1 + GL_FLOAT_VEC4, // 2 + GL_INT_VEC4, // 3 + GL_BOOL_VEC4, // 4 + GL_FLOAT_MAT3, // 5 + GL_FLOAT_VEC3, // 6 + GL_INT_VEC3, // 7 + GL_BOOL_VEC3, // 8 + GL_FLOAT_VEC2, // 9 + GL_INT_VEC2, // 10 + GL_BOOL_VEC2, // 11 + GL_FLOAT, // 12 + GL_INT, // 13 + GL_BOOL, // 14 + GL_SAMPLER_2D, // 15 + GL_SAMPLER_CUBE, // 16 + GL_SAMPLER_EXTERNAL_OES, // 17 + GL_SAMPLER_2D_RECT_ARB, // 18 + GL_UNSIGNED_INT, // 19 + GL_UNSIGNED_INT_VEC2, // 20 + GL_UNSIGNED_INT_VEC3, // 21 + GL_UNSIGNED_INT_VEC4, // 22 + GL_FLOAT_MAT2x3, // 23 + GL_FLOAT_MAT2x4, // 24 + GL_FLOAT_MAT3x2, // 25 + GL_FLOAT_MAT3x4, // 26 + GL_FLOAT_MAT4x2, // 27 + GL_FLOAT_MAT4x3, // 28 + GL_SAMPLER_3D, // 29 + GL_SAMPLER_2D_ARRAY, // 30 + GL_SAMPLER_2D_SHADOW, // 31 + GL_SAMPLER_CUBE_SHADOW, // 32 + GL_SAMPLER_2D_ARRAY_SHADOW, // 33 + GL_INT_SAMPLER_2D, // 34 + GL_INT_SAMPLER_CUBE, // 35 + GL_INT_SAMPLER_3D, // 36 + GL_INT_SAMPLER_2D_ARRAY, // 37 + GL_UNSIGNED_INT_SAMPLER_2D, // 38 + GL_UNSIGNED_INT_SAMPLER_CUBE, // 39 + GL_UNSIGNED_INT_SAMPLER_3D, // 40 + GL_UNSIGNED_INT_SAMPLER_2D_ARRAY, // 41 +}; + +static sh::GLenum nonSqMatTypes[] = { + GL_FLOAT_MAT2x3, + GL_FLOAT_MAT2x4, + GL_FLOAT_MAT3x2, + GL_FLOAT_MAT3x4, + GL_FLOAT_MAT4x2, + GL_FLOAT_MAT4x3 +}; + +TEST(VariablePacking, Pack) { + VariablePacker packer; + std::vector<sh::ShaderVariable> vars; + const int kMaxRows = 16; + // test no vars. + EXPECT_TRUE(packer.CheckVariablesWithinPackingLimits(kMaxRows, vars)); + + for (size_t tt = 0; tt < ArraySize(types); ++tt) + { + sh::GLenum type = types[tt]; + int num_rows = VariablePacker::GetNumRows(type); + int num_components_per_row = VariablePacker::GetNumComponentsPerRow(type); + // Check 1 of the type. + vars.clear(); + vars.push_back(sh::ShaderVariable(type, 0)); + EXPECT_TRUE(packer.CheckVariablesWithinPackingLimits(kMaxRows, vars)); + + // Check exactly the right amount of 1 type as an array. + int num_vars = kMaxRows / num_rows; + vars.clear(); + vars.push_back(sh::ShaderVariable(type, num_vars == 1 ? 0 : num_vars)); + EXPECT_TRUE(packer.CheckVariablesWithinPackingLimits(kMaxRows, vars)); + + // test too many + vars.clear(); + vars.push_back(sh::ShaderVariable(type, num_vars == 0 ? 0 : (num_vars + 1))); + EXPECT_FALSE(packer.CheckVariablesWithinPackingLimits(kMaxRows, vars)); + + // Check exactly the right amount of 1 type as individual vars. + num_vars = + kMaxRows / num_rows * ((num_components_per_row > 2) ? 1 : (4 / num_components_per_row)); + vars.clear(); + for (int ii = 0; ii < num_vars; ++ii) + { + vars.push_back(sh::ShaderVariable(type, 0)); + } + EXPECT_TRUE(packer.CheckVariablesWithinPackingLimits(kMaxRows, vars)); + + // Check 1 too many. + vars.push_back(sh::ShaderVariable(type, 0)); + EXPECT_FALSE(packer.CheckVariablesWithinPackingLimits(kMaxRows, vars)); + } + + // Test example from GLSL ES 3.0 spec chapter 11. + vars.clear(); + vars.push_back(sh::ShaderVariable(GL_FLOAT_VEC4, 0)); + vars.push_back(sh::ShaderVariable(GL_FLOAT_MAT3, 0)); + vars.push_back(sh::ShaderVariable(GL_FLOAT_MAT3, 0)); + vars.push_back(sh::ShaderVariable(GL_FLOAT_VEC2, 6)); + vars.push_back(sh::ShaderVariable(GL_FLOAT_VEC2, 4)); + vars.push_back(sh::ShaderVariable(GL_FLOAT_VEC2, 0)); + vars.push_back(sh::ShaderVariable(GL_FLOAT, 3)); + vars.push_back(sh::ShaderVariable(GL_FLOAT, 2)); + vars.push_back(sh::ShaderVariable(GL_FLOAT, 0)); + EXPECT_TRUE(packer.CheckVariablesWithinPackingLimits(kMaxRows, vars)); +} + +TEST(VariablePacking, PackSizes) { + for (size_t tt = 0; tt < ArraySize(types); ++tt) { + GLenum type = types[tt]; + + int expectedComponents = gl::VariableComponentCount(type); + int expectedRows = gl::VariableRowCount(type); + + if (type == GL_FLOAT_MAT2) { + expectedComponents = 4; + } else if (gl::IsMatrixType(type)) { + int squareSize = std::max(gl::VariableRowCount(type), + gl::VariableColumnCount(type)); + expectedComponents = squareSize; + expectedRows = squareSize; + } + + EXPECT_EQ(expectedComponents, + VariablePacker::GetNumComponentsPerRow(type)); + EXPECT_EQ(expectedRows, VariablePacker::GetNumRows(type)); + } +} + +// Check special assumptions about packing non-square mats +TEST(VariablePacking, NonSquareMats) { + + for (size_t mt = 0; mt < ArraySize(nonSqMatTypes); ++mt) { + + GLenum type = nonSqMatTypes[mt]; + + int rows = gl::VariableRowCount(type); + int cols = gl::VariableColumnCount(type); + int squareSize = std::max(rows, cols); + + std::vector<sh::ShaderVariable> vars; + vars.push_back(sh::ShaderVariable(type, 0)); + + // Fill columns + for (int row = 0; row < squareSize; row++) { + for (int col = squareSize; col < 4; ++col) { + vars.push_back(sh::ShaderVariable(GL_FLOAT, 0)); + } + } + + VariablePacker packer; + + EXPECT_TRUE(packer.CheckVariablesWithinPackingLimits(squareSize, vars)); + + // and one scalar and packing should fail + vars.push_back(sh::ShaderVariable(GL_FLOAT, 0)); + EXPECT_FALSE(packer.CheckVariablesWithinPackingLimits(squareSize, vars)); + } +} + +// Scalar type variables can be packed sharing rows with other variables. +TEST(VariablePacking, ReuseRows) +{ + VariablePacker packer; + std::vector<sh::ShaderVariable> vars; + const int kMaxRows = 512; + + // uniform bool u0[129]; + // uniform bool u1[129]; + // uniform bool u2[129]; + // uniform bool u3[129]; + { + int num_arrays = 4; + int num_elements_per_array = kMaxRows / num_arrays + 1; + for (int ii = 0; ii < num_arrays; ++ii) + { + vars.push_back(sh::ShaderVariable(GL_BOOL, num_elements_per_array)); + } + EXPECT_TRUE(packer.CheckVariablesWithinPackingLimits(kMaxRows, vars)); + } + + vars.clear(); + // uniform vec2 u0[257]; + // uniform float u1[257]; + // uniform int u1[257]; + { + int num_elements_per_array = kMaxRows / 2 + 1; + vars.push_back(sh::ShaderVariable(GL_FLOAT_VEC2, num_elements_per_array)); + vars.push_back(sh::ShaderVariable(GL_FLOAT, num_elements_per_array)); + vars.push_back(sh::ShaderVariable(GL_INT, num_elements_per_array)); + EXPECT_TRUE(packer.CheckVariablesWithinPackingLimits(kMaxRows, vars)); + } +} + +// Check the packer supports and flattens structures. +TEST(VariablePacking, Struct) +{ + VariablePacker packer; + std::vector<sh::ShaderVariable> fields; + const int kMaxRows = 16; + + // Test example from GLSL ES 3.0 spec chapter 11, but with structs + std::vector<sh::ShaderVariable> vars; + vars.push_back(sh::ShaderVariable(GL_STRUCT_ANGLEX, 0)); + + sh::ShaderVariable &parentStruct = vars[0]; + parentStruct.fields.push_back(sh::ShaderVariable(GL_FLOAT_VEC4, 0)); + parentStruct.fields.push_back(sh::ShaderVariable(GL_FLOAT_MAT3, 0)); + + parentStruct.fields.push_back(sh::ShaderVariable(GL_STRUCT_ANGLEX, 0)); + sh::ShaderVariable &innerStruct = parentStruct.fields.back(); + innerStruct.fields.push_back(sh::ShaderVariable(GL_FLOAT_MAT3, 0)); + innerStruct.fields.push_back(sh::ShaderVariable(GL_FLOAT_VEC2, 6)); + innerStruct.fields.push_back(sh::ShaderVariable(GL_FLOAT_VEC2, 4)); + + parentStruct.fields.push_back(sh::ShaderVariable(GL_FLOAT_VEC2, 0)); + parentStruct.fields.push_back(sh::ShaderVariable(GL_FLOAT, 3)); + parentStruct.fields.push_back(sh::ShaderVariable(GL_FLOAT, 2)); + parentStruct.fields.push_back(sh::ShaderVariable(GL_FLOAT, 0)); + + EXPECT_TRUE(packer.CheckVariablesWithinPackingLimits(kMaxRows, vars)); +} diff --git a/gfx/angle/src/tests/compiler_tests/WorkGroupSize_test.cpp b/gfx/angle/src/tests/compiler_tests/WorkGroupSize_test.cpp new file mode 100755 index 000000000..980617f84 --- /dev/null +++ b/gfx/angle/src/tests/compiler_tests/WorkGroupSize_test.cpp @@ -0,0 +1,99 @@ +// +// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// WorkGroupSize_test.cpp: +// tests for local group size in a compute shader +// + +#include "angle_gl.h" +#include "gtest/gtest.h" +#include "GLSLANG/ShaderLang.h" +#include "compiler/translator/TranslatorESSL.h" +#include "tests/test_utils/compiler_test.h" + +using namespace sh; + +class WorkGroupSizeTest : public testing::Test +{ + public: + WorkGroupSizeTest() {} + + protected: + void SetUp() override + { + ShBuiltInResources resources; + InitBuiltInResources(&resources); + + mTranslator = new TranslatorESSL(GL_COMPUTE_SHADER, SH_GLES3_1_SPEC); + ASSERT_TRUE(mTranslator->Init(resources)); + } + + void TearDown() override { SafeDelete(mTranslator); } + + // Return true when compilation succeeds + bool compile(const std::string &shaderString) + { + const char *shaderStrings[] = {shaderString.c_str()}; + bool status = mTranslator->compile(shaderStrings, 1, SH_INTERMEDIATE_TREE | SH_VARIABLES); + TInfoSink &infoSink = mTranslator->getInfoSink(); + mInfoLog = infoSink.info.c_str(); + return status; + } + + protected: + std::string mInfoLog; + TranslatorESSL *mTranslator = nullptr; +}; + +// checks whether compiler has parsed the local size layout qualifiers qcorrectly +TEST_F(WorkGroupSizeTest, OnlyLocalSizeXSpecified) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x=5) in;\n" + "void main() {\n" + "}\n"; + + compile(shaderString); + + const WorkGroupSize &localSize = mTranslator->getComputeShaderLocalSize(); + ASSERT_EQ(5, localSize[0]); + ASSERT_EQ(1, localSize[1]); + ASSERT_EQ(1, localSize[2]); +} + +// checks whether compiler has parsed the local size layout qualifiers qcorrectly +TEST_F(WorkGroupSizeTest, LocalSizeXandZ) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x=5, local_size_z=10) in;\n" + "void main() {\n" + "}\n"; + + compile(shaderString); + + const WorkGroupSize &localSize = mTranslator->getComputeShaderLocalSize(); + ASSERT_EQ(5, localSize[0]); + ASSERT_EQ(1, localSize[1]); + ASSERT_EQ(10, localSize[2]); +} + +// checks whether compiler has parsed the local size layout qualifiers qcorrectly +TEST_F(WorkGroupSizeTest, LocalSizeAll) +{ + const std::string &shaderString = + "#version 310 es\n" + "layout(local_size_x=5, local_size_z=10, local_size_y=15) in;\n" + "void main() {\n" + "}\n"; + + compile(shaderString); + + const WorkGroupSize &localSize = mTranslator->getComputeShaderLocalSize(); + ASSERT_EQ(5, localSize[0]); + ASSERT_EQ(15, localSize[1]); + ASSERT_EQ(10, localSize[2]); +} diff --git a/gfx/angle/src/tests/deqp.gypi b/gfx/angle/src/tests/deqp.gypi new file mode 100755 index 000000000..1c1e3e5e2 --- /dev/null +++ b/gfx/angle/src/tests/deqp.gypi @@ -0,0 +1,1904 @@ +# Copyright 2015 The ANGLE Project Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +{ + 'variables': + { + # Define these variables within an inner variables dict. + # This is necessary to get these variables defined for the conditions + # within the outer variables dict which operate on these variables. + 'variables': + { + 'angle_build_winrt%': 0, + }, + + # Copy conditionally-set variables to the outer variables dict. + 'angle_build_winrt%': '<(angle_build_winrt)', + + 'deqp_path': '<(DEPTH)/third_party/deqp/src', + 'libpng_path': '<(DEPTH)/third_party/libpng', + 'zlib_path': '<(DEPTH)/third_party/zlib', + + 'angle_build_deqp_libraries%' : 0, + 'angle_build_deqp_gtest_support%' : 0, + 'angle_build_deqp_executables%' : 0, + 'angle_build_deqp_gtest_executables%' :0, + + 'clang_warning_flags': + [ + # tcu::CommandLine has virtual functions but no virtual destructor + '-Wno-no-delete-non-virtual-dtor', + ], + + 'deqp_win_cflags': + [ + '/EHsc', # dEQP requires exceptions + '/wd4091', # typedef ignored when no variable is declared + '/wd4100', + '/wd4125', # decimal digit terminates octal escape sequence + '/wd4127', # conditional expression constant + '/wd4244', # possible loss of data + '/wd4245', # argument signed/unsigned mismatch + '/wd4297', # function assumed not to throw an exception but does + '/wd4389', # signed/unsigned mismatch + '/wd4510', # default constructor could not be generated + '/wd4512', + '/wd4610', # cannot be instantiated + '/wd4611', # setjmp interaction non-portable + '/wd4701', # potentially uninit used + '/wd4702', # unreachable code + '/wd4706', # assignment within conditional expression + '/wd4838', # conversion requires a narrowing conversion + '/wd4996', # deprecated + ], + 'deqp_defines': + [ + 'DEQP_SUPPORT_GLES31=1', + 'DEQP_SUPPORT_GLES3=1', + 'DEQP_SUPPORT_GLES2=1', + 'DEQP_SUPPORT_EGL=1', + 'DEQP_TARGET_NAME="angle"', + 'DEQP_GLES31_RUNTIME_LOAD=1', + 'DEQP_GLES3_RUNTIME_LOAD=1', + 'DEQP_GLES2_RUNTIME_LOAD=1', + 'QP_SUPPORT_PNG=1', + '_HAS_EXCEPTIONS=1', + ], + 'deqp_undefines': + [ + 'WIN32_LEAN_AND_MEAN', + 'NOMINMAX', + '_HAS_EXCEPTIONS=0', + ], + 'deqp_include_dirs': + [ + '<(deqp_path)/executor', + '<(deqp_path)/execserver', + '<(deqp_path)/framework/common', + '<(deqp_path)/framework/delibs/debase', + '<(deqp_path)/framework/delibs/decpp', + '<(deqp_path)/framework/delibs/depool', + '<(deqp_path)/framework/delibs/dethread', + '<(deqp_path)/framework/delibs/deutil', + '<(deqp_path)/framework/delibs/destream', + '<(deqp_path)/framework/egl', + '<(deqp_path)/framework/egl/wrapper', + '<(deqp_path)/framework/opengl', + '<(deqp_path)/framework/opengl/simplereference', + '<(deqp_path)/framework/opengl/wrapper', + '<(deqp_path)/framework/platform/null', + '<(deqp_path)/framework/qphelper', + '<(deqp_path)/framework/randomshaders', + '<(deqp_path)/framework/referencerenderer', + '<(deqp_path)/modules/gles2', + '<(deqp_path)/modules/gles2/functional', + '<(deqp_path)/modules/gles2/accuracy', + '<(deqp_path)/modules/gles2/performance', + '<(deqp_path)/modules/gles2/stress', + '<(deqp_path)/modules/gles2/usecases', + '<(deqp_path)/modules/gles3', + '<(deqp_path)/modules/gles3/functional', + '<(deqp_path)/modules/gles3/accuracy', + '<(deqp_path)/modules/gles3/performance', + '<(deqp_path)/modules/gles3/stress', + '<(deqp_path)/modules/gles3/usecases', + '<(deqp_path)/modules/gles31', + '<(deqp_path)/modules/gles31/functional', + '<(deqp_path)/modules/gles31/stress', + '<(deqp_path)/modules/glshared', + '<(deqp_path)/modules/glusecases', + '<(libpng_path)', + '<(zlib_path)', + ], + 'deqp_gles2_sources': + [ + '<(deqp_path)/modules/gles2/accuracy/es2aAccuracyTests.cpp', + '<(deqp_path)/modules/gles2/accuracy/es2aAccuracyTests.hpp', + '<(deqp_path)/modules/gles2/accuracy/es2aTextureFilteringTests.cpp', + '<(deqp_path)/modules/gles2/accuracy/es2aTextureFilteringTests.hpp', + '<(deqp_path)/modules/gles2/accuracy/es2aTextureMipmapTests.cpp', + '<(deqp_path)/modules/gles2/accuracy/es2aTextureMipmapTests.hpp', + '<(deqp_path)/modules/gles2/accuracy/es2aVaryingInterpolationTests.cpp', + '<(deqp_path)/modules/gles2/accuracy/es2aVaryingInterpolationTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fApiCase.cpp', + '<(deqp_path)/modules/gles2/functional/es2fApiCase.hpp', + '<(deqp_path)/modules/gles2/functional/es2fAttribLocationTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fAttribLocationTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fBlendTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fBlendTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fBooleanStateQueryTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fBooleanStateQueryTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fBufferObjectQueryTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fBufferObjectQueryTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fBufferTestUtil.cpp', + '<(deqp_path)/modules/gles2/functional/es2fBufferTestUtil.hpp', + '<(deqp_path)/modules/gles2/functional/es2fBufferWriteTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fBufferWriteTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fClippingTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fClippingTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fColorClearTest.cpp', + '<(deqp_path)/modules/gles2/functional/es2fColorClearTest.hpp', + '<(deqp_path)/modules/gles2/functional/es2fDebugMarkerTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fDebugMarkerTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fDefaultVertexAttributeTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fDefaultVertexAttributeTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fDepthRangeTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fDepthRangeTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fDepthStencilClearTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fDepthStencilClearTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fDepthStencilTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fDepthStencilTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fDepthTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fDepthTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fDitheringTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fDitheringTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fDrawTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fDrawTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fFboApiTest.cpp', + '<(deqp_path)/modules/gles2/functional/es2fFboApiTest.hpp', + '<(deqp_path)/modules/gles2/functional/es2fFboCompletenessTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fFboCompletenessTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fFboRenderTest.cpp', + '<(deqp_path)/modules/gles2/functional/es2fFboRenderTest.hpp', + '<(deqp_path)/modules/gles2/functional/es2fFboStateQueryTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fFboStateQueryTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fFloatStateQueryTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fFloatStateQueryTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fFlushFinishTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fFlushFinishTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fFragOpInteractionTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fFragOpInteractionTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fFunctionalTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fFunctionalTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fImplementationLimitTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fImplementationLimitTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fIntegerStateQueryTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fIntegerStateQueryTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fLifetimeTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fLifetimeTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fLightAmountTest.cpp', + '<(deqp_path)/modules/gles2/functional/es2fLightAmountTest.hpp', + '<(deqp_path)/modules/gles2/functional/es2fMultisampleTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fMultisampleTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fNegativeBufferApiTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fNegativeBufferApiTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fNegativeFragmentApiTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fNegativeFragmentApiTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fNegativeShaderApiTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fNegativeShaderApiTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fNegativeStateApiTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fNegativeStateApiTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fNegativeTextureApiTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fNegativeTextureApiTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fNegativeVertexArrayApiTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fNegativeVertexArrayApiTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fPolygonOffsetTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fPolygonOffsetTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fPrerequisiteTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fPrerequisiteTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fRandomFragmentOpTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fRandomFragmentOpTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fRandomShaderTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fRandomShaderTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fRasterizationTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fRasterizationTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fRboStateQueryTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fRboStateQueryTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fReadPixelsTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fReadPixelsTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fScissorTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fScissorTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fShaderAlgorithmTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fShaderAlgorithmTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fShaderApiTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fShaderApiTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fShaderBuiltinVarTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fShaderBuiltinVarTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fShaderConstExprTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fShaderConstExprTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fShaderDiscardTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fShaderDiscardTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fShaderExecuteTest.cpp', + '<(deqp_path)/modules/gles2/functional/es2fShaderExecuteTest.hpp', + '<(deqp_path)/modules/gles2/functional/es2fShaderFragDataTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fShaderFragDataTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fShaderIndexingTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fShaderIndexingTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fShaderInvarianceTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fShaderInvarianceTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fShaderLoopTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fShaderLoopTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fShaderMatrixTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fShaderMatrixTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fShaderOperatorTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fShaderOperatorTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fShaderReturnTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fShaderReturnTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fShaderStateQueryTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fShaderStateQueryTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fShaderStructTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fShaderStructTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fShaderTextureFunctionTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fShaderTextureFunctionTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fStencilTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fStencilTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fStringQueryTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fStringQueryTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fTextureCompletenessTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fTextureCompletenessTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fTextureFilteringTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fTextureFilteringTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fTextureFormatTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fTextureFormatTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fTextureMipmapTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fTextureMipmapTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fTextureSizeTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fTextureSizeTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fTextureSpecificationTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fTextureSpecificationTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fTextureStateQueryTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fTextureStateQueryTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fTextureUnitTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fTextureUnitTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fTextureWrapTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fTextureWrapTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fUniformApiTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fUniformApiTests.hpp', + '<(deqp_path)/modules/gles2/functional/es2fVertexArrayTest.cpp', + '<(deqp_path)/modules/gles2/functional/es2fVertexArrayTest.hpp', + '<(deqp_path)/modules/gles2/functional/es2fVertexTextureTests.cpp', + '<(deqp_path)/modules/gles2/functional/es2fVertexTextureTests.hpp', + '<(deqp_path)/modules/gles2/performance/es2pBlendTests.cpp', + '<(deqp_path)/modules/gles2/performance/es2pBlendTests.hpp', + '<(deqp_path)/modules/gles2/performance/es2pDrawCallBatchingTests.cpp', + '<(deqp_path)/modules/gles2/performance/es2pDrawCallBatchingTests.hpp', + '<(deqp_path)/modules/gles2/performance/es2pPerformanceTests.cpp', + '<(deqp_path)/modules/gles2/performance/es2pPerformanceTests.hpp', + '<(deqp_path)/modules/gles2/performance/es2pRedundantStateChangeTests.cpp', + '<(deqp_path)/modules/gles2/performance/es2pRedundantStateChangeTests.hpp', + '<(deqp_path)/modules/gles2/performance/es2pShaderCompilationCases.cpp', + '<(deqp_path)/modules/gles2/performance/es2pShaderCompilationCases.hpp', + '<(deqp_path)/modules/gles2/performance/es2pShaderCompilerTests.cpp', + '<(deqp_path)/modules/gles2/performance/es2pShaderCompilerTests.hpp', + '<(deqp_path)/modules/gles2/performance/es2pShaderControlStatementTests.cpp', + '<(deqp_path)/modules/gles2/performance/es2pShaderControlStatementTests.hpp', + '<(deqp_path)/modules/gles2/performance/es2pShaderOperatorTests.cpp', + '<(deqp_path)/modules/gles2/performance/es2pShaderOperatorTests.hpp', + '<(deqp_path)/modules/gles2/performance/es2pShaderOptimizationTests.cpp', + '<(deqp_path)/modules/gles2/performance/es2pShaderOptimizationTests.hpp', + '<(deqp_path)/modules/gles2/performance/es2pStateChangeCallTests.cpp', + '<(deqp_path)/modules/gles2/performance/es2pStateChangeCallTests.hpp', + '<(deqp_path)/modules/gles2/performance/es2pStateChangeTests.cpp', + '<(deqp_path)/modules/gles2/performance/es2pStateChangeTests.hpp', + '<(deqp_path)/modules/gles2/performance/es2pTextureCases.cpp', + '<(deqp_path)/modules/gles2/performance/es2pTextureCases.hpp', + '<(deqp_path)/modules/gles2/performance/es2pTextureCountTests.cpp', + '<(deqp_path)/modules/gles2/performance/es2pTextureCountTests.hpp', + '<(deqp_path)/modules/gles2/performance/es2pTextureFilteringTests.cpp', + '<(deqp_path)/modules/gles2/performance/es2pTextureFilteringTests.hpp', + '<(deqp_path)/modules/gles2/performance/es2pTextureFormatTests.cpp', + '<(deqp_path)/modules/gles2/performance/es2pTextureFormatTests.hpp', + '<(deqp_path)/modules/gles2/performance/es2pTextureUploadTests.cpp', + '<(deqp_path)/modules/gles2/performance/es2pTextureUploadTests.hpp', + '<(deqp_path)/modules/gles2/stress/es2sDrawTests.cpp', + '<(deqp_path)/modules/gles2/stress/es2sDrawTests.hpp', + '<(deqp_path)/modules/gles2/stress/es2sLongRunningTests.cpp', + '<(deqp_path)/modules/gles2/stress/es2sLongRunningTests.hpp', + '<(deqp_path)/modules/gles2/stress/es2sMemoryTests.cpp', + '<(deqp_path)/modules/gles2/stress/es2sMemoryTests.hpp', + '<(deqp_path)/modules/gles2/stress/es2sSpecialFloatTests.cpp', + '<(deqp_path)/modules/gles2/stress/es2sSpecialFloatTests.hpp', + '<(deqp_path)/modules/gles2/stress/es2sStressTests.cpp', + '<(deqp_path)/modules/gles2/stress/es2sStressTests.hpp', + '<(deqp_path)/modules/gles2/stress/es2sVertexArrayTests.cpp', + '<(deqp_path)/modules/gles2/stress/es2sVertexArrayTests.hpp', + '<(deqp_path)/modules/gles2/tes2CapabilityTests.cpp', + '<(deqp_path)/modules/gles2/tes2CapabilityTests.hpp', + '<(deqp_path)/modules/gles2/tes2Context.cpp', + '<(deqp_path)/modules/gles2/tes2Context.hpp', + '<(deqp_path)/modules/gles2/tes2InfoTests.cpp', + '<(deqp_path)/modules/gles2/tes2InfoTests.hpp', + '<(deqp_path)/modules/gles2/tes2TestCase.cpp', + '<(deqp_path)/modules/gles2/tes2TestCase.hpp', + '<(deqp_path)/modules/gles2/tes2TestPackage.cpp', + '<(deqp_path)/modules/gles2/tes2TestPackage.hpp', + '<(deqp_path)/modules/gles2/tes2TestPackageEntry.cpp', + ], + 'deqp_gles3_sources': + [ + '<(deqp_path)/modules/gles3/accuracy/es3aAccuracyTests.cpp', + '<(deqp_path)/modules/gles3/accuracy/es3aAccuracyTests.hpp', + '<(deqp_path)/modules/gles3/accuracy/es3aTextureFilteringTests.cpp', + '<(deqp_path)/modules/gles3/accuracy/es3aTextureFilteringTests.hpp', + '<(deqp_path)/modules/gles3/accuracy/es3aTextureMipmapTests.cpp', + '<(deqp_path)/modules/gles3/accuracy/es3aTextureMipmapTests.hpp', + '<(deqp_path)/modules/gles3/accuracy/es3aVaryingInterpolationTests.cpp', + '<(deqp_path)/modules/gles3/accuracy/es3aVaryingInterpolationTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fApiCase.cpp', + '<(deqp_path)/modules/gles3/functional/es3fApiCase.hpp', + '<(deqp_path)/modules/gles3/functional/es3fASTCDecompressionCases.cpp', + '<(deqp_path)/modules/gles3/functional/es3fASTCDecompressionCases.hpp', + '<(deqp_path)/modules/gles3/functional/es3fAttribLocationTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fAttribLocationTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fBlendTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fBlendTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fBooleanStateQueryTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fBooleanStateQueryTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fBufferCopyTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fBufferCopyTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fBufferMapTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fBufferMapTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fBufferObjectQueryTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fBufferObjectQueryTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fBufferWriteTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fBufferWriteTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fBuiltinPrecisionTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fBuiltinPrecisionTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fClippingTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fClippingTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fColorClearTest.cpp', + '<(deqp_path)/modules/gles3/functional/es3fColorClearTest.hpp', + '<(deqp_path)/modules/gles3/functional/es3fCompressedTextureTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fCompressedTextureTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fDefaultVertexArrayObjectTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fDefaultVertexArrayObjectTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fDefaultVertexAttributeTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fDefaultVertexAttributeTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fDepthStencilClearTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fDepthStencilClearTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fDepthStencilTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fDepthStencilTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fDepthTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fDepthTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fDitheringTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fDitheringTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fDrawTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fDrawTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fFboApiTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fFboApiTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fFboColorbufferTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fFboColorbufferTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fFboCompletenessTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fFboCompletenessTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fFboDepthbufferTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fFboDepthbufferTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fFboInvalidateTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fFboInvalidateTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fFboMultisampleTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fFboMultisampleTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fFboRenderTest.cpp', + '<(deqp_path)/modules/gles3/functional/es3fFboRenderTest.hpp', + '<(deqp_path)/modules/gles3/functional/es3fFboStateQueryTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fFboStateQueryTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fFboStencilbufferTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fFboStencilbufferTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fFboTestCase.cpp', + '<(deqp_path)/modules/gles3/functional/es3fFboTestCase.hpp', + '<(deqp_path)/modules/gles3/functional/es3fFboTestUtil.cpp', + '<(deqp_path)/modules/gles3/functional/es3fFboTestUtil.hpp', + '<(deqp_path)/modules/gles3/functional/es3fFloatStateQueryTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fFloatStateQueryTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fFlushFinishTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fFlushFinishTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fFragDepthTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fFragDepthTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fFragmentOutputTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fFragmentOutputTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fFragOpInteractionTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fFragOpInteractionTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fFramebufferBlitTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fFramebufferBlitTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fFunctionalTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fFunctionalTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fImplementationLimitTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fImplementationLimitTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fIndexedStateQueryTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fIndexedStateQueryTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fInstancedRenderingTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fInstancedRenderingTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fInteger64StateQueryTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fInteger64StateQueryTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fIntegerStateQueryTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fIntegerStateQueryTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fInternalFormatQueryTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fInternalFormatQueryTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fLifetimeTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fLifetimeTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fMultisampleTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fMultisampleTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fNegativeBufferApiTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fNegativeBufferApiTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fNegativeFragmentApiTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fNegativeFragmentApiTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fNegativeShaderApiTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fNegativeShaderApiTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fNegativeStateApiTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fNegativeStateApiTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fNegativeTextureApiTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fNegativeTextureApiTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fNegativeVertexArrayApiTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fNegativeVertexArrayApiTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fOcclusionQueryTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fOcclusionQueryTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fPixelBufferObjectTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fPixelBufferObjectTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fPolygonOffsetTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fPolygonOffsetTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fPrerequisiteTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fPrerequisiteTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fPrimitiveRestartTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fPrimitiveRestartTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fRandomFragmentOpTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fRandomFragmentOpTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fRandomShaderTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fRandomShaderTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fRasterizationTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fRasterizationTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fRasterizerDiscardTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fRasterizerDiscardTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fRboStateQueryTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fRboStateQueryTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fReadPixelsTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fReadPixelsTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fSamplerObjectTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fSamplerObjectTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fSamplerStateQueryTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fSamplerStateQueryTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fScissorTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fScissorTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderApiTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderApiTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderBuiltinVarTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderBuiltinVarTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderCommonFunctionTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderCommonFunctionTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderConstExprTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderConstExprTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderDerivateTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderDerivateTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderDiscardTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderDiscardTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderFragDataTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderFragDataTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderIndexingTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderIndexingTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderInvarianceTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderInvarianceTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderLoopTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderLoopTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderMatrixTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderMatrixTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderOperatorTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderOperatorTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderPackingFunctionTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderPackingFunctionTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderPrecisionTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderPrecisionTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderReturnTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderReturnTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderStateQueryTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderStateQueryTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderStructTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderStructTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderSwitchTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderSwitchTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderTextureFunctionTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fShaderTextureFunctionTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fStencilTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fStencilTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fStringQueryTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fStringQueryTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fSyncTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fSyncTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fTextureFilteringTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fTextureFilteringTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fTextureFormatTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fTextureFormatTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fTextureMipmapTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fTextureMipmapTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fTextureShadowTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fTextureShadowTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fTextureSizeTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fTextureSizeTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fTextureSpecificationTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fTextureSpecificationTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fTextureStateQueryTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fTextureStateQueryTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fTextureSwizzleTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fTextureSwizzleTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fTextureUnitTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fTextureUnitTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fTextureWrapTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fTextureWrapTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fTransformFeedbackTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fTransformFeedbackTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fUniformApiTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fUniformApiTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fUniformBlockTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fUniformBlockTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fVertexArrayObjectTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fVertexArrayObjectTests.hpp', + '<(deqp_path)/modules/gles3/functional/es3fVertexArrayTest.cpp', + '<(deqp_path)/modules/gles3/functional/es3fVertexArrayTest.hpp', + '<(deqp_path)/modules/gles3/functional/es3fVertexTextureTests.cpp', + '<(deqp_path)/modules/gles3/functional/es3fVertexTextureTests.hpp', + '<(deqp_path)/modules/gles3/performance/es3pBlendTests.cpp', + '<(deqp_path)/modules/gles3/performance/es3pBlendTests.hpp', + '<(deqp_path)/modules/gles3/performance/es3pBufferDataUploadTests.cpp', + '<(deqp_path)/modules/gles3/performance/es3pBufferDataUploadTests.hpp', + '<(deqp_path)/modules/gles3/performance/es3pDepthTests.cpp', + '<(deqp_path)/modules/gles3/performance/es3pDepthTests.hpp', + '<(deqp_path)/modules/gles3/performance/es3pPerformanceTests.cpp', + '<(deqp_path)/modules/gles3/performance/es3pPerformanceTests.hpp', + '<(deqp_path)/modules/gles3/performance/es3pRedundantStateChangeTests.cpp', + '<(deqp_path)/modules/gles3/performance/es3pRedundantStateChangeTests.hpp', + '<(deqp_path)/modules/gles3/performance/es3pShaderCompilationCases.cpp', + '<(deqp_path)/modules/gles3/performance/es3pShaderCompilationCases.hpp', + '<(deqp_path)/modules/gles3/performance/es3pShaderCompilerTests.cpp', + '<(deqp_path)/modules/gles3/performance/es3pShaderCompilerTests.hpp', + '<(deqp_path)/modules/gles3/performance/es3pShaderControlStatementTests.cpp', + '<(deqp_path)/modules/gles3/performance/es3pShaderControlStatementTests.hpp', + '<(deqp_path)/modules/gles3/performance/es3pShaderOperatorTests.cpp', + '<(deqp_path)/modules/gles3/performance/es3pShaderOperatorTests.hpp', + '<(deqp_path)/modules/gles3/performance/es3pShaderOptimizationTests.cpp', + '<(deqp_path)/modules/gles3/performance/es3pShaderOptimizationTests.hpp', + '<(deqp_path)/modules/gles3/performance/es3pStateChangeCallTests.cpp', + '<(deqp_path)/modules/gles3/performance/es3pStateChangeCallTests.hpp', + '<(deqp_path)/modules/gles3/performance/es3pStateChangeTests.cpp', + '<(deqp_path)/modules/gles3/performance/es3pStateChangeTests.hpp', + '<(deqp_path)/modules/gles3/performance/es3pTextureCases.cpp', + '<(deqp_path)/modules/gles3/performance/es3pTextureCases.hpp', + '<(deqp_path)/modules/gles3/performance/es3pTextureCountTests.cpp', + '<(deqp_path)/modules/gles3/performance/es3pTextureCountTests.hpp', + '<(deqp_path)/modules/gles3/performance/es3pTextureFilteringTests.cpp', + '<(deqp_path)/modules/gles3/performance/es3pTextureFilteringTests.hpp', + '<(deqp_path)/modules/gles3/performance/es3pTextureFormatTests.cpp', + '<(deqp_path)/modules/gles3/performance/es3pTextureFormatTests.hpp', + '<(deqp_path)/modules/gles3/stress/es3sDrawTests.cpp', + '<(deqp_path)/modules/gles3/stress/es3sDrawTests.hpp', + '<(deqp_path)/modules/gles3/stress/es3sLongRunningShaderTests.cpp', + '<(deqp_path)/modules/gles3/stress/es3sLongRunningShaderTests.hpp', + '<(deqp_path)/modules/gles3/stress/es3sLongRunningTests.cpp', + '<(deqp_path)/modules/gles3/stress/es3sLongRunningTests.hpp', + '<(deqp_path)/modules/gles3/stress/es3sLongShaderTests.cpp', + '<(deqp_path)/modules/gles3/stress/es3sLongShaderTests.hpp', + '<(deqp_path)/modules/gles3/stress/es3sMemoryTests.cpp', + '<(deqp_path)/modules/gles3/stress/es3sMemoryTests.hpp', + '<(deqp_path)/modules/gles3/stress/es3sOcclusionQueryTests.cpp', + '<(deqp_path)/modules/gles3/stress/es3sOcclusionQueryTests.hpp', + '<(deqp_path)/modules/gles3/stress/es3sSpecialFloatTests.cpp', + '<(deqp_path)/modules/gles3/stress/es3sSpecialFloatTests.hpp', + '<(deqp_path)/modules/gles3/stress/es3sStressTests.cpp', + '<(deqp_path)/modules/gles3/stress/es3sStressTests.hpp', + '<(deqp_path)/modules/gles3/stress/es3sSyncTests.cpp', + '<(deqp_path)/modules/gles3/stress/es3sSyncTests.hpp', + '<(deqp_path)/modules/gles3/stress/es3sVertexArrayTests.cpp', + '<(deqp_path)/modules/gles3/stress/es3sVertexArrayTests.hpp', + '<(deqp_path)/modules/gles3/tes3Context.cpp', + '<(deqp_path)/modules/gles3/tes3Context.hpp', + '<(deqp_path)/modules/gles3/tes3InfoTests.cpp', + '<(deqp_path)/modules/gles3/tes3InfoTests.hpp', + '<(deqp_path)/modules/gles3/tes3TestCase.cpp', + '<(deqp_path)/modules/gles3/tes3TestCase.hpp', + '<(deqp_path)/modules/gles3/tes3TestPackage.cpp', + '<(deqp_path)/modules/gles3/tes3TestPackage.hpp', + '<(deqp_path)/modules/gles3/tes3TestPackageEntry.cpp', + ], + 'deqp_gles31_sources': + [ + '<(deqp_path)/modules/gles31/functional/es31fAdvancedBlendTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fAdvancedBlendTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fAndroidExtensionPackES31ATests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fAndroidExtensionPackES31ATests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fAtomicCounterTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fAtomicCounterTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fBasicComputeShaderTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fBasicComputeShaderTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fBooleanStateQueryTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fBooleanStateQueryTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fBuiltinPrecisionTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fBuiltinPrecisionTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fComputeShaderBuiltinVarTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fComputeShaderBuiltinVarTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fCopyImageTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fCopyImageTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fDebugTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fDebugTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fDefaultVertexArrayObjectTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fDefaultVertexArrayObjectTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fDrawBuffersIndexedTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fDrawBuffersIndexedTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fDrawTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fDrawTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fFboColorbufferTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fFboColorbufferTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fFboNoAttachmentTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fFboNoAttachmentTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fFboTestCase.cpp', + '<(deqp_path)/modules/gles31/functional/es31fFboTestCase.hpp', + '<(deqp_path)/modules/gles31/functional/es31fFboTestUtil.cpp', + '<(deqp_path)/modules/gles31/functional/es31fFboTestUtil.hpp', + '<(deqp_path)/modules/gles31/functional/es31fFramebufferDefaultStateQueryTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fFramebufferDefaultStateQueryTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fFunctionalTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fFunctionalTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fGeometryShaderTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fGeometryShaderTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fIndexedStateQueryTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fIndexedStateQueryTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fIndirectComputeDispatchTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fIndirectComputeDispatchTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fInfoLogQueryShared.cpp', + '<(deqp_path)/modules/gles31/functional/es31fInfoLogQueryShared.hpp', + '<(deqp_path)/modules/gles31/functional/es31fIntegerStateQueryTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fIntegerStateQueryTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fInternalFormatQueryTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fInternalFormatQueryTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fLayoutBindingTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fLayoutBindingTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fMultisampleShaderRenderCase.cpp', + '<(deqp_path)/modules/gles31/functional/es31fMultisampleShaderRenderCase.hpp', + '<(deqp_path)/modules/gles31/functional/es31fMultisampleTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fMultisampleTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fNegativeAdvancedBlendEquationTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fNegativeAdvancedBlendEquationTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fNegativeAtomicCounterTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fNegativeAtomicCounterTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fNegativeBufferApiTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fNegativeBufferApiTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fNegativeFragmentApiTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fNegativeFragmentApiTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fNegativePreciseTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fNegativePreciseTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fNegativeShaderApiTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fNegativeShaderApiTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fNegativeShaderDirectiveTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fNegativeShaderDirectiveTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fNegativeShaderFunctionTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fNegativeShaderFunctionTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fNegativeShaderImageLoadStoreTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fNegativeShaderImageLoadStoreTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fNegativeStateApiTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fNegativeStateApiTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fNegativeTestShared.cpp', + '<(deqp_path)/modules/gles31/functional/es31fNegativeTestShared.hpp', + '<(deqp_path)/modules/gles31/functional/es31fNegativeTextureApiTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fNegativeTextureApiTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fNegativeVertexArrayApiTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fNegativeVertexArrayApiTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fOpaqueTypeIndexingTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fOpaqueTypeIndexingTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fPrimitiveBoundingBoxTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fPrimitiveBoundingBoxTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fProgramInterfaceDefinition.cpp', + '<(deqp_path)/modules/gles31/functional/es31fProgramInterfaceDefinition.hpp', + '<(deqp_path)/modules/gles31/functional/es31fProgramInterfaceDefinitionUtil.cpp', + '<(deqp_path)/modules/gles31/functional/es31fProgramInterfaceDefinitionUtil.hpp', + '<(deqp_path)/modules/gles31/functional/es31fProgramInterfaceQueryTestCase.cpp', + '<(deqp_path)/modules/gles31/functional/es31fProgramInterfaceQueryTestCase.hpp', + '<(deqp_path)/modules/gles31/functional/es31fProgramInterfaceQueryTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fProgramInterfaceQueryTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fProgramPipelineStateQueryTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fProgramPipelineStateQueryTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fProgramStateQueryTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fProgramStateQueryTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fProgramUniformTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fProgramUniformTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fSSBOArrayLengthTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fSSBOArrayLengthTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fSSBOLayoutCase.cpp', + '<(deqp_path)/modules/gles31/functional/es31fSSBOLayoutCase.hpp', + '<(deqp_path)/modules/gles31/functional/es31fSSBOLayoutTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fSSBOLayoutTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fSampleShadingTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fSampleShadingTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fSampleVariableTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fSampleVariableTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fSamplerStateQueryTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fSamplerStateQueryTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fSeparateShaderTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fSeparateShaderTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fShaderAtomicOpTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fShaderAtomicOpTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fShaderBuiltinConstantTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fShaderBuiltinConstantTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fShaderCommonFunctionTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fShaderCommonFunctionTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fShaderHelperInvocationTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fShaderHelperInvocationTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fShaderImageLoadStoreTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fShaderImageLoadStoreTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fShaderIntegerFunctionTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fShaderIntegerFunctionTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fShaderMultisampleInterpolationStateQueryTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fShaderMultisampleInterpolationStateQueryTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fShaderMultisampleInterpolationTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fShaderMultisampleInterpolationTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fShaderPackingFunctionTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fShaderPackingFunctionTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fShaderSharedVarTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fShaderSharedVarTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fShaderStateQueryTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fShaderStateQueryTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fShaderTextureSizeTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fShaderTextureSizeTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fStencilTexturingTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fStencilTexturingTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fSynchronizationTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fSynchronizationTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fTessellationGeometryInteractionTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fTessellationGeometryInteractionTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fTessellationTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fTessellationTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fTextureBorderClampTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fTextureBorderClampTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fTextureBufferTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fTextureBufferTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fTextureFilteringTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fTextureFilteringTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fTextureFormatTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fTextureFormatTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fTextureGatherTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fTextureGatherTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fTextureLevelStateQueryTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fTextureLevelStateQueryTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fTextureMultisampleTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fTextureMultisampleTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fTextureSpecificationTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fTextureSpecificationTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fTextureStateQueryTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fTextureStateQueryTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fUniformBlockTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fUniformBlockTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fUniformLocationTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fUniformLocationTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fVertexAttributeBindingStateQueryTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fVertexAttributeBindingStateQueryTests.hpp', + '<(deqp_path)/modules/gles31/functional/es31fVertexAttributeBindingTests.cpp', + '<(deqp_path)/modules/gles31/functional/es31fVertexAttributeBindingTests.hpp', + '<(deqp_path)/modules/gles31/stress/es31sDrawTests.cpp', + '<(deqp_path)/modules/gles31/stress/es31sDrawTests.hpp', + '<(deqp_path)/modules/gles31/stress/es31sStressTests.cpp', + '<(deqp_path)/modules/gles31/stress/es31sStressTests.hpp', + '<(deqp_path)/modules/gles31/stress/es31sTessellationGeometryInteractionTests.cpp', + '<(deqp_path)/modules/gles31/stress/es31sTessellationGeometryInteractionTests.hpp', + '<(deqp_path)/modules/gles31/stress/es31sVertexAttributeBindingTests.cpp', + '<(deqp_path)/modules/gles31/stress/es31sVertexAttributeBindingTests.hpp', + '<(deqp_path)/modules/gles31/tes31Context.cpp', + '<(deqp_path)/modules/gles31/tes31Context.hpp', + '<(deqp_path)/modules/gles31/tes31InfoTests.cpp', + '<(deqp_path)/modules/gles31/tes31InfoTests.hpp', + '<(deqp_path)/modules/gles31/tes31TestCase.cpp', + '<(deqp_path)/modules/gles31/tes31TestCase.hpp', + '<(deqp_path)/modules/gles31/tes31TestPackage.cpp', + '<(deqp_path)/modules/gles31/tes31TestPackage.hpp', + '<(deqp_path)/modules/gles31/tes31TestPackageEntry.cpp' + ], + 'deqp_egl_sources': + [ + '<(deqp_path)/modules/egl/teglAndroidUtil.cpp', + '<(deqp_path)/modules/egl/teglAndroidUtil.hpp', + '<(deqp_path)/modules/egl/teglApiCase.cpp', + '<(deqp_path)/modules/egl/teglApiCase.hpp', + '<(deqp_path)/modules/egl/teglBufferAgeTests.cpp', + '<(deqp_path)/modules/egl/teglBufferAgeTests.hpp', + '<(deqp_path)/modules/egl/teglChooseConfigReference.cpp', + '<(deqp_path)/modules/egl/teglChooseConfigReference.hpp', + '<(deqp_path)/modules/egl/teglChooseConfigTests.cpp', + '<(deqp_path)/modules/egl/teglChooseConfigTests.hpp', + '<(deqp_path)/modules/egl/teglClientExtensionTests.cpp', + '<(deqp_path)/modules/egl/teglClientExtensionTests.hpp', + '<(deqp_path)/modules/egl/teglColorClearCase.cpp', + '<(deqp_path)/modules/egl/teglColorClearCase.hpp', + '<(deqp_path)/modules/egl/teglColorClearTests.cpp', + '<(deqp_path)/modules/egl/teglColorClearTests.hpp', + '<(deqp_path)/modules/egl/teglConfigList.cpp', + '<(deqp_path)/modules/egl/teglConfigList.hpp', + '<(deqp_path)/modules/egl/teglCreateContextExtTests.cpp', + '<(deqp_path)/modules/egl/teglCreateContextExtTests.hpp', + '<(deqp_path)/modules/egl/teglCreateContextTests.cpp', + '<(deqp_path)/modules/egl/teglCreateContextTests.hpp', + '<(deqp_path)/modules/egl/teglCreateSurfaceTests.cpp', + '<(deqp_path)/modules/egl/teglCreateSurfaceTests.hpp', + '<(deqp_path)/modules/egl/teglGetProcAddressTests.cpp', + '<(deqp_path)/modules/egl/teglGetProcAddressTests.hpp', + '<(deqp_path)/modules/egl/teglGLES1RenderUtil.cpp', + '<(deqp_path)/modules/egl/teglGLES1RenderUtil.hpp', + '<(deqp_path)/modules/egl/teglGLES2RenderUtil.cpp', + '<(deqp_path)/modules/egl/teglGLES2RenderUtil.hpp', + '<(deqp_path)/modules/egl/teglGLES2SharedRenderingPerfTests.cpp', + '<(deqp_path)/modules/egl/teglGLES2SharedRenderingPerfTests.hpp', + '<(deqp_path)/modules/egl/teglGLES2SharingTests.cpp', + '<(deqp_path)/modules/egl/teglGLES2SharingTests.hpp', + '<(deqp_path)/modules/egl/teglGLES2SharingThreadedTests.cpp', + '<(deqp_path)/modules/egl/teglGLES2SharingThreadedTests.hpp', + '<(deqp_path)/modules/egl/teglImageFormatTests.cpp', + '<(deqp_path)/modules/egl/teglImageFormatTests.hpp', + '<(deqp_path)/modules/egl/teglImageTests.cpp', + '<(deqp_path)/modules/egl/teglImageTests.hpp', + '<(deqp_path)/modules/egl/teglImageUtil.cpp', + '<(deqp_path)/modules/egl/teglImageUtil.hpp', + '<(deqp_path)/modules/egl/teglInfoTests.cpp', + '<(deqp_path)/modules/egl/teglInfoTests.hpp', + '<(deqp_path)/modules/egl/teglMakeCurrentPerfTests.cpp', + '<(deqp_path)/modules/egl/teglMakeCurrentPerfTests.hpp', + '<(deqp_path)/modules/egl/teglMemoryStressTests.cpp', + '<(deqp_path)/modules/egl/teglMemoryStressTests.hpp', + '<(deqp_path)/modules/egl/teglMultiContextTests.cpp', + '<(deqp_path)/modules/egl/teglMultiContextTests.hpp', + '<(deqp_path)/modules/egl/teglMultiThreadTests.cpp', + '<(deqp_path)/modules/egl/teglMultiThreadTests.hpp', + '<(deqp_path)/modules/egl/teglNativeColorMappingTests.cpp', + '<(deqp_path)/modules/egl/teglNativeColorMappingTests.hpp', + '<(deqp_path)/modules/egl/teglNativeCoordMappingTests.cpp', + '<(deqp_path)/modules/egl/teglNativeCoordMappingTests.hpp', + '<(deqp_path)/modules/egl/teglNegativeApiTests.cpp', + '<(deqp_path)/modules/egl/teglNegativeApiTests.hpp', + '<(deqp_path)/modules/egl/teglNegativePartialUpdateTests.cpp', + '<(deqp_path)/modules/egl/teglNegativePartialUpdateTests.hpp', + '<(deqp_path)/modules/egl/teglPreservingSwapTests.cpp', + '<(deqp_path)/modules/egl/teglPreservingSwapTests.hpp', + '<(deqp_path)/modules/egl/teglPartialUpdateTests.cpp', + '<(deqp_path)/modules/egl/teglPartialUpdateTests.hpp', + '<(deqp_path)/modules/egl/teglQueryConfigTests.cpp', + '<(deqp_path)/modules/egl/teglQueryConfigTests.hpp', + '<(deqp_path)/modules/egl/teglQueryContextTests.cpp', + '<(deqp_path)/modules/egl/teglQueryContextTests.hpp', + '<(deqp_path)/modules/egl/teglQuerySurfaceTests.cpp', + '<(deqp_path)/modules/egl/teglQuerySurfaceTests.hpp', + '<(deqp_path)/modules/egl/teglRenderCase.cpp', + '<(deqp_path)/modules/egl/teglRenderCase.hpp', + '<(deqp_path)/modules/egl/teglRenderTests.cpp', + '<(deqp_path)/modules/egl/teglRenderTests.hpp', + '<(deqp_path)/modules/egl/teglResizeTests.cpp', + '<(deqp_path)/modules/egl/teglResizeTests.hpp', + '<(deqp_path)/modules/egl/teglSimpleConfigCase.cpp', + '<(deqp_path)/modules/egl/teglSimpleConfigCase.hpp', + '<(deqp_path)/modules/egl/teglSurfacelessContextTests.cpp', + '<(deqp_path)/modules/egl/teglSurfacelessContextTests.hpp', + '<(deqp_path)/modules/egl/teglSwapBuffersTests.cpp', + '<(deqp_path)/modules/egl/teglSwapBuffersTests.hpp', + '<(deqp_path)/modules/egl/teglSwapBuffersWithDamageTests.cpp', + '<(deqp_path)/modules/egl/teglSwapBuffersWithDamageTests.hpp', + '<(deqp_path)/modules/egl/teglSyncTests.cpp', + '<(deqp_path)/modules/egl/teglSyncTests.hpp', + '<(deqp_path)/modules/egl/teglTestCase.cpp', + '<(deqp_path)/modules/egl/teglTestCase.hpp', + '<(deqp_path)/modules/egl/teglTestPackage.cpp', + '<(deqp_path)/modules/egl/teglTestPackage.hpp', + '<(deqp_path)/modules/egl/teglTestPackageEntry.cpp', + '<(deqp_path)/modules/egl/teglVGRenderUtil.cpp', + '<(deqp_path)/modules/egl/teglVGRenderUtil.hpp', + ], + 'deqp_libtester_decpp_sources': + [ + '<(deqp_path)/framework/delibs/decpp/deArrayBuffer.cpp', + '<(deqp_path)/framework/delibs/decpp/deBlockBuffer.cpp', + '<(deqp_path)/framework/delibs/decpp/deCommandLine.cpp', + '<(deqp_path)/framework/delibs/decpp/deDefs.cpp', + '<(deqp_path)/framework/delibs/decpp/deDirectoryIterator.cpp', + '<(deqp_path)/framework/delibs/decpp/deDynamicLibrary.cpp', + '<(deqp_path)/framework/delibs/decpp/deFilePath.cpp', + '<(deqp_path)/framework/delibs/decpp/deMemPool.cpp', + '<(deqp_path)/framework/delibs/decpp/deMutex.cpp', + '<(deqp_path)/framework/delibs/decpp/dePoolArray.cpp', + '<(deqp_path)/framework/delibs/decpp/dePoolString.cpp', + '<(deqp_path)/framework/delibs/decpp/deProcess.cpp', + '<(deqp_path)/framework/delibs/decpp/deRandom.cpp', + '<(deqp_path)/framework/delibs/decpp/deRingBuffer.cpp', + '<(deqp_path)/framework/delibs/decpp/deSemaphore.cpp', + '<(deqp_path)/framework/delibs/decpp/deSharedPtr.cpp', + '<(deqp_path)/framework/delibs/decpp/deSha1.cpp', + '<(deqp_path)/framework/delibs/decpp/deSocket.cpp', + '<(deqp_path)/framework/delibs/decpp/deSTLUtil.cpp', + '<(deqp_path)/framework/delibs/decpp/deStringUtil.cpp', + '<(deqp_path)/framework/delibs/decpp/deThread.cpp', + '<(deqp_path)/framework/delibs/decpp/deThreadLocal.cpp', + '<(deqp_path)/framework/delibs/decpp/deThreadSafeRingBuffer.cpp', + '<(deqp_path)/framework/delibs/decpp/deUniquePtr.cpp', + ], + 'deqp_libtester_sources': + [ + '<(deqp_path)/execserver/xsDefs.cpp', + '<(deqp_path)/execserver/xsExecutionServer.cpp', + '<(deqp_path)/execserver/xsPosixFileReader.cpp', + '<(deqp_path)/execserver/xsPosixTestProcess.cpp', + '<(deqp_path)/execserver/xsProtocol.cpp', + '<(deqp_path)/execserver/xsTcpServer.cpp', + '<(deqp_path)/execserver/xsTestDriver.cpp', + '<(deqp_path)/execserver/xsTestProcess.cpp', + '<(deqp_path)/executor/xeBatchExecutor.cpp', + '<(deqp_path)/executor/xeBatchResult.cpp', + '<(deqp_path)/executor/xeCallQueue.cpp', + '<(deqp_path)/executor/xeCommLink.cpp', + '<(deqp_path)/executor/xeContainerFormatParser.cpp', + '<(deqp_path)/executor/xeDefs.cpp', + '<(deqp_path)/executor/xeLocalTcpIpLink.cpp', + '<(deqp_path)/executor/xeTcpIpLink.cpp', + '<(deqp_path)/executor/xeTestCase.cpp', + '<(deqp_path)/executor/xeTestCaseListParser.cpp', + '<(deqp_path)/executor/xeTestCaseResult.cpp', + '<(deqp_path)/executor/xeTestLogParser.cpp', + '<(deqp_path)/executor/xeTestLogWriter.cpp', + '<(deqp_path)/executor/xeTestResultParser.cpp', + '<(deqp_path)/executor/xeXMLParser.cpp', + '<(deqp_path)/executor/xeXMLWriter.cpp', + '<(deqp_path)/framework/common/tcuApp.cpp', + '<(deqp_path)/framework/common/tcuAstcUtil.cpp', + '<(deqp_path)/framework/common/tcuBilinearImageCompare.cpp', + '<(deqp_path)/framework/common/tcuCommandLine.cpp', + '<(deqp_path)/framework/common/tcuCompressedTexture.cpp', + '<(deqp_path)/framework/common/tcuCPUWarmup.cpp', + '<(deqp_path)/framework/common/tcuDefs.cpp', + '<(deqp_path)/framework/common/tcuEither.cpp', + '<(deqp_path)/framework/common/tcuFactoryRegistry.cpp', + '<(deqp_path)/framework/common/tcuFloatFormat.cpp', + '<(deqp_path)/framework/common/tcuFunctionLibrary.cpp', + '<(deqp_path)/framework/common/tcuFuzzyImageCompare.cpp', + '<(deqp_path)/framework/common/tcuImageCompare.cpp', + '<(deqp_path)/framework/common/tcuImageIO.cpp', + '<(deqp_path)/framework/common/tcuInterval.cpp', + '<(deqp_path)/framework/common/tcuPlatform.cpp', + '<(deqp_path)/framework/common/tcuRandomValueIterator.cpp', + '<(deqp_path)/framework/common/tcuRenderTarget.cpp', + '<(deqp_path)/framework/common/tcuResource.cpp', + '<(deqp_path)/framework/common/tcuResultCollector.cpp', + '<(deqp_path)/framework/common/tcuRGBA.cpp', + '<(deqp_path)/framework/common/tcuStringTemplate.cpp', + '<(deqp_path)/framework/common/tcuSurface.cpp', + '<(deqp_path)/framework/common/tcuTestCase.cpp', + '<(deqp_path)/framework/common/tcuTestContext.cpp', + '<(deqp_path)/framework/common/tcuTestHierarchyIterator.cpp', + '<(deqp_path)/framework/common/tcuTestHierarchyUtil.cpp', + '<(deqp_path)/framework/common/tcuTestLog.cpp', + '<(deqp_path)/framework/common/tcuTestPackage.cpp', + '<(deqp_path)/framework/common/tcuTestSessionExecutor.cpp', + '<(deqp_path)/framework/common/tcuTexCompareVerifier.cpp', + '<(deqp_path)/framework/common/tcuTexLookupVerifier.cpp', + '<(deqp_path)/framework/common/tcuTexture.cpp', + '<(deqp_path)/framework/common/tcuTextureUtil.cpp', + '<(deqp_path)/framework/common/tcuTexVerifierUtil.cpp', + '<(deqp_path)/framework/common/tcuThreadUtil.cpp', + '<(deqp_path)/framework/common/tcuSeedBuilder.cpp', + '<(deqp_path)/framework/delibs/debase/deDefs.c', + '<(deqp_path)/framework/delibs/debase/deFloat16.c', + '<(deqp_path)/framework/delibs/debase/deInt32.c', + '<(deqp_path)/framework/delibs/debase/deInt32Test.c', + '<(deqp_path)/framework/delibs/debase/deMath.c', + '<(deqp_path)/framework/delibs/debase/deMemory.c', + '<(deqp_path)/framework/delibs/debase/deRandom.c', + '<(deqp_path)/framework/delibs/debase/deString.c', + '<(deqp_path)/framework/delibs/debase/deSha1.c', + '<(deqp_path)/framework/delibs/deimage/deImage.c', + '<(deqp_path)/framework/delibs/deimage/deTarga.c', + '<(deqp_path)/framework/delibs/depool/deMemPool.c', + '<(deqp_path)/framework/delibs/depool/dePoolArray.c', + '<(deqp_path)/framework/delibs/depool/dePoolHashArray.c', + '<(deqp_path)/framework/delibs/depool/dePoolHash.c', + '<(deqp_path)/framework/delibs/depool/dePoolHashSet.c', + '<(deqp_path)/framework/delibs/depool/dePoolHeap.c', + '<(deqp_path)/framework/delibs/depool/dePoolMultiSet.c', + '<(deqp_path)/framework/delibs/depool/dePoolSet.c', + '<(deqp_path)/framework/delibs/depool/dePoolStringBuilder.c', + '<(deqp_path)/framework/delibs/depool/dePoolTest.c', + '<(deqp_path)/framework/delibs/destream/deFileStream.c', + '<(deqp_path)/framework/delibs/destream/deRingbuffer.c', + '<(deqp_path)/framework/delibs/destream/deStreamCpyThread.c', + '<(deqp_path)/framework/delibs/destream/deThreadStream.c', + '<(deqp_path)/framework/delibs/dethread/deAtomic.c', + '<(deqp_path)/framework/delibs/dethread/deSingleton.c', + '<(deqp_path)/framework/delibs/dethread/deThreadTest.c', + '<(deqp_path)/framework/delibs/deutil/deClock.c', + '<(deqp_path)/framework/delibs/deutil/deCommandLine.c', + '<(deqp_path)/framework/delibs/deutil/deDynamicLibrary.c', + '<(deqp_path)/framework/delibs/deutil/deFile.c', + '<(deqp_path)/framework/delibs/deutil/deProcess.c', + '<(deqp_path)/framework/delibs/deutil/deSocket.c', + '<(deqp_path)/framework/delibs/deutil/deTimer.c', + '<(deqp_path)/framework/delibs/deutil/deTimerTest.c', + '<(deqp_path)/framework/egl/egluCallLogWrapper.cpp', + '<(deqp_path)/framework/egl/egluConfigFilter.cpp', + '<(deqp_path)/framework/egl/egluConfigInfo.cpp', + '<(deqp_path)/framework/egl/egluDefs.cpp', + '<(deqp_path)/framework/egl/egluGLContextFactory.cpp', + '<(deqp_path)/framework/egl/egluGLFunctionLoader.cpp', + '<(deqp_path)/framework/egl/egluGLUtil.cpp', + '<(deqp_path)/framework/egl/egluNativeDisplay.cpp', + '<(deqp_path)/framework/egl/egluNativePixmap.cpp', + '<(deqp_path)/framework/egl/egluNativeWindow.cpp', + '<(deqp_path)/framework/egl/egluPlatform.cpp', + '<(deqp_path)/framework/egl/egluStaticESLibrary.cpp', + '<(deqp_path)/framework/egl/egluStrUtil.cpp', + '<(deqp_path)/framework/egl/egluUnique.cpp', + '<(deqp_path)/framework/egl/egluUtil.cpp', + '<(deqp_path)/framework/egl/wrapper/eglwDefs.cpp', + '<(deqp_path)/framework/egl/wrapper/eglwFunctions.cpp', + '<(deqp_path)/framework/egl/wrapper/eglwLibrary.cpp', + '<(deqp_path)/framework/opengl/gluCallLogWrapper.cpp', + '<(deqp_path)/framework/opengl/gluContextFactory.cpp', + '<(deqp_path)/framework/opengl/gluContextInfo.cpp', + '<(deqp_path)/framework/opengl/gluDefs.cpp', + '<(deqp_path)/framework/opengl/gluDrawUtil.cpp', + '<(deqp_path)/framework/opengl/gluDummyRenderContext.cpp', + '<(deqp_path)/framework/opengl/gluES3PlusWrapperContext.cpp', + '<(deqp_path)/framework/opengl/gluFboRenderContext.cpp', + '<(deqp_path)/framework/opengl/gluObjectWrapper.cpp', + '<(deqp_path)/framework/opengl/gluPixelTransfer.cpp', + '<(deqp_path)/framework/opengl/gluPlatform.cpp', + '<(deqp_path)/framework/opengl/gluProgramInterfaceQuery.cpp', + '<(deqp_path)/framework/opengl/gluRenderConfig.cpp', + '<(deqp_path)/framework/opengl/gluRenderContext.cpp', + '<(deqp_path)/framework/opengl/gluShaderLibrary.cpp', + '<(deqp_path)/framework/opengl/gluShaderProgram.cpp', + '<(deqp_path)/framework/opengl/gluShaderUtil.cpp', + '<(deqp_path)/framework/opengl/gluStateReset.cpp', + '<(deqp_path)/framework/opengl/gluStrUtil.cpp', + '<(deqp_path)/framework/opengl/gluTexture.cpp', + '<(deqp_path)/framework/opengl/gluTextureUtil.cpp', + '<(deqp_path)/framework/opengl/gluVarType.cpp', + '<(deqp_path)/framework/opengl/gluVarTypeUtil.cpp', + '<(deqp_path)/framework/opengl/simplereference/sglrContext.cpp', + '<(deqp_path)/framework/opengl/simplereference/sglrContextUtil.cpp', + '<(deqp_path)/framework/opengl/simplereference/sglrContextWrapper.cpp', + '<(deqp_path)/framework/opengl/simplereference/sglrGLContext.cpp', + '<(deqp_path)/framework/opengl/simplereference/sglrReferenceContext.cpp', + '<(deqp_path)/framework/opengl/simplereference/sglrReferenceUtils.cpp', + '<(deqp_path)/framework/opengl/simplereference/sglrShaderProgram.cpp', + '<(deqp_path)/framework/opengl/wrapper/glwDefs.cpp', + '<(deqp_path)/framework/opengl/wrapper/glwFunctions.cpp', + '<(deqp_path)/framework/opengl/wrapper/glwInitES20Direct.cpp', + '<(deqp_path)/framework/opengl/wrapper/glwInitES30Direct.cpp', + '<(deqp_path)/framework/opengl/wrapper/glwInitFunctions.cpp', + '<(deqp_path)/framework/opengl/wrapper/glwWrapper.cpp', + '<(deqp_path)/framework/platform/null/tcuNullContextFactory.cpp', + '<(deqp_path)/framework/platform/null/tcuNullContextFactory.hpp', + '<(deqp_path)/framework/platform/null/tcuNullRenderContext.cpp', + '<(deqp_path)/framework/qphelper/qpCrashHandler.c', + '<(deqp_path)/framework/qphelper/qpDebugOut.c', + '<(deqp_path)/framework/qphelper/qpInfo.c', + '<(deqp_path)/framework/qphelper/qpTestLog.c', + '<(deqp_path)/framework/qphelper/qpWatchDog.c', + '<(deqp_path)/framework/qphelper/qpXmlWriter.c', + '<(deqp_path)/framework/randomshaders/rsgBinaryOps.cpp', + '<(deqp_path)/framework/randomshaders/rsgBuiltinFunctions.cpp', + '<(deqp_path)/framework/randomshaders/rsgDefs.cpp', + '<(deqp_path)/framework/randomshaders/rsgExecutionContext.cpp', + '<(deqp_path)/framework/randomshaders/rsgExpression.cpp', + '<(deqp_path)/framework/randomshaders/rsgExpressionGenerator.cpp', + '<(deqp_path)/framework/randomshaders/rsgFunctionGenerator.cpp', + '<(deqp_path)/framework/randomshaders/rsgGeneratorState.cpp', + '<(deqp_path)/framework/randomshaders/rsgNameAllocator.cpp', + '<(deqp_path)/framework/randomshaders/rsgParameters.cpp', + '<(deqp_path)/framework/randomshaders/rsgPrettyPrinter.cpp', + '<(deqp_path)/framework/randomshaders/rsgProgramExecutor.cpp', + '<(deqp_path)/framework/randomshaders/rsgProgramGenerator.cpp', + '<(deqp_path)/framework/randomshaders/rsgSamplers.cpp', + '<(deqp_path)/framework/randomshaders/rsgShader.cpp', + '<(deqp_path)/framework/randomshaders/rsgShaderGenerator.cpp', + '<(deqp_path)/framework/randomshaders/rsgStatement.cpp', + '<(deqp_path)/framework/randomshaders/rsgToken.cpp', + '<(deqp_path)/framework/randomshaders/rsgUtils.cpp', + '<(deqp_path)/framework/randomshaders/rsgVariable.cpp', + '<(deqp_path)/framework/randomshaders/rsgVariableManager.cpp', + '<(deqp_path)/framework/randomshaders/rsgVariableType.cpp', + '<(deqp_path)/framework/randomshaders/rsgVariableValue.cpp', + '<(deqp_path)/framework/referencerenderer/rrDefs.cpp', + '<(deqp_path)/framework/referencerenderer/rrFragmentOperations.cpp', + '<(deqp_path)/framework/referencerenderer/rrMultisamplePixelBufferAccess.cpp', + '<(deqp_path)/framework/referencerenderer/rrPrimitivePacket.cpp', + '<(deqp_path)/framework/referencerenderer/rrRasterizer.cpp', + '<(deqp_path)/framework/referencerenderer/rrRenderer.cpp', + '<(deqp_path)/framework/referencerenderer/rrShaders.cpp', + '<(deqp_path)/framework/referencerenderer/rrShadingContext.cpp', + '<(deqp_path)/framework/referencerenderer/rrVertexAttrib.cpp', + '<(deqp_path)/framework/referencerenderer/rrVertexPacket.cpp', + '<(deqp_path)/modules/glshared/glsAttributeLocationTests.cpp', + '<(deqp_path)/modules/glshared/glsBufferTestUtil.cpp', + '<(deqp_path)/modules/glshared/glsBuiltinPrecisionTests.cpp', + '<(deqp_path)/modules/glshared/glsCalibration.cpp', + '<(deqp_path)/modules/glshared/glsDrawTest.cpp', + '<(deqp_path)/modules/glshared/glsFboCompletenessTests.cpp', + '<(deqp_path)/modules/glshared/glsFboUtil.cpp', + '<(deqp_path)/modules/glshared/glsFragmentOpUtil.cpp', + '<(deqp_path)/modules/glshared/glsFragOpInteractionCase.cpp', + '<(deqp_path)/modules/glshared/glsInteractionTestUtil.cpp', + '<(deqp_path)/modules/glshared/glsLifetimeTests.cpp', + '<(deqp_path)/modules/glshared/glsLongStressCase.cpp', + '<(deqp_path)/modules/glshared/glsLongStressTestUtil.cpp', + '<(deqp_path)/modules/glshared/glsMemoryStressCase.cpp', + '<(deqp_path)/modules/glshared/glsRandomShaderCase.cpp', + '<(deqp_path)/modules/glshared/glsRandomShaderProgram.cpp', + '<(deqp_path)/modules/glshared/glsRandomUniformBlockCase.cpp', + '<(deqp_path)/modules/glshared/glsRasterizationTestUtil.cpp', + '<(deqp_path)/modules/glshared/glsSamplerObjectTest.cpp', + '<(deqp_path)/modules/glshared/glsScissorTests.cpp', + '<(deqp_path)/modules/glshared/glsShaderConstExprTests.cpp', + '<(deqp_path)/modules/glshared/glsShaderExecUtil.cpp', + '<(deqp_path)/modules/glshared/glsShaderLibraryCase.cpp', + '<(deqp_path)/modules/glshared/glsShaderLibrary.cpp', + '<(deqp_path)/modules/glshared/glsShaderPerformanceCase.cpp', + '<(deqp_path)/modules/glshared/glsShaderPerformanceMeasurer.cpp', + '<(deqp_path)/modules/glshared/glsShaderRenderCase.cpp', + '<(deqp_path)/modules/glshared/glsStateQueryUtil.cpp', + '<(deqp_path)/modules/glshared/glsStateChangePerfTestCases.cpp', + '<(deqp_path)/modules/glshared/glsTextureBufferCase.cpp', + '<(deqp_path)/modules/glshared/glsTextureStateQueryTests.cpp', + '<(deqp_path)/modules/glshared/glsTextureTestUtil.cpp', + '<(deqp_path)/modules/glshared/glsUniformBlockCase.cpp', + '<(deqp_path)/modules/glshared/glsVertexArrayTests.cpp', + '<(angle_path)/src/tests/deqp_support/tcuANGLENativeDisplayFactory.cpp', + '<(angle_path)/src/tests/deqp_support/tcuANGLENativeDisplayFactory.h', + # TODO(jmadill): integrate with dEQP + '<(angle_path)/src/tests/deqp_support/tcuRandomOrderExecutor.cpp', + '<(angle_path)/src/tests/deqp_support/tcuRandomOrderExecutor.h', + ], + 'deqp_libtester_sources_win': + [ + '<(deqp_path)/framework/delibs/dethread/win32/deMutexWin32.c', + '<(deqp_path)/framework/delibs/dethread/win32/deSemaphoreWin32.c', + '<(deqp_path)/framework/delibs/dethread/win32/deThreadLocalWin32.c', + '<(deqp_path)/framework/delibs/dethread/win32/deThreadWin32.c', + ], + 'deqp_libtester_sources_unix': + [ + '<(deqp_path)/framework/delibs/dethread/unix/deMutexUnix.c', + '<(deqp_path)/framework/delibs/dethread/unix/deNamedSemaphoreUnix.c', + '<(deqp_path)/framework/delibs/dethread/unix/deSemaphoreUnix.c', + '<(deqp_path)/framework/delibs/dethread/unix/deThreadLocalUnix.c', + '<(deqp_path)/framework/delibs/dethread/unix/deThreadUnix.c', + ], + 'deqp_gpu_test_expectations_sources': + [ + 'third_party/gpu_test_expectations/gpu_info.cc', + 'third_party/gpu_test_expectations/gpu_info.h', + 'third_party/gpu_test_expectations/gpu_test_config.cc', + 'third_party/gpu_test_expectations/gpu_test_config.h', + 'third_party/gpu_test_expectations/gpu_test_expectations_parser.cc', + 'third_party/gpu_test_expectations/gpu_test_expectations_parser.h', + ], + 'conditions': + [ + ['(OS=="win" or OS=="linux" or OS=="mac")', + { + # Build the dEQP libraries for all Windows/Linux builds + 'angle_build_deqp_libraries%': 1, + }], + ['((OS=="win" or OS=="linux" or OS=="mac") and angle_build_winrt==0)', + { + # Build the dEQP GoogleTest support helpers for all Windows/Linux builds except WinRT + # GoogleTest doesn't support WinRT + 'angle_build_deqp_gtest_support%': 1, + }], + ['((OS=="win" or OS=="linux" or OS=="mac") and angle_build_winrt==0)', + { + # Build the dEQP executables for all standalone Windows/Linux builds except WinRT + # GYP doesn't support generating standalone WinRT executables + 'angle_build_deqp_executables%': 1, + + # Build the GoogleTest versions of dEQP for all standalone Windows/Linux builds except WinRT + # GoogleTest doesn't support WinRT + 'angle_build_deqp_gtest_executables%': 1, + }], + ['OS=="linux" and use_x11==1', + { + 'deqp_include_dirs': + [ + '<(deqp_path)/framework/platform/x11', + ], + }], + ['OS=="linux"', + { + 'deqp_defines': + [ + # Ask the system headers to expose all the regular function otherwise + # dEQP doesn't compile and produces warnings about implicitly defined + # functions. + # This has to be GNU_SOURCE as on Linux dEQP uses syscall() + '_GNU_SOURCE', + ], + }], + ['OS=="mac"', + { + 'deqp_include_dirs': + [ + '<(deqp_path)/framework/platform/osx', + ], + 'deqp_defines': + [ + # Ask the system headers to expose all the regular function otherwise + # dEQP doesn't compile and produces warnings about implicitly defined + # functions. + '_XOPEN_SOURCE=600', + ], + }], + ['use_ozone==1', + { + 'deqp_defines': + [ + 'ANGLE_USE_OZONE', + ], + }], + ], + }, + 'conditions': + [ + ['angle_build_deqp_libraries==1', + { + 'targets': + [ + { + 'target_name': 'angle_zlib', + 'type': 'static_library', + 'includes': [ '../../gyp/common_defines.gypi', ], + 'include_dirs': + [ + '<(zlib_path)', + ], + 'direct_dependent_settings': + { + 'include_dirs': + [ + '<(zlib_path)', + ], + }, + 'msvs_settings': + { + 'VCCLCompilerTool': + { + 'AdditionalOptions': + [ + '/wd4131', # old-style declarator + '/wd4244', # Conversion from 'type1' to 'type2', possible loss of data + '/wd4324', # structure was padded + '/wd4701', # potentially uninit used + '/wd4996', # deprecated + ], + }, + }, + 'conditions': + [ + ['angle_build_winrt==1', + { + # In zlib, deflate.c/insert_string_sse assumes _MSC_VER is only used for x86 or x64 + # To compile this function for ARM using MSC, we trick it by defining __clang__ + # __clang__ isn't used elsewhere zlib, so this workaround shouldn't impact anything else + 'defines': + [ + '__clang__', + ], + }], + ], + 'sources': + [ + '<(zlib_path)/adler32.c', + '<(zlib_path)/compress.c', + '<(zlib_path)/crc32.c', + '<(zlib_path)/crc32.h', + '<(zlib_path)/deflate.c', + '<(zlib_path)/deflate.h', + '<(zlib_path)/gzclose.c', + '<(zlib_path)/gzguts.h', + '<(zlib_path)/gzlib.c', + '<(zlib_path)/gzread.c', + '<(zlib_path)/gzwrite.c', + '<(zlib_path)/infback.c', + '<(zlib_path)/inffast.c', + '<(zlib_path)/inffast.h', + '<(zlib_path)/inffixed.h', + '<(zlib_path)/inflate.c', + '<(zlib_path)/inflate.h', + '<(zlib_path)/inftrees.c', + '<(zlib_path)/inftrees.h', + '<(zlib_path)/mozzconf.h', + '<(zlib_path)/trees.c', + '<(zlib_path)/trees.h', + '<(zlib_path)/uncompr.c', + '<(zlib_path)/x86.h', + '<(zlib_path)/zconf.h', + '<(zlib_path)/zlib.h', + '<(zlib_path)/zutil.c', + '<(zlib_path)/zutil.h', + '<(zlib_path)/simd_stub.c', + ], + }, + + { + 'target_name': 'angle_libpng', + 'type': 'static_library', + 'includes': [ '../../gyp/common_defines.gypi', ], + 'dependencies': + [ + 'angle_zlib' + ], + 'msvs_settings': + { + 'VCCLCompilerTool': + { + 'AdditionalOptions': + [ + '/wd4018', # signed/unsigned mismatch + '/wd4028', # parameter differs from decl + '/wd4101', # unreferenced local + '/wd4189', # unreferenced but initted + '/wd4244', # Conversion from 'type1' to 'type2', possible loss of data + '/wd4267', # Conversion from 'size_t' to 'type', possible loss of data + ], + }, + }, + 'sources': + [ + '<(libpng_path)/png.c', + '<(libpng_path)/pngerror.c', + '<(libpng_path)/pngget.c', + '<(libpng_path)/pngmem.c', + '<(libpng_path)/pngpread.c', + '<(libpng_path)/pngread.c', + '<(libpng_path)/pngrio.c', + '<(libpng_path)/pngrtran.c', + '<(libpng_path)/pngrutil.c', + '<(libpng_path)/pngset.c', + '<(libpng_path)/pngtrans.c', + '<(libpng_path)/pngwio.c', + '<(libpng_path)/pngwrite.c', + '<(libpng_path)/pngwtran.c', + '<(libpng_path)/pngwutil.c', + ], + }, + ], # targets + }], # angle_build_deqp_libraries==1 + ['angle_build_deqp_libraries==1', + { + 'targets': + [ + { + 'target_name': 'angle_deqp_support', + 'type': 'none', + 'direct_dependent_settings': + { + 'configurations': + { + 'Common_Base': + { + 'msvs_configuration_attributes': + { + # dEQP requires ASCII + 'CharacterSet': '0', + }, + 'msvs_settings': + { + 'VCLinkerTool': + { + 'conditions': + [ + ['angle_build_winrt==0', + { + 'AdditionalDependencies': + [ + 'dbghelp.lib', + 'gdi32.lib', + 'user32.lib', + 'ws2_32.lib', + ], + }], + ['angle_build_winrt==1', + { + # Disable COMDAT optimizations, disabled by default for non-WinRT + 'AdditionalOptions': ['/OPT:NOREF', '/OPT:NOICF'], + # AdditionalDependencies automatically configures the required .libs + 'AdditionalDependencies': + [ + '%(AdditionalDependencies)' + ], + }], + ], + }, + }, + }, + + 'Debug_Base': + { + 'msvs_settings': + { + 'VCCLCompilerTool': + { + 'RuntimeTypeInfo': 'true', # dEQP needs RTTI + }, + }, + }, + + 'Release_Base': + { + 'msvs_settings': + { + 'VCCLCompilerTool': + { + 'RuntimeTypeInfo': 'true', # dEQP needs RTTI + }, + }, + }, + }, + # Re-enable RTTI and exceptions, dEQP needs them. + 'cflags_cc!': + [ + '-fno-exceptions', + '-fno-rtti', + ], + 'include_dirs': ['<@(deqp_include_dirs)'], + 'defines': ['<@(deqp_defines)'], + 'defines!': [ '<@(deqp_undefines)' ], + 'msvs_settings': + { + 'VCCLCompilerTool': + { + 'AdditionalOptions': ['<@(deqp_win_cflags)'], + }, + }, + 'conditions': + [ + ['clang==1', + { + # TODO(jmadill): Remove this once we fix dEQP. + 'cflags_cc': + [ + '-Wno-delete-non-virtual-dtor', + ], + }], + ['OS=="win"', + { + 'cflags': ['<@(deqp_win_cflags)'], + 'cflags_cc': ['<@(deqp_win_cflags)'], + 'include_dirs': + [ + '<(deqp_path)/framework/platform/win32', + ], + }], + ], + }, + 'conditions': + [ + ['angle_build_winrt==1', + { + 'type' : 'shared_library', + }], + ], + }, + + # Compile decpp separately because MSVC ignores the extension of the files when + # outputting the obj file, and later thinks that a decpp obj and another obj are the + # same, ignoring one and eventually producing a link error. The problem occurs for + # example between decpp/deRandom.cpp and debase/deRandom.c + { + 'target_name': 'angle_deqp_decpp', + 'type': 'static_library', + 'dependencies': [ 'angle_deqp_support' ], + 'sources': + [ + '<@(deqp_libtester_decpp_sources)', + ], + # In a chromium build dl is required for deDynamicLibrary + 'conditions': + [ + ['OS=="linux"', + { + 'link_settings': + { + 'libraries': ['-ldl'] + }, + }], + ], + }, + + { + 'target_name': 'angle_deqp_libtester', + 'type': 'static_library', + 'dependencies': + [ + 'angle_deqp_decpp', + 'angle_deqp_support', + 'angle_libpng', + '<(angle_path)/src/angle.gyp:libEGL', + '<(angle_path)/util/util.gyp:angle_util', + ], + 'export_dependent_settings': + [ + 'angle_deqp_support', + '<(angle_path)/util/util.gyp:angle_util', + ], + 'include_dirs': + [ + '<(angle_path)/include', + ], + 'direct_dependent_settings': + { + 'include_dirs': + [ + '<(angle_path)/include', + ], + 'defines': + [ + 'ANGLE_DEQP_LIBTESTER_IMPLEMENTATION', + ], + }, + 'msvs_settings': + { + 'VCCLCompilerTool': + { + 'AdditionalOptions': + [ + '/bigobj', # needed for glsBuiltinPrecisionTests.cpp + '/wd4251', # needed for angle_util STL objects not having DLL interface + ], + }, + }, + 'sources': + [ + '<@(deqp_libtester_sources)', + ], + 'conditions': + [ + ['OS=="mac"', + { + 'direct_dependent_settings': + { + 'xcode_settings': + { + 'DYLIB_INSTALL_NAME_BASE': '@rpath', + }, + }, + }], + ['OS=="win"', + { + 'sources': [ '<@(deqp_libtester_sources_win)', ], + }], + ['OS=="linux" or OS=="mac"', + { + 'sources': [ '<@(deqp_libtester_sources_unix)', ], + }], + ['OS=="linux"', + { + 'link_settings': + { + 'libraries': ['-lrt'] + }, + }], + ], + }, + + { + 'target_name': 'angle_deqp_libgles2', + 'type': 'shared_library', + 'dependencies': + [ + 'angle_deqp_libtester', + ], + 'defines': + [ + 'ANGLE_DEQP_GLES2_TESTS', + ], + 'direct_dependent_settings': + { + 'defines': + [ + 'ANGLE_DEQP_GLES2_TESTS', + ], + }, + 'sources': + [ + '<@(deqp_gles2_sources)', + 'deqp_support/angle_deqp_libtester_main.cpp', + 'deqp_support/tcuANGLEPlatform.cpp', + 'deqp_support/tcuANGLEPlatform.h', + ], + }, + + { + 'target_name': 'angle_deqp_libgles3', + 'type': 'shared_library', + 'dependencies': + [ + 'angle_deqp_libtester', + ], + 'defines': + [ + 'ANGLE_DEQP_GLES3_TESTS', + ], + 'direct_dependent_settings': + { + 'defines': + [ + 'ANGLE_DEQP_GLES3_TESTS', + ], + }, + 'sources': + [ + '<@(deqp_gles3_sources)', + 'deqp_support/angle_deqp_libtester_main.cpp', + 'deqp_support/tcuANGLEPlatform.cpp', + 'deqp_support/tcuANGLEPlatform.h', + ], + }, + + { + 'target_name': 'angle_deqp_libgles31', + 'type': 'shared_library', + 'dependencies': + [ + 'angle_deqp_libtester', + ], + 'defines': + [ + 'ANGLE_DEQP_GLES31_TESTS', + ], + 'direct_dependent_settings': + { + 'defines': + [ + 'ANGLE_DEQP_GLES31_TESTS', + ], + }, + 'sources': + [ + '<@(deqp_gles31_sources)', + 'deqp_support/angle_deqp_libtester_main.cpp', + 'deqp_support/tcuANGLEPlatform.cpp', + 'deqp_support/tcuANGLEPlatform.h', + ], + }, + + { + 'target_name': 'angle_deqp_libegl', + 'type': 'shared_library', + 'dependencies': + [ + 'angle_deqp_libtester', + ], + 'defines': + [ + 'ANGLE_DEQP_EGL_TESTS', + ], + 'direct_dependent_settings': + { + 'defines': + [ + 'ANGLE_DEQP_EGL_TESTS', + ], + }, + 'sources': + [ + '<@(deqp_egl_sources)', + 'deqp_support/angle_deqp_libtester_main.cpp', + 'deqp_support/tcuANGLEPlatform.cpp', + 'deqp_support/tcuANGLEPlatform.h', + ], + }, + ], # targets + }], # angle_build_deqp_libraries + ['angle_build_deqp_executables==1', + { + "targets": + [ + { + 'target_name': 'angle_deqp_gles2_tests', + 'type': 'executable', + 'dependencies': + [ + 'angle_deqp_libgles2', + ], + 'sources': + [ + 'deqp_support/angle_deqp_tests_main.cpp', + ], + }, + + { + 'target_name': 'angle_deqp_gles3_tests', + 'type': 'executable', + 'dependencies': + [ + 'angle_deqp_libgles3', + ], + 'sources': + [ + 'deqp_support/angle_deqp_tests_main.cpp', + ], + }, + + { + 'target_name': 'angle_deqp_gles31_tests', + 'type': 'executable', + 'dependencies': + [ + 'angle_deqp_libgles31', + ], + 'sources': + [ + 'deqp_support/angle_deqp_tests_main.cpp', + ], + }, + + { + 'target_name': 'angle_deqp_egl_tests', + 'type': 'executable', + 'dependencies': + [ + 'angle_deqp_libegl', + ], + 'sources': + [ + 'deqp_support/angle_deqp_tests_main.cpp', + ], + }, + ], # targets + }], # angle_build_deqp_executables + ['angle_build_deqp_gtest_support==1', + { + 'targets': + [ + # Helper target for synching our implementation with chrome's + { + 'target_name': 'angle_deqp_gtest_support', + 'type': 'none', + 'dependencies': + [ + 'angle_test_support', + '<(angle_path)/util/util.gyp:angle_util', + '<(angle_path)/src/angle.gyp:angle_common', + ], + 'export_dependent_settings': + [ + 'angle_test_support', + '<(angle_path)/util/util.gyp:angle_util', + ], + + 'direct_dependent_settings': + { + 'include_dirs': + [ + 'deqp_support', + 'third_party/gpu_test_expectations', + ], + 'sources': + [ + '<@(deqp_gpu_test_expectations_sources)', + 'deqp_support/angle_deqp_gtest.cpp', + ], + + 'defines': + [ + # Re-define the missing Windows macros + '<@(deqp_undefines)', + ], + + 'msvs_settings': + { + 'VCLinkerTool': + { + 'AdditionalDependencies': + [ + 'user32.lib', + ], + }, + }, + + 'conditions': + [ + # NOTE(smcgruer): Guarding with use_libpci allows gyp to run successfully + # on systems without libpci, but the test targets will not compile or link. + ['OS=="linux" and use_libpci==1', + { + 'ldflags': + [ + '<!@(<(pkg-config) --libs-only-L --libs-only-other libpci)', + ], + 'libraries': + [ + '<!@(<(pkg-config) --libs-only-l libpci)', + ], + }], + ['OS=="mac"', + { + 'sources': + [ + 'third_party/gpu_test_expectations/gpu_test_config_mac.mm', + ], + 'link_settings': + { + 'libraries': + [ + '$(SDKROOT)/System/Library/Frameworks/IOKit.framework', + ], + }, + }], + ], + }, + }, + ], # targets + }], # angle_build_deqp_gtest_support + ['angle_build_deqp_gtest_executables==1', + { + "targets": + [ + { + 'target_name': 'angle_deqp_gtest_gles2_tests', + 'type': 'executable', + 'includes': [ '../../gyp/common_defines.gypi', ], + 'dependencies': + [ + 'angle_deqp_gtest_support', + 'angle_deqp_libgles2', + ], + 'sources': + [ + 'deqp_support/angle_deqp_gtest_main.cpp', + ], + }, + + { + 'target_name': 'angle_deqp_gtest_gles3_tests', + 'type': 'executable', + 'includes': [ '../../gyp/common_defines.gypi', ], + 'dependencies': + [ + 'angle_deqp_gtest_support', + 'angle_deqp_libgles3', + ], + 'sources': + [ + 'deqp_support/angle_deqp_gtest_main.cpp', + ], + }, + + { + 'target_name': 'angle_deqp_gtest_gles31_tests', + 'type': 'executable', + 'includes': [ '../../gyp/common_defines.gypi', ], + 'dependencies': + [ + 'angle_deqp_gtest_support', + 'angle_deqp_libgles31', + ], + 'sources': + [ + 'deqp_support/angle_deqp_gtest_main.cpp', + ], + }, + + { + 'target_name': 'angle_deqp_gtest_egl_tests', + 'type': 'executable', + 'includes': [ '../../gyp/common_defines.gypi', ], + 'dependencies': + [ + 'angle_deqp_gtest_support', + 'angle_deqp_libegl', + ], + 'sources': + [ + 'deqp_support/angle_deqp_gtest_main.cpp', + ], + }, + ], # targets + }], # angle_build_deqp_gtest_executables + ], # conditions +} diff --git a/gfx/angle/src/tests/deqp_support/angle_deqp_gtest.cpp b/gfx/angle/src/tests/deqp_support/angle_deqp_gtest.cpp new file mode 100755 index 000000000..89f3f8a42 --- /dev/null +++ b/gfx/angle/src/tests/deqp_support/angle_deqp_gtest.cpp @@ -0,0 +1,453 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// angle_deqp_gtest: +// dEQP and GoogleTest integration logic. Calls through to the random +// order executor. + +#include <fstream> +#include <stdint.h> + +#include <gtest/gtest.h> + +#include "angle_deqp_libtester.h" +#include "common/angleutils.h" +#include "common/debug.h" +#include "common/Optional.h" +#include "common/platform.h" +#include "common/string_utils.h" +#include "gpu_test_expectations_parser.h" +#include "system_utils.h" + +namespace +{ + +#if defined(ANGLE_PLATFORM_ANDROID) +const char *g_CaseListRelativePath = + "/../../sdcard/chromium_tests_root/third_party/deqp/src/android/cts/master/"; +#else +const char *g_CaseListRelativePath = "/../../third_party/deqp/src/android/cts/master/"; +#endif + +const char *g_TestExpectationsSearchPaths[] = { + "/../../src/tests/deqp_support/", "/../../third_party/angle/src/tests/deqp_support/", + "/deqp_support/", "/../../sdcard/chromium_tests_root/third_party/angle/src/tests/deqp_support/", +}; + +const char *g_CaseListFiles[] = { + "gles2-master.txt", "gles3-master.txt", "gles31-master.txt", "egl-master.txt", +}; + +const char *g_TestExpectationsFiles[] = { + "deqp_gles2_test_expectations.txt", "deqp_gles3_test_expectations.txt", + "deqp_gles31_test_expectations.txt", "deqp_egl_test_expectations.txt", +}; + +using APIInfo = std::pair<const char *, gpu::GPUTestConfig::API>; + +const APIInfo g_eglDisplayAPIs[] = { + {"angle-d3d9", gpu::GPUTestConfig::kAPID3D9}, + {"angle-d3d11", gpu::GPUTestConfig::kAPID3D11}, + {"angle-gl", gpu::GPUTestConfig::kAPIGLDesktop}, + {"angle-gles", gpu::GPUTestConfig::kAPIGLES}, +}; + +const APIInfo *g_initAPI = nullptr; + +// Returns the default API for a platform. +const char *GetDefaultAPIName() +{ +#if defined(ANGLE_PLATFORM_WINDOWS) + return "angle-d3d11"; +#elif defined(ANGLE_PLATFORM_APPLE) || defined(ANGLE_PLATFORM_LINUX) + return "angle-gl"; +#elif defined(ANGLE_PLATFORM_ANDROID) + return "angle-gles"; +#else +#error Unknown platform. +#endif +} + +const APIInfo *FindAPIInfo(const std::string &arg) +{ + for (auto &displayAPI : g_eglDisplayAPIs) + { + if (arg == displayAPI.first) + { + return &displayAPI; + } + } + return nullptr; +} + +const APIInfo *GetDefaultAPIInfo() +{ + const APIInfo *defaultInfo = FindAPIInfo(GetDefaultAPIName()); + ASSERT(defaultInfo); + return defaultInfo; +} + +// During the CaseList initialization we cannot use the GTEST FAIL macro to quit the program because +// the initialization is called outside of tests the first time. +void Die() +{ + exit(EXIT_FAILURE); +} + +Optional<std::string> FindTestExpectationsPath(const std::string &exeDir, + size_t testModuleIndex) +{ + for (const char *testPath : g_TestExpectationsSearchPaths) + { + std::stringstream testExpectationsPathStr; + testExpectationsPathStr << exeDir << testPath << g_TestExpectationsFiles[testModuleIndex]; + + std::string path = testExpectationsPathStr.str(); + std::ifstream inFile(path.c_str()); + if (!inFile.fail()) + { + inFile.close(); + return Optional<std::string>(path); + } + } + + return Optional<std::string>::Invalid(); +} + +class dEQPCaseList +{ + public: + dEQPCaseList(size_t testModuleIndex); + + struct CaseInfo + { + CaseInfo(const std::string &dEQPName, + const std::string &gTestName, + int expectation) + : mDEQPName(dEQPName), + mGTestName(gTestName), + mExpectation(expectation) + { + } + + std::string mDEQPName; + std::string mGTestName; + int mExpectation; + }; + + void initialize(); + + const CaseInfo &getCaseInfo(size_t caseIndex) const + { + ASSERT(mInitialized); + ASSERT(caseIndex < mCaseInfoList.size()); + return mCaseInfoList[caseIndex]; + } + + size_t numCases() const + { + ASSERT(mInitialized); + return mCaseInfoList.size(); + } + + private: + std::vector<CaseInfo> mCaseInfoList; + gpu::GPUTestExpectationsParser mTestExpectationsParser; + gpu::GPUTestBotConfig mTestConfig; + size_t mTestModuleIndex; + bool mInitialized; +}; + +dEQPCaseList::dEQPCaseList(size_t testModuleIndex) + : mTestModuleIndex(testModuleIndex), + mInitialized(false) +{ +} + +void dEQPCaseList::initialize() +{ + if (mInitialized) + { + return; + } + + mInitialized = true; + + std::string exeDir = angle::GetExecutableDirectory(); + + std::stringstream caseListPathStr; + caseListPathStr << exeDir << g_CaseListRelativePath << g_CaseListFiles[mTestModuleIndex]; + std::string caseListPath = caseListPathStr.str(); + + Optional<std::string> testExpectationsPath = FindTestExpectationsPath(exeDir, mTestModuleIndex); + if (!testExpectationsPath.valid()) + { + std::cerr << "Failed to find test expectations file." << std::endl; + Die(); + } + + if (!mTestExpectationsParser.LoadTestExpectationsFromFile(testExpectationsPath.value())) + { + std::stringstream errorMsgStream; + for (const auto &message : mTestExpectationsParser.GetErrorMessages()) + { + errorMsgStream << std::endl << " " << message; + } + + std::cerr << "Failed to load test expectations." << errorMsgStream.str() << std::endl; + Die(); + } + + if (!mTestConfig.LoadCurrentConfig(nullptr)) + { + std::cerr << "Failed to load test configuration." << std::endl; + Die(); + } + + // Set the API from the command line, or using the default platform API. + if (g_initAPI) + { + mTestConfig.set_api(g_initAPI->second); + } + else + { + mTestConfig.set_api(GetDefaultAPIInfo()->second); + } + + std::ifstream caseListStream(caseListPath); + if (caseListStream.fail()) + { + std::cerr << "Failed to load the case list." << std::endl; + Die(); + } + + while (!caseListStream.eof()) + { + std::string inString; + std::getline(caseListStream, inString); + + std::string dEQPName = angle::TrimString(inString, angle::kWhitespaceASCII); + if (dEQPName.empty()) + continue; + std::string gTestName = dEQPName.substr(dEQPName.find('.') + 1); + if (gTestName.empty()) + continue; + std::replace(gTestName.begin(), gTestName.end(), '.', '_'); + + // Occurs in some luminance tests + gTestName.erase(std::remove(gTestName.begin(), gTestName.end(), '-'), gTestName.end()); + + int expectation = mTestExpectationsParser.GetTestExpectation(dEQPName, mTestConfig); + if (expectation != gpu::GPUTestExpectationsParser::kGpuTestSkip) + { + mCaseInfoList.push_back(CaseInfo(dEQPName, gTestName, expectation)); + } + } +} + +template <size_t TestModuleIndex> +class dEQPTest : public testing::TestWithParam<size_t> +{ + public: + static testing::internal::ParamGenerator<size_t> GetTestingRange() + { + return testing::Range<size_t>(0, GetCaseList().numCases()); + } + + static std::string GetCaseGTestName(size_t caseIndex) + { + const auto &caseInfo = GetCaseList().getCaseInfo(caseIndex); + return caseInfo.mGTestName; + } + + static const dEQPCaseList &GetCaseList() + { + static dEQPCaseList sCaseList(TestModuleIndex); + sCaseList.initialize(); + return sCaseList; + } + + static void SetUpTestCase(); + static void TearDownTestCase(); + + protected: + void runTest() + { + const auto &caseInfo = GetCaseList().getCaseInfo(GetParam()); + std::cout << caseInfo.mDEQPName << std::endl; + + bool result = deqp_libtester_run(caseInfo.mDEQPName.c_str()); + + if (caseInfo.mExpectation == gpu::GPUTestExpectationsParser::kGpuTestPass) + { + EXPECT_TRUE(result); + sPasses += (result ? 1u : 0u); + sFails += (!result ? 1u : 0u); + } + else if (result) + { + std::cout << "Test expected to fail but passed!" << std::endl; + sUnexpectedPasses++; + } + else + { + sFails++; + } + } + + static unsigned int sPasses; + static unsigned int sFails; + static unsigned int sUnexpectedPasses; +}; + +template <size_t TestModuleIndex> +unsigned int dEQPTest<TestModuleIndex>::sPasses = 0; +template <size_t TestModuleIndex> +unsigned int dEQPTest<TestModuleIndex>::sFails = 0; +template <size_t TestModuleIndex> +unsigned int dEQPTest<TestModuleIndex>::sUnexpectedPasses = 0; + +// static +template <size_t TestModuleIndex> +void dEQPTest<TestModuleIndex>::SetUpTestCase() +{ + sPasses = 0; + sFails = 0; + sUnexpectedPasses = 0; + + int argc = 0; + std::vector<const char *> argv; + + // Reserve one argument for the binary name. + argc++; + argv.push_back(""); + + // Add init api. + argc++; + argv.push_back(g_initAPI ? g_initAPI->first : GetDefaultAPIName()); + + // Init the platform. + if (!deqp_libtester_init_platform(argc, argv.data())) + { + std::cout << "Aborting test due to dEQP initialization error." << std::endl; + exit(1); + } +} + +// static +template <size_t TestModuleIndex> +void dEQPTest<TestModuleIndex>::TearDownTestCase() +{ + unsigned int total = sPasses + sFails; + float passFrac = static_cast<float>(sPasses) / static_cast<float>(total) * 100.0f; + float failFrac = static_cast<float>(sFails) / static_cast<float>(total) * 100.0f; + std::cout << "Passed: " << sPasses << "/" << total << " tests. (" << passFrac << "%)" + << std::endl; + if (sFails > 0) + { + std::cout << "Failed: " << sFails << "/" << total << " tests. (" << failFrac << "%)" + << std::endl; + } + if (sUnexpectedPasses > 0) + { + std::cout << sUnexpectedPasses << " tests unexpectedly passed." << std::endl; + } + + deqp_libtester_shutdown_platform(); +} + +#define ANGLE_INSTANTIATE_DEQP_TEST_CASE(DEQP_TEST, N) \ + class DEQP_TEST : public dEQPTest<N> \ + { \ + }; \ + TEST_P(DEQP_TEST, Default) { runTest(); } \ + \ + INSTANTIATE_TEST_CASE_P(, DEQP_TEST, DEQP_TEST::GetTestingRange(), \ + [](const testing::TestParamInfo<size_t> &info) { \ + return DEQP_TEST::GetCaseGTestName(info.param); \ + }) + +#ifdef ANGLE_DEQP_GLES2_TESTS +ANGLE_INSTANTIATE_DEQP_TEST_CASE(dEQP_GLES2, 0); +#endif + +#ifdef ANGLE_DEQP_GLES3_TESTS +ANGLE_INSTANTIATE_DEQP_TEST_CASE(dEQP_GLES3, 1); +#endif + +#ifdef ANGLE_DEQP_GLES31_TESTS +ANGLE_INSTANTIATE_DEQP_TEST_CASE(dEQP_GLES31, 2); +#endif + +#ifdef ANGLE_DEQP_EGL_TESTS +ANGLE_INSTANTIATE_DEQP_TEST_CASE(dEQP_EGL, 3); +#endif + +const char *g_deqpEGLString = "--deqp-egl-display-type="; +const char *g_angleEGLString = "--use-angle="; + +void HandleDisplayType(const char *displayTypeString) +{ + std::stringstream argStream; + + if (g_initAPI) + { + std::cout << "Cannot specify two EGL displays!" << std::endl; + exit(1); + } + + if (strncmp(displayTypeString, "angle-", strlen("angle-")) != 0) + { + argStream << "angle-"; + } + + argStream << displayTypeString; + std::string arg = argStream.str(); + + g_initAPI = FindAPIInfo(arg); + + if (!g_initAPI) + { + std::cout << "Unknown ANGLE back-end API: " << displayTypeString << std::endl; + exit(1); + } +} + +void DeleteArg(int *argc, int argIndex, char **argv) +{ + (*argc)--; + for (int moveIndex = argIndex; moveIndex < *argc; ++moveIndex) + { + argv[moveIndex] = argv[moveIndex + 1]; + } +} + +} // anonymous namespace + +// Called from main() to process command-line arguments. +namespace angle +{ +void InitTestHarness(int *argc, char **argv) +{ + int argIndex = 0; + while (argIndex < *argc) + { + if (strncmp(argv[argIndex], g_deqpEGLString, strlen(g_deqpEGLString)) == 0) + { + HandleDisplayType(argv[argIndex] + strlen(g_deqpEGLString)); + DeleteArg(argc, argIndex, argv); + } + else if (strncmp(argv[argIndex], g_angleEGLString, strlen(g_angleEGLString)) == 0) + { + HandleDisplayType(argv[argIndex] + strlen(g_angleEGLString)); + DeleteArg(argc, argIndex, argv); + } + else + { + argIndex++; + } + } +} +} // namespace angle diff --git a/gfx/angle/src/tests/deqp_support/angle_deqp_gtest_main.cpp b/gfx/angle/src/tests/deqp_support/angle_deqp_gtest_main.cpp new file mode 100755 index 000000000..e72417f0a --- /dev/null +++ b/gfx/angle/src/tests/deqp_support/angle_deqp_gtest_main.cpp @@ -0,0 +1,24 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// angle_deqp_gtest_main: +// Entry point for standalone dEQP tests. + +#include <gtest/gtest.h> + +// Defined in angle_deqp_gtest.cpp. Declared here so we don't need to make a header that we import +// in Chromium. +namespace angle +{ +void InitTestHarness(int *argc, char **argv); +} // namespace angle + +int main(int argc, char **argv) +{ + angle::InitTestHarness(&argc, argv); + testing::InitGoogleTest(&argc, argv); + int rt = RUN_ALL_TESTS(); + return rt; +} diff --git a/gfx/angle/src/tests/deqp_support/angle_deqp_libtester.h b/gfx/angle/src/tests/deqp_support/angle_deqp_libtester.h new file mode 100755 index 000000000..7f35ddb06 --- /dev/null +++ b/gfx/angle/src/tests/deqp_support/angle_deqp_libtester.h @@ -0,0 +1,35 @@ +// +// Copyright(c) 2014 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +// angle_deqp_libtester.h: +// Exports for the ANGLE dEQP libtester module. + +#ifndef ANGLE_DEQP_LIBTESTER_H_ +#define ANGLE_DEQP_LIBTESTER_H_ + +#if defined(_WIN32) +# if defined(ANGLE_DEQP_LIBTESTER_IMPLEMENTATION) +# define ANGLE_LIBTESTER_EXPORT __declspec(dllexport) +# else +# define ANGLE_LIBTESTER_EXPORT __declspec(dllimport) +# endif +#elif defined(__GNUC__) +# if defined(ANGLE_DEQP_LIBTESTER_IMPLEMENTATION) +# define ANGLE_LIBTESTER_EXPORT __attribute__((visibility ("default"))) +# else +# define ANGLE_LIBTESTER_EXPORT +# endif +#else +# define ANGLE_LIBTESTER_EXPORT +#endif + +// Exported to the tester app. +ANGLE_LIBTESTER_EXPORT int deqp_libtester_main(int argc, const char *argv[]); +ANGLE_LIBTESTER_EXPORT bool deqp_libtester_init_platform(int argc, const char *argv[]); +ANGLE_LIBTESTER_EXPORT void deqp_libtester_shutdown_platform(); +ANGLE_LIBTESTER_EXPORT bool deqp_libtester_run(const char *caseName); + +#endif // ANGLE_DEQP_LIBTESTER_H_ diff --git a/gfx/angle/src/tests/deqp_support/angle_deqp_libtester_main.cpp b/gfx/angle/src/tests/deqp_support/angle_deqp_libtester_main.cpp new file mode 100755 index 000000000..90727f390 --- /dev/null +++ b/gfx/angle/src/tests/deqp_support/angle_deqp_libtester_main.cpp @@ -0,0 +1,250 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// deqp_libtester_main.cpp: Entry point for tester DLL. + +#include <cstdio> +#include <iostream> + +#include "angle_deqp_libtester.h" +#include "common/angleutils.h" +#include "deMath.h" +#include "deUniquePtr.hpp" +#include "tcuApp.hpp" +#include "tcuCommandLine.hpp" +#include "tcuDefs.hpp" +#include "tcuPlatform.hpp" +#include "tcuRandomOrderExecutor.h" +#include "tcuResource.hpp" +#include "tcuTestLog.hpp" +#include "system_utils.h" + +#if (DE_OS == DE_OS_WIN32) +#include <Windows.h> +#elif (DE_OS == DE_OS_UNIX) || (DE_OS == DE_OS_OSX) +#include <sys/unistd.h> +#include <sys/stat.h> +#include <sys/types.h> +#elif (DE_OS == DE_OS_ANDROID) +#include <sys/stat.h> +#endif + +tcu::Platform *createPlatform(); + +namespace +{ + +tcu::Platform *g_platform = nullptr; +tcu::CommandLine *g_cmdLine = nullptr; +tcu::DirArchive *g_archive = nullptr; +tcu::TestLog *g_log = nullptr; +tcu::TestContext *g_testCtx = nullptr; +tcu::TestPackageRoot *g_root = nullptr; +tcu::RandomOrderExecutor *g_executor = nullptr; + +const char *g_dEQPDataSearchDirs[] = { + "data", + "third_party/deqp/data", + "../third_party/deqp/src/data", + "deqp_support/data", + "third_party/deqp/src/data", + "../../third_party/deqp/src/data", + "../../../third_party/deqp/src/data", + "../../sdcard/chromium_tests_root/third_party/deqp/src/data", +}; + +// TODO(jmadill): upstream to dEQP? +#if (DE_OS == DE_OS_WIN32) +deBool deIsDir(const char *filename) +{ + WIN32_FILE_ATTRIBUTE_DATA fileInformation; + + BOOL result = GetFileAttributesExA(filename, GetFileExInfoStandard, &fileInformation); + if (result) + { + DWORD attribs = fileInformation.dwFileAttributes; + return (attribs != INVALID_FILE_ATTRIBUTES) && ((attribs & FILE_ATTRIBUTE_DIRECTORY) > 0); + } + + return false; +} +#elif (DE_OS == DE_OS_UNIX) || (DE_OS == DE_OS_OSX) || (DE_OS == DE_OS_ANDROID) +deBool deIsDir(const char *filename) +{ + struct stat st; + int result = stat(filename, &st); + return result == 0 && ((st.st_mode & S_IFDIR) == S_IFDIR); +} +#else +#error TODO(jmadill): support other platforms +#endif + +bool FindDataDir(std::string *dataDirOut) +{ + for (auto searchDir : g_dEQPDataSearchDirs) + { + if (deIsDir((std::string(searchDir) + "/gles2").c_str())) + { + *dataDirOut = searchDir; + return true; + } + + std::stringstream dirStream; + dirStream << angle::GetExecutableDirectory() << "/" << searchDir; + std::string dataDir = dirStream.str(); + dirStream << "/gles2"; + std::string searchPath = dirStream.str(); + + if (deIsDir(searchPath.c_str())) + { + *dataDirOut = dataDir; + return true; + } + } + + return false; +} + +std::string GetLogFileName(std::string deqpDataDir) +{ +#if (DE_OS == DE_OS_ANDROID) + // On Android executable dir is not writable, so use data dir instead + return deqpDataDir + "/" + g_cmdLine->getLogFileName(); +#else + return g_cmdLine->getLogFileName(); +#endif +} + +} // anonymous namespace + +ANGLE_LIBTESTER_EXPORT bool deqp_libtester_init_platform(int argc, const char *argv[]) +{ + try + { +#if (DE_OS != DE_OS_WIN32) + // Set stdout to line-buffered mode (will be fully buffered by default if stdout is pipe). + setvbuf(stdout, DE_NULL, _IOLBF, 4 * 1024); +#endif + g_platform = createPlatform(); + + if (!deSetRoundingMode(DE_ROUNDINGMODE_TO_NEAREST)) + { + std::cout << "Failed to set floating point rounding mode." << std::endl; + return false; + } + + std::string deqpDataDir; + if (!FindDataDir(&deqpDataDir)) + { + std::cout << "Failed to find dEQP data directory." << std::endl; + return false; + } + + g_cmdLine = new tcu::CommandLine(argc, argv); + g_archive = new tcu::DirArchive(deqpDataDir.c_str()); + g_log = new tcu::TestLog(GetLogFileName(deqpDataDir).c_str(), g_cmdLine->getLogFlags()); + g_testCtx = new tcu::TestContext(*g_platform, *g_archive, *g_log, *g_cmdLine, DE_NULL); + g_root = new tcu::TestPackageRoot(*g_testCtx, tcu::TestPackageRegistry::getSingleton()); + g_executor = new tcu::RandomOrderExecutor(*g_root, *g_testCtx); + } + catch (const std::exception& e) + { + tcu::die("%s", e.what()); + return false; + } + + return true; +} + +// Exported to the tester app. +ANGLE_LIBTESTER_EXPORT int deqp_libtester_main(int argc, const char *argv[]) +{ + if (!deqp_libtester_init_platform(argc, argv)) + { + tcu::die("Could not initialize the dEQP platform"); + } + + try + { + de::UniquePtr<tcu::App> app(new tcu::App(*g_platform, *g_archive, *g_log, *g_cmdLine)); + + // Main loop. + for (;;) + { + if (!app->iterate()) + break; + } + } + catch (const std::exception &e) + { + deqp_libtester_shutdown_platform(); + tcu::die("%s", e.what()); + } + + deqp_libtester_shutdown_platform(); + return 0; +} + +ANGLE_LIBTESTER_EXPORT void deqp_libtester_shutdown_platform() +{ + delete g_executor; + g_executor = nullptr; + delete g_root; + g_root = nullptr; + delete g_testCtx; + g_testCtx = nullptr; + delete g_log; + g_log = nullptr; + delete g_archive; + g_archive = nullptr; + delete g_cmdLine; + g_cmdLine = nullptr; + delete g_platform; + g_platform = nullptr; +} + +ANGLE_LIBTESTER_EXPORT bool deqp_libtester_run(const char *caseName) +{ + const char *emptyString = ""; + if (g_platform == nullptr && !deqp_libtester_init_platform(1, &emptyString)) + { + tcu::die("Failed to initialize platform."); + } + + try + { + // Poll platform events + const bool platformOk = g_platform->processEvents(); + + if (platformOk) + { + const tcu::TestStatus &result = g_executor->execute(caseName); + switch (result.getCode()) + { + case QP_TEST_RESULT_PASS: + case QP_TEST_RESULT_NOT_SUPPORTED: + return true; + case QP_TEST_RESULT_QUALITY_WARNING: + std::cout << "Quality warning! " << result.getDescription() << std::endl; + return true; + case QP_TEST_RESULT_COMPATIBILITY_WARNING: + std::cout << "Compatiblity warning! " << result.getDescription() << std::endl; + return true; + default: + return false; + } + } + else + { + std::cout << "Aborted test!" << std::endl; + } + } + catch (const std::exception &e) + { + std::cout << "Exception running test: " << e.what() << std::endl; + } + + return false; +} diff --git a/gfx/angle/src/tests/deqp_support/angle_deqp_tests_main.cpp b/gfx/angle/src/tests/deqp_support/angle_deqp_tests_main.cpp new file mode 100755 index 000000000..468f1c1cf --- /dev/null +++ b/gfx/angle/src/tests/deqp_support/angle_deqp_tests_main.cpp @@ -0,0 +1,14 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +// angle_deqp_tests_main.cpp: Entry point for ANGLE's dEQP tests. + +#include "angle_deqp_libtester.h" + +int main(int argc, const char *argv[]) +{ + return deqp_libtester_main(argc, argv); +} diff --git a/gfx/angle/src/tests/deqp_support/deqp_egl_test_expectations.txt b/gfx/angle/src/tests/deqp_support/deqp_egl_test_expectations.txt new file mode 100755 index 000000000..789d3a6fe --- /dev/null +++ b/gfx/angle/src/tests/deqp_support/deqp_egl_test_expectations.txt @@ -0,0 +1,260 @@ +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This file contains a list of defective dEQP conformance tests. The expected +// format is: +// {BUG#} {MODIFIERS} : {TEST_NAME} = {PASS,FAIL,FLAKY,TIMEOUT,SKIP} +// +// MODIFIERS can be a combination of the below list: +// WIN XP VISTA WIN7 MAC LEOPARD SNOWLEOPARD LION LINUX CHROMEOS MOUNTAINLION +// MAVERICKS +// NVIDIA AMD INTEL +// 0xabcd - GPU PCI device ID. Specifying a PCI id requires a vendor. +// DEBUG RELEASE +// TODO(jmadill): Add ANGLE Renderer selection modifiers +// +// TEST_NAME can be a specific test name, or have a '*' in the end, which +// indicates a prefix matching. +// +// Examples: +// 91530 MAC WIN LINUX : context_lost_restored = TIMEOUT +// 91533 WIN : gl_min_uniforms = FAIL +// 91531 MAC WIN LINUX : conformance_more_* = SKIP +// 91532 MAC NVIDIA 0x0640 : tex_image_and_sub_image_2d_with_video = PASS FAIL + +// ANGLE does not yet support multithreading +1340 WIN MAC LINUX : dEQP-EGL.functional.sharing.gles2.multithread.* = SKIP +1340 WIN MAC LINUX : dEQP-EGL.functional.multithread.* = SKIP +1340 WIN MAC LINUX : dEQP-EGL.functional.render.multi_thread.* = SKIP + +//////////////////////////////////////////////////////////////////////////////// +// +// Temprory entries: they should be removed once the bugs are fixed. +// +//////////////////////////////////////////////////////////////////////////////// + +// TODO(jmadill): Triage these into permananent and temporary failures. +1340 WIN : dEQP-EGL.functional.query_surface.simple.window.rgb565_no_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.simple.window.rgb565_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.simple.window.rgb565_depth_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.simple.window.rgb888_no_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.simple.window.rgb888_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.simple.window.rgb888_depth_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.simple.window.rgba4444_no_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.simple.window.rgba4444_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.simple.window.rgba4444_depth_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.simple.window.rgba5551_no_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.simple.window.rgba5551_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.simple.window.rgba5551_depth_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.simple.window.rgba8888_no_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.simple.window.rgba8888_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.simple.window.rgba8888_depth_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.simple.pbuffer.rgb565_no_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.simple.pbuffer.rgb565_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.simple.pbuffer.rgb565_depth_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.simple.pbuffer.rgb888_no_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.simple.pbuffer.rgb888_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.simple.pbuffer.rgb888_depth_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.simple.pbuffer.rgba4444_no_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.simple.pbuffer.rgba4444_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.simple.pbuffer.rgba4444_depth_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.simple.pbuffer.rgba5551_no_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.simple.pbuffer.rgba5551_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.simple.pbuffer.rgba5551_depth_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.simple.pbuffer.rgba8888_no_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.simple.pbuffer.rgba8888_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.simple.pbuffer.rgba8888_depth_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.set_attribute.window.rgb565_no_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.set_attribute.window.rgb565_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.set_attribute.window.rgb565_depth_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.set_attribute.window.rgb888_no_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.set_attribute.window.rgb888_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.set_attribute.window.rgb888_depth_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.set_attribute.window.rgba4444_no_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.set_attribute.window.rgba4444_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.set_attribute.window.rgba4444_depth_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.set_attribute.window.rgba5551_no_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.set_attribute.window.rgba5551_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.set_attribute.window.rgba5551_depth_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.set_attribute.window.rgba8888_no_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.set_attribute.window.rgba8888_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.set_attribute.window.rgba8888_depth_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.set_attribute.pbuffer.rgb565_no_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.set_attribute.pbuffer.rgb565_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.set_attribute.pbuffer.rgb565_depth_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.set_attribute.pbuffer.rgb888_no_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.set_attribute.pbuffer.rgb888_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.set_attribute.pbuffer.rgb888_depth_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.set_attribute.pbuffer.rgba4444_no_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.set_attribute.pbuffer.rgba4444_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.set_attribute.pbuffer.rgba4444_depth_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.set_attribute.pbuffer.rgba5551_no_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.set_attribute.pbuffer.rgba5551_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.set_attribute.pbuffer.rgba5551_depth_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.set_attribute.pbuffer.rgba8888_no_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.set_attribute.pbuffer.rgba8888_depth_no_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_surface.set_attribute.pbuffer.rgba8888_depth_stencil = SKIP +1340 WIN : dEQP-EGL.functional.query_config.get_configs.get_configs_bounds = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_only.buffer_size = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_only.red_size = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_only.green_size = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_only.blue_size = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_only.luminance_size = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_only.alpha_size = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_only.alpha_mask_size = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_only.bind_to_texture_rgb = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_only.bind_to_texture_rgba = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_only.color_buffer_type = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_only.config_caveat = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_only.config_id = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_only.depth_size = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_only.level = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_only.max_swap_interval = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_only.min_swap_interval = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_only.native_renderable = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_only.native_visual_type = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_only.sample_buffers = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_only.samples = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_only.stencil_size = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_only.surface_type = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_only.transparent_red_value = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_only.transparent_green_value = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_only.transparent_blue_value = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_and_sort.buffer_size = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_and_sort.red_size = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_and_sort.green_size = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_and_sort.blue_size = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_and_sort.luminance_size = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_and_sort.alpha_size = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_and_sort.alpha_mask_size = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_and_sort.bind_to_texture_rgb = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_and_sort.bind_to_texture_rgba = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_and_sort.color_buffer_type = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_and_sort.config_caveat = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_and_sort.config_id = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_and_sort.depth_size = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_and_sort.level = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_and_sort.max_swap_interval = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_and_sort.min_swap_interval = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_and_sort.native_renderable = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_and_sort.native_visual_type = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_and_sort.sample_buffers = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_and_sort.samples = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_and_sort.stencil_size = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_and_sort.surface_type = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_and_sort.transparent_red_value = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_and_sort.transparent_green_value = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.simple.selection_and_sort.transparent_blue_value = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.random.color_sizes = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.random.color_depth_stencil_sizes = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.random.buffer_sizes = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.random.surface_type = FAIL +1340 WIN : dEQP-EGL.functional.choose_config.random.sample_buffers = FAIL +1340 WIN : dEQP-EGL.functional.render.single_context.gles2.rgba5551_window = FAIL +1340 WIN : dEQP-EGL.functional.render.single_context.gles2.rgba5551_pbuffer = FAIL +1340 WIN : dEQP-EGL.functional.render.single_context.gles3.rgba5551_window = FAIL +1340 WIN : dEQP-EGL.functional.render.single_context.gles3.rgba5551_pbuffer = FAIL +1340 WIN : dEQP-EGL.functional.render.multi_context.gles2.rgba5551_window = FAIL +1340 WIN : dEQP-EGL.functional.render.multi_context.gles2.rgba5551_pbuffer = FAIL +1340 WIN : dEQP-EGL.functional.render.multi_context.gles3.rgba5551_window = FAIL +1340 WIN : dEQP-EGL.functional.render.multi_context.gles3.rgba5551_pbuffer = FAIL +1340 WIN : dEQP-EGL.functional.render.multi_context.gles2_gles3.rgba5551_window = FAIL +1340 WIN : dEQP-EGL.functional.render.multi_context.gles2_gles3.rgba5551_pbuffer = FAIL +1340 WIN : dEQP-EGL.functional.image.modify.tex_rgb8_tex_subimage_rgb565 = FAIL +1340 WIN : dEQP-EGL.functional.image.modify.tex_rgb565_tex_subimage_rgb8 = FAIL +1340 WIN : dEQP-EGL.functional.image.modify.tex_rgba8_tex_subimage_rgba5_a1 = FAIL +1340 WIN : dEQP-EGL.functional.image.modify.tex_rgba8_tex_subimage_rgba4 = FAIL +1340 WIN : dEQP-EGL.functional.image.modify.tex_rgba5_a1_tex_subimage_rgba8 = FAIL +1340 WIN : dEQP-EGL.functional.image.modify.tex_rgba5_a1_tex_subimage_rgba4 = FAIL +1340 WIN : dEQP-EGL.functional.image.modify.tex_rgba4_tex_subimage_rgba8 = FAIL +1340 WIN : dEQP-EGL.functional.image.modify.tex_rgba4_tex_subimage_rgba5_a1 = FAIL +1340 WIN : dEQP-EGL.functional.image.modify.renderbuffer_rgba4_tex_subimage_rgba8 = FAIL +1340 WIN : dEQP-EGL.functional.image.modify.renderbuffer_rgba4_tex_subimage_rgba5_a1 = FAIL +1340 WIN : dEQP-EGL.functional.image.modify.renderbuffer_rgb5_a1_tex_subimage_rgba8 = FAIL +1340 WIN : dEQP-EGL.functional.image.modify.renderbuffer_rgb5_a1_tex_subimage_rgba4 = FAIL +1340 WIN : dEQP-EGL.functional.image.modify.renderbuffer_rgb565_tex_subimage_rgb8 = FAIL +1340 WIN : dEQP-EGL.functional.negative_api.choose_config = SKIP +1340 WIN : dEQP-EGL.functional.negative_api.get_display = FAIL +1340 WIN : dEQP-EGL.functional.negative_api.surface_attrib = SKIP +1340 WIN : dEQP-EGL.functional.negative_api.swap_interval = FAIL +1340 WIN : dEQP-EGL.functional.swap_buffers.rgb565_no_depth_no_stencil = FAIL +1340 WIN : dEQP-EGL.functional.swap_buffers.rgb565_depth_no_stencil = FAIL +1340 WIN : dEQP-EGL.functional.swap_buffers.rgb565_depth_stencil = FAIL +1340 WIN : dEQP-EGL.functional.swap_buffers.rgb888_no_depth_no_stencil = FAIL +1340 WIN : dEQP-EGL.functional.swap_buffers.rgb888_depth_no_stencil = FAIL +1340 WIN : dEQP-EGL.functional.swap_buffers.rgb888_depth_stencil = FAIL +1340 WIN : dEQP-EGL.functional.swap_buffers.rgba4444_no_depth_no_stencil = FAIL +1340 WIN : dEQP-EGL.functional.swap_buffers.rgba4444_depth_no_stencil = FAIL +1340 WIN : dEQP-EGL.functional.swap_buffers.rgba4444_depth_stencil = FAIL +1340 WIN : dEQP-EGL.functional.swap_buffers.rgba5551_no_depth_no_stencil = FAIL +1340 WIN : dEQP-EGL.functional.swap_buffers.rgba5551_depth_no_stencil = FAIL +1340 WIN : dEQP-EGL.functional.swap_buffers.rgba5551_depth_stencil = FAIL +1340 WIN : dEQP-EGL.functional.swap_buffers.rgba8888_no_depth_no_stencil = FAIL +1340 WIN : dEQP-EGL.functional.swap_buffers.rgba8888_depth_no_stencil = FAIL +1340 WIN : dEQP-EGL.functional.swap_buffers.rgba8888_depth_stencil = FAIL +1340 WIN : dEQP-EGL.functional.native_color_mapping.native_window.rgb565_no_depth_no_stencil_clear = FAIL +1340 WIN : dEQP-EGL.functional.native_color_mapping.native_window.rgb565_no_depth_no_stencil_render = FAIL +1340 WIN : dEQP-EGL.functional.native_color_mapping.native_window.rgb565_depth_no_stencil_clear = FAIL +1340 WIN : dEQP-EGL.functional.native_color_mapping.native_window.rgb565_depth_no_stencil_render = FAIL +1340 WIN : dEQP-EGL.functional.native_color_mapping.native_window.rgb565_depth_stencil_clear = FAIL +1340 WIN : dEQP-EGL.functional.native_color_mapping.native_window.rgb565_depth_stencil_render = FAIL +1340 WIN : dEQP-EGL.functional.native_color_mapping.native_window.rgb888_no_depth_no_stencil_clear = FAIL +1340 WIN : dEQP-EGL.functional.native_color_mapping.native_window.rgb888_no_depth_no_stencil_render = FAIL +1340 WIN : dEQP-EGL.functional.native_color_mapping.native_window.rgb888_depth_no_stencil_clear = FAIL +1340 WIN : dEQP-EGL.functional.native_color_mapping.native_window.rgb888_depth_no_stencil_render = FAIL +1340 WIN : dEQP-EGL.functional.native_color_mapping.native_window.rgb888_depth_stencil_clear = FAIL +1340 WIN : dEQP-EGL.functional.native_color_mapping.native_window.rgb888_depth_stencil_render = FAIL +1340 WIN : dEQP-EGL.functional.native_color_mapping.native_window.rgba4444_no_depth_no_stencil_clear = FAIL +1340 WIN : dEQP-EGL.functional.native_color_mapping.native_window.rgba4444_no_depth_no_stencil_render = FAIL +1340 WIN : dEQP-EGL.functional.native_color_mapping.native_window.rgba4444_depth_no_stencil_clear = FAIL +1340 WIN : dEQP-EGL.functional.native_color_mapping.native_window.rgba4444_depth_no_stencil_render = FAIL +1340 WIN : dEQP-EGL.functional.native_color_mapping.native_window.rgba4444_depth_stencil_clear = FAIL +1340 WIN : dEQP-EGL.functional.native_color_mapping.native_window.rgba4444_depth_stencil_render = FAIL +1340 WIN : dEQP-EGL.functional.native_color_mapping.native_window.rgba5551_no_depth_no_stencil_clear = FAIL +1340 WIN : dEQP-EGL.functional.native_color_mapping.native_window.rgba5551_no_depth_no_stencil_render = FAIL +1340 WIN : dEQP-EGL.functional.native_color_mapping.native_window.rgba5551_depth_no_stencil_clear = FAIL +1340 WIN : dEQP-EGL.functional.native_color_mapping.native_window.rgba5551_depth_no_stencil_render = FAIL +1340 WIN : dEQP-EGL.functional.native_color_mapping.native_window.rgba5551_depth_stencil_clear = FAIL +1340 WIN : dEQP-EGL.functional.native_color_mapping.native_window.rgba5551_depth_stencil_render = FAIL +1340 WIN : dEQP-EGL.functional.native_color_mapping.native_window.rgba8888_no_depth_no_stencil_clear = FAIL +1340 WIN : dEQP-EGL.functional.native_color_mapping.native_window.rgba8888_no_depth_no_stencil_render = FAIL +1340 WIN : dEQP-EGL.functional.native_color_mapping.native_window.rgba8888_depth_no_stencil_clear = FAIL +1340 WIN : dEQP-EGL.functional.native_color_mapping.native_window.rgba8888_depth_no_stencil_render = FAIL +1340 WIN : dEQP-EGL.functional.native_color_mapping.native_window.rgba8888_depth_stencil_clear = FAIL +1340 WIN : dEQP-EGL.functional.native_color_mapping.native_window.rgba8888_depth_stencil_render = FAIL +1340 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.rgb565_no_depth_no_stencil_clear = FAIL +1340 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.rgb565_no_depth_no_stencil_render = FAIL +1340 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.rgb565_depth_no_stencil_clear = FAIL +1340 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.rgb565_depth_no_stencil_render = FAIL +1340 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.rgb565_depth_stencil_clear = FAIL +1340 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.rgb565_depth_stencil_render = FAIL +1340 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.rgb888_no_depth_no_stencil_clear = FAIL +1340 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.rgb888_no_depth_no_stencil_render = FAIL +1340 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.rgb888_depth_no_stencil_clear = FAIL +1340 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.rgb888_depth_no_stencil_render = FAIL +1340 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.rgb888_depth_stencil_clear = FAIL +1340 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.rgb888_depth_stencil_render = FAIL +1340 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.rgba4444_no_depth_no_stencil_clear = FAIL +1340 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.rgba4444_no_depth_no_stencil_render = FAIL +1340 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.rgba4444_depth_no_stencil_clear = FAIL +1340 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.rgba4444_depth_no_stencil_render = FAIL +1340 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.rgba4444_depth_stencil_clear = FAIL +1340 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.rgba4444_depth_stencil_render = FAIL +1340 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.rgba5551_no_depth_no_stencil_clear = FAIL +1340 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.rgba5551_no_depth_no_stencil_render = FAIL +1340 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.rgba5551_depth_no_stencil_clear = FAIL +1340 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.rgba5551_depth_no_stencil_render = FAIL +1340 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.rgba5551_depth_stencil_clear = FAIL +1340 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.rgba5551_depth_stencil_render = FAIL +1340 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.rgba8888_no_depth_no_stencil_clear = FAIL +1340 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.rgba8888_no_depth_no_stencil_render = FAIL +1340 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.rgba8888_depth_no_stencil_clear = FAIL +1340 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.rgba8888_depth_no_stencil_render = FAIL +1340 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.rgba8888_depth_stencil_clear = FAIL +1340 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.rgba8888_depth_stencil_render = FAIL +1340 WIN : dEQP-EGL.functional.get_proc_address.extension.egl_ext_platform_base = FAIL +1340 WIN : dEQP-EGL.functional.preserve_swap.preserve.no_read_before_swap.* = SKIP +1340 WIN : dEQP-EGL.functional.preserve_swap.preserve.read_before_swap.* = SKIP +1340 WIN : dEQP-EGL.functional.resize.back_buffer.* = SKIP +1340 WIN : dEQP-EGL.functional.resize.pixel_density.* = SKIP diff --git a/gfx/angle/src/tests/deqp_support/deqp_gles2_test_expectations.txt b/gfx/angle/src/tests/deqp_support/deqp_gles2_test_expectations.txt new file mode 100755 index 000000000..b0ca48b72 --- /dev/null +++ b/gfx/angle/src/tests/deqp_support/deqp_gles2_test_expectations.txt @@ -0,0 +1,222 @@ +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This file contains a list of defective dEQP conformance tests. The expected +// format is: +// {BUG#} {MODIFIERS} : {TEST_NAME} = {PASS,FAIL,FLAKY,TIMEOUT,SKIP} +// +// MODIFIERS can be a combination of the below list: +// WIN XP VISTA WIN7 MAC LEOPARD SNOWLEOPARD LION LINUX CHROMEOS MOUNTAINLION +// MAVERICKS +// NVIDIA AMD INTEL +// 0xabcd - GPU PCI device ID. Specifying a PCI id requires a vendor. +// DEBUG RELEASE +// TODO(jmadill): Add ANGLE Renderer selection modifiers +// +// TEST_NAME can be a specific test name, or have a '*' in the end, which +// indicates a prefix matching. +// +// Examples: +// 91530 MAC WIN LINUX : context_lost_restored = TIMEOUT +// 91533 WIN : gl_min_uniforms = FAIL +// 91531 MAC WIN LINUX : conformance_more_* = SKIP +// 91532 MAC NVIDIA 0x0640 : tex_image_and_sub_image_2d_with_video = PASS FAIL + +// TODO(jmadill): Figure out why these fail on the bots, but not locally. +1018 WIN : dEQP-GLES2.functional.shaders.invariance.highp.loop_2 = FAIL +1018 WIN : dEQP-GLES2.functional.shaders.invariance.mediump.loop_2 = FAIL + +// Skip these tests due to timeouts +1034 WIN LINUX MAC : dEQP-GLES2.functional.flush_finish.* = SKIP + +// Don't run these tests for faster turnover +998 WIN LINUX MAC : dEQP-GLES2.performance.* = SKIP +998 WIN LINUX MAC : dEQP-GLES2.stress.* = SKIP + +// Tests that we fail because they're not in line with the WebGL spec +1335 WIN LINUX MAC ANDROID : dEQP-GLES2.functional.shaders.preprocessor.conditional_inclusion.basic_2* = FAIL + +//////////////////////////////////////////////////////////////////////////////// +// +// Temporary entries: they should be removed once the bugs are fixed. +// +//////////////////////////////////////////////////////////////////////////////// + +// Windows only failures + +// TODO(jmadill): triage these into temporary and permanent suppressions + +1027 WIN : dEQP-GLES2.functional.fbo.render.color_clear.rbo_rgb5_a1 = FAIL +1027 WIN : dEQP-GLES2.functional.fbo.render.color_clear.rbo_rgb5_a1_stencil_index8 = FAIL +1027 WIN : dEQP-GLES2.functional.fbo.render.color_clear.rbo_rgb5_a1_depth_component16 = FAIL +1027 WIN : dEQP-GLES2.functional.fbo.render.stencil_clear.rbo_rgb5_a1_stencil_index8 = FAIL +1027 WIN : dEQP-GLES2.functional.fbo.render.shared_colorbuffer.tex2d_rgb_stencil_index8 = FAIL +1027 WIN : dEQP-GLES2.functional.fbo.render.shared_colorbuffer.tex2d_rgba_stencil_index8 = FAIL +1027 WIN : dEQP-GLES2.functional.fbo.render.shared_colorbuffer.rbo_rgb565_stencil_index8 = FAIL +1027 WIN : dEQP-GLES2.functional.fbo.render.shared_colorbuffer.rbo_rgb5_a1_stencil_index8 = FAIL +1027 WIN : dEQP-GLES2.functional.fbo.render.shared_colorbuffer.rbo_rgba4_stencil_index8 = FAIL +1027 WIN : dEQP-GLES2.functional.fbo.render.recreate_colorbuffer.rebind_tex2d_rgb_stencil_index8 = FAIL +1027 WIN : dEQP-GLES2.functional.fbo.render.recreate_colorbuffer.rebind_tex2d_rgba_stencil_index8 = FAIL +1027 WIN : dEQP-GLES2.functional.fbo.render.recreate_colorbuffer.rebind_rbo_rgb565_stencil_index8 = FAIL +1027 WIN : dEQP-GLES2.functional.fbo.render.recreate_colorbuffer.rebind_rbo_rgb5_a1_stencil_index8 = FAIL +1027 WIN : dEQP-GLES2.functional.fbo.render.recreate_colorbuffer.rebind_rbo_rgba4_stencil_index8 = FAIL +1027 WIN : dEQP-GLES2.functional.fbo.render.recreate_colorbuffer.no_rebind_tex2d_rgb_stencil_index8 = FAIL +1027 WIN : dEQP-GLES2.functional.fbo.render.recreate_colorbuffer.no_rebind_tex2d_rgba_stencil_index8 = FAIL +1033 WIN : dEQP-GLES2.functional.polygon_offset.fixed16_render_with_units = FAIL +1017 WIN : dEQP-GLES2.functional.shaders.loops.for_constant_iterations.nested_tricky_dataflow_* = FAIL +1017 WIN : dEQP-GLES2.functional.shaders.loops.while_constant_iterations.nested_tricky_dataflow_* = FAIL +1017 WIN : dEQP-GLES2.functional.shaders.loops.do_while_constant_iterations.nested_tricky_dataflow_* = FAIL +989 WIN : dEQP-GLES2.functional.shaders.preprocessor.pragmas.invalid_pragma_invalid_* = FAIL +1018 WIN : dEQP-GLES2.functional.shaders.texture_functions.vertex.texturecubelod = FAIL +1020 WIN : dEQP-GLES2.functional.texture.mipmap.cube.basic.linear_nearest = FAIL +1020 WIN : dEQP-GLES2.functional.texture.mipmap.cube.basic.linear_linear = FAIL +1020 WIN : dEQP-GLES2.functional.texture.mipmap.cube.projected.linear_nearest = FAIL +1020 WIN : dEQP-GLES2.functional.texture.mipmap.cube.bias.linear_nearest = FAIL +1020 WIN : dEQP-GLES2.functional.texture.mipmap.cube.bias.linear_linear = FAIL +1025 WIN : dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_depth_funcs.stencil_* = FAIL +1025 WIN : dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.* = FAIL +1025 WIN : dEQP-GLES2.functional.fragment_ops.depth_stencil.write_mask.* = FAIL +1025 WIN : dEQP-GLES2.functional.fragment_ops.depth_stencil.random.* = FAIL +1025 WIN : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.add_constant_color_constant_alpha = FAIL +1025 WIN : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.add_constant_color_one_minus_constant_alpha = FAIL +1025 WIN : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.add_one_minus_constant_color_constant_alpha = FAIL +1025 WIN : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.add_one_minus_constant_color_one_minus_constant_alpha = FAIL +1025 WIN : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.add_constant_alpha_constant_color = FAIL +1025 WIN : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.add_constant_alpha_one_minus_constant_color = FAIL +1025 WIN : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.add_one_minus_constant_alpha_constant_color = FAIL +1025 WIN : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.add_one_minus_constant_alpha_one_minus_constant_color = FAIL +1025 WIN : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.subtract_constant_color_constant_alpha = FAIL +1025 WIN : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.subtract_constant_color_one_minus_constant_alpha = FAIL +1025 WIN : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.subtract_one_minus_constant_color_constant_alpha = FAIL +1025 WIN : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.subtract_one_minus_constant_color_one_minus_constant_alpha = FAIL +1025 WIN : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.subtract_constant_alpha_constant_color = FAIL +1025 WIN : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.subtract_constant_alpha_one_minus_constant_color = FAIL +1025 WIN : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.subtract_one_minus_constant_alpha_constant_color = FAIL +1025 WIN : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.subtract_one_minus_constant_alpha_one_minus_constant_color = FAIL +1025 WIN : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.reverse_subtract_constant_color_constant_alpha = FAIL +1025 WIN : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.reverse_subtract_constant_color_one_minus_constant_alpha = FAIL +1025 WIN : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.reverse_subtract_one_minus_constant_color_constant_alpha = FAIL +1025 WIN : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.reverse_subtract_one_minus_constant_color_one_minus_constant_alpha = FAIL +1025 WIN : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.reverse_subtract_constant_alpha_constant_color = FAIL +1025 WIN : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.reverse_subtract_constant_alpha_one_minus_constant_color = FAIL +1025 WIN : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.reverse_subtract_one_minus_constant_alpha_constant_color = FAIL +1025 WIN : dEQP-GLES2.functional.fragment_ops.blend.equation_src_func_dst_func.reverse_subtract_one_minus_constant_alpha_one_minus_constant_color = FAIL +1418 WIN : dEQP-GLES2.functional.clipping.triangle_vertex.clip_three.clip_pos_x_pos_y_pos_z_and_neg_x_pos_y_pos_z_and_neg_x_neg_y_neg_z = FAIL + +// Failures on the dEQP Windows bots that do not reproduce locally +1108 WIN : dEQP-GLES2.functional.shaders.struct.local.dynamic_loop_struct_array_fragment = FAIL + +// Linux only failures + +1051 LINUX : dEQP-GLES2.functional.shaders.functions.array_arguments.copy_global_inout_on_call_fragment = FAIL +1051 LINUX : dEQP-GLES2.functional.shaders.functions.array_arguments.copy_global_inout_on_call_vertex = FAIL +1019 LINUX : dEQP-GLES2.functional.texture.size.cube.256x256_rgba4444 = FAIL +1019 LINUX : dEQP-GLES2.functional.texture.size.cube.512x512_rgba4444 = FAIL +1020 LINUX : dEQP-GLES2.functional.texture.mipmap.2d.projected.nearest_linear* = FAIL +1020 LINUX : dEQP-GLES2.functional.texture.mipmap.2d.projected.linear_linear* = FAIL + +// Failures on the Linux dEQP bot that do not appear on the workstation +1143 LINUX : dEQP-GLES2.functional.shaders.random.all_features.vertex.13 = FAIL +1143 LINUX : dEQP-GLES2.functional.shaders.invariance.mediump.common_subexpression_1 = FAIL +1143 LINUX : dEQP-GLES2.functional.shaders.invariance.highp.common_subexpression_1 = FAIL +1143 LINUX : dEQP-GLES2.functional.texture.mipmap.cube.projected.linear_nearest = FAIL + +// Mac specific failures +1143 MAC : dEQP-GLES2.functional.shaders.scoping.valid.local_int_variable_hides_struct_type_* = FAIL +1143 MAC : dEQP-GLES2.functional.shaders.scoping.valid.local_struct_variable_hides_struct_type_* = FAIL +1143 MAC : dEQP-GLES2.functional.shaders.scoping.valid.function_parameter_hides_struct_type_* = FAIL +1143 MAC : dEQP-GLES2.functional.shaders.random.trigonometric.vertex.65 = FAIL + +// Android only failures +1484 ANDROID : dEQP-GLES2.functional.vertex_arrays.* = SKIP +1485 ANDROID : dEQP-GLES2.functional.clipping.triangle_vertex.clip_three.clip_neg_x_neg_z_and_pos_x_pos_z_and_neg_x_neg_y_pos_z = FAIL +1486 ANDROID : dEQP-GLES2.functional.fbo.completeness.attachment_combinations.none_none_none_tex = FAIL +1486 ANDROID : dEQP-GLES2.functional.fbo.completeness.attachment_combinations.none_none_rbo_tex = FAIL +1486 ANDROID : dEQP-GLES2.functional.fbo.completeness.attachment_combinations.none_none_tex_none = FAIL +1486 ANDROID : dEQP-GLES2.functional.fbo.completeness.attachment_combinations.none_none_tex_rbo = FAIL +1486 ANDROID : dEQP-GLES2.functional.fbo.completeness.attachment_combinations.none_none_tex_tex = FAIL +1486 ANDROID : dEQP-GLES2.functional.fbo.completeness.attachment_combinations.rbo_none_none_tex = FAIL +1486 ANDROID : dEQP-GLES2.functional.fbo.completeness.attachment_combinations.rbo_none_rbo_tex = FAIL +1486 ANDROID : dEQP-GLES2.functional.fbo.completeness.attachment_combinations.rbo_none_tex_none = FAIL +1486 ANDROID : dEQP-GLES2.functional.fbo.completeness.attachment_combinations.rbo_none_tex_rbo = FAIL +1486 ANDROID : dEQP-GLES2.functional.fbo.completeness.attachment_combinations.rbo_none_tex_tex = FAIL +1486 ANDROID : dEQP-GLES2.functional.fbo.completeness.attachment_combinations.tex_none_none_tex = FAIL +1486 ANDROID : dEQP-GLES2.functional.fbo.completeness.attachment_combinations.tex_none_rbo_tex = FAIL +1486 ANDROID : dEQP-GLES2.functional.fbo.completeness.attachment_combinations.tex_none_tex_none = FAIL +1486 ANDROID : dEQP-GLES2.functional.fbo.completeness.attachment_combinations.tex_none_tex_rbo = FAIL +1486 ANDROID : dEQP-GLES2.functional.fbo.completeness.attachment_combinations.tex_none_tex_tex = FAIL +1487 ANDROID : dEQP-GLES2.functional.fbo.completeness.renderable.texture.color0.depth_stencil_unsigned_int_24_8 = FAIL +1487 ANDROID : dEQP-GLES2.functional.fbo.completeness.renderable.texture.color0.srgb8 = FAIL +1487 ANDROID : dEQP-GLES2.functional.fbo.completeness.renderable.texture.stencil.depth_stencil_unsigned_int_24_8 = FAIL +1487 ANDROID : dEQP-GLES2.functional.fbo.completeness.renderable.texture.stencil.srgb8 = FAIL +1487 ANDROID : dEQP-GLES2.functional.fbo.completeness.renderable.texture.depth.depth_stencil_unsigned_int_24_8 = FAIL +1487 ANDROID : dEQP-GLES2.functional.fbo.completeness.renderable.texture.depth.srgb8 = FAIL +1488 ANDROID : dEQP-GLES2.functional.shaders.return.conditional_return_always_vertex = FAIL +1488 ANDROID : dEQP-GLES2.functional.shaders.return.conditional_return_always_fragment = FAIL +1488 ANDROID : dEQP-GLES2.functional.shaders.return.output_write_always_vertex = FAIL +1488 ANDROID : dEQP-GLES2.functional.shaders.return.output_write_always_fragment = FAIL +1489 ANDROID : dEQP-GLES2.functional.texture.mipmap.2d.generate.a8_fastest = FAIL +1489 ANDROID : dEQP-GLES2.functional.texture.mipmap.2d.generate.a8_nicest = FAIL +1489 ANDROID : dEQP-GLES2.functional.texture.mipmap.2d.generate.l8_fastest = FAIL +1489 ANDROID : dEQP-GLES2.functional.texture.mipmap.2d.generate.l8_nicest = FAIL +1489 ANDROID : dEQP-GLES2.functional.texture.mipmap.2d.generate.la88_fastest = FAIL +1489 ANDROID : dEQP-GLES2.functional.texture.mipmap.2d.generate.la88_nicest = FAIL +1489 ANDROID : dEQP-GLES2.functional.texture.mipmap.cube.generate.a8_fastest = FAIL +1489 ANDROID : dEQP-GLES2.functional.texture.mipmap.cube.generate.a8_nicest = FAIL +1489 ANDROID : dEQP-GLES2.functional.texture.mipmap.cube.generate.l8_fastest = FAIL +1489 ANDROID : dEQP-GLES2.functional.texture.mipmap.cube.generate.l8_nicest = FAIL +1489 ANDROID : dEQP-GLES2.functional.texture.mipmap.cube.generate.la88_fastest = FAIL +1489 ANDROID : dEQP-GLES2.functional.texture.mipmap.cube.generate.la88_nicest = FAIL + +// Windows and Linux failures +1020 WIN LINUX : dEQP-GLES2.functional.texture.mipmap.cube.projected.linear_linear = FAIL + +// Windows Linux and Mac failures +989 WIN LINUX MAC : dEQP-GLES2.functional.shaders.preprocessor.extensions.after_non_preprocessing_tokens_vertex = FAIL +989 WIN LINUX MAC : dEQP-GLES2.functional.shaders.preprocessor.extensions.after_non_preprocessing_tokens_fragment = FAIL +1015 WIN LINUX MAC : dEQP-GLES2.functional.shaders.functions.invalid.return_array_in_struct_vertex = FAIL +1015 WIN LINUX MAC : dEQP-GLES2.functional.shaders.functions.invalid.return_array_in_struct_fragment = FAIL +1016 WIN LINUX MAC : dEQP-GLES2.functional.shaders.scoping.valid.local_variable_hides_function_parameter_vertex = FAIL +1016 WIN LINUX MAC : dEQP-GLES2.functional.shaders.scoping.valid.local_variable_hides_function_parameter_fragment = FAIL +1016 WIN LINUX MAC : dEQP-GLES2.functional.shaders.scoping.invalid.redeclare_function_vertex = FAIL +1016 WIN LINUX MAC : dEQP-GLES2.functional.shaders.scoping.invalid.redeclare_function_fragment = FAIL +1020 WIN LINUX MAC : dEQP-GLES2.functional.texture.mipmap.2d.projected.nearest_nearest* = FAIL +1020 WIN LINUX MAC : dEQP-GLES2.functional.texture.mipmap.2d.projected.linear_nearest* = FAIL +1025 WIN LINUX MAC : dEQP-GLES2.functional.fragment_ops.random.* = FAIL +1025 WIN LINUX MAC : dEQP-GLES2.functional.fragment_ops.interaction.basic_shader.* = FAIL +1027 WIN LINUX MAC : dEQP-GLES2.functional.fbo.render.repeated_clear.tex2d_rgb = FAIL +1027 WIN LINUX MAC : dEQP-GLES2.functional.fbo.render.repeated_clear.tex2d_rgba = FAIL +1028 WIN LINUX MAC : dEQP-GLES2.functional.fbo.completeness.renderable.texture.color0.rgb_float = FAIL +1028 WIN LINUX MAC : dEQP-GLES2.functional.fbo.completeness.renderable.texture.color0.rgb_half_float_oes = FAIL +1028 WIN LINUX MAC : dEQP-GLES2.functional.fbo.completeness.renderable.texture.color0.rgba_float = FAIL +1028 WIN LINUX MAC : dEQP-GLES2.functional.fbo.completeness.renderable.texture.color0.rgba_half_float_oes = FAIL +1028 WIN LINUX MAC : dEQP-GLES2.functional.fbo.completeness.renderable.texture.color0.srgb8 = FAIL +1028 WIN LINUX MAC : dEQP-GLES2.functional.fbo.completeness.renderable.texture.stencil.srgb8 = FAIL +1028 WIN LINUX MAC : dEQP-GLES2.functional.fbo.completeness.renderable.texture.stencil.srgb8_alpha8 = FAIL +1028 WIN LINUX MAC : dEQP-GLES2.functional.fbo.completeness.renderable.texture.depth.depth_component_unsigned_short = FAIL +1028 WIN LINUX MAC : dEQP-GLES2.functional.fbo.completeness.renderable.texture.depth.depth_component_unsigned_int = FAIL +1028 WIN LINUX MAC : dEQP-GLES2.functional.fbo.completeness.renderable.texture.depth.srgb8 = FAIL +1028 WIN LINUX MAC : dEQP-GLES2.functional.fbo.completeness.renderable.texture.depth.srgb8_alpha8 = FAIL +1128 WIN LINUX MAC : dEQP-GLES2.functional.negative_api.texture.compressedtexsubimage2d_invalid_size = FAIL +1029 WIN LINUX MAC : dEQP-GLES2.functional.negative_api.texture.teximage2d_invalid_format = FAIL +1029 WIN LINUX MAC : dEQP-GLES2.functional.negative_api.texture.teximage2d_invalid_internalformat = FAIL +1029 WIN LINUX MAC : dEQP-GLES2.functional.negative_api.texture.texsubimage2d_invalid_type = FAIL +1029 WIN LINUX MAC : dEQP-GLES2.functional.negative_api.texture.texsubimage2d_offset_allowed = FAIL +1030 WIN LINUX MAC : dEQP-GLES2.functional.attribute_location.bind_aliasing.cond_float = FAIL +1030 WIN LINUX MAC : dEQP-GLES2.functional.attribute_location.bind_aliasing.max_cond_float = FAIL +1030 WIN LINUX MAC : dEQP-GLES2.functional.attribute_location.bind_aliasing.cond_vec2 = FAIL +1030 WIN LINUX MAC : dEQP-GLES2.functional.attribute_location.bind_aliasing.max_cond_vec2 = FAIL +1030 WIN LINUX MAC : dEQP-GLES2.functional.attribute_location.bind_aliasing.cond_vec3 = FAIL +1030 WIN LINUX MAC : dEQP-GLES2.functional.attribute_location.bind_aliasing.max_cond_vec3 = FAIL +1030 WIN LINUX MAC : dEQP-GLES2.functional.attribute_location.bind_aliasing.cond_vec4 = FAIL +1030 WIN LINUX MAC : dEQP-GLES2.functional.attribute_location.bind_aliasing.max_cond_vec4 = FAIL +1030 WIN LINUX MAC : dEQP-GLES2.functional.attribute_location.bind_aliasing.cond_mat2 = FAIL +1030 WIN LINUX MAC : dEQP-GLES2.functional.attribute_location.bind_aliasing.cond_mat2_offset_1 = FAIL +1030 WIN LINUX MAC : dEQP-GLES2.functional.attribute_location.bind_aliasing.max_cond_mat2 = FAIL +1030 WIN LINUX MAC : dEQP-GLES2.functional.attribute_location.bind_aliasing.cond_mat3 = FAIL +1030 WIN LINUX MAC : dEQP-GLES2.functional.attribute_location.bind_aliasing.cond_mat3_offset_1 = FAIL +1030 WIN LINUX MAC : dEQP-GLES2.functional.attribute_location.bind_aliasing.max_cond_mat3 = FAIL +1030 WIN LINUX MAC : dEQP-GLES2.functional.attribute_location.bind_aliasing.cond_mat4 = FAIL +1030 WIN LINUX MAC : dEQP-GLES2.functional.attribute_location.bind_aliasing.cond_mat4_offset_1 = FAIL +1030 WIN LINUX MAC : dEQP-GLES2.functional.attribute_location.bind_aliasing.max_cond_mat4 = FAIL diff --git a/gfx/angle/src/tests/deqp_support/deqp_gles31_test_expectations.txt b/gfx/angle/src/tests/deqp_support/deqp_gles31_test_expectations.txt new file mode 100755 index 000000000..84d327692 --- /dev/null +++ b/gfx/angle/src/tests/deqp_support/deqp_gles31_test_expectations.txt @@ -0,0 +1,11528 @@ +// Copyright 2016 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This file contains a list of defective dEQP conformance tests. The expected +// format is: +// {BUG#} {MODIFIERS} : {TEST_NAME} = {PASS,FAIL,FLAKY,TIMEOUT,SKIP} +// +// MODIFIERS can be a combination of the below list: +// WIN XP VISTA WIN7 MAC LEOPARD SNOWLEOPARD LION LINUX CHROMEOS MOUNTAINLION +// MAVERICKS +// NVIDIA AMD INTEL +// 0xabcd - GPU PCI device ID. Specifying a PCI id requires a vendor. +// DEBUG RELEASE +// TODO(jmadill): Add ANGLE Renderer selection modifiers +// +// TEST_NAME can be a specific test name, or have a '*' in the end, which +// indicates a prefix matching. +// +// Examples: +// 91530 MAC WIN LINUX : context_lost_restored = TIMEOUT +// 91533 WIN : gl_min_uniforms = FAIL +// 91531 MAC WIN LINUX : conformance_more_* = SKIP +// 91532 MAC NVIDIA 0x0640 : tex_image_and_sub_image_2d_with_video = PASS FAIL + +// Crashing Tests +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.image.image2d.vertex_binding_array = SKIP +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.image.image2d.vertex_binding_max_array = SKIP +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.image.image2d.fragment_binding_array = SKIP +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.image.image2d.fragment_binding_max_array = SKIP +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.image.image3d.vertex_binding_array = SKIP +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.image.image3d.vertex_binding_max_array = SKIP +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.image.image3d.fragment_binding_array = SKIP +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.image.image3d.fragment_binding_max_array = SKIP +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.negative.image.image2d.vertex_binding_over_max_array = SKIP +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.negative.image.image2d.fragment_binding_over_max_array = SKIP +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.negative.image.image2d.binding_contradictory_array = SKIP +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.negative.image.image3d.vertex_binding_over_max_array = SKIP +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.negative.image.image3d.fragment_binding_over_max_array = SKIP +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.negative.image.image3d.binding_contradictory_array = SKIP + +// Failing Tests +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_var.compute.num_work_groups = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_var.compute.work_group_size = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_var.compute.work_group_id = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_var.compute.local_invocation_id = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_var.compute.global_invocation_id = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_var.compute.local_invocation_index = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.float_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.float_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.float_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.vec2_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.vec2_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.vec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.vec3_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.vec3_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.vec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.vec4_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.vec4_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.vec4_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.int_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.int_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.int_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.ivec2_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.ivec2_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.ivec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.ivec3_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.ivec3_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.ivec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.ivec4_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.ivec4_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.ivec4_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.float_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.float_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.float_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.vec2_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.vec2_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.vec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.vec3_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.vec3_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.vec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.vec4_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.vec4_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.vec4_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.int_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.int_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.int_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.ivec2_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.ivec2_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.ivec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.ivec3_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.ivec3_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.ivec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.ivec4_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.ivec4_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.ivec4_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.float_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.float_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.float_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.vec2_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.vec2_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.vec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.vec3_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.vec3_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.vec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.vec4_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.vec4_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.vec4_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.float_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.float_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.float_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.vec2_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.vec2_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.vec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.vec3_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.vec3_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.vec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.vec4_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.vec4_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.vec4_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.round.float_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.round.float_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.round.float_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.round.vec2_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.round.vec2_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.round.vec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.round.vec3_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.round.vec3_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.round.vec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.round.vec4_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.round.vec4_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.round.vec4_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.float_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.float_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.float_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.vec2_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.vec2_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.vec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.vec3_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.vec3_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.vec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.vec4_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.vec4_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.vec4_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.float_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.float_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.float_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.vec2_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.vec2_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.vec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.vec3_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.vec3_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.vec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.vec4_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.vec4_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.vec4_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.float_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.float_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.float_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.vec2_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.vec2_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.vec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.vec3_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.vec3_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.vec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.vec4_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.vec4_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.vec4_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.float_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.float_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.float_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.vec2_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.vec2_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.vec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.vec3_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.vec3_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.vec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.vec4_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.vec4_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.vec4_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.float_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.float_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.float_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.vec2_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.vec2_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.vec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.vec3_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.vec3_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.vec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.vec4_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.vec4_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.vec4_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.float_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.float_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.float_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.vec2_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.vec2_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.vec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.vec3_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.vec3_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.vec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.vec4_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.vec4_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.vec4_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.float_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.float_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.float_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.vec2_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.vec2_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.vec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.vec3_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.vec3_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.vec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.vec4_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.vec4_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.vec4_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.float_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.float_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.float_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.vec2_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.vec2_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.vec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.vec3_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.vec3_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.vec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.vec4_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.vec4_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.vec4_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.float_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.float_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.float_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.float_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.float_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.float_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.float_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.float_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.float_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec2_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec2_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec2_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec2_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec2_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec2_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec2_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec2_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec3_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec3_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec3_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec3_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec3_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec3_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec3_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec3_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec4_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec4_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec4_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec4_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec4_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec4_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec4_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec4_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec4_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.float_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.float_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.float_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.float_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.float_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.float_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.float_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.float_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.float_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec2_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec2_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec2_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec2_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec2_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec2_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec2_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec2_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec3_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec3_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec3_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec3_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec3_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec3_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec3_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec3_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec4_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec4_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec4_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec4_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec4_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec4_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec4_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec4_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec4_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.intbitstofloat.int_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.intbitstofloat.ivec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.intbitstofloat.ivec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.uintbitstofloat.uint_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.uintbitstofloat.uvec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.common.uintbitstofloat.uvec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packsnorm4x8_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packsnorm4x8_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packsnorm4x8_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packsnorm4x8_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packsnorm4x8_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packsnorm4x8_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packsnorm4x8_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packsnorm4x8_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packsnorm4x8_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.unpacksnorm4x8_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.unpacksnorm4x8_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.unpacksnorm4x8_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packunorm4x8_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packunorm4x8_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packunorm4x8_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packunorm4x8_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packunorm4x8_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packunorm4x8_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packunorm4x8_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packunorm4x8_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packunorm4x8_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.unpackunorm4x8_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.unpackunorm4x8_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.unpackunorm4x8_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packsnorm2x16_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packsnorm2x16_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packsnorm2x16_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.unpacksnorm2x16_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packunorm2x16_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packunorm2x16_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packunorm2x16_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.unpackunorm2x16_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packhalf2x16_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.unpackhalf2x16_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uint_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uint_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uint_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uint_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uint_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uint_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uint_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uint_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uint_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec2_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec2_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec2_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec2_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec2_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec2_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec2_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec2_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec3_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec3_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec3_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec3_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec3_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec3_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec3_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec3_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec4_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec4_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec4_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec4_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec4_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec4_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec4_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec4_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec4_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uint_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uint_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uint_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uint_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uint_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uint_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uint_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uint_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uint_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec2_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec2_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec2_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec2_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec2_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec2_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec2_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec2_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec3_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec3_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec3_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec3_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec3_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec3_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec3_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec3_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec4_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec4_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec4_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec4_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec4_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec4_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec4_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec4_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec4_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.umulextended.uint_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.umulextended.uint_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.umulextended.uint_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.umulextended.uvec2_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.umulextended.uvec2_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.umulextended.uvec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.umulextended.uvec3_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.umulextended.uvec3_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.umulextended.uvec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.umulextended.uvec4_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.umulextended.uvec4_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.umulextended.uvec4_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.imulextended.int_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.imulextended.int_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.imulextended.int_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.imulextended.ivec2_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.imulextended.ivec2_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.imulextended.ivec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.imulextended.ivec3_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.imulextended.ivec3_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.imulextended.ivec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.imulextended.ivec4_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.imulextended.ivec4_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.imulextended.ivec4_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.int_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.int_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.int_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.int_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.int_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.int_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.int_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.int_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.int_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec2_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec2_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec2_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec2_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec2_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec2_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec2_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec2_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec3_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec3_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec3_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec3_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec3_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec3_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec3_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec3_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec4_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec4_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec4_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec4_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec4_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec4_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec4_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec4_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec4_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uint_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uint_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uint_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uint_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uint_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uint_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uint_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uint_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uint_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec2_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec2_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec2_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec2_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec2_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec2_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec2_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec2_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec3_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec3_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec3_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec3_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec3_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec3_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec3_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec3_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec4_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec4_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec4_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec4_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec4_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec4_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec4_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec4_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec4_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.int_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.int_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.int_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.int_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.int_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.int_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.int_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.int_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.int_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec2_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec2_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec2_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec2_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec2_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec2_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec2_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec2_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec3_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec3_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec3_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec3_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec3_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec3_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec3_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec3_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec4_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec4_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec4_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec4_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec4_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec4_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec4_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec4_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec4_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uint_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uint_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uint_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uint_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uint_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uint_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uint_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uint_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uint_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec2_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec2_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec2_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec2_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec2_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec2_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec2_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec2_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec3_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec3_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec3_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec3_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec3_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec3_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec3_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec3_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec4_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec4_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec4_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec4_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec4_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec4_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec4_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec4_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec4_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.int_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.int_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.int_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.int_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.int_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.int_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.int_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.int_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.int_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec2_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec2_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec2_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec2_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec2_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec2_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec2_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec2_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec3_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec3_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec3_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec3_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec3_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec3_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec3_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec3_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec4_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec4_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec4_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec4_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec4_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec4_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec4_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec4_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec4_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uint_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uint_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uint_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uint_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uint_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uint_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uint_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uint_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uint_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec2_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec2_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec2_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec2_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec2_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec2_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec2_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec2_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec3_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec3_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec3_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec3_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec3_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec3_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec3_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec3_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec4_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec4_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec4_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec4_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec4_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec4_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec4_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec4_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec4_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.int_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.int_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.int_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.int_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.int_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.int_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.int_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.int_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.int_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec2_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec2_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec2_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec2_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec2_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec2_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec2_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec2_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec3_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec3_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec3_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec3_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec3_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec3_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec3_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec3_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec4_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec4_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec4_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec4_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec4_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec4_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec4_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec4_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec4_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uint_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uint_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uint_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uint_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uint_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uint_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uint_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uint_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uint_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec2_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec2_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec2_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec2_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec2_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec2_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec2_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec2_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec3_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec3_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec3_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec3_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec3_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec3_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec3_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec3_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec4_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec4_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec4_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec4_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec4_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec4_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec4_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec4_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec4_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.int_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.int_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.int_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.int_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.int_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.int_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.int_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.int_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.int_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec2_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec2_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec2_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec2_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec2_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec2_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec2_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec2_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec3_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec3_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec3_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec3_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec3_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec3_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec3_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec3_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec4_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec4_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec4_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec4_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec4_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec4_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec4_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec4_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec4_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uint_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uint_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uint_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uint_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uint_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uint_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uint_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uint_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uint_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec2_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec2_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec2_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec2_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec2_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec2_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec2_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec2_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec3_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec3_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec3_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec3_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec3_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec3_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec3_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec3_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec4_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec4_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec4_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec4_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec4_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec4_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec4_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec4_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec4_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.int_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.int_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.int_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.int_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.int_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.int_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.int_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.int_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.int_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec2_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec2_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec2_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec2_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec2_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec2_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec2_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec2_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec3_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec3_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec3_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec3_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec3_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec3_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec3_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec3_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec4_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec4_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec4_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec4_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec4_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec4_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec4_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec4_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec4_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uint_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uint_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uint_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uint_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uint_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uint_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uint_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uint_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uint_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec2_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec2_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec2_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec2_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec2_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec2_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec2_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec2_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec2_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec3_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec3_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec3_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec3_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec3_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec3_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec3_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec3_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec3_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec4_lowp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec4_lowp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec4_lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec4_mediump_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec4_mediump_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec4_mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec4_highp_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec4_highp_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec4_highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.add.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.add.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.add.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.add.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.add.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.add.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.add.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.add.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.add.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.add.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.add.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.add.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sub.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sub.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sub.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sub.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sub.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sub.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sub.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sub.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sub.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sub.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sub.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sub.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.mul.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.mul.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.mul.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.mul.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.mul.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.mul.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.mul.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.mul.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.mul.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.mul.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.mul.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.mul.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.div.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.div.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.div.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.div.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.div.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.div.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.div.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.div.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.radians.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.radians.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.radians.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.radians.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.radians.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.radians.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.radians.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.radians.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.radians.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.radians.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.radians.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.radians.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.degrees.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.degrees.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.degrees.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.degrees.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.degrees.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.degrees.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.degrees.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.degrees.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.degrees.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.degrees.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.degrees.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.degrees.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sin.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sin.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sin.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sin.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sin.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sin.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sin.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sin.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.cos.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.cos.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.cos.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.cos.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.cos.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.cos.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.cos.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.cos.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.tan.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.tan.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.tan.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.tan.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.tan.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.tan.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.tan.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.tan.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.asin.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.asin.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.asin.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.asin.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.asin.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.asin.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.asin.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.asin.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.asin.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.asin.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.asin.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.asin.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.acos.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.acos.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.acos.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.acos.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.acos.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.acos.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.acos.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.acos.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.atan2.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.atan2.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.atan2.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.atan2.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.atan.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.atan.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.atan.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.atan.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.atan.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.atan.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.atan.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.atan.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sinh.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sinh.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sinh.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sinh.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sinh.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sinh.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sinh.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sinh.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sinh.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sinh.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sinh.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sinh.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.cosh.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.cosh.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.cosh.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.cosh.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.cosh.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.cosh.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.cosh.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.cosh.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.cosh.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.cosh.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.cosh.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.cosh.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.tanh.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.tanh.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.tanh.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.tanh.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.tanh.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.tanh.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.tanh.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.tanh.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.tanh.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.tanh.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.tanh.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.tanh.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.asinh.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.asinh.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.asinh.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.asinh.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.asinh.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.asinh.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.asinh.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.asinh.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.asinh.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.asinh.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.asinh.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.asinh.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.acosh.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.acosh.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.acosh.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.acosh.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.acosh.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.acosh.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.acosh.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.acosh.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.atanh.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.atanh.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.atanh.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.atanh.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.atanh.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.atanh.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.atanh.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.atanh.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.pow.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.pow.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.pow.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.pow.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.pow.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.pow.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.pow.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.pow.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.pow.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.pow.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.pow.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.pow.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.exp.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.exp.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.exp.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.exp.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.exp.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.exp.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.exp.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.exp.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.exp.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.exp.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.exp.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.exp.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.log.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.log.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.log.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.log.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.log.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.log.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.log.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.log.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.log.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.log.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.log.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.log.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.exp2.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.exp2.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.exp2.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.exp2.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.exp2.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.exp2.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.exp2.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.exp2.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.exp2.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.exp2.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.exp2.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.exp2.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.log2.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.log2.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.log2.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.log2.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.log2.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.log2.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.log2.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.log2.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.log2.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.log2.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.log2.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.log2.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sqrt.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sqrt.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sqrt.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sqrt.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sqrt.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sqrt.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sqrt.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sqrt.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sqrt.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sqrt.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sqrt.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sqrt.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.inversesqrt.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.inversesqrt.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.inversesqrt.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.inversesqrt.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.inversesqrt.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.inversesqrt.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.inversesqrt.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.inversesqrt.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.inversesqrt.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.inversesqrt.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.inversesqrt.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.inversesqrt.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.abs.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.abs.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.abs.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.abs.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.abs.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.abs.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.abs.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.abs.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.abs.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.abs.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.abs.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.abs.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sign.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sign.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sign.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sign.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sign.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sign.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sign.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sign.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sign.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sign.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sign.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.sign.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.floor.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.floor.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.floor.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.floor.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.floor.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.floor.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.floor.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.floor.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.floor.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.floor.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.floor.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.floor.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.trunc.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.trunc.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.trunc.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.trunc.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.trunc.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.trunc.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.trunc.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.trunc.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.trunc.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.trunc.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.trunc.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.trunc.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.round.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.round.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.round.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.round.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.round.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.round.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.round.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.round.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.round.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.round.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.round.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.round.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.roundeven.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.roundeven.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.roundeven.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.roundeven.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.roundeven.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.roundeven.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.roundeven.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.roundeven.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.roundeven.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.roundeven.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.roundeven.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.roundeven.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ceil.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ceil.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ceil.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ceil.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ceil.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ceil.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ceil.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ceil.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ceil.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ceil.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ceil.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ceil.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.fract.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.fract.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.fract.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.fract.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.fract.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.fract.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.fract.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.fract.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.fract.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.fract.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.fract.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.fract.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.mod.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.mod.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.mod.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.mod.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.mod.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.mod.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.mod.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.mod.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.modf.lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.modf.mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.modf.highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.min.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.min.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.min.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.min.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.min.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.min.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.min.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.min.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.max.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.max.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.max.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.max.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.max.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.max.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.max.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.max.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.clamp.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.clamp.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.clamp.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.clamp.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.clamp.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.clamp.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.clamp.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.clamp.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.mix.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.mix.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.mix.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.mix.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.mix.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.mix.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.mix.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.mix.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.mix.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.mix.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.mix.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.mix.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.step.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.step.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.step.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.step.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.step.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.step.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.step.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.step.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.step.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.step.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.step.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.step.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.smoothstep.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.smoothstep.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.smoothstep.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.smoothstep.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.length.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.length.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.length.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.length.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.length.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.length.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.length.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.length.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.length.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.length.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.length.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.length.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.distance.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.distance.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.distance.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.distance.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.distance.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.distance.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.distance.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.distance.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.distance.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.distance.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.distance.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.distance.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.dot.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.dot.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.dot.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.dot.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.dot.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.dot.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.dot.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.dot.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.dot.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.dot.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.dot.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.cross.lowp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.cross.mediump_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.cross.highp_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.normalize.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.normalize.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.normalize.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.normalize.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.normalize.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.normalize.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.normalize.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.normalize.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.normalize.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.normalize.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.normalize.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.normalize.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.faceforward.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.faceforward.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.faceforward.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.faceforward.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.faceforward.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.faceforward.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.faceforward.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.faceforward.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.faceforward.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.faceforward.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.faceforward.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.faceforward.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.reflect.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.reflect.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.reflect.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.reflect.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.reflect.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.reflect.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.reflect.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.reflect.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.reflect.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.refract.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.refract.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.refract.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.refract.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.refract.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.refract.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.refract.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.refract.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.refract.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.refract.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.refract.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.refract.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.matrixcompmult.lowp_compute.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.matrixcompmult.lowp_compute.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.matrixcompmult.lowp_compute.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.matrixcompmult.lowp_compute.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.matrixcompmult.lowp_compute.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.matrixcompmult.lowp_compute.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.matrixcompmult.lowp_compute.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.matrixcompmult.lowp_compute.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.matrixcompmult.lowp_compute.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.matrixcompmult.mediump_compute.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.matrixcompmult.mediump_compute.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.matrixcompmult.mediump_compute.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.matrixcompmult.mediump_compute.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.matrixcompmult.mediump_compute.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.matrixcompmult.mediump_compute.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.matrixcompmult.mediump_compute.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.matrixcompmult.mediump_compute.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.matrixcompmult.mediump_compute.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.matrixcompmult.highp_compute.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.matrixcompmult.highp_compute.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.matrixcompmult.highp_compute.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.matrixcompmult.highp_compute.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.matrixcompmult.highp_compute.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.matrixcompmult.highp_compute.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.matrixcompmult.highp_compute.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.matrixcompmult.highp_compute.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.matrixcompmult.highp_compute.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.outerproduct.lowp_compute.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.outerproduct.lowp_compute.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.outerproduct.lowp_compute.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.outerproduct.lowp_compute.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.outerproduct.lowp_compute.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.outerproduct.lowp_compute.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.outerproduct.lowp_compute.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.outerproduct.lowp_compute.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.outerproduct.lowp_compute.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.outerproduct.mediump_compute.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.outerproduct.mediump_compute.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.outerproduct.mediump_compute.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.outerproduct.mediump_compute.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.outerproduct.mediump_compute.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.outerproduct.mediump_compute.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.outerproduct.mediump_compute.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.outerproduct.mediump_compute.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.outerproduct.mediump_compute.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.outerproduct.highp_compute.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.outerproduct.highp_compute.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.outerproduct.highp_compute.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.outerproduct.highp_compute.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.outerproduct.highp_compute.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.outerproduct.highp_compute.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.outerproduct.highp_compute.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.outerproduct.highp_compute.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.outerproduct.highp_compute.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.transpose.lowp_compute.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.transpose.lowp_compute.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.transpose.lowp_compute.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.transpose.lowp_compute.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.transpose.lowp_compute.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.transpose.lowp_compute.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.transpose.lowp_compute.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.transpose.lowp_compute.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.transpose.lowp_compute.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.transpose.mediump_compute.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.transpose.mediump_compute.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.transpose.mediump_compute.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.transpose.mediump_compute.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.transpose.mediump_compute.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.transpose.mediump_compute.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.transpose.mediump_compute.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.transpose.mediump_compute.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.transpose.mediump_compute.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.transpose.highp_compute.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.transpose.highp_compute.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.transpose.highp_compute.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.transpose.highp_compute.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.transpose.highp_compute.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.transpose.highp_compute.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.transpose.highp_compute.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.transpose.highp_compute.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.transpose.highp_compute.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.determinant.lowp_compute.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.determinant.mediump_compute.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.determinant.highp_compute.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.inverse.lowp_compute.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.inverse.mediump_compute.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.lowp_vertex.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.lowp_vertex.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.lowp_vertex.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.lowp_vertex.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.lowp_fragment.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.lowp_fragment.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.lowp_fragment.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.lowp_fragment.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.mediump_vertex.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.mediump_vertex.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.mediump_vertex.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.mediump_vertex.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.mediump_fragment.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.mediump_fragment.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.mediump_fragment.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.mediump_fragment.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.highp_vertex.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.highp_vertex.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.highp_vertex.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.highp_vertex.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.highp_fragment.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.highp_fragment.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.highp_fragment.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.highp_fragment.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.frexp.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.lowp_vertex.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.lowp_vertex.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.lowp_vertex.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.lowp_vertex.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.lowp_fragment.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.lowp_fragment.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.lowp_fragment.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.lowp_fragment.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.lowp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.lowp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.lowp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.lowp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.mediump_vertex.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.mediump_vertex.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.mediump_vertex.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.mediump_vertex.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.mediump_fragment.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.mediump_fragment.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.mediump_fragment.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.mediump_fragment.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.mediump_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.mediump_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.mediump_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.mediump_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.highp_vertex.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.highp_vertex.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.highp_vertex.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.highp_vertex.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.highp_fragment.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.highp_fragment.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.highp_fragment.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.highp_fragment.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.highp_compute.scalar = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.highp_compute.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.highp_compute.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_functions.precision.ldexp.highp_compute.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.compute.sampler2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.compute.samplercube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.compute.sampler2darray = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.compute.sampler3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.compute.sampler2dshadow = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.compute.samplercubeshadow = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.compute.sampler2darrayshadow = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.compute.isampler2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.compute.isamplercube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.compute.isampler2darray = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.compute.isampler3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.compute.usampler2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.compute.usamplercube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.compute.usampler2darray = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.compute.usampler3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_expression.compute.sampler2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_expression.compute.samplercube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_expression.compute.sampler2darray = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_expression.compute.sampler3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_expression.compute.sampler2dshadow = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_expression.compute.samplercubeshadow = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_expression.compute.sampler2darrayshadow = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_expression.compute.isampler2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_expression.compute.isamplercube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_expression.compute.isampler2darray = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_expression.compute.isampler3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_expression.compute.usampler2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_expression.compute.usamplercube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_expression.compute.usampler2darray = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_expression.compute.usampler3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.ubo.const_literal_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.ubo.const_literal_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.ubo.const_literal_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.ubo.const_expression_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.ubo.const_expression_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.ubo.const_expression_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.ssbo.const_literal_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.ssbo.const_literal_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.ssbo.const_literal_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.ssbo.const_expression_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.ssbo.const_expression_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.ssbo.const_expression_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.atomic_counter.const_literal_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.atomic_counter.const_literal_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.atomic_counter.const_literal_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.atomic_counter.const_expression_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.atomic_counter.const_expression_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.opaque_type_indexing.atomic_counter.const_expression_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.functions.overloading.arrays_of_arrays_size_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.functions.overloading.arrays_of_arrays_size_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.explicit.float_3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.explicit.float_3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.explicit.float_3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.explicit.float_3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.explicit.int_3x1_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.explicit.int_3x1_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.explicit.int_4x4x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.explicit.int_4x4x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.explicit.bool_3x3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.explicit.bool_3x3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.explicit.bool_2x1x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.explicit.bool_2x1x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.explicit.struct_3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.explicit.struct_3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.explicit.struct_4x1x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.explicit.struct_4x1x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.explicit.vec3_4x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.explicit.vec3_4x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.explicit.ivec3_3x2x1_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.explicit.ivec3_3x2x1_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.explicit.bvec3_1x2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.explicit.bvec3_1x2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.explicit.mat3_3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.explicit.mat3_3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.explicit.mat3_3x3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.explicit.mat3_3x3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.explicit.mat3_3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.explicit.mat3_3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.explicit.high_dimensional_array_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.explicit.high_dimensional_array_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.implicit.float_3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.implicit.float_3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.implicit.float_3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.implicit.float_3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.implicit.int_3x1_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.implicit.int_3x1_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.implicit.int_4x4x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.implicit.int_4x4x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.implicit.bool_3x3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.implicit.bool_3x3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.implicit.bool_2x1x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.implicit.bool_2x1x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.implicit.struct_3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.implicit.struct_3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.implicit.struct_4x1x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.implicit.struct_4x1x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.implicit.vec3_4x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.implicit.vec3_4x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.implicit.ivec3_3x2x1_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.implicit.ivec3_3x2x1_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.implicit.bvec3_1x2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.implicit.bvec3_1x2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.implicit.mat3_3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.implicit.mat3_3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.implicit.mat3_3x3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.implicit.mat3_3x3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.implicit.mat3_3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.implicit.mat3_3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.implicit.int_high_dimensional_array_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.constructor.implicit.int_high_dimensional_array_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.explicit.float_3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.explicit.float_3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.explicit.int_2x2x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.explicit.int_2x2x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.explicit.bool_3x2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.explicit.bool_3x2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.explicit.vec3_2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.explicit.vec3_2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.explicit.struct_3x1x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.explicit.struct_3x1x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.explicit.ivec3_3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.explicit.ivec3_3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.explicit.bvec4_4x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.explicit.bvec4_4x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.explicit.mat3_3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.explicit.mat3_3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.explicit.mat3_3x3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.explicit.mat3_3x3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.explicit.mat3_3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.explicit.mat3_3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.implicit.float_3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.implicit.float_3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.implicit.int_2x2x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.implicit.int_2x2x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.implicit.bool_3x2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.implicit.bool_3x2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.implicit.vec3_2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.implicit.vec3_2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.implicit.struct_3x1x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.implicit.struct_3x1x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.implicit.ivec3_3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.implicit.ivec3_3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.implicit.bvec4_4x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.implicit.bvec4_4x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.implicit.mat3_3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.implicit.mat3_3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.implicit.mat3_3x3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.implicit.mat3_3x3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.implicit.mat3_3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.return.implicit.mat3_3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.in.float_3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.in.float_3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.in.int_2x2x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.in.int_2x2x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.in.bool_3x2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.in.bool_3x2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.in.vec3_2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.in.vec3_2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.in.struct_3x1x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.in.struct_3x1x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.in.ivec3_3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.in.ivec3_3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.in.bvec4_4x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.in.bvec4_4x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.in.mat3_3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.in.mat3_3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.in.mat3_3x3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.in.mat3_3x3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.in.mat3_3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.in.mat3_3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.out.float_3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.out.float_3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.out.int_2x2x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.out.int_2x2x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.out.bool_3x2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.out.bool_3x2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.out.vec3_2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.out.vec3_2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.out.struct_3x1x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.out.struct_3x1x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.out.ivec3_3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.out.ivec3_3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.out.bvec4_4x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.out.bvec4_4x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.out.mat3_3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.out.mat3_3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.out.mat3_3x3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.out.mat3_3x3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.out.mat3_3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.out.mat3_3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.unnamed.float_3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.unnamed.float_3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.unnamed.int_2x2x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.unnamed.int_2x2x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.unnamed.bool_3x2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.unnamed.bool_3x2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.unnamed.vec3_2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.unnamed.vec3_2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.unnamed.struct_3x1x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.unnamed.struct_3x1x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.unnamed.ivec3_3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.unnamed.ivec3_3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.unnamed.bvec4_4x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.unnamed.bvec4_4x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.unnamed.mat3_3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.unnamed.mat3_3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.unnamed.mat3_3x3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.unnamed.mat3_3x3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.unnamed.mat3_3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.parameter.unnamed.mat3_3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.implicit_size.float_3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.implicit_size.float_3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.implicit_size.int_2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.implicit_size.int_2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.implicit_size.bool_3x3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.implicit_size.bool_3x3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.implicit_size.struct_5x5x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.implicit_size.struct_5x5x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.implicit_size.vec3_1x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.implicit_size.vec3_1x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.implicit_size.ivec3_3x1x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.implicit_size.ivec3_3x1x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.implicit_size.bvec3_3x1_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.implicit_size.bvec3_3x1_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.implicit_size.mat3_3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.implicit_size.mat3_3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.implicit_size.mat3_3x3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.implicit_size.mat3_3x3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.implicit_size.mat3_3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.implicit_size.mat3_3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_explicit.float_3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_explicit.float_3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_explicit.int_2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_explicit.int_2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_explicit.bool_3x3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_explicit.bool_3x3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_explicit.struct_5x5x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_explicit.struct_5x5x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_explicit.vec3_1x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_explicit.vec3_1x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_explicit.ivec3_3x1x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_explicit.ivec3_3x1x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_explicit.bvec3_3x1_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_explicit.bvec3_3x1_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_explicit.mat3_3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_explicit.mat3_3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_explicit.mat3_3x3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_explicit.mat3_3x3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_explicit.mat3_3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_explicit.mat3_3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit.float_3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit.float_3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit.int_2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit.int_2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit.bool_3x3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit.bool_3x3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit.struct_5x5x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit.struct_5x5x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit.vec3_1x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit.vec3_1x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit.ivec3_3x1x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit.ivec3_3x1x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit.bvec3_3x1_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit.bvec3_3x1_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit.mat3_3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit.mat3_3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit.mat3_3x3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit.mat3_3x3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit.mat3_3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.explicit_to_implicit.mat3_3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_explicit.float_3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_explicit.float_3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_explicit.int_2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_explicit.int_2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_explicit.bool_3x3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_explicit.bool_3x3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_explicit.struct_5x5x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_explicit.struct_5x5x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_explicit.vec3_1x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_explicit.vec3_1x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_explicit.ivec3_3x1x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_explicit.ivec3_3x1x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_explicit.bvec3_3x1_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_explicit.bvec3_3x1_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_explicit.mat3_3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_explicit.mat3_3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_explicit.mat3_3x3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_explicit.mat3_3x3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_explicit.mat3_3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_explicit.mat3_3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit.float_3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit.float_3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit.int_2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit.int_2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit.bool_3x3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit.bool_3x3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit.struct_5x5x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit.struct_5x5x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit.vec3_1x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit.vec3_1x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit.ivec3_3x1x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit.ivec3_3x1x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit.bvec3_3x1_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit.bvec3_3x1_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit.mat3_3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit.mat3_3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit.mat3_3x3x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit.mat3_3x3x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit.mat3_3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.assignment.implicit_to_implicit.mat3_3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.length.float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.length.float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.length.int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.length.int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.length.bool_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.length.bool_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.length.struct_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.length.struct_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.length.mat3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.length.mat3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.length.constant_expression_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.length.constant_expression_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.array_access.constant_expression_access_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.array_access.constant_expression_access_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.array_access.dynamic_expression_access_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.array_access.dynamic_expression_access_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.single_statement_multiple_declarations.explicit_constructor.float_2_dimensions_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.single_statement_multiple_declarations.explicit_constructor.float_2_dimensions_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.single_statement_multiple_declarations.explicit_constructor.int_3_dimensions_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.single_statement_multiple_declarations.explicit_constructor.int_3_dimensions_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.single_statement_multiple_declarations.implicit_constructor.float_2_dimensions_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.single_statement_multiple_declarations.implicit_constructor.float_2_dimensions_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.single_statement_multiple_declarations.implicit_constructor.int_3_dimensions_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.arrays_of_arrays.single_statement_multiple_declarations.implicit_constructor.int_3_dimensions_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.linkage.shader_storage_block.mismatch_number_of_declarations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.linkage.shader_storage_block.mismatch_order = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.linkage.shader_storage_block.mismatch_type = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.linkage.shader_storage_block.mismatch_member_name = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.linkage.shader_storage_block.mismatch_member_unsized_sized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.linkage.shader_storage_block.mismatch_member_array_size = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.linkage.shader_storage_block.mismatch_with_and_without_instance_name = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.linkage.shader_storage_block.mismatch_block_array_size = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_constants.core.max_vertex_attribs = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_constants.core.max_vertex_uniform_vectors = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_constants.core.max_vertex_output_vectors = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_constants.core.max_fragment_input_vectors = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_constants.core.max_fragment_uniform_vectors = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_constants.core.max_draw_buffers = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_constants.core.max_vertex_texture_image_units = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_constants.core.max_combined_texture_image_units = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_constants.core.max_texture_image_units = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_constants.core.min_program_texel_offset = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_constants.core.max_program_texel_offset = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_constants.core.max_image_units = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_constants.core.max_vertex_image_uniforms = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_constants.core.max_fragment_image_uniforms = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_constants.core.max_compute_image_uniforms = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_constants.core.max_combined_image_uniforms = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_constants.core.max_combined_shader_output_resources = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_constants.core.max_compute_uniform_components = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_constants.core.max_compute_texture_image_units = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_constants.core.max_compute_atomic_counters = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_constants.core.max_compute_atomic_counter_buffers = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_constants.core.max_vertex_atomic_counters = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_constants.core.max_fragment_atomic_counters = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_constants.core.max_combined_atomic_counters = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_constants.core.max_atomic_counter_bindings = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_constants.core.max_vertex_atomic_counter_buffers = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_constants.core.max_fragment_atomic_counter_buffers = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_constants.core.max_combined_atomic_counter_buffers = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_constants.core.max_atomic_counter_buffer_size = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_constants.core.max_compute_work_group_count = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.builtin_constants.core.max_compute_work_group_size = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.value.triangles = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.value.lines = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.value.wide_lines = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.value.points = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.value.wide_points = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.value.triangles_4_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.value.lines_4_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.value.wide_lines_4_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.value.points_4_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.value.wide_points_4_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.value.triangles_8_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.value.lines_8_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.value.wide_lines_8_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.value.points_8_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.value.wide_points_8_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.value.triangles_max_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.value.lines_max_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.value.wide_lines_max_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.value.points_max_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.value.wide_points_max_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.triangles_dfdx = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.triangles_dfdy = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.triangles_fwidth = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.lines_dfdx = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.lines_dfdy = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.lines_fwidth = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.wide_lines_dfdx = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.wide_lines_dfdy = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.wide_lines_fwidth = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.points_dfdx = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.points_dfdy = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.points_fwidth = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.wide_points_dfdx = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.wide_points_dfdy = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.wide_points_fwidth = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.triangles_4_samples_dfdx = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.triangles_4_samples_dfdy = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.triangles_4_samples_fwidth = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.lines_4_samples_dfdx = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.lines_4_samples_dfdy = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.lines_4_samples_fwidth = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.wide_lines_4_samples_dfdx = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.wide_lines_4_samples_dfdy = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.wide_lines_4_samples_fwidth = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.points_4_samples_dfdx = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.points_4_samples_dfdy = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.points_4_samples_fwidth = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.wide_points_4_samples_dfdx = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.wide_points_4_samples_dfdy = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.wide_points_4_samples_fwidth = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.triangles_8_samples_dfdx = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.triangles_8_samples_dfdy = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.triangles_8_samples_fwidth = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.lines_8_samples_dfdx = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.lines_8_samples_dfdy = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.lines_8_samples_fwidth = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.wide_lines_8_samples_dfdx = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.wide_lines_8_samples_dfdy = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.wide_lines_8_samples_fwidth = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.points_8_samples_dfdx = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.points_8_samples_dfdy = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.points_8_samples_fwidth = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.wide_points_8_samples_dfdx = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.wide_points_8_samples_dfdy = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.wide_points_8_samples_fwidth = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.triangles_max_samples_dfdx = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.triangles_max_samples_dfdy = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.triangles_max_samples_fwidth = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.lines_max_samples_dfdx = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.lines_max_samples_dfdy = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.lines_max_samples_fwidth = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.wide_lines_max_samples_dfdx = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.wide_lines_max_samples_dfdy = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.wide_lines_max_samples_fwidth = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.points_max_samples_dfdx = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.points_max_samples_dfdy = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.points_max_samples_fwidth = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.wide_points_max_samples_dfdx = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.wide_points_max_samples_dfdy = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.shaders.helper_invocation.derivate.wide_points_max_samples_fwidth = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.empty = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.ubo_to_ssbo_single_invocation = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.ubo_to_ssbo_single_group = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.ubo_to_ssbo_multiple_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.ubo_to_ssbo_multiple_groups = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.copy_ssbo_single_invocation = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.copy_ssbo_multiple_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.copy_ssbo_multiple_groups = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.ssbo_rw_single_invocation = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.ssbo_rw_multiple_groups = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.ssbo_unsized_arr_single_invocation = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.ssbo_unsized_arr_multiple_groups = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.write_multiple_arr_single_invocation = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.write_multiple_arr_multiple_groups = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.write_multiple_unsized_arr_single_invocation = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.write_multiple_unsized_arr_multiple_groups = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.ssbo_local_barrier_single_invocation = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.ssbo_local_barrier_single_group = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.ssbo_local_barrier_multiple_groups = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.ssbo_cmd_barrier_single = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.ssbo_cmd_barrier_multiple = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.shared_var_single_invocation = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.shared_var_single_group = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.shared_var_multiple_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.shared_var_multiple_groups = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.shared_atomic_op_single_invocation = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.shared_atomic_op_single_group = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.shared_atomic_op_multiple_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.shared_atomic_op_multiple_groups = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.copy_image_to_ssbo_small = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.copy_image_to_ssbo_large = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.copy_ssbo_to_image_small = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.copy_ssbo_to_image_large = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.image_barrier_single = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.image_barrier_multiple = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.atomic_counter_single_invocation = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.atomic_counter_single_group = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.atomic_counter_multiple_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.basic.atomic_counter_multiple_groups = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.float_lowp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.float_mediump = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.float_highp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.vec2_lowp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.vec2_mediump = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.vec2_highp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.vec3_lowp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.vec3_mediump = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.vec3_highp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.vec4_lowp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.vec4_mediump = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.vec4_highp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.mat2_lowp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.mat2_mediump = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.mat2_highp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.mat2x3_lowp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.mat2x3_mediump = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.mat2x3_highp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.mat2x4_lowp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.mat2x4_mediump = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.mat2x4_highp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.mat3x2_lowp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.mat3x2_mediump = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.mat3x2_highp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.mat3_lowp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.mat3_mediump = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.mat3_highp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.mat3x4_lowp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.mat3x4_mediump = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.mat3x4_highp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.mat4x2_lowp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.mat4x2_mediump = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.mat4x2_highp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.mat4x3_lowp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.mat4x3_mediump = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.mat4x3_highp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.mat4_lowp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.mat4_mediump = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.mat4_highp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.int_lowp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.int_mediump = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.int_highp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.ivec2_lowp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.ivec2_mediump = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.ivec2_highp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.ivec3_lowp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.ivec3_mediump = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.ivec3_highp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.ivec4_lowp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.ivec4_mediump = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.ivec4_highp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.uint_lowp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.uint_mediump = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.uint_highp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.uvec2_lowp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.uvec2_mediump = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.uvec2_highp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.uvec3_lowp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.uvec3_mediump = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.uvec3_highp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.uvec4_lowp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.uvec4_mediump = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.uvec4_highp = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.basic_type.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.work_group_size.float_1_1_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.work_group_size.float_64_1_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.work_group_size.float_1_64_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.work_group_size.float_1_1_64 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.work_group_size.float_128_1_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.work_group_size.float_1_128_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.work_group_size.float_13_2_4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.work_group_size.vec4_1_1_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.work_group_size.vec4_64_1_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.work_group_size.vec4_1_64_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.work_group_size.vec4_1_1_64 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.work_group_size.vec4_128_1_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.work_group_size.vec4_1_128_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.work_group_size.vec4_13_2_4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.work_group_size.mat4_1_1_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.work_group_size.mat4_64_1_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.work_group_size.mat4_1_64_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.work_group_size.mat4_1_1_64 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.work_group_size.mat4_128_1_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.work_group_size.mat4_1_128_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.work_group_size.mat4_13_2_4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.add.lowp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.add.lowp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.add.mediump_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.add.mediump_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.add.highp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.add.highp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.min.lowp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.min.lowp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.min.mediump_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.min.mediump_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.min.highp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.min.highp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.max.lowp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.max.lowp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.max.mediump_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.max.mediump_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.max.highp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.max.highp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.and.lowp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.and.lowp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.and.mediump_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.and.mediump_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.and.highp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.and.highp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.or.lowp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.or.lowp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.or.mediump_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.or.mediump_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.or.highp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.or.highp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.xor.lowp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.xor.lowp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.xor.mediump_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.xor.mediump_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.xor.highp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.xor.highp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.exchange.lowp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.exchange.lowp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.exchange.mediump_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.exchange.mediump_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.exchange.highp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.exchange.highp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.compswap.lowp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.compswap.lowp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.compswap.mediump_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.compswap.mediump_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.compswap.highp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.shared_var.atomic.compswap.highp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.indirect_dispatch.upload_buffer.single_invocation = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.indirect_dispatch.upload_buffer.multiple_groups = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.indirect_dispatch.upload_buffer.multiple_groups_multiple_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.indirect_dispatch.upload_buffer.small_offset = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.indirect_dispatch.upload_buffer.large_offset = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.indirect_dispatch.upload_buffer.large_offset_multiple_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.indirect_dispatch.upload_buffer.empty_command = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.indirect_dispatch.upload_buffer.multi_dispatch = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.indirect_dispatch.upload_buffer.multi_dispatch_reuse_command = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.indirect_dispatch.gen_in_compute.single_invocation = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.indirect_dispatch.gen_in_compute.multiple_groups = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.indirect_dispatch.gen_in_compute.multiple_groups_multiple_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.indirect_dispatch.gen_in_compute.small_offset = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.indirect_dispatch.gen_in_compute.large_offset = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.indirect_dispatch.gen_in_compute.large_offset_multiple_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.indirect_dispatch.gen_in_compute.empty_command = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.indirect_dispatch.gen_in_compute.multi_dispatch = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.compute.indirect_dispatch.gen_in_compute.multi_dispatch_reuse_command = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_arrays_indirect.first.first_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_arrays_indirect.first.first_3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_arrays_indirect.first.first_17 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_arrays_indirect.points.single_attribute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_arrays_indirect.points.multiple_attributes = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_arrays_indirect.points.instanced_attributes = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_arrays_indirect.points.default_attribute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_arrays_indirect.triangles.single_attribute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_arrays_indirect.triangles.multiple_attributes = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_arrays_indirect.triangles.instanced_attributes = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_arrays_indirect.triangles.default_attribute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_arrays_indirect.triangle_fan.single_attribute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_arrays_indirect.triangle_fan.multiple_attributes = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_arrays_indirect.triangle_fan.instanced_attributes = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_arrays_indirect.triangle_fan.default_attribute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_arrays_indirect.triangle_strip.single_attribute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_arrays_indirect.triangle_strip.multiple_attributes = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_arrays_indirect.triangle_strip.instanced_attributes = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_arrays_indirect.triangle_strip.default_attribute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_arrays_indirect.lines.single_attribute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_arrays_indirect.lines.multiple_attributes = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_arrays_indirect.lines.instanced_attributes = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_arrays_indirect.lines.default_attribute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_arrays_indirect.line_strip.single_attribute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_arrays_indirect.line_strip.multiple_attributes = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_arrays_indirect.line_strip.instanced_attributes = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_arrays_indirect.line_strip.default_attribute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_arrays_indirect.line_loop.single_attribute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_arrays_indirect.line_loop.multiple_attributes = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_arrays_indirect.line_loop.instanced_attributes = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_arrays_indirect.line_loop.default_attribute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.indices.index_byte = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.indices.index_short = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.indices.index_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.base_vertex.index_byte = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.base_vertex.index_short = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.base_vertex.index_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.base_vertex.index_neg_byte = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.base_vertex.index_neg_short = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.base_vertex.index_neg_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.points.single_attribute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.points.multiple_attributes = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.points.instanced_attributes = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.points.default_attribute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.triangles.single_attribute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.triangles.multiple_attributes = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.triangles.instanced_attributes = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.triangles.default_attribute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.triangle_fan.single_attribute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.triangle_fan.multiple_attributes = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.triangle_fan.instanced_attributes = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.triangle_fan.default_attribute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.triangle_strip.single_attribute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.triangle_strip.multiple_attributes = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.triangle_strip.instanced_attributes = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.triangle_strip.default_attribute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.lines.single_attribute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.lines.multiple_attributes = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.lines.instanced_attributes = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.lines.default_attribute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.line_strip.single_attribute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.line_strip.multiple_attributes = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.line_strip.instanced_attributes = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.line_strip.default_attribute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.line_loop.single_attribute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.line_loop.multiple_attributes = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.line_loop.instanced_attributes = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.line_loop.default_attribute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.instancing.draw_arrays_indirect_grid_2x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.instancing.draw_arrays_indirect_grid_5x5 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.instancing.draw_arrays_indirect_grid_10x10 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.instancing.draw_arrays_indirect_grid_32x32 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.instancing.draw_arrays_indirect_grid_100x100 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.instancing.draw_elements_indirect_grid_2x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.instancing.draw_elements_indirect_grid_5x5 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.instancing.draw_elements_indirect_grid_10x10 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.instancing.draw_elements_indirect_grid_32x32 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.instancing.draw_elements_indirect_grid_100x100 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.separate.drawarrays_compute_cmd = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.separate.drawarrays_compute_data = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.separate.drawarrays_compute_cmd_and_data = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.separate.drawelements_compute_cmd = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.separate.drawelements_compute_data = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.separate.drawelements_compute_indices = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.separate.drawelements_compute_cmd_and_data = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.separate.drawelements_compute_cmd_and_indices = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.separate.drawelements_compute_data_and_indices = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.separate.drawelements_compute_cmd_and_data_and_indices = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.combined.drawarrays_compute_cmd_and_data = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.combined.drawelements_compute_cmd_and_data = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.combined.drawelements_compute_cmd_and_indices = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.combined.drawelements_compute_data_and_indices = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.combined.drawelements_compute_cmd_and_data_and_indices = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_separate_grid_100x100_drawcount_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_separate_grid_200x200_drawcount_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_separate_grid_500x500_drawcount_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_separate_grid_1000x1000_drawcount_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_separate_grid_1200x1200_drawcount_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_separate_grid_1500x1500_drawcount_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_separate_grid_100x100_drawcount_8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_separate_grid_200x200_drawcount_8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_separate_grid_500x500_drawcount_8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_separate_grid_1000x1000_drawcount_8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_separate_grid_1200x1200_drawcount_8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_separate_grid_1500x1500_drawcount_8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_separate_grid_100x100_drawcount_200 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_separate_grid_200x200_drawcount_800 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_separate_grid_500x500_drawcount_2500 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_separate_grid_1000x1000_drawcount_5000 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_combined_grid_100x100_drawcount_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_combined_grid_200x200_drawcount_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_combined_grid_500x500_drawcount_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_combined_grid_1000x1000_drawcount_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_combined_grid_1200x1200_drawcount_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_combined_grid_1500x1500_drawcount_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_combined_grid_100x100_drawcount_8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_combined_grid_200x200_drawcount_8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_combined_grid_500x500_drawcount_8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_combined_grid_1000x1000_drawcount_8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_combined_grid_1200x1200_drawcount_8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_combined_grid_1500x1500_drawcount_8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_combined_grid_100x100_drawcount_200 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_combined_grid_200x200_drawcount_800 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_combined_grid_500x500_drawcount_2500 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawarrays_combined_grid_1000x1000_drawcount_5000 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawelements_separate_grid_100x100_drawcount_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawelements_separate_grid_200x200_drawcount_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawelements_separate_grid_500x500_drawcount_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawelements_separate_grid_100x100_drawcount_8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawelements_separate_grid_200x200_drawcount_8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawelements_separate_grid_500x500_drawcount_8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawelements_separate_grid_100x100_drawcount_200 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawelements_separate_grid_200x200_drawcount_800 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawelements_separate_grid_500x500_drawcount_2500 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawelements_combined_grid_100x100_drawcount_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawelements_combined_grid_200x200_drawcount_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawelements_combined_grid_500x500_drawcount_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawelements_combined_grid_100x100_drawcount_8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawelements_combined_grid_200x200_drawcount_8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawelements_combined_grid_500x500_drawcount_8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawelements_combined_grid_100x100_drawcount_200 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawelements_combined_grid_200x200_drawcount_800 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawelements_combined_grid_500x500_drawcount_2500 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.0 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.5 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.6 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.7 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.10 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.11 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.12 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.13 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.14 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.15 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.17 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.18 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.19 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.20 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.21 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.22 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.24 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.25 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.27 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.28 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.29 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.30 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.31 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.32 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.35 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.36 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.37 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.38 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.39 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.40 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.42 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.43 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.44 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.45 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.46 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.47 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.48 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.49 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.50 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.51 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.52 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.53 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.54 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.55 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.56 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.57 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.random.61 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.negative.command_bad_alignment_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.negative.command_bad_alignment_2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.negative.command_bad_alignment_3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.negative.command_offset_partially_in_buffer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.negative.command_offset_not_in_buffer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.negative.command_offset_not_in_buffer_unsigned32_wrap = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.negative.command_offset_not_in_buffer_signed32_wrap = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.negative.client_vertex_attrib_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.negative.default_vao = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.negative.invalid_mode_draw_arrays = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.negative.invalid_mode_draw_elements = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.draw_indirect.negative.invalid_type_draw_elements = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.lowp_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.mediump_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.highp_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.lowp_vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.mediump_vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.highp_vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.lowp_vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.mediump_vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.highp_vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.lowp_vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.mediump_vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.highp_vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.lowp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.mediump_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.highp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.lowp_ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.mediump_ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.highp_ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.lowp_ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.mediump_ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.highp_ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.lowp_ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.mediump_ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.highp_ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.lowp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.mediump_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.highp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.lowp_uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.mediump_uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.highp_uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.lowp_uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.mediump_uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.highp_uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.lowp_uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.mediump_uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.highp_uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.lowp_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.mediump_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.highp_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.row_major_lowp_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.row_major_mediump_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.row_major_highp_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.column_major_lowp_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.column_major_mediump_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.column_major_highp_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.lowp_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.mediump_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.highp_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.row_major_lowp_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.row_major_mediump_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.row_major_highp_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.column_major_lowp_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.column_major_mediump_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.column_major_highp_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.lowp_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.mediump_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.highp_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.row_major_lowp_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.row_major_mediump_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.row_major_highp_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.column_major_lowp_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.column_major_mediump_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.column_major_highp_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.lowp_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.mediump_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.highp_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.row_major_lowp_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.row_major_mediump_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.row_major_highp_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.column_major_lowp_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.column_major_mediump_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.column_major_highp_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.lowp_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.mediump_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.highp_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.row_major_lowp_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.row_major_mediump_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.row_major_highp_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.column_major_lowp_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.column_major_mediump_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.column_major_highp_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.lowp_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.mediump_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.highp_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.row_major_lowp_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.row_major_mediump_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.row_major_highp_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.column_major_lowp_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.column_major_mediump_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.column_major_highp_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.lowp_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.mediump_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.highp_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.row_major_lowp_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.row_major_mediump_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.row_major_highp_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.column_major_lowp_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.column_major_mediump_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.column_major_highp_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.lowp_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.mediump_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.highp_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.row_major_lowp_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.row_major_mediump_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.row_major_highp_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.column_major_lowp_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.column_major_mediump_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.column_major_highp_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.lowp_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.mediump_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.highp_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.row_major_lowp_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.row_major_mediump_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.row_major_highp_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.column_major_lowp_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.column_major_mediump_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.shared.column_major_highp_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.lowp_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.mediump_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.highp_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.lowp_vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.mediump_vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.highp_vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.lowp_vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.mediump_vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.highp_vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.lowp_vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.mediump_vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.highp_vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.lowp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.mediump_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.highp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.lowp_ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.mediump_ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.highp_ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.lowp_ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.mediump_ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.highp_ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.lowp_ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.mediump_ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.highp_ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.lowp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.mediump_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.highp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.lowp_uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.mediump_uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.highp_uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.lowp_uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.mediump_uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.highp_uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.lowp_uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.mediump_uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.highp_uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.lowp_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.mediump_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.highp_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.row_major_lowp_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.row_major_mediump_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.row_major_highp_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.column_major_lowp_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.column_major_mediump_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.column_major_highp_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.lowp_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.mediump_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.highp_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.row_major_lowp_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.row_major_mediump_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.row_major_highp_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.column_major_lowp_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.column_major_mediump_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.column_major_highp_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.lowp_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.mediump_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.highp_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.row_major_lowp_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.row_major_mediump_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.row_major_highp_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.column_major_lowp_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.column_major_mediump_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.column_major_highp_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.lowp_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.mediump_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.highp_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.row_major_lowp_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.row_major_mediump_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.row_major_highp_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.column_major_lowp_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.column_major_mediump_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.column_major_highp_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.lowp_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.mediump_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.highp_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.row_major_lowp_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.row_major_mediump_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.row_major_highp_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.column_major_lowp_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.column_major_mediump_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.column_major_highp_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.lowp_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.mediump_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.highp_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.row_major_lowp_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.row_major_mediump_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.row_major_highp_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.column_major_lowp_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.column_major_mediump_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.column_major_highp_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.lowp_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.mediump_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.highp_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.row_major_lowp_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.row_major_mediump_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.row_major_highp_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.column_major_lowp_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.column_major_mediump_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.column_major_highp_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.lowp_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.mediump_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.highp_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.row_major_lowp_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.row_major_mediump_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.row_major_highp_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.column_major_lowp_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.column_major_mediump_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.column_major_highp_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.lowp_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.mediump_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.highp_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.row_major_lowp_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.row_major_mediump_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.row_major_highp_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.column_major_lowp_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.column_major_mediump_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.packed.column_major_highp_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.lowp_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.mediump_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.highp_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.lowp_vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.mediump_vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.highp_vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.lowp_vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.mediump_vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.highp_vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.lowp_vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.mediump_vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.highp_vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.lowp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.mediump_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.highp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.lowp_ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.mediump_ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.highp_ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.lowp_ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.mediump_ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.highp_ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.lowp_ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.mediump_ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.highp_ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.lowp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.mediump_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.highp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.lowp_uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.mediump_uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.highp_uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.lowp_uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.mediump_uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.highp_uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.lowp_uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.mediump_uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.highp_uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.lowp_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.mediump_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.highp_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.row_major_lowp_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.row_major_mediump_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.row_major_highp_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.column_major_lowp_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.column_major_mediump_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.column_major_highp_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.lowp_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.mediump_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.highp_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.row_major_lowp_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.row_major_mediump_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.row_major_highp_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.column_major_lowp_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.column_major_mediump_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.column_major_highp_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.lowp_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.mediump_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.highp_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.row_major_lowp_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.row_major_mediump_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.row_major_highp_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.column_major_lowp_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.column_major_mediump_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.column_major_highp_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.lowp_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.mediump_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.highp_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.row_major_lowp_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.row_major_mediump_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.row_major_highp_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.column_major_lowp_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.column_major_mediump_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.column_major_highp_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.lowp_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.mediump_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.highp_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.row_major_lowp_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.row_major_mediump_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.row_major_highp_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.column_major_lowp_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.column_major_mediump_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.column_major_highp_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.lowp_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.mediump_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.highp_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.row_major_lowp_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.row_major_mediump_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.row_major_highp_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.column_major_lowp_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.column_major_mediump_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.column_major_highp_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.lowp_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.mediump_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.highp_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.row_major_lowp_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.row_major_mediump_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.row_major_highp_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.column_major_lowp_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.column_major_mediump_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.column_major_highp_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.lowp_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.mediump_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.highp_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.row_major_lowp_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.row_major_mediump_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.row_major_highp_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.column_major_lowp_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.column_major_mediump_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.column_major_highp_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.lowp_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.mediump_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.highp_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.row_major_lowp_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.row_major_mediump_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.row_major_highp_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.column_major_lowp_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.column_major_mediump_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std140.column_major_highp_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.lowp_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.mediump_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.highp_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.lowp_vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.mediump_vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.highp_vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.lowp_vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.mediump_vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.highp_vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.lowp_vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.mediump_vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.highp_vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.lowp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.mediump_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.highp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.lowp_ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.mediump_ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.highp_ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.lowp_ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.mediump_ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.highp_ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.lowp_ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.mediump_ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.highp_ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.lowp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.mediump_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.highp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.lowp_uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.mediump_uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.highp_uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.lowp_uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.mediump_uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.highp_uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.lowp_uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.mediump_uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.highp_uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.lowp_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.mediump_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.highp_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_lowp_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_mediump_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_highp_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.column_major_lowp_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.column_major_mediump_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.column_major_highp_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.lowp_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.mediump_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.highp_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_lowp_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_mediump_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_highp_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.column_major_lowp_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.column_major_mediump_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.column_major_highp_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.lowp_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.mediump_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.highp_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_lowp_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_mediump_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_highp_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.column_major_lowp_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.column_major_mediump_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.column_major_highp_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.lowp_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.mediump_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.highp_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_lowp_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_mediump_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_highp_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.column_major_lowp_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.column_major_mediump_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.column_major_highp_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.lowp_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.mediump_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.highp_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_lowp_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_mediump_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_highp_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.column_major_lowp_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.column_major_mediump_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.column_major_highp_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.lowp_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.mediump_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.highp_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_lowp_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_mediump_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_highp_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.column_major_lowp_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.column_major_mediump_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.column_major_highp_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.lowp_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.mediump_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.highp_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_lowp_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_mediump_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_highp_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.column_major_lowp_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.column_major_mediump_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.column_major_highp_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.lowp_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.mediump_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.highp_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_lowp_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_mediump_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_highp_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.column_major_lowp_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.column_major_mediump_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.column_major_highp_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.lowp_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.mediump_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.highp_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_lowp_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_mediump_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.row_major_highp_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.column_major_lowp_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.column_major_mediump_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_type.std430.column_major_highp_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.row_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.column_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.row_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.column_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.row_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.column_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.row_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.column_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.row_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.column_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.row_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.column_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.row_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.column_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.row_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.column_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.row_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.shared.column_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.row_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.column_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.row_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.column_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.row_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.column_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.row_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.column_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.row_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.column_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.row_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.column_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.row_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.column_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.row_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.column_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.row_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.packed.column_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.row_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.column_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.row_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.column_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.row_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.column_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.row_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.column_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.row_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.column_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.row_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.column_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.row_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.column_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.row_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.column_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.row_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std140.column_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.row_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.column_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.row_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.column_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.row_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.column_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.row_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.column_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.row_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.column_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.row_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.column_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.row_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.column_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.row_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.column_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.row_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_basic_array.std430.column_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.row_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.column_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.row_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.column_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.row_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.column_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.row_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.column_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.row_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.column_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.row_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.column_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.row_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.column_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.row_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.column_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.row_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.shared.column_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.row_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.column_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.row_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.column_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.row_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.column_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.row_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.column_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.row_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.column_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.row_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.column_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.row_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.column_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.row_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.column_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.row_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.packed.column_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.row_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.column_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.row_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.column_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.row_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.column_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.row_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.column_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.row_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.column_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.row_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.column_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.row_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.column_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.row_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.column_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.row_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std140.column_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.row_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.column_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.row_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.column_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.row_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.column_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.row_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.column_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.row_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.column_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.row_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.column_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.row_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.column_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.row_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.column_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.row_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.basic_unsized_array.std430.column_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.row_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.column_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.row_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.column_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.row_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.column_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.row_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.column_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.row_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.column_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.row_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.column_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.row_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.column_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.row_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.column_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.row_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.shared.column_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.row_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.column_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.row_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.column_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.row_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.column_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.row_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.column_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.row_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.column_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.row_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.column_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.row_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.column_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.row_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.column_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.row_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.packed.column_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.row_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.column_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.row_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.column_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.row_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.column_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.row_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.column_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.row_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.column_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.row_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.column_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.row_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.column_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.row_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.column_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.row_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std140.column_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.row_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.column_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.row_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.column_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.row_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.column_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.row_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.column_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.row_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.column_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.row_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.column_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.row_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.column_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.row_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.column_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.row_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_array.std430.column_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.row_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.column_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.row_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.column_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.row_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.column_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.row_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.column_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.row_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.column_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.row_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.column_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.row_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.column_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.row_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.column_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.row_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.shared.column_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.row_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.column_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.row_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.column_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.row_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.column_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.row_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.column_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.row_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.column_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.row_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.column_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.row_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.column_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.row_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.column_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.row_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.packed.column_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.row_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.column_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.row_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.column_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.row_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.column_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.row_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.column_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.row_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.column_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.row_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.column_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.row_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.column_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.row_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.column_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.row_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std140.column_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.row_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.column_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.row_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.column_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.row_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.column_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.row_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.column_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.row_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.column_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.row_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.column_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.row_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.column_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.row_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.column_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.row_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_array.std430.column_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.row_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.column_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.row_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.column_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.row_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.column_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.row_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.column_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.row_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.column_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.row_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.column_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.row_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.column_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.row_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.column_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.row_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.shared.column_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.row_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.column_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.row_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.column_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.row_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.column_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.row_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.column_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.row_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.column_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.row_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.column_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.row_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.column_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.row_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.column_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.row_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.packed.column_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.row_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.column_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.row_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.column_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.row_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.column_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.row_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.column_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.row_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.column_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.row_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.column_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.row_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.column_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.row_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.column_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.row_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std140.column_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.row_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.column_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.row_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.column_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.row_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.column_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.row_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.column_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.row_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.column_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.row_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.column_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.row_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.column_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.row_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.column_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.row_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.3_level_unsized_array.std430.column_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_struct.per_block_buffer.shared = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_struct.per_block_buffer.shared_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_struct.per_block_buffer.packed = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_struct.per_block_buffer.packed_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_struct.per_block_buffer.std140 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_struct.per_block_buffer.std140_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_struct.per_block_buffer.std430 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_struct.per_block_buffer.std430_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_struct.single_buffer.shared_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_struct.single_buffer.packed_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_struct.single_buffer.std140_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_struct.single_buffer.std430_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_struct_array.per_block_buffer.shared = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_struct_array.per_block_buffer.shared_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_struct_array.per_block_buffer.packed = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_struct_array.per_block_buffer.packed_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_struct_array.per_block_buffer.std140 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_struct_array.per_block_buffer.std140_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_struct_array.per_block_buffer.std430 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_struct_array.per_block_buffer.std430_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_struct_array.single_buffer.shared_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_struct_array.single_buffer.packed_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_struct_array.single_buffer.std140_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_struct_array.single_buffer.std430_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_nested_struct.per_block_buffer.shared = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_nested_struct.per_block_buffer.shared_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_nested_struct.per_block_buffer.packed = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_nested_struct.per_block_buffer.packed_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_nested_struct.per_block_buffer.std140 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_nested_struct.per_block_buffer.std140_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_nested_struct.per_block_buffer.std430 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_nested_struct.per_block_buffer.std430_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_nested_struct.single_buffer.shared_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_nested_struct.single_buffer.packed_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_nested_struct.single_buffer.std140_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_nested_struct.single_buffer.std430_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_nested_struct_array.per_block_buffer.shared = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_nested_struct_array.per_block_buffer.shared_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_nested_struct_array.per_block_buffer.packed = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_nested_struct_array.per_block_buffer.packed_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_nested_struct_array.per_block_buffer.std140 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_nested_struct_array.per_block_buffer.std140_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_nested_struct_array.per_block_buffer.std430 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_nested_struct_array.per_block_buffer.std430_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_nested_struct_array.single_buffer.shared_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_nested_struct_array.single_buffer.packed_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_nested_struct_array.single_buffer.std140_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.single_nested_struct_array.single_buffer.std430_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.unsized_struct_array.per_block_buffer.shared = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.unsized_struct_array.per_block_buffer.shared_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.unsized_struct_array.per_block_buffer.packed = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.unsized_struct_array.per_block_buffer.packed_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.unsized_struct_array.per_block_buffer.std140 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.unsized_struct_array.per_block_buffer.std140_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.unsized_struct_array.per_block_buffer.std430 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.unsized_struct_array.per_block_buffer.std430_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.unsized_struct_array.single_buffer.shared_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.unsized_struct_array.single_buffer.packed_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.unsized_struct_array.single_buffer.std140_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.unsized_struct_array.single_buffer.std430_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_unsized_struct_array.per_block_buffer.shared = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_unsized_struct_array.per_block_buffer.shared_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_unsized_struct_array.per_block_buffer.packed = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_unsized_struct_array.per_block_buffer.packed_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_unsized_struct_array.per_block_buffer.std140 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_unsized_struct_array.per_block_buffer.std140_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_unsized_struct_array.per_block_buffer.std430 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_unsized_struct_array.per_block_buffer.std430_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_unsized_struct_array.single_buffer.shared_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_unsized_struct_array.single_buffer.packed_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_unsized_struct_array.single_buffer.std140_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.2_level_unsized_struct_array.single_buffer.std430_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.unsized_nested_struct_array.per_block_buffer.shared = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.unsized_nested_struct_array.per_block_buffer.shared_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.unsized_nested_struct_array.per_block_buffer.packed = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.unsized_nested_struct_array.per_block_buffer.packed_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.unsized_nested_struct_array.per_block_buffer.std140 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.unsized_nested_struct_array.per_block_buffer.std140_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.unsized_nested_struct_array.per_block_buffer.std430 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.unsized_nested_struct_array.per_block_buffer.std430_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.unsized_nested_struct_array.single_buffer.shared_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.unsized_nested_struct_array.single_buffer.packed_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.unsized_nested_struct_array.single_buffer.std140_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.unsized_nested_struct_array.single_buffer.std430_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.row_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.column_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.row_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.column_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.row_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.column_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.row_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.column_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.row_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.column_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.row_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.column_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.row_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.column_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.row_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.column_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.row_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.shared.column_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.row_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.column_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.row_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.column_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.row_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.column_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.row_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.column_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.row_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.column_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.row_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.column_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.row_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.column_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.row_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.column_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.row_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.packed.column_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.row_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.column_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.row_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.column_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.row_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.column_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.row_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.column_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.row_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.column_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.row_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.column_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.row_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.column_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.row_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.column_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.row_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std140.column_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.row_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.column_major_mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.row_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.column_major_mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.row_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.column_major_mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.row_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.column_major_mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.row_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.column_major_mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.row_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.column_major_mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.row_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.column_major_mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.row_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.column_major_mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.row_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.instance_array_basic_type.std430.column_major_mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.multi_basic_types.per_block_buffer.shared = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.multi_basic_types.per_block_buffer.shared_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.multi_basic_types.per_block_buffer.packed = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.multi_basic_types.per_block_buffer.packed_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.multi_basic_types.per_block_buffer.std140 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.multi_basic_types.per_block_buffer.std140_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.multi_basic_types.per_block_buffer.std430 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.multi_basic_types.per_block_buffer.std430_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.multi_basic_types.single_buffer.shared = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.multi_basic_types.single_buffer.shared_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.multi_basic_types.single_buffer.packed = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.multi_basic_types.single_buffer.packed_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.multi_basic_types.single_buffer.std140 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.multi_basic_types.single_buffer.std140_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.multi_basic_types.single_buffer.std430 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.multi_basic_types.single_buffer.std430_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.multi_nested_struct.per_block_buffer.shared = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.multi_nested_struct.per_block_buffer.shared_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.multi_nested_struct.per_block_buffer.packed = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.multi_nested_struct.per_block_buffer.packed_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.multi_nested_struct.per_block_buffer.std140 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.multi_nested_struct.per_block_buffer.std140_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.multi_nested_struct.per_block_buffer.std430 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.multi_nested_struct.per_block_buffer.std430_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.multi_nested_struct.single_buffer.shared = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.multi_nested_struct.single_buffer.shared_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.multi_nested_struct.single_buffer.packed = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.multi_nested_struct.single_buffer.packed_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.multi_nested_struct.single_buffer.std140 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.multi_nested_struct.single_buffer.std140_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.multi_nested_struct.single_buffer.std430 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.multi_nested_struct.single_buffer.std430_instance_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.scalar_types.0 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.scalar_types.1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.scalar_types.2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.scalar_types.3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.scalar_types.4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.scalar_types.5 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.scalar_types.6 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.scalar_types.7 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.scalar_types.8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.scalar_types.9 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.scalar_types.10 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.scalar_types.11 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.scalar_types.12 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.scalar_types.13 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.scalar_types.14 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.scalar_types.15 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.scalar_types.16 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.scalar_types.17 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.scalar_types.18 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.scalar_types.19 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.scalar_types.20 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.scalar_types.21 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.scalar_types.22 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.scalar_types.23 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.scalar_types.24 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.vector_types.0 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.vector_types.1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.vector_types.2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.vector_types.3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.vector_types.4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.vector_types.5 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.vector_types.6 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.vector_types.7 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.vector_types.8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.vector_types.9 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.vector_types.10 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.vector_types.11 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.vector_types.12 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.vector_types.13 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.vector_types.14 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.vector_types.15 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.vector_types.16 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.vector_types.17 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.vector_types.18 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.vector_types.19 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.vector_types.20 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.vector_types.21 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.vector_types.22 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.vector_types.23 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.vector_types.24 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_types.0 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_types.1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_types.2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_types.3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_types.4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_types.5 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_types.6 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_types.7 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_types.8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_types.9 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_types.10 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_types.11 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_types.12 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_types.13 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_types.14 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_types.15 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_types.16 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_types.17 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_types.18 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_types.19 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_types.20 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_types.21 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_types.22 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_types.23 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_types.24 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_arrays.0 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_arrays.1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_arrays.2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_arrays.3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_arrays.4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_arrays.5 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_arrays.6 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_arrays.7 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_arrays.8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_arrays.9 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_arrays.10 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_arrays.11 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_arrays.12 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_arrays.13 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_arrays.14 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_arrays.15 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_arrays.16 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_arrays.17 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_arrays.18 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_arrays.19 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_arrays.20 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_arrays.21 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_arrays.22 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_arrays.23 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_arrays.24 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.unsized_arrays.0 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.unsized_arrays.1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.unsized_arrays.2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.unsized_arrays.3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.unsized_arrays.4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.unsized_arrays.5 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.unsized_arrays.6 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.unsized_arrays.7 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.unsized_arrays.8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.unsized_arrays.9 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.unsized_arrays.10 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.unsized_arrays.11 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.unsized_arrays.12 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.unsized_arrays.13 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.unsized_arrays.14 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.unsized_arrays.15 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.unsized_arrays.16 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.unsized_arrays.17 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.unsized_arrays.18 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.unsized_arrays.19 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.unsized_arrays.20 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.unsized_arrays.21 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.unsized_arrays.22 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.unsized_arrays.23 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.unsized_arrays.24 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.arrays_of_arrays.0 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.arrays_of_arrays.1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.arrays_of_arrays.2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.arrays_of_arrays.3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.arrays_of_arrays.4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.arrays_of_arrays.5 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.arrays_of_arrays.6 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.arrays_of_arrays.7 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.arrays_of_arrays.8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.arrays_of_arrays.9 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.arrays_of_arrays.10 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.arrays_of_arrays.11 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.arrays_of_arrays.12 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.arrays_of_arrays.13 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.arrays_of_arrays.14 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.arrays_of_arrays.15 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.arrays_of_arrays.16 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.arrays_of_arrays.17 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.arrays_of_arrays.18 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.arrays_of_arrays.19 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.arrays_of_arrays.20 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.arrays_of_arrays.21 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.arrays_of_arrays.22 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.arrays_of_arrays.23 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.arrays_of_arrays.24 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_instance_arrays.0 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_instance_arrays.1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_instance_arrays.2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_instance_arrays.3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_instance_arrays.4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_instance_arrays.5 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_instance_arrays.6 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_instance_arrays.7 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_instance_arrays.8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_instance_arrays.9 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_instance_arrays.10 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_instance_arrays.11 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_instance_arrays.12 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_instance_arrays.13 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_instance_arrays.14 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_instance_arrays.15 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_instance_arrays.16 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_instance_arrays.17 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_instance_arrays.18 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_instance_arrays.19 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_instance_arrays.20 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_instance_arrays.21 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_instance_arrays.22 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_instance_arrays.23 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.basic_instance_arrays.24 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs.0 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs.1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs.2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs.3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs.4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs.5 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs.6 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs.7 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs.8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs.9 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs.10 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs.11 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs.12 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs.13 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs.14 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs.15 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs.16 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs.17 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs.18 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs.19 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs.20 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs.21 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs.22 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs.23 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs.24 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays.0 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays.1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays.2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays.3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays.4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays.5 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays.6 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays.7 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays.8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays.9 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays.10 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays.11 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays.12 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays.13 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays.14 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays.15 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays.16 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays.17 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays.18 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays.19 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays.20 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays.21 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays.22 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays.23 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays.24 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_instance_arrays.0 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_instance_arrays.1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_instance_arrays.2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_instance_arrays.3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_instance_arrays.4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_instance_arrays.5 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_instance_arrays.6 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_instance_arrays.7 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_instance_arrays.8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_instance_arrays.9 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_instance_arrays.10 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_instance_arrays.11 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_instance_arrays.12 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_instance_arrays.13 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_instance_arrays.14 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_instance_arrays.15 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_instance_arrays.16 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_instance_arrays.17 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_instance_arrays.18 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_instance_arrays.19 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_instance_arrays.20 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_instance_arrays.21 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_instance_arrays.22 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_instance_arrays.23 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_instance_arrays.24 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays_instance_arrays.0 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays_instance_arrays.1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays_instance_arrays.2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays_instance_arrays.3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays_instance_arrays.4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays_instance_arrays.5 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays_instance_arrays.6 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays_instance_arrays.7 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays_instance_arrays.8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays_instance_arrays.9 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays_instance_arrays.10 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays_instance_arrays.11 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays_instance_arrays.12 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays_instance_arrays.13 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays_instance_arrays.14 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays_instance_arrays.15 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays_instance_arrays.16 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays_instance_arrays.17 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays_instance_arrays.18 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays_instance_arrays.19 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays_instance_arrays.20 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays_instance_arrays.21 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays_instance_arrays.22 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays_instance_arrays.23 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.nested_structs_arrays_instance_arrays.24 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.0 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.5 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.6 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.7 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.9 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.10 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.11 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.12 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.13 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.14 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.15 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.16 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.17 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.18 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.19 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.20 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.21 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.22 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.23 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.24 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.25 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.26 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.27 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.28 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.29 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.30 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.31 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.32 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.33 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.34 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.35 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.36 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.37 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.38 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.39 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.40 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.41 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.42 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.43 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.44 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.45 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.46 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.47 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.48 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_per_block_buffers.49 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.0 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.5 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.6 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.7 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.9 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.10 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.11 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.12 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.13 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.14 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.15 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.16 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.17 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.18 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.19 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.20 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.21 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.22 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.23 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.24 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.25 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.26 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.27 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.28 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.29 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.30 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.31 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.32 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.33 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.34 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.35 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.36 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.37 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.38 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.39 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.40 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.41 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.42 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.43 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.44 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.45 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.46 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.47 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.48 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.49 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.add.lowp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.add.lowp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.add.mediump_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.add.mediump_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.add.highp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.add.highp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.min.lowp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.min.lowp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.min.mediump_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.min.mediump_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.min.highp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.min.highp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.max.lowp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.max.lowp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.max.mediump_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.max.mediump_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.max.highp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.max.highp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.and.lowp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.and.lowp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.and.mediump_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.and.mediump_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.and.highp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.and.highp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.or.lowp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.or.lowp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.or.mediump_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.or.mediump_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.or.highp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.or.highp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.xor.lowp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.xor.lowp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.xor.mediump_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.xor.mediump_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.xor.highp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.xor.highp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.exchange.lowp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.exchange.lowp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.exchange.mediump_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.exchange.mediump_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.exchange.highp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.exchange.highp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.compswap.lowp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.compswap.lowp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.compswap.mediump_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.compswap.mediump_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.compswap.highp_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.atomic.compswap.highp_int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.array_length.sized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.array_length.sized_writeonly_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.array_length.sized_readonly_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.array_length.unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.array_length.unsized_writeonly_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ssbo.array_length.unsized_readonly_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.float_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.vec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.vec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.vec2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.vec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.vec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.vec3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.int_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.ivec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.ivec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.ivec2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.ivec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.ivec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.ivec3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.uint_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.uvec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.uvec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.uvec2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.uvec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.uvec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.uvec3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.bool_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.bool_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.bool_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.bvec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.bvec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.bvec2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.bvec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.bvec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.bvec3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.bvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.mat2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.row_major_mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.row_major_mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.row_major_mat2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.column_major_mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.column_major_mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.column_major_mat2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.mat3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.mat3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.mat3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.row_major_mat3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.row_major_mat3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.row_major_mat3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.column_major_mat3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.column_major_mat3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.column_major_mat3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.mat4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.mat4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.mat4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.row_major_mat4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.row_major_mat4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.row_major_mat4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.column_major_mat4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.column_major_mat4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.column_major_mat4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.mat2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.mat2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.mat2x3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.row_major_mat2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.row_major_mat2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.row_major_mat2x3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.column_major_mat2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.column_major_mat2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.column_major_mat2x3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.mat2x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.mat2x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.mat2x4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.row_major_mat2x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.row_major_mat2x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.row_major_mat2x4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.column_major_mat2x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.column_major_mat2x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.column_major_mat2x4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.mat3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.mat3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.mat3x2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.row_major_mat3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.row_major_mat3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.row_major_mat3x2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.column_major_mat3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.column_major_mat3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.column_major_mat3x2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.mat3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.mat3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.mat3x4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.row_major_mat3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.row_major_mat3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.row_major_mat3x4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.column_major_mat3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.column_major_mat3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.column_major_mat3x4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.mat4x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.mat4x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.mat4x2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.row_major_mat4x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.row_major_mat4x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.row_major_mat4x2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.column_major_mat4x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.column_major_mat4x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.column_major_mat4x2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.mat4x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.mat4x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.mat4x3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.row_major_mat4x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.row_major_mat4x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.row_major_mat4x3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.column_major_mat4x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.column_major_mat4x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.shared.column_major_mat4x3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.vec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.vec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.vec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.vec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.ivec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.ivec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.ivec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.ivec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.uvec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.uvec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.uvec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.uvec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.bool_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.bool_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.bvec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.bvec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.bvec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.bvec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.row_major_mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.row_major_mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.column_major_mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.column_major_mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.mat3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.mat3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.row_major_mat3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.row_major_mat3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.column_major_mat3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.column_major_mat3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.mat4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.mat4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.row_major_mat4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.row_major_mat4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.column_major_mat4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.column_major_mat4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.mat2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.mat2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.row_major_mat2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.row_major_mat2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.column_major_mat2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.column_major_mat2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.mat2x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.mat2x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.row_major_mat2x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.row_major_mat2x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.column_major_mat2x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.column_major_mat2x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.mat3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.mat3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.row_major_mat3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.row_major_mat3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.column_major_mat3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.column_major_mat3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.mat3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.mat3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.row_major_mat3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.row_major_mat3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.column_major_mat3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.column_major_mat3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.mat4x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.mat4x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.row_major_mat4x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.row_major_mat4x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.column_major_mat4x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.column_major_mat4x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.mat4x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.mat4x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.row_major_mat4x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.row_major_mat4x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.column_major_mat4x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.packed.column_major_mat4x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.float_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.vec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.vec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.vec2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.vec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.vec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.vec3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.int_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.ivec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.ivec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.ivec2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.ivec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.ivec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.ivec3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.uint_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.uvec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.uvec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.uvec2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.uvec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.uvec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.uvec3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.bool_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.bool_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.bool_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.bvec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.bvec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.bvec2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.bvec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.bvec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.bvec3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.bvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.mat2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.row_major_mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.row_major_mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.row_major_mat2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.column_major_mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.column_major_mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.column_major_mat2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.mat3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.mat3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.mat3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.row_major_mat3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.row_major_mat3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.row_major_mat3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.column_major_mat3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.column_major_mat3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.column_major_mat3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.mat4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.mat4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.mat4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.row_major_mat4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.row_major_mat4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.row_major_mat4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.column_major_mat4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.column_major_mat4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.column_major_mat4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.mat2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.mat2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.mat2x3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.row_major_mat2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.row_major_mat2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.row_major_mat2x3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.column_major_mat2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.column_major_mat2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.column_major_mat2x3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.mat2x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.mat2x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.mat2x4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.row_major_mat2x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.row_major_mat2x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.row_major_mat2x4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.column_major_mat2x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.column_major_mat2x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.column_major_mat2x4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.mat3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.mat3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.mat3x2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.row_major_mat3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.row_major_mat3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.row_major_mat3x2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.column_major_mat3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.column_major_mat3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.column_major_mat3x2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.mat3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.mat3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.mat3x4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.row_major_mat3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.row_major_mat3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.row_major_mat3x4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.column_major_mat3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.column_major_mat3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.column_major_mat3x4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.mat4x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.mat4x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.mat4x2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.row_major_mat4x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.row_major_mat4x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.row_major_mat4x2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.column_major_mat4x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.column_major_mat4x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.column_major_mat4x2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.mat4x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.mat4x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.mat4x3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.row_major_mat4x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.row_major_mat4x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.row_major_mat4x3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.column_major_mat4x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.column_major_mat4x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_array.std140.column_major_mat4x3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.float_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.vec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.vec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.vec2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.vec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.vec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.vec3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.int_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.ivec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.ivec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.ivec2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.ivec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.ivec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.ivec3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.uint_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.uvec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.uvec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.uvec2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.uvec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.uvec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.uvec3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.bool_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.bool_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.bool_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.bvec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.bvec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.bvec2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.bvec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.bvec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.bvec3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.bvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.mat2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.row_major_mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.row_major_mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.row_major_mat2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.column_major_mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.column_major_mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.column_major_mat2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.mat3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.mat3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.mat3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.row_major_mat3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.row_major_mat3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.row_major_mat3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.column_major_mat3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.column_major_mat3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.column_major_mat3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.mat4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.mat4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.mat4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.row_major_mat4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.row_major_mat4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.row_major_mat4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.column_major_mat4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.column_major_mat4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.column_major_mat4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.mat2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.mat2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.mat2x3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.row_major_mat2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.row_major_mat2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.row_major_mat2x3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.column_major_mat2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.column_major_mat2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.column_major_mat2x3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.mat2x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.mat2x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.mat2x4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.row_major_mat2x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.row_major_mat2x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.row_major_mat2x4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.column_major_mat2x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.column_major_mat2x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.column_major_mat2x4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.mat3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.mat3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.mat3x2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.row_major_mat3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.row_major_mat3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.row_major_mat3x2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.column_major_mat3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.column_major_mat3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.column_major_mat3x2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.mat3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.mat3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.mat3x4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.row_major_mat3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.row_major_mat3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.row_major_mat3x4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.column_major_mat3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.column_major_mat3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.column_major_mat3x4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.mat4x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.mat4x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.mat4x2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.row_major_mat4x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.row_major_mat4x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.row_major_mat4x2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.column_major_mat4x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.column_major_mat4x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.column_major_mat4x2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.mat4x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.mat4x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.mat4x3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.row_major_mat4x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.row_major_mat4x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.row_major_mat4x3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.column_major_mat4x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.column_major_mat4x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.shared.column_major_mat4x3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.vec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.vec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.vec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.vec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.ivec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.ivec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.ivec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.ivec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.uvec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.uvec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.uvec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.uvec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.bool_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.bool_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.bvec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.bvec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.bvec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.bvec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.row_major_mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.row_major_mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.column_major_mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.column_major_mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.mat3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.mat3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.row_major_mat3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.row_major_mat3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.column_major_mat3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.column_major_mat3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.mat4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.mat4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.row_major_mat4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.row_major_mat4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.column_major_mat4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.column_major_mat4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.mat2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.mat2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.row_major_mat2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.row_major_mat2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.column_major_mat2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.column_major_mat2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.mat2x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.mat2x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.row_major_mat2x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.row_major_mat2x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.column_major_mat2x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.column_major_mat2x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.mat3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.mat3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.row_major_mat3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.row_major_mat3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.column_major_mat3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.column_major_mat3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.mat3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.mat3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.row_major_mat3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.row_major_mat3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.column_major_mat3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.column_major_mat3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.mat4x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.mat4x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.row_major_mat4x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.row_major_mat4x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.column_major_mat4x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.column_major_mat4x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.mat4x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.mat4x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.row_major_mat4x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.row_major_mat4x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.column_major_mat4x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.packed.column_major_mat4x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.float_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.vec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.vec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.vec2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.vec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.vec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.vec3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.int_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.ivec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.ivec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.ivec2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.ivec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.ivec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.ivec3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.uint_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.uvec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.uvec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.uvec2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.uvec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.uvec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.uvec3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.bool_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.bool_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.bool_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.bvec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.bvec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.bvec2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.bvec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.bvec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.bvec3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.bvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.mat2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.row_major_mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.row_major_mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.row_major_mat2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.column_major_mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.column_major_mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.column_major_mat2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.mat3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.mat3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.mat3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.row_major_mat3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.row_major_mat3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.row_major_mat3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.column_major_mat3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.column_major_mat3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.column_major_mat3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.mat4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.mat4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.mat4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.row_major_mat4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.row_major_mat4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.row_major_mat4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.column_major_mat4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.column_major_mat4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.column_major_mat4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.mat2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.mat2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.mat2x3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.row_major_mat2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.row_major_mat2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.row_major_mat2x3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.column_major_mat2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.column_major_mat2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.column_major_mat2x3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.mat2x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.mat2x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.mat2x4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.row_major_mat2x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.row_major_mat2x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.row_major_mat2x4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.column_major_mat2x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.column_major_mat2x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.column_major_mat2x4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.mat3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.mat3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.mat3x2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.row_major_mat3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.row_major_mat3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.row_major_mat3x2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.column_major_mat3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.column_major_mat3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.column_major_mat3x2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.mat3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.mat3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.mat3x4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.row_major_mat3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.row_major_mat3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.row_major_mat3x4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.column_major_mat3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.column_major_mat3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.column_major_mat3x4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.mat4x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.mat4x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.mat4x2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.row_major_mat4x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.row_major_mat4x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.row_major_mat4x2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.column_major_mat4x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.column_major_mat4x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.column_major_mat4x2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.mat4x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.mat4x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.mat4x3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.row_major_mat4x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.row_major_mat4x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.row_major_mat4x3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.column_major_mat4x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.column_major_mat4x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.3_level_array.std140.column_major_mat4x3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_struct_array.per_block_buffer.shared_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_struct_array.per_block_buffer.shared_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_struct_array.per_block_buffer.shared_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_struct_array.per_block_buffer.shared_instance_array_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_struct_array.per_block_buffer.shared_instance_array_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_struct_array.per_block_buffer.shared_instance_array_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_struct_array.per_block_buffer.packed_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_struct_array.per_block_buffer.packed_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_struct_array.per_block_buffer.packed_instance_array_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_struct_array.per_block_buffer.packed_instance_array_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_struct_array.per_block_buffer.std140_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_struct_array.per_block_buffer.std140_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_struct_array.per_block_buffer.std140_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_struct_array.per_block_buffer.std140_instance_array_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_struct_array.per_block_buffer.std140_instance_array_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_struct_array.per_block_buffer.std140_instance_array_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_struct_array.single_buffer.shared_instance_array_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_struct_array.single_buffer.shared_instance_array_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_struct_array.single_buffer.shared_instance_array_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_struct_array.single_buffer.packed_instance_array_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_struct_array.single_buffer.packed_instance_array_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_struct_array.single_buffer.std140_instance_array_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_struct_array.single_buffer.std140_instance_array_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.2_level_struct_array.single_buffer.std140_instance_array_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.random.basic_type_arrays.4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.random.basic_type_arrays.10 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.random.all_per_block_buffers.1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.random.all_per_block_buffers.7 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.random.all_per_block_buffers.10 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.random.all_per_block_buffers.13 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.random.all_per_block_buffers.18 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.random.all_per_block_buffers.20 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.random.all_per_block_buffers.29 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.random.all_per_block_buffers.41 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.random.all_shared_buffer.1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.random.all_shared_buffer.8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.random.all_shared_buffer.22 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.random.all_shared_buffer.37 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.ubo.random.all_shared_buffer.38 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.store.rgba32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.store.rgba16f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.store.r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.store.rgba32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.store.rgba16ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.store.rgba8ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.store.r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.store.rgba32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.store.rgba16i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.store.rgba8i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.store.r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.store.rgba8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.store.rgba8_snorm = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.load_store.rgba32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.load_store.rgba16f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.load_store.r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.load_store.rgba32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.load_store.rgba16ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.load_store.rgba8ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.load_store.r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.load_store.rgba32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.load_store.rgba16i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.load_store.rgba8i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.load_store.r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.load_store.rgba8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.load_store.rgba8_snorm = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.qualifiers.coherent_r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.qualifiers.volatile_r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.qualifiers.coherent_r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.qualifiers.volatile_r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.qualifiers.coherent_r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.qualifiers.volatile_r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.qualifiers.restrict = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba32f_rgba32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba32f_rgba32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba16f_rgba16ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba16f_rgba16i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.r32f_rgba8ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.r32f_r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.r32f_rgba8i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.r32f_r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.r32f_rgba8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.r32f_rgba8_snorm = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba32ui_rgba32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba32ui_rgba32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba16ui_rgba16f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba16ui_rgba16i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8ui_r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8ui_r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8ui_rgba8i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8ui_r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8ui_rgba8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8ui_rgba8_snorm = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.r32ui_r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.r32ui_rgba8ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.r32ui_rgba8i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.r32ui_r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.r32ui_rgba8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.r32ui_rgba8_snorm = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba32i_rgba32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba32i_rgba32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba16i_rgba16f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba16i_rgba16ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8i_r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8i_rgba8ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8i_r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8i_r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8i_rgba8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8i_rgba8_snorm = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.r32i_r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.r32i_rgba8ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.r32i_r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.r32i_rgba8i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.r32i_rgba8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.r32i_rgba8_snorm = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8_r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8_rgba8ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8_r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8_rgba8i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8_r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8_rgba8_snorm = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8_snorm_r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8_snorm_rgba8ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8_snorm_r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8_snorm_rgba8i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8_snorm_r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8_snorm_rgba8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.image_size.readonly_32x32 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.image_size.readonly_12x34 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.image_size.readonly_1x1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.image_size.readonly_7x1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.image_size.writeonly_32x32 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.image_size.writeonly_12x34 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.image_size.writeonly_1x1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.image_size.writeonly_7x1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.image_size.readonly_writeonly_32x32 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.image_size.readonly_writeonly_12x34 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.image_size.readonly_writeonly_1x1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d.image_size.readonly_writeonly_7x1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.store.rgba32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.store.rgba32f_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.store.rgba16f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.store.rgba16f_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.store.r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.store.r32f_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.store.rgba32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.store.rgba32ui_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.store.rgba16ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.store.rgba16ui_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.store.rgba8ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.store.rgba8ui_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.store.r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.store.r32ui_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.store.rgba32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.store.rgba32i_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.store.rgba16i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.store.rgba16i_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.store.rgba8i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.store.rgba8i_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.store.r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.store.r32i_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.store.rgba8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.store.rgba8_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.store.rgba8_snorm = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.store.rgba8_snorm_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.load_store.rgba32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.load_store.rgba32f_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.load_store.rgba16f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.load_store.rgba16f_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.load_store.r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.load_store.r32f_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.load_store.rgba32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.load_store.rgba32ui_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.load_store.rgba16ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.load_store.rgba16ui_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.load_store.rgba8ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.load_store.rgba8ui_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.load_store.r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.load_store.r32ui_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.load_store.rgba32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.load_store.rgba32i_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.load_store.rgba16i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.load_store.rgba16i_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.load_store.rgba8i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.load_store.rgba8i_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.load_store.r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.load_store.r32i_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.load_store.rgba8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.load_store.rgba8_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.load_store.rgba8_snorm = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.load_store.rgba8_snorm_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.qualifiers.coherent_r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.qualifiers.volatile_r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.qualifiers.coherent_r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.qualifiers.volatile_r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.qualifiers.coherent_r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.qualifiers.volatile_r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.qualifiers.restrict = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba32f_rgba32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba32f_rgba32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba16f_rgba16ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba16f_rgba16i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.r32f_rgba8ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.r32f_r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.r32f_rgba8i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.r32f_r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.r32f_rgba8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.r32f_rgba8_snorm = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba32ui_rgba32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba32ui_rgba32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba16ui_rgba16f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba16ui_rgba16i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8ui_r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8ui_r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8ui_rgba8i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8ui_r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8ui_rgba8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8ui_rgba8_snorm = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.r32ui_r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.r32ui_rgba8ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.r32ui_rgba8i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.r32ui_r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.r32ui_rgba8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.r32ui_rgba8_snorm = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba32i_rgba32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba32i_rgba32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba16i_rgba16f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba16i_rgba16ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8i_r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8i_rgba8ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8i_r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8i_r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8i_rgba8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8i_rgba8_snorm = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.r32i_r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.r32i_rgba8ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.r32i_r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.r32i_rgba8i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.r32i_rgba8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.r32i_rgba8_snorm = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8_r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8_rgba8ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8_r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8_rgba8i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8_r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8_rgba8_snorm = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8_snorm_r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8_snorm_rgba8ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8_snorm_r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8_snorm_rgba8i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8_snorm_r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.format_reinterpret.rgba8_snorm_rgba8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.image_size.readonly_32x32 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.image_size.readonly_12x12 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.image_size.readonly_1x1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.image_size.readonly_7x7 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.image_size.writeonly_32x32 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.image_size.writeonly_12x12 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.image_size.writeonly_1x1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.image_size.writeonly_7x7 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.image_size.readonly_writeonly_32x32 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.image_size.readonly_writeonly_12x12 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.image_size.readonly_writeonly_1x1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.cube.image_size.readonly_writeonly_7x7 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.store.rgba32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.store.rgba32f_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.store.rgba16f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.store.rgba16f_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.store.r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.store.r32f_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.store.rgba32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.store.rgba32ui_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.store.rgba16ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.store.rgba16ui_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.store.rgba8ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.store.rgba8ui_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.store.r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.store.r32ui_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.store.rgba32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.store.rgba32i_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.store.rgba16i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.store.rgba16i_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.store.rgba8i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.store.rgba8i_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.store.r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.store.r32i_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.store.rgba8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.store.rgba8_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.store.rgba8_snorm = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.store.rgba8_snorm_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.load_store.rgba32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.load_store.rgba32f_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.load_store.rgba16f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.load_store.rgba16f_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.load_store.r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.load_store.r32f_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.load_store.rgba32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.load_store.rgba32ui_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.load_store.rgba16ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.load_store.rgba16ui_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.load_store.rgba8ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.load_store.rgba8ui_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.load_store.r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.load_store.r32ui_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.load_store.rgba32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.load_store.rgba32i_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.load_store.rgba16i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.load_store.rgba16i_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.load_store.rgba8i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.load_store.rgba8i_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.load_store.r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.load_store.r32i_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.load_store.rgba8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.load_store.rgba8_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.load_store.rgba8_snorm = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.load_store.rgba8_snorm_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.qualifiers.coherent_r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.qualifiers.volatile_r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.qualifiers.coherent_r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.qualifiers.volatile_r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.qualifiers.coherent_r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.qualifiers.volatile_r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.qualifiers.restrict = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba32f_rgba32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba32f_rgba32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba16f_rgba16ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba16f_rgba16i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.r32f_rgba8ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.r32f_r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.r32f_rgba8i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.r32f_r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.r32f_rgba8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.r32f_rgba8_snorm = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba32ui_rgba32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba32ui_rgba32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba16ui_rgba16f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba16ui_rgba16i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8ui_r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8ui_r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8ui_rgba8i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8ui_r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8ui_rgba8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8ui_rgba8_snorm = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.r32ui_r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.r32ui_rgba8ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.r32ui_rgba8i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.r32ui_r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.r32ui_rgba8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.r32ui_rgba8_snorm = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba32i_rgba32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba32i_rgba32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba16i_rgba16f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba16i_rgba16ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8i_r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8i_rgba8ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8i_r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8i_r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8i_rgba8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8i_rgba8_snorm = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.r32i_r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.r32i_rgba8ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.r32i_r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.r32i_rgba8i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.r32i_rgba8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.r32i_rgba8_snorm = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8_r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8_rgba8ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8_r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8_rgba8i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8_r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8_rgba8_snorm = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8_snorm_r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8_snorm_rgba8ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8_snorm_r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8_snorm_rgba8i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8_snorm_r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba8_snorm_rgba8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.image_size.readonly_32x32x32 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.image_size.readonly_12x34x56 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.image_size.readonly_1x1x1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.image_size.readonly_7x1x1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.image_size.writeonly_32x32x32 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.image_size.writeonly_12x34x56 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.image_size.writeonly_1x1x1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.image_size.writeonly_7x1x1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.image_size.readonly_writeonly_32x32x32 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.image_size.readonly_writeonly_12x34x56 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.image_size.readonly_writeonly_1x1x1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.3d.image_size.readonly_writeonly_7x1x1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.store.rgba32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.store.rgba32f_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.store.rgba16f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.store.rgba16f_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.store.r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.store.r32f_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.store.rgba32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.store.rgba32ui_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.store.rgba16ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.store.rgba16ui_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.store.rgba8ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.store.rgba8ui_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.store.r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.store.r32ui_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.store.rgba32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.store.rgba32i_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.store.rgba16i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.store.rgba16i_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.store.rgba8i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.store.rgba8i_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.store.r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.store.r32i_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.store.rgba8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.store.rgba8_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.store.rgba8_snorm = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.store.rgba8_snorm_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.load_store.rgba32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.load_store.rgba32f_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.load_store.rgba16f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.load_store.rgba16f_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.load_store.r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.load_store.r32f_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.load_store.rgba32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.load_store.rgba32ui_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.load_store.rgba16ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.load_store.rgba16ui_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.load_store.rgba8ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.load_store.rgba8ui_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.load_store.r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.load_store.r32ui_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.load_store.rgba32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.load_store.rgba32i_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.load_store.rgba16i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.load_store.rgba16i_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.load_store.rgba8i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.load_store.rgba8i_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.load_store.r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.load_store.r32i_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.load_store.rgba8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.load_store.rgba8_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.load_store.rgba8_snorm = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.load_store.rgba8_snorm_single_layer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.qualifiers.coherent_r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.qualifiers.volatile_r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.qualifiers.coherent_r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.qualifiers.volatile_r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.qualifiers.coherent_r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.qualifiers.volatile_r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.qualifiers.restrict = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba32f_rgba32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba32f_rgba32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba16f_rgba16ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba16f_rgba16i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.r32f_rgba8ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.r32f_r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.r32f_rgba8i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.r32f_r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.r32f_rgba8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.r32f_rgba8_snorm = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba32ui_rgba32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba32ui_rgba32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba16ui_rgba16f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba16ui_rgba16i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8ui_r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8ui_r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8ui_rgba8i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8ui_r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8ui_rgba8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8ui_rgba8_snorm = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.r32ui_r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.r32ui_rgba8ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.r32ui_rgba8i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.r32ui_r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.r32ui_rgba8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.r32ui_rgba8_snorm = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba32i_rgba32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba32i_rgba32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba16i_rgba16f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba16i_rgba16ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8i_r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8i_rgba8ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8i_r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8i_r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8i_rgba8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8i_rgba8_snorm = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.r32i_r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.r32i_rgba8ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.r32i_r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.r32i_rgba8i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.r32i_rgba8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.r32i_rgba8_snorm = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8_r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8_rgba8ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8_r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8_rgba8i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8_r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8_rgba8_snorm = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8_snorm_r32f = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8_snorm_rgba8ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8_snorm_r32ui = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8_snorm_rgba8i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8_snorm_r32i = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.rgba8_snorm_rgba8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.image_size.readonly_32x32x32 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.image_size.readonly_12x34x56 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.image_size.readonly_1x1x1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.image_size.readonly_7x1x1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.image_size.writeonly_32x32x32 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.image_size.writeonly_12x34x56 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.image_size.writeonly_1x1x1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.image_size.writeonly_7x1x1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.image_size.readonly_writeonly_32x32x32 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.image_size.readonly_writeonly_12x34x56 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.image_size.readonly_writeonly_1x1x1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.image_load_store.2d_array.image_size.readonly_writeonly_7x1x1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get.1_counter_1_call_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get.1_counter_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get.1_counter_1_call_5000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get.1_counter_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get.1_counter_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get.1_counter_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get.1_counter_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get.4_counters_1_call_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get.4_counters_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get.4_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get.4_counters_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get.4_counters_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get.4_counters_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get.8_counters_1_call_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get.8_counters_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get.8_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get.8_counters_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get.8_counters_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get.8_counters_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_branch.1_counter_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_branch.1_counter_1_call_5000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_branch.1_counter_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_branch.1_counter_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_branch.1_counter_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_branch.1_counter_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_branch.4_counters_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_branch.4_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_branch.4_counters_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_branch.4_counters_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_branch.4_counters_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_branch.8_counters_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_branch.8_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_branch.8_counters_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_branch.8_counters_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_branch.8_counters_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc.1_counter_1_call_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc.1_counter_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc.1_counter_1_call_5000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc.1_counter_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc.1_counter_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc.1_counter_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc.1_counter_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc.4_counters_1_call_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc.4_counters_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc.4_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc.4_counters_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc.4_counters_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc.4_counters_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc.8_counters_1_call_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc.8_counters_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc.8_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc.8_counters_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc.8_counters_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc.8_counters_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_branch.1_counter_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_branch.1_counter_1_call_5000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_branch.1_counter_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_branch.1_counter_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_branch.1_counter_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_branch.1_counter_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_branch.4_counters_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_branch.4_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_branch.4_counters_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_branch.4_counters_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_branch.4_counters_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_branch.8_counters_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_branch.8_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_branch.8_counters_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_branch.8_counters_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_branch.8_counters_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec.1_counter_1_call_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec.1_counter_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec.1_counter_1_call_5000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec.1_counter_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec.1_counter_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec.1_counter_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec.1_counter_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec.4_counters_1_call_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec.4_counters_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec.4_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec.4_counters_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec.4_counters_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec.4_counters_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec.8_counters_1_call_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec.8_counters_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec.8_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec.8_counters_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec.8_counters_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec.8_counters_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec_branch.1_counter_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec_branch.1_counter_1_call_5000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec_branch.1_counter_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec_branch.1_counter_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec_branch.1_counter_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec_branch.1_counter_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec_branch.4_counters_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec_branch.4_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec_branch.4_counters_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec_branch.4_counters_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec_branch.4_counters_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec_branch.8_counters_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec_branch.8_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec_branch.8_counters_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec_branch.8_counters_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.dec_branch.8_counters_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc.1_counter_1_call_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc.1_counter_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc.1_counter_1_call_5000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc.1_counter_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc.1_counter_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc.1_counter_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc.1_counter_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc.4_counters_1_call_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc.4_counters_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc.4_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc.4_counters_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc.4_counters_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc.4_counters_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc.8_counters_1_call_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc.8_counters_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc.8_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc.8_counters_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc.8_counters_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc.8_counters_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_branch.1_counter_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_branch.1_counter_1_call_5000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_branch.1_counter_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_branch.1_counter_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_branch.1_counter_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_branch.1_counter_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_branch.4_counters_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_branch.4_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_branch.4_counters_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_branch.4_counters_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_branch.4_counters_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_branch.8_counters_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_branch.8_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_branch.8_counters_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_branch.8_counters_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_branch.8_counters_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec.1_counter_1_call_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec.1_counter_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec.1_counter_1_call_5000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec.1_counter_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec.1_counter_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec.1_counter_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec.1_counter_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec.4_counters_1_call_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec.4_counters_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec.4_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec.4_counters_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec.4_counters_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec.4_counters_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec.8_counters_1_call_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec.8_counters_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec.8_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec.8_counters_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec.8_counters_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec.8_counters_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec_branch.1_counter_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec_branch.1_counter_1_call_5000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec_branch.1_counter_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec_branch.1_counter_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec_branch.1_counter_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec_branch.1_counter_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec_branch.4_counters_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec_branch.4_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec_branch.4_counters_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec_branch.4_counters_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec_branch.4_counters_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec_branch.8_counters_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec_branch.8_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec_branch.8_counters_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec_branch.8_counters_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_dec_branch.8_counters_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec.1_counter_1_call_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec.1_counter_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec.1_counter_1_call_5000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec.1_counter_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec.1_counter_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec.1_counter_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec.1_counter_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec.4_counters_1_call_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec.4_counters_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec.4_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec.4_counters_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec.4_counters_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec.4_counters_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec.8_counters_1_call_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec.8_counters_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec.8_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec.8_counters_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec.8_counters_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec.8_counters_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec_branch.1_counter_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec_branch.1_counter_1_call_5000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec_branch.1_counter_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec_branch.1_counter_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec_branch.1_counter_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec_branch.1_counter_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec_branch.4_counters_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec_branch.4_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec_branch.4_counters_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec_branch.4_counters_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec_branch.4_counters_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec_branch.8_counters_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec_branch.8_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec_branch.8_counters_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec_branch.8_counters_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.inc_dec_branch.8_counters_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec.1_counter_1_call_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec.1_counter_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec.1_counter_1_call_5000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec.1_counter_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec.1_counter_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec.1_counter_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec.1_counter_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec.4_counters_1_call_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec.4_counters_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec.4_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec.4_counters_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec.4_counters_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec.4_counters_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec.8_counters_1_call_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec.8_counters_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec.8_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec.8_counters_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec.8_counters_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec.8_counters_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec_branch.1_counter_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec_branch.1_counter_1_call_5000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec_branch.1_counter_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec_branch.1_counter_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec_branch.1_counter_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec_branch.1_counter_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec_branch.4_counters_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec_branch.4_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec_branch.4_counters_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec_branch.4_counters_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec_branch.4_counters_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec_branch.8_counters_1_call_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec_branch.8_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec_branch.8_counters_5_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec_branch.8_counters_100_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.get_inc_dec_branch.8_counters_100_calls_10_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.reverse_offset.get_inc.8_counters_1_call_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.reverse_offset.get_inc.8_counters_1_call_1000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.reverse_offset.get_inc.8_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.reverse_offset.get_inc.8_counters_5_calls_1000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.reverse_offset.get_dec.8_counters_1_call_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.reverse_offset.get_dec.8_counters_1_call_1000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.reverse_offset.get_dec.8_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.reverse_offset.get_dec.8_counters_5_calls_1000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.reverse_offset.inc_dec.8_counters_1_call_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.reverse_offset.inc_dec.8_counters_1_call_1000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.reverse_offset.inc_dec.8_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.reverse_offset.inc_dec.8_counters_5_calls_1000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.first_offset_set.get_inc.8_counters_1_call_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.first_offset_set.get_inc.8_counters_1_call_1000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.first_offset_set.get_inc.8_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.first_offset_set.get_inc.8_counters_5_calls_1000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.first_offset_set.get_dec.8_counters_1_call_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.first_offset_set.get_dec.8_counters_1_call_1000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.first_offset_set.get_dec.8_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.first_offset_set.get_dec.8_counters_5_calls_1000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.first_offset_set.inc_dec.8_counters_1_call_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.first_offset_set.inc_dec.8_counters_1_call_1000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.first_offset_set.inc_dec.8_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.first_offset_set.inc_dec.8_counters_5_calls_1000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.default_offset_set.get_inc.8_counters_1_call_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.default_offset_set.get_inc.8_counters_1_call_1000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.default_offset_set.get_inc.8_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.default_offset_set.get_inc.8_counters_5_calls_1000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.default_offset_set.get_dec.8_counters_1_call_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.default_offset_set.get_dec.8_counters_1_call_1000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.default_offset_set.get_dec.8_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.default_offset_set.get_dec.8_counters_5_calls_1000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.default_offset_set.inc_dec.8_counters_1_call_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.default_offset_set.inc_dec.8_counters_1_call_1000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.default_offset_set.inc_dec.8_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.default_offset_set.inc_dec.8_counters_5_calls_1000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.reset_default_offset.get_inc.8_counters_1_call_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.reset_default_offset.get_inc.8_counters_1_call_1000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.reset_default_offset.get_inc.8_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.reset_default_offset.get_inc.8_counters_5_calls_1000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.reset_default_offset.get_dec.8_counters_1_call_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.reset_default_offset.get_dec.8_counters_1_call_1000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.reset_default_offset.get_dec.8_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.reset_default_offset.get_dec.8_counters_5_calls_1000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.reset_default_offset.inc_dec.8_counters_1_call_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.reset_default_offset.inc_dec.8_counters_1_call_1000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.reset_default_offset.inc_dec.8_counters_5_calls_1_thread = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.atomic_counter.layout.reset_default_offset.inc_dec.8_counters_5_calls_1000_threads = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.stencil_texturing.format.depth32f_stencil8_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.stencil_texturing.format.depth32f_stencil8_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.stencil_texturing.format.depth32f_stencil8_cube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.stencil_texturing.format.depth24_stencil8_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.stencil_texturing.format.depth24_stencil8_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.stencil_texturing.format.depth24_stencil8_cube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.stencil_texturing.render.depth32f_stencil8_clear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.stencil_texturing.render.depth32f_stencil8_draw = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.stencil_texturing.render.depth24_stencil8_clear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.stencil_texturing.render.depth24_stencil8_draw = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.stencil_texturing.misc.compare_mode_effect = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.stencil_texturing.misc.base_level = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_1.sample_position = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_1.sample_mask_only = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_1.sample_mask_and_alpha_to_coverage = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_1.sample_mask_and_sample_coverage = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_1.sample_mask_and_sample_coverage_and_alpha_to_coverage = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_1.sample_mask_non_effective_bits = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_2.sample_position = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_2.sample_mask_only = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_2.sample_mask_and_alpha_to_coverage = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_2.sample_mask_and_sample_coverage = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_2.sample_mask_and_sample_coverage_and_alpha_to_coverage = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_2.sample_mask_non_effective_bits = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_3.sample_position = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_3.sample_mask_only = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_3.sample_mask_and_alpha_to_coverage = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_3.sample_mask_and_sample_coverage = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_3.sample_mask_and_sample_coverage_and_alpha_to_coverage = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_3.sample_mask_non_effective_bits = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_4.sample_position = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_4.sample_mask_only = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_4.sample_mask_and_alpha_to_coverage = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_4.sample_mask_and_sample_coverage = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_4.sample_mask_and_sample_coverage_and_alpha_to_coverage = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_4.sample_mask_non_effective_bits = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_8.sample_position = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_8.sample_mask_only = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_8.sample_mask_and_alpha_to_coverage = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_8.sample_mask_and_sample_coverage = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_8.sample_mask_and_sample_coverage_and_alpha_to_coverage = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_8.sample_mask_non_effective_bits = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_10.sample_position = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_10.sample_mask_only = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_10.sample_mask_and_alpha_to_coverage = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_10.sample_mask_and_sample_coverage = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_10.sample_mask_and_sample_coverage_and_alpha_to_coverage = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_10.sample_mask_non_effective_bits = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_12.sample_position = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_12.sample_mask_only = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_12.sample_mask_and_alpha_to_coverage = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_12.sample_mask_and_sample_coverage = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_12.sample_mask_and_sample_coverage_and_alpha_to_coverage = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_12.sample_mask_non_effective_bits = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_13.sample_position = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_13.sample_mask_only = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_13.sample_mask_and_alpha_to_coverage = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_13.sample_mask_and_sample_coverage = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_13.sample_mask_and_sample_coverage_and_alpha_to_coverage = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_13.sample_mask_non_effective_bits = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_16.sample_position = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_16.sample_mask_only = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_16.sample_mask_and_alpha_to_coverage = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_16.sample_mask_and_sample_coverage = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_16.sample_mask_and_sample_coverage_and_alpha_to_coverage = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.samples_16.sample_mask_non_effective_bits = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.negative.fbo_attach_different_sample_count_tex_tex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.negative.fbo_attach_different_sample_count_tex_rbo = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.negative.fbo_attach_different_fixed_state_tex_tex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.negative.fbo_attach_different_fixed_state_tex_rbo = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.negative.fbo_attach_non_zero_level = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.negative.texture_min_filter = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.negative.texture_mag_filter = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.negative.texture_wrap_s = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.negative.texture_wrap_t = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.negative.texture_wrap_r = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.negative.texture_min_lod = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.negative.texture_max_lod = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.negative.texture_compare_mode = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.negative.texture_compare_func = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.negative.texture_base_level = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.negative.texture_high_sample_count = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.multisample.negative.texture_zero_sample_count = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.size_pot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.size_pot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.size_pot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.size_npot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.size_npot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.size_npot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.texture_swizzle.red_green_blue_alpha = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.texture_swizzle.green_blue_alpha_zero = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.texture_swizzle.blue_alpha_zero_one = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.texture_swizzle.alpha_zero_one_red = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.texture_swizzle.zero_one_red_green = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.texture_swizzle.one_red_green_blue = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.filter_mode.min_linear_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.filter_mode.min_nearest_mipmap_nearest_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.filter_mode.min_nearest_mipmap_linear_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.filter_mode.min_linear_mipmap_nearest_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.filter_mode.min_linear_mipmap_linear_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.base_level.level_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.base_level.level_2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8.incomplete.mipmap_incomplete = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8ui.size_pot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8ui.size_pot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8ui.size_pot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8ui.size_npot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8ui.size_npot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8ui.size_npot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8ui.texture_swizzle.red_green_blue_alpha = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8ui.texture_swizzle.green_blue_alpha_zero = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8ui.texture_swizzle.blue_alpha_zero_one = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8ui.texture_swizzle.alpha_zero_one_red = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8ui.texture_swizzle.zero_one_red_green = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8ui.texture_swizzle.one_red_green_blue = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8ui.filter_mode.min_nearest_mipmap_nearest_mag_nearest = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8ui.base_level.level_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8ui.base_level.level_2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8i.size_pot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8i.size_pot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8i.size_pot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8i.size_npot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8i.size_npot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8i.size_npot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8i.texture_swizzle.red_green_blue_alpha = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8i.texture_swizzle.green_blue_alpha_zero = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8i.texture_swizzle.blue_alpha_zero_one = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8i.texture_swizzle.alpha_zero_one_red = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8i.texture_swizzle.zero_one_red_green = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8i.texture_swizzle.one_red_green_blue = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8i.filter_mode.min_nearest_mipmap_nearest_mag_nearest = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8i.base_level.level_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.rgba8i.base_level.level_2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.size_pot.compare_less.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.size_pot.compare_greater.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.size_npot.compare_less.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.size_npot.compare_less.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.size_npot.compare_less.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.size_npot.compare_greater.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.size_npot.compare_greater.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.size_npot.compare_greater.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.filter_mode.min_linear_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.filter_mode.min_nearest_mipmap_nearest_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.filter_mode.min_nearest_mipmap_linear_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.filter_mode.min_linear_mipmap_nearest_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.filter_mode.min_linear_mipmap_linear_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.base_level.level_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d.depth32f.base_level.level_2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.size_pot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.size_pot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.size_pot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.size_npot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.size_npot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.size_npot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.texture_swizzle.red_green_blue_alpha = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.texture_swizzle.green_blue_alpha_zero = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.texture_swizzle.blue_alpha_zero_one = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.texture_swizzle.alpha_zero_one_red = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.texture_swizzle.zero_one_red_green = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.texture_swizzle.one_red_green_blue = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.filter_mode.min_linear_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.filter_mode.min_nearest_mipmap_nearest_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.filter_mode.min_nearest_mipmap_linear_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.filter_mode.min_linear_mipmap_nearest_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.filter_mode.min_linear_mipmap_linear_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.base_level.level_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.base_level.level_2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8.incomplete.mipmap_incomplete = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8ui.size_pot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8ui.size_pot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8ui.size_pot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8ui.size_npot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8ui.size_npot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8ui.size_npot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8ui.texture_swizzle.red_green_blue_alpha = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8ui.texture_swizzle.green_blue_alpha_zero = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8ui.texture_swizzle.blue_alpha_zero_one = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8ui.texture_swizzle.alpha_zero_one_red = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8ui.texture_swizzle.zero_one_red_green = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8ui.texture_swizzle.one_red_green_blue = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8ui.filter_mode.min_nearest_mipmap_nearest_mag_nearest = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8ui.base_level.level_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8ui.base_level.level_2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8i.size_pot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8i.size_pot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8i.size_pot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8i.size_npot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8i.size_npot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8i.size_npot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8i.texture_swizzle.red_green_blue_alpha = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8i.texture_swizzle.green_blue_alpha_zero = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8i.texture_swizzle.blue_alpha_zero_one = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8i.texture_swizzle.alpha_zero_one_red = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8i.texture_swizzle.zero_one_red_green = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8i.texture_swizzle.one_red_green_blue = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8i.filter_mode.min_nearest_mipmap_nearest_mag_nearest = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8i.base_level.level_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.rgba8i.base_level.level_2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.size_pot.compare_less.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.size_pot.compare_less.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.size_pot.compare_less.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.size_pot.compare_greater.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.size_pot.compare_greater.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.size_pot.compare_greater.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.size_npot.compare_less.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.size_npot.compare_less.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.size_npot.compare_less.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.size_npot.compare_greater.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.size_npot.compare_greater.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.size_npot.compare_greater.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.filter_mode.min_linear_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.filter_mode.min_nearest_mipmap_nearest_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.filter_mode.min_nearest_mipmap_linear_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.filter_mode.min_linear_mipmap_nearest_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.filter_mode.min_linear_mipmap_linear_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.base_level.level_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.2d_array.depth32f.base_level.level_2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.size_pot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.size_pot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.size_pot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.size_npot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.size_npot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.size_npot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.no_corners.size_pot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.no_corners.size_pot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.no_corners.size_pot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.no_corners.size_npot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.no_corners.size_npot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.no_corners.size_npot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.texture_swizzle.red_green_blue_alpha = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.texture_swizzle.green_blue_alpha_zero = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.texture_swizzle.blue_alpha_zero_one = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.texture_swizzle.alpha_zero_one_red = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.texture_swizzle.zero_one_red_green = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.texture_swizzle.one_red_green_blue = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.filter_mode.min_linear_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.filter_mode.min_nearest_mipmap_nearest_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.filter_mode.min_nearest_mipmap_linear_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.filter_mode.min_linear_mipmap_nearest_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.filter_mode.min_linear_mipmap_linear_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.base_level.level_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.base_level.level_2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8.incomplete.mipmap_incomplete = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.size_pot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.size_pot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.size_pot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.size_npot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.size_npot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.size_npot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.no_corners.size_pot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.no_corners.size_pot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.no_corners.size_pot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.no_corners.size_npot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.no_corners.size_npot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.no_corners.size_npot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.texture_swizzle.red_green_blue_alpha = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.texture_swizzle.green_blue_alpha_zero = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.texture_swizzle.blue_alpha_zero_one = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.texture_swizzle.alpha_zero_one_red = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.texture_swizzle.zero_one_red_green = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.texture_swizzle.one_red_green_blue = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.filter_mode.min_nearest_mipmap_nearest_mag_nearest = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.base_level.level_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8ui.base_level.level_2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.size_pot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.size_pot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.size_pot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.size_npot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.size_npot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.size_npot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.no_corners.size_pot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.no_corners.size_pot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.no_corners.size_pot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.no_corners.size_npot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.no_corners.size_npot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.no_corners.size_npot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.texture_swizzle.red_green_blue_alpha = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.texture_swizzle.green_blue_alpha_zero = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.texture_swizzle.blue_alpha_zero_one = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.texture_swizzle.alpha_zero_one_red = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.texture_swizzle.zero_one_red_green = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.texture_swizzle.one_red_green_blue = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.filter_mode.min_nearest_mipmap_nearest_mag_nearest = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.base_level.level_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.base_level.level_2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.no_corners.size_pot.compare_less.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.no_corners.size_pot.compare_less.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.no_corners.size_pot.compare_less.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.no_corners.size_pot.compare_greater.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.no_corners.size_pot.compare_greater.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.no_corners.size_pot.compare_greater.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.no_corners.size_npot.compare_less.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.no_corners.size_npot.compare_less.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.no_corners.size_npot.compare_less.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.no_corners.size_npot.compare_greater.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.no_corners.size_npot.compare_greater.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.no_corners.size_npot.compare_greater.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8.size_pot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8.size_pot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8.size_pot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8.size_npot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8.size_npot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8.size_npot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8ui.size_pot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8ui.size_pot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8ui.size_pot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8ui.size_npot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8ui.size_npot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8ui.size_npot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8i.size_pot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8i.size_pot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8i.size_pot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8i.size_npot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8i.size_npot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8i.size_npot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.depth32f.size_pot.compare_less.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.depth32f.size_pot.compare_less.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.depth32f.size_pot.compare_less.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.depth32f.size_pot.compare_greater.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.depth32f.size_pot.compare_greater.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.depth32f.size_pot.compare_greater.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.depth32f.size_npot.compare_less.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.depth32f.size_npot.compare_less.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.depth32f.size_npot.compare_less.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.depth32f.size_npot.compare_greater.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.depth32f.size_npot.compare_greater.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.depth32f.size_npot.compare_greater.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8.size_pot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8.size_pot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8.size_pot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8.size_npot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8.size_npot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8.size_npot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8ui.size_pot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8ui.size_pot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8ui.size_pot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8ui.size_npot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8ui.size_npot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8ui.size_npot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8i.size_pot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8i.size_pot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8i.size_pot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8i.size_npot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8i.size_npot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.rgba8i.size_npot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.depth32f.size_pot.compare_less.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.depth32f.size_pot.compare_less.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.depth32f.size_pot.compare_less.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.depth32f.size_pot.compare_greater.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.depth32f.size_pot.compare_greater.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.depth32f.size_pot.compare_greater.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.depth32f.size_npot.compare_less.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.depth32f.size_npot.compare_less.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.depth32f.size_npot.compare_less.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.depth32f.size_npot.compare_greater.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.depth32f.size_npot.compare_greater.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d_array.depth32f.size_npot.compare_greater.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.size_pot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.size_pot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.size_pot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.size_npot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.size_npot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.size_npot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.texture_swizzle.red_green_blue_alpha = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.texture_swizzle.green_blue_alpha_zero = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.texture_swizzle.blue_alpha_zero_one = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.texture_swizzle.alpha_zero_one_red = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.texture_swizzle.zero_one_red_green = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.texture_swizzle.one_red_green_blue = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.filter_mode.min_linear_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.filter_mode.min_nearest_mipmap_nearest_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.filter_mode.min_nearest_mipmap_linear_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.filter_mode.min_linear_mipmap_nearest_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.filter_mode.min_linear_mipmap_linear_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.base_level.level_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.base_level.level_2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8.incomplete.mipmap_incomplete = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8ui.size_pot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8ui.size_pot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8ui.size_pot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8ui.size_npot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8ui.size_npot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8ui.size_npot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8ui.texture_swizzle.red_green_blue_alpha = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8ui.texture_swizzle.green_blue_alpha_zero = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8ui.texture_swizzle.blue_alpha_zero_one = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8ui.texture_swizzle.alpha_zero_one_red = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8ui.texture_swizzle.zero_one_red_green = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8ui.texture_swizzle.one_red_green_blue = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8ui.filter_mode.min_nearest_mipmap_nearest_mag_nearest = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8ui.base_level.level_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8ui.base_level.level_2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8i.size_pot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8i.size_pot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8i.size_pot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8i.size_npot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8i.size_npot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8i.size_npot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8i.texture_swizzle.red_green_blue_alpha = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8i.texture_swizzle.green_blue_alpha_zero = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8i.texture_swizzle.blue_alpha_zero_one = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8i.texture_swizzle.alpha_zero_one_red = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8i.texture_swizzle.zero_one_red_green = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8i.texture_swizzle.one_red_green_blue = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8i.filter_mode.min_nearest_mipmap_nearest_mag_nearest = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8i.base_level.level_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.rgba8i.base_level.level_2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.size_pot.compare_less.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.size_pot.compare_less.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.size_pot.compare_less.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.size_pot.compare_greater.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.size_pot.compare_greater.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.size_pot.compare_greater.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.size_npot.compare_less.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.size_npot.compare_less.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.size_npot.compare_less.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.size_npot.compare_greater.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.size_npot.compare_greater.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.size_npot.compare_greater.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.filter_mode.min_linear_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.filter_mode.min_nearest_mipmap_nearest_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.filter_mode.min_nearest_mipmap_linear_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.filter_mode.min_linear_mipmap_nearest_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.filter_mode.min_linear_mipmap_linear_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.base_level.level_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d.depth32f.base_level.level_2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.size_pot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.size_pot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.size_pot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.size_npot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.size_npot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.size_npot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.texture_swizzle.red_green_blue_alpha = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.texture_swizzle.green_blue_alpha_zero = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.texture_swizzle.blue_alpha_zero_one = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.texture_swizzle.alpha_zero_one_red = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.texture_swizzle.zero_one_red_green = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.texture_swizzle.one_red_green_blue = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.filter_mode.min_linear_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.filter_mode.min_nearest_mipmap_nearest_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.filter_mode.min_nearest_mipmap_linear_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.filter_mode.min_linear_mipmap_nearest_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.filter_mode.min_linear_mipmap_linear_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.base_level.level_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.base_level.level_2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8.incomplete.mipmap_incomplete = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8ui.size_pot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8ui.size_pot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8ui.size_pot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8ui.size_npot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8ui.size_npot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8ui.size_npot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8ui.texture_swizzle.red_green_blue_alpha = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8ui.texture_swizzle.green_blue_alpha_zero = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8ui.texture_swizzle.blue_alpha_zero_one = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8ui.texture_swizzle.alpha_zero_one_red = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8ui.texture_swizzle.zero_one_red_green = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8ui.texture_swizzle.one_red_green_blue = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8ui.filter_mode.min_nearest_mipmap_nearest_mag_nearest = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8ui.base_level.level_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8ui.base_level.level_2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8i.size_pot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8i.size_pot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8i.size_pot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8i.size_npot.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8i.size_npot.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8i.size_npot.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8i.texture_swizzle.red_green_blue_alpha = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8i.texture_swizzle.green_blue_alpha_zero = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8i.texture_swizzle.blue_alpha_zero_one = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8i.texture_swizzle.alpha_zero_one_red = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8i.texture_swizzle.zero_one_red_green = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8i.texture_swizzle.one_red_green_blue = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8i.filter_mode.min_nearest_mipmap_nearest_mag_nearest = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8i.base_level.level_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.rgba8i.base_level.level_2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.size_pot.compare_less.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.size_pot.compare_less.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.size_pot.compare_less.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.size_pot.compare_greater.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.size_pot.compare_greater.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.size_pot.compare_greater.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.size_npot.compare_less.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.size_npot.compare_less.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.size_npot.compare_less.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.size_npot.compare_greater.clamp_to_edge_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.size_npot.compare_greater.repeat_mirrored_repeat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.size_npot.compare_greater.mirrored_repeat_clamp_to_edge = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.filter_mode.min_linear_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.filter_mode.min_nearest_mipmap_nearest_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.filter_mode.min_nearest_mipmap_linear_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.filter_mode.min_linear_mipmap_nearest_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.filter_mode.min_linear_mipmap_linear_mag_linear = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.base_level.level_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.texture.gather.offset.implementation_offset.2d_array.depth32f.base_level.level_2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.boolean.sample_mask_isenabled = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.boolean.sample_mask_getboolean = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.boolean.sample_mask_getinteger = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.boolean.sample_mask_getinteger64 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.boolean.sample_mask_getfloat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.integer.texture_binding_2d_multisample_getboolean = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.integer.texture_binding_2d_multisample_getinteger = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.integer.texture_binding_2d_multisample_getinteger64 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.integer.texture_binding_2d_multisample_getfloat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.integer.draw_indirect_buffer_binding_getboolean = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.integer.draw_indirect_buffer_binding_getinteger = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.integer.draw_indirect_buffer_binding_getinteger64 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.integer.draw_indirect_buffer_binding_getfloat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.integer.atomic_counter_buffer_binding_getboolean = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.integer.atomic_counter_buffer_binding_getinteger = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.integer.atomic_counter_buffer_binding_getinteger64 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.integer.atomic_counter_buffer_binding_getfloat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.integer.shader_storage_buffer_binding_getboolean = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.integer.shader_storage_buffer_binding_getinteger = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.integer.shader_storage_buffer_binding_getinteger64 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.integer.shader_storage_buffer_binding_getfloat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.integer.dispatch_indirect_buffer_binding_getboolean = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.integer.dispatch_indirect_buffer_binding_getinteger = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.integer.dispatch_indirect_buffer_binding_getinteger64 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.integer.dispatch_indirect_buffer_binding_getfloat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.integer.program_pipeline_binding_getboolean = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.integer.program_pipeline_binding_getinteger = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.integer.program_pipeline_binding_getinteger64 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.integer.program_pipeline_binding_getfloat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.sample_mask_value_getbooleani_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.sample_mask_value_getintegeri_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.sample_mask_value_getinteger64i_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.atomic_counter_buffer_binding_getbooleani_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.atomic_counter_buffer_binding_getintegeri_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.atomic_counter_buffer_binding_getinteger64i_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.atomic_counter_buffer_start_getbooleani_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.atomic_counter_buffer_start_getintegeri_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.atomic_counter_buffer_start_getinteger64i_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.atomic_counter_buffer_size_getbooleani_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.atomic_counter_buffer_size_getintegeri_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.atomic_counter_buffer_size_getinteger64i_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.shader_storage_buffer_binding_getbooleani_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.shader_storage_buffer_binding_getintegeri_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.shader_storage_buffer_binding_getinteger64i_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.shader_storage_buffer_start_getbooleani_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.shader_storage_buffer_start_getintegeri_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.shader_storage_buffer_start_getinteger64i_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.shader_storage_buffer_size_getbooleani_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.shader_storage_buffer_size_getintegeri_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.shader_storage_buffer_size_getinteger64i_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.image_binding_name_getbooleani_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.image_binding_name_getintegeri_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.image_binding_name_getinteger64i_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.image_binding_level_getbooleani_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.image_binding_level_getintegeri_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.image_binding_level_getinteger64i_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.image_binding_layered_getbooleani_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.image_binding_layered_getintegeri_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.image_binding_layered_getinteger64i_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.image_binding_layer_getbooleani_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.image_binding_layer_getintegeri_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.image_binding_layer_getinteger64i_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.image_binding_access_getbooleani_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.image_binding_access_getintegeri_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.image_binding_access_getinteger64i_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.image_binding_format_getbooleani_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.image_binding_format_getintegeri_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.indexed.image_binding_format_getinteger64i_v = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture.texture_2d.depth_stencil_mode_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture.texture_2d.depth_stencil_mode_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture.texture_3d.depth_stencil_mode_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture.texture_3d.depth_stencil_mode_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture.texture_2d_array.depth_stencil_mode_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture.texture_2d_array.depth_stencil_mode_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture.texture_cube_map.depth_stencil_mode_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture.texture_cube_map.depth_stencil_mode_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture.texture_2d_multisample.is_texture = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture.texture_2d_multisample.texture_swizzle_r_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture.texture_2d_multisample.texture_swizzle_r_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture.texture_2d_multisample.texture_swizzle_g_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture.texture_2d_multisample.texture_swizzle_g_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture.texture_2d_multisample.texture_swizzle_b_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture.texture_2d_multisample.texture_swizzle_b_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture.texture_2d_multisample.texture_swizzle_a_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture.texture_2d_multisample.texture_swizzle_a_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture.texture_2d_multisample.texture_base_level_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture.texture_2d_multisample.texture_base_level_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture.texture_2d_multisample.texture_max_level_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture.texture_2d_multisample.texture_max_level_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture.texture_2d_multisample.texture_immutable_levels_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture.texture_2d_multisample.texture_immutable_levels_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture.texture_2d_multisample.texture_immutable_format_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture.texture_2d_multisample.texture_immutable_format_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture.texture_2d_multisample.depth_stencil_mode_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture.texture_2d_multisample.depth_stencil_mode_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.samples_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.samples_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.fixed_sample_locations_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.fixed_sample_locations_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.width_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.width_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.height_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.height_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.depth_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.depth_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.internal_format_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.internal_format_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.red_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.red_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.green_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.green_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.blue_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.blue_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.alpha_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.alpha_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.depth_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.depth_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.stencil_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.stencil_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.shared_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.shared_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.red_type_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.red_type_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.green_type_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.green_type_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.blue_type_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.blue_type_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.alpha_type_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.alpha_type_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.depth_type_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.depth_type_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.compressed_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d.compressed_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.samples_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.samples_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.fixed_sample_locations_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.fixed_sample_locations_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.width_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.width_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.height_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.height_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.depth_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.depth_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.internal_format_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.internal_format_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.red_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.red_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.green_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.green_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.blue_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.blue_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.alpha_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.alpha_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.depth_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.depth_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.stencil_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.stencil_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.shared_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.shared_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.red_type_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.red_type_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.green_type_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.green_type_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.blue_type_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.blue_type_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.alpha_type_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.alpha_type_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.depth_type_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.depth_type_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.compressed_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_3d.compressed_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.samples_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.samples_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.fixed_sample_locations_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.fixed_sample_locations_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.width_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.width_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.height_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.height_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.depth_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.depth_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.internal_format_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.internal_format_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.red_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.red_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.green_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.green_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.blue_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.blue_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.alpha_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.alpha_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.depth_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.depth_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.stencil_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.stencil_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.shared_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.shared_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.red_type_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.red_type_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.green_type_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.green_type_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.blue_type_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.blue_type_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.alpha_type_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.alpha_type_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.depth_type_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.depth_type_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.compressed_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_array.compressed_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.samples_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.samples_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.fixed_sample_locations_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.fixed_sample_locations_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.width_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.width_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.height_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.height_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.depth_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.depth_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.internal_format_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.internal_format_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.red_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.red_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.green_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.green_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.blue_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.blue_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.alpha_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.alpha_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.depth_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.depth_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.stencil_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.stencil_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.shared_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.shared_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.red_type_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.red_type_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.green_type_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.green_type_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.blue_type_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.blue_type_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.alpha_type_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.alpha_type_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.depth_type_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.depth_type_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.compressed_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_cube_map.compressed_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.samples_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.samples_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.fixed_sample_locations_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.fixed_sample_locations_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.width_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.width_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.height_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.height_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.depth_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.depth_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.internal_format_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.internal_format_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.red_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.red_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.green_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.green_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.blue_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.blue_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.alpha_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.alpha_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.depth_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.depth_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.stencil_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.stencil_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.shared_size_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.shared_size_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.red_type_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.red_type_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.green_type_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.green_type_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.blue_type_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.blue_type_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.alpha_type_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.alpha_type_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.depth_type_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.depth_type_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.compressed_integer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.compressed_float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.shader.sampler_type = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.renderbuffer.rgb10_a2ui_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.renderbuffer.r8i_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.renderbuffer.r8ui_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.renderbuffer.r16i_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.renderbuffer.r16ui_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.renderbuffer.r32i_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.renderbuffer.r32ui_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.renderbuffer.rg8i_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.renderbuffer.rg8ui_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.renderbuffer.rg16i_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.renderbuffer.rg16ui_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.renderbuffer.rg32i_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.renderbuffer.rg32ui_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.renderbuffer.rgba8i_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.renderbuffer.rgba8ui_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.renderbuffer.rgba16i_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.renderbuffer.rgba16ui_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.renderbuffer.rgba32i_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.renderbuffer.rgba32ui_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.texture_2d_multisample.r8_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.texture_2d_multisample.rg8_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.texture_2d_multisample.rgb8_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.texture_2d_multisample.rgb565_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.texture_2d_multisample.rgba4_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.texture_2d_multisample.rgb5_a1_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.texture_2d_multisample.rgba8_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.texture_2d_multisample.rgb10_a2_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.texture_2d_multisample.rgb10_a2ui_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.texture_2d_multisample.srgb8_alpha8_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.texture_2d_multisample.r8i_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.texture_2d_multisample.r8ui_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.texture_2d_multisample.r16i_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.texture_2d_multisample.r16ui_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.texture_2d_multisample.r32i_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.texture_2d_multisample.r32ui_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.texture_2d_multisample.rg8i_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.texture_2d_multisample.rg8ui_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.texture_2d_multisample.rg16i_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.texture_2d_multisample.rg16ui_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.texture_2d_multisample.rg32i_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.texture_2d_multisample.rg32ui_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.texture_2d_multisample.rgba8i_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.texture_2d_multisample.rgba8ui_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.texture_2d_multisample.rgba16i_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.texture_2d_multisample.rgba16ui_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.texture_2d_multisample.rgba32i_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.texture_2d_multisample.rgba32ui_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.texture_2d_multisample.depth_component16_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.texture_2d_multisample.depth_component24_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.texture_2d_multisample.depth_component32f_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.texture_2d_multisample.depth24_stencil8_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.texture_2d_multisample.depth32f_stencil8_samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.partial_query.num_sample_counts = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.internal_format.partial_query.samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.vertex_attribute_binding.vertex_attrib.vertex_attrib_binding = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.vertex_attribute_binding.vertex_attrib.vertex_attrib_relative_offset = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.vertex_attribute_binding.vertex_attrib.vertex_attrib_binding_getvertexattribfv = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.vertex_attribute_binding.vertex_attrib.vertex_attrib_relative_offset_getvertexattribfv = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.vertex_attribute_binding.vertex_attrib.vertex_attrib_binding_getvertexattribiiv = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.vertex_attribute_binding.vertex_attrib.vertex_attrib_relative_offset_getvertexattribiiv = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.vertex_attribute_binding.vertex_attrib.vertex_attrib_binding_getvertexattribiuiv = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.vertex_attribute_binding.vertex_attrib.vertex_attrib_relative_offset_getvertexattribiuiv = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.vertex_attribute_binding.indexed.vertex_binding_divisor_getintegeri = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.vertex_attribute_binding.indexed.vertex_binding_offset_getintegeri = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.vertex_attribute_binding.indexed.vertex_binding_stride_getintegeri = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.vertex_attribute_binding.indexed.vertex_binding_buffer_getintegeri = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.vertex_attribute_binding.indexed.vertex_binding_divisor_getintegeri64 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.vertex_attribute_binding.indexed.vertex_binding_offset_getintegeri64 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.vertex_attribute_binding.indexed.vertex_binding_stride_getintegeri64 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.vertex_attribute_binding.indexed.vertex_binding_buffer_getintegeri64 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.vertex_attribute_binding.indexed.vertex_binding_divisor_getboolean = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.vertex_attribute_binding.indexed.vertex_binding_offset_getboolean = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.vertex_attribute_binding.indexed.vertex_binding_stride_getboolean = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.vertex_attribute_binding.indexed.vertex_binding_buffer_getboolean = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.vertex_attribute_binding.indexed.vertex_binding_divisor_mixed = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.vertex_attribute_binding.indexed.vertex_binding_offset_mixed = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.vertex_attribute_binding.indexed.vertex_binding_stride_mixed = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.vertex_attribute_binding.indexed.vertex_binding_buffer_mixed = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.framebuffer_default.framebuffer_default_width_get_framebuffer_parameteriv = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.framebuffer_default.framebuffer_default_height_get_framebuffer_parameteriv = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.framebuffer_default.framebuffer_default_samples_get_framebuffer_parameteriv = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.framebuffer_default.framebuffer_default_fixed_sample_locations_get_framebuffer_parameteriv = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.program.program_separable_get_programiv = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.program.compute_work_group_size_get_programiv = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.program.active_atomic_counter_buffers_get_programiv = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.program_pipeline.active_program_get_program_pipelineiv = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.program_pipeline.vertex_shader_get_program_pipelineiv = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.program_pipeline.fragment_shader_get_program_pipelineiv = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.program_pipeline.compute_shader_get_program_pipelineiv = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.program_pipeline.validate_status_get_program_pipelineiv = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.state_query.program_pipeline.info_log = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.in_invocation.image_write_read = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.in_invocation.image_read_write = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.in_invocation.image_overwrite = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.in_invocation.image_alias_write = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.in_invocation.image_alias_overwrite = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.in_invocation.ssbo_write_read = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.in_invocation.ssbo_read_write = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.in_invocation.ssbo_overwrite = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.in_invocation.ssbo_alias_write = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.in_invocation.ssbo_alias_overwrite = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.in_invocation.ssbo_atomic_write_read = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.in_invocation.ssbo_atomic_read_write = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.in_invocation.ssbo_atomic_overwrite = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.in_invocation.ssbo_atomic_alias_write = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.in_invocation.ssbo_atomic_alias_overwrite = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_invocation.image_write_read = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_invocation.image_read_write = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_invocation.image_overwrite = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_invocation.image_alias_write = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_invocation.image_alias_overwrite = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_invocation.ssbo_write_read = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_invocation.ssbo_read_write = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_invocation.ssbo_overwrite = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_invocation.ssbo_alias_write = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_invocation.ssbo_alias_overwrite = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_invocation.ssbo_atomic_write_read = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_invocation.ssbo_atomic_read_write = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_invocation.ssbo_atomic_overwrite = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_invocation.ssbo_atomic_alias_write = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_invocation.ssbo_atomic_alias_overwrite = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.with_memory_barrier.image_write_read = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.with_memory_barrier.image_read_write = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.with_memory_barrier.image_overwrite = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.with_memory_barrier.image_multiple_write_read = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.with_memory_barrier.image_multiple_interleaved_write_read = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.with_memory_barrier.image_multiple_unrelated_write_read_ordered = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.with_memory_barrier.image_multiple_unrelated_write_read_non_ordered = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.with_memory_barrier.ssbo_write_read = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.with_memory_barrier.ssbo_read_write = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.with_memory_barrier.ssbo_overwrite = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.with_memory_barrier.ssbo_multiple_write_read = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.with_memory_barrier.ssbo_multiple_interleaved_write_read = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.with_memory_barrier.ssbo_multiple_unrelated_write_read_ordered = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.with_memory_barrier.ssbo_multiple_unrelated_write_read_non_ordered = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.with_memory_barrier.ssbo_atomic_write_read = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.with_memory_barrier.ssbo_atomic_read_write = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.with_memory_barrier.ssbo_atomic_overwrite = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.with_memory_barrier.ssbo_atomic_multiple_write_read = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.with_memory_barrier.ssbo_atomic_multiple_interleaved_write_read = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.with_memory_barrier.ssbo_atomic_multiple_unrelated_write_read_ordered = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.with_memory_barrier.ssbo_atomic_multiple_unrelated_write_read_non_ordered = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.without_memory_barrier.ssbo_atomic_dispatch_2_calls_1k_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.without_memory_barrier.ssbo_atomic_dispatch_5_calls_1k_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.without_memory_barrier.ssbo_atomic_dispatch_100_calls_1k_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.without_memory_barrier.ssbo_atomic_dispatch_2_calls_4k_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.without_memory_barrier.ssbo_atomic_dispatch_5_calls_4k_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.without_memory_barrier.ssbo_atomic_dispatch_100_calls_4k_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.without_memory_barrier.ssbo_atomic_dispatch_2_calls_32k_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.without_memory_barrier.ssbo_atomic_dispatch_5_calls_32k_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.without_memory_barrier.ssbo_atomic_dispatch_100_calls_32k_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.without_memory_barrier.atomic_counter_dispatch_2_calls_32_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.without_memory_barrier.atomic_counter_dispatch_5_calls_32_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.without_memory_barrier.atomic_counter_dispatch_100_calls_32_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.without_memory_barrier.atomic_counter_dispatch_2_calls_128_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.without_memory_barrier.atomic_counter_dispatch_5_calls_128_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.without_memory_barrier.atomic_counter_dispatch_100_calls_128_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.without_memory_barrier.atomic_counter_dispatch_2_calls_1k_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.without_memory_barrier.atomic_counter_dispatch_5_calls_1k_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.without_memory_barrier.atomic_counter_dispatch_100_calls_1k_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.without_memory_barrier.ssbo_atomic_counter_mixed_dispatch_2_calls_32_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.without_memory_barrier.ssbo_atomic_counter_mixed_dispatch_5_calls_32_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.without_memory_barrier.ssbo_atomic_counter_mixed_dispatch_100_calls_32_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.without_memory_barrier.ssbo_atomic_counter_mixed_dispatch_2_calls_128_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.without_memory_barrier.ssbo_atomic_counter_mixed_dispatch_5_calls_128_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.without_memory_barrier.ssbo_atomic_counter_mixed_dispatch_100_calls_128_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.without_memory_barrier.ssbo_atomic_counter_mixed_dispatch_2_calls_1k_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.without_memory_barrier.ssbo_atomic_counter_mixed_dispatch_5_calls_1k_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.synchronization.inter_call.without_memory_barrier.ssbo_atomic_counter_mixed_dispatch_100_calls_1k_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.geometry_shading.query.geometry_linked_vertices_out = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.geometry_shading.query.geometry_linked_input_type = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.geometry_shading.query.geometry_linked_output_type = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.geometry_shading.query.geometry_shader_invocations = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.vertex_attribute_binding.usage.single_binding.elements_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.vertex_attribute_binding.usage.single_binding.elements_2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.vertex_attribute_binding.usage.single_binding.elements_2_share_elements = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.vertex_attribute_binding.usage.single_binding.offset_elements_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.vertex_attribute_binding.usage.single_binding.offset_elements_2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.vertex_attribute_binding.usage.single_binding.offset_elements_2_share_elements = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.vertex_attribute_binding.usage.single_binding.unaligned_offset_elements_1_aligned_elements = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.vertex_attribute_binding.usage.multiple_bindings.basic = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.vertex_attribute_binding.usage.multiple_bindings.zero_stride = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.vertex_attribute_binding.usage.multiple_bindings.instanced = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.vertex_attribute_binding.usage.multiple_bindings.aliasing_buffer_zero_stride = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.vertex_attribute_binding.usage.multiple_bindings.aliasing_buffer_instanced = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.vertex_attribute_binding.usage.mixed_usage.mixed_attribs_basic = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.vertex_attribute_binding.usage.mixed_usage.mixed_attribs_instanced_binding = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.vertex_attribute_binding.usage.mixed_usage.mixed_attribs_instanced_attrib = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.vertex_attribute_binding.usage.mixed_usage.mixed_api_change_buffer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.vertex_attribute_binding.usage.mixed_usage.mixed_api_change_buffer_offset = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.vertex_attribute_binding.usage.mixed_usage.mixed_api_change_buffer_stride = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.vertex_attribute_binding.usage.mixed_usage.mixed_api_change_binding_point = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.vertex_attribute_binding.negative.vertex_attrib_format_large_offset = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.vertex_attribute_binding.negative.bind_vertex_buffer_large_stride = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.vertex_attribute_binding.negative.bind_vertex_buffer_negative_stride = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.vertex_attribute_binding.negative.bind_vertex_buffer_negative_offset = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.vertex_attribute_binding.negative.vertex_attrib_binding_invalid_attr = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.vertex_attribute_binding.negative.vertex_attrib_binding_invalid_binding = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.float_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.vec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.vec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.vec2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.vec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.vec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.vec3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat2_row_major_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat2_row_major_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat2_row_major_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat2x3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat2x3_row_major_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat2x3_row_major_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat2x3_row_major_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat2x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat2x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat2x4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat2x4_row_major_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat2x4_row_major_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat2x4_row_major_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat3x2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat3x2_row_major_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat3x2_row_major_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat3x2_row_major_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat3_row_major_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat3_row_major_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat3_row_major_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat3x4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat3x4_row_major_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat3x4_row_major_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat3x4_row_major_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat4x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat4x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat4x2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat4x2_row_major_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat4x2_row_major_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat4x2_row_major_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat4x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat4x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat4x3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat4x3_row_major_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat4x3_row_major_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat4x3_row_major_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat4_row_major_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat4_row_major_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.mat4_row_major_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.int_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.ivec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.ivec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.ivec2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.ivec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.ivec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.ivec3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.uint_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.uvec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.uvec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.uvec2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.uvec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.uvec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.uvec3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bool_api_float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bool_api_float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bool_api_float_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bool_api_int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bool_api_int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bool_api_int_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bool_api_uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bool_api_uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bool_api_uint_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bvec2_api_float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bvec2_api_float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bvec2_api_float_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bvec2_api_int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bvec2_api_int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bvec2_api_int_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bvec2_api_uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bvec2_api_uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bvec2_api_uint_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bvec3_api_float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bvec3_api_float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bvec3_api_float_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bvec3_api_int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bvec3_api_int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bvec3_api_int_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bvec3_api_uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bvec3_api_uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bvec3_api_uint_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bvec4_api_float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bvec4_api_float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bvec4_api_float_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bvec4_api_int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bvec4_api_int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bvec4_api_int_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bvec4_api_uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bvec4_api_uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.bvec4_api_uint_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.sampler2D_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.sampler2D_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.sampler2D_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.samplerCube_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.samplerCube_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic.samplerCube_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.float_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.mat4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.mat4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.mat4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.mat4_row_major_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.mat4_row_major_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.mat4_row_major_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.int_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.uint_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.bool_api_float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.bool_api_float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.bool_api_float_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.bool_api_int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.bool_api_int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.bool_api_int_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.bool_api_uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.bool_api_uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.bool_api_uint_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.bvec4_api_float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.bvec4_api_float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.bvec4_api_float_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.bvec4_api_int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.bvec4_api_int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.bvec4_api_int_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.bvec4_api_uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.bvec4_api_uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.bvec4_api_uint_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.sampler2D_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.sampler2D_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array.sampler2D_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.float_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.mat4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.mat4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.mat4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.mat4_row_major_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.mat4_row_major_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.mat4_row_major_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.int_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.uint_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.bool_api_float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.bool_api_float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.bool_api_float_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.bool_api_int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.bool_api_int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.bool_api_int_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.bool_api_uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.bool_api_uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.bool_api_uint_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.bvec4_api_float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.bvec4_api_float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.bvec4_api_float_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.bvec4_api_int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.bvec4_api_int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.bvec4_api_int_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.bvec4_api_uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.bvec4_api_uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.bvec4_api_uint_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.sampler2D_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.sampler2D_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_array_first_elem_without_brackets.sampler2D_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_struct.float_vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_struct.float_vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_struct.float_vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_struct.mat4_mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_struct.mat4_mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_struct.mat4_mat2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_struct.int_ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_struct.int_ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_struct.int_ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_struct.uint_uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_struct.uint_uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_struct.uint_uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_struct.bool_bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_struct.bool_bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_struct.bool_bvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_struct.sampler2D_samplerCube_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_struct.sampler2D_samplerCube_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.basic_struct.sampler2D_samplerCube_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.struct_in_array.float_vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.struct_in_array.float_vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.struct_in_array.float_vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.struct_in_array.mat4_mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.struct_in_array.mat4_mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.struct_in_array.mat4_mat2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.struct_in_array.int_ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.struct_in_array.int_ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.struct_in_array.int_ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.struct_in_array.uint_uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.struct_in_array.uint_uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.struct_in_array.uint_uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.struct_in_array.bool_bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.struct_in_array.bool_bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.struct_in_array.bool_bvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.struct_in_array.sampler2D_samplerCube_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.struct_in_array.sampler2D_samplerCube_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.struct_in_array.sampler2D_samplerCube_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.array_in_struct.float_vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.array_in_struct.float_vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.array_in_struct.float_vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.array_in_struct.mat4_mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.array_in_struct.mat4_mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.array_in_struct.mat4_mat2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.array_in_struct.int_ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.array_in_struct.int_ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.array_in_struct.int_ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.array_in_struct.uint_uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.array_in_struct.uint_uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.array_in_struct.uint_uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.array_in_struct.bool_bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.array_in_struct.bool_bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.array_in_struct.bool_bvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.array_in_struct.sampler2D_samplerCube_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.array_in_struct.sampler2D_samplerCube_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.array_in_struct.sampler2D_samplerCube_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.nested_structs_arrays.float_vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.nested_structs_arrays.float_vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.nested_structs_arrays.float_vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.nested_structs_arrays.mat4_mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.nested_structs_arrays.mat4_mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.nested_structs_arrays.mat4_mat2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.nested_structs_arrays.int_ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.nested_structs_arrays.int_ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.nested_structs_arrays.int_ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.nested_structs_arrays.uint_uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.nested_structs_arrays.uint_uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.nested_structs_arrays.uint_uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.nested_structs_arrays.bool_bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.nested_structs_arrays.bool_bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.nested_structs_arrays.bool_bvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.nested_structs_arrays.sampler2D_samplerCube_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.nested_structs_arrays.sampler2D_samplerCube_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.nested_structs_arrays.sampler2D_samplerCube_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.multiple_basic.vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.multiple_basic.fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.multiple_basic.both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.multiple_basic_array.vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.multiple_basic_array.fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.multiple_basic_array.both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.multiple_nested_structs_arrays.vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.multiple_nested_structs_arrays.fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.get_uniform.multiple_nested_structs_arrays.both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.float_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.vec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.vec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.vec2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.vec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.vec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.vec3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat2_row_major_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat2_row_major_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat2_row_major_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat2x3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat2x3_row_major_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat2x3_row_major_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat2x3_row_major_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat2x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat2x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat2x4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat2x4_row_major_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat2x4_row_major_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat2x4_row_major_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat3x2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat3x2_row_major_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat3x2_row_major_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat3x2_row_major_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat3_row_major_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat3_row_major_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat3_row_major_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat3x4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat3x4_row_major_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat3x4_row_major_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat3x4_row_major_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat4x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat4x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat4x2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat4x2_row_major_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat4x2_row_major_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat4x2_row_major_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat4x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat4x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat4x3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat4x3_row_major_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat4x3_row_major_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat4x3_row_major_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat4_row_major_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat4_row_major_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.mat4_row_major_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.int_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.ivec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.ivec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.ivec2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.ivec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.ivec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.ivec3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.uint_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.uvec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.uvec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.uvec2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.uvec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.uvec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.uvec3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.bool_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.bool_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.bool_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.bvec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.bvec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.bvec2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.bvec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.bvec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.bvec3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.bvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.sampler2D_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.sampler2D_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.sampler2D_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.samplerCube_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.samplerCube_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic.samplerCube_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_array.float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_array.float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_array.float_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_array.vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_array.vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_array.vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_array.mat4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_array.mat4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_array.mat4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_array.mat4_row_major_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_array.mat4_row_major_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_array.mat4_row_major_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_array.int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_array.int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_array.int_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_array.ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_array.ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_array.ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_array.uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_array.uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_array.uint_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_array.uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_array.uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_array.uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_array.bool_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_array.bool_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_array.bool_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_array.bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_array.bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_array.bvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_array.sampler2D_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_array.sampler2D_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_array.sampler2D_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_struct.float_vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_struct.float_vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_struct.float_vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_struct.mat4_mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_struct.mat4_mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_struct.mat4_mat2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_struct.int_ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_struct.int_ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_struct.int_ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_struct.uint_uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_struct.uint_uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_struct.uint_uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_struct.bool_bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_struct.bool_bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_struct.bool_bvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_struct.sampler2D_samplerCube_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_struct.sampler2D_samplerCube_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.basic_struct.sampler2D_samplerCube_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.struct_in_array.float_vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.struct_in_array.float_vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.struct_in_array.float_vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.struct_in_array.mat4_mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.struct_in_array.mat4_mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.struct_in_array.mat4_mat2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.struct_in_array.int_ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.struct_in_array.int_ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.struct_in_array.int_ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.struct_in_array.uint_uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.struct_in_array.uint_uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.struct_in_array.uint_uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.struct_in_array.bool_bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.struct_in_array.bool_bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.struct_in_array.bool_bvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.struct_in_array.sampler2D_samplerCube_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.struct_in_array.sampler2D_samplerCube_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.struct_in_array.sampler2D_samplerCube_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.array_in_struct.float_vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.array_in_struct.float_vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.array_in_struct.float_vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.array_in_struct.mat4_mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.array_in_struct.mat4_mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.array_in_struct.mat4_mat2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.array_in_struct.int_ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.array_in_struct.int_ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.array_in_struct.int_ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.array_in_struct.uint_uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.array_in_struct.uint_uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.array_in_struct.uint_uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.array_in_struct.bool_bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.array_in_struct.bool_bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.array_in_struct.bool_bvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.array_in_struct.sampler2D_samplerCube_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.array_in_struct.sampler2D_samplerCube_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.array_in_struct.sampler2D_samplerCube_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.nested_structs_arrays.float_vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.nested_structs_arrays.float_vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.nested_structs_arrays.float_vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.nested_structs_arrays.mat4_mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.nested_structs_arrays.mat4_mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.nested_structs_arrays.mat4_mat2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.nested_structs_arrays.int_ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.nested_structs_arrays.int_ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.nested_structs_arrays.int_ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.nested_structs_arrays.uint_uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.nested_structs_arrays.uint_uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.nested_structs_arrays.uint_uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.nested_structs_arrays.bool_bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.nested_structs_arrays.bool_bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.nested_structs_arrays.bool_bvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.nested_structs_arrays.sampler2D_samplerCube_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.nested_structs_arrays.sampler2D_samplerCube_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.nested_structs_arrays.sampler2D_samplerCube_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.multiple_basic.vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.multiple_basic.fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.multiple_basic.both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.multiple_basic_array.vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.multiple_basic_array.fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.multiple_basic_array.both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.multiple_nested_structs_arrays.vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.multiple_nested_structs_arrays.fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_pointer.render.multiple_nested_structs_arrays.both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.float_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.vec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.vec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.vec2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.vec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.vec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.vec3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.int_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.ivec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.ivec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.ivec2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.ivec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.ivec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.ivec3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.uint_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.uvec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.uvec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.uvec2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.uvec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.uvec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.uvec3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bool_api_float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bool_api_float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bool_api_float_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bool_api_int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bool_api_int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bool_api_int_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bool_api_uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bool_api_uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bool_api_uint_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bvec2_api_float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bvec2_api_float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bvec2_api_float_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bvec2_api_int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bvec2_api_int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bvec2_api_int_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bvec2_api_uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bvec2_api_uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bvec2_api_uint_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bvec3_api_float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bvec3_api_float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bvec3_api_float_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bvec3_api_int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bvec3_api_int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bvec3_api_int_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bvec3_api_uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bvec3_api_uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bvec3_api_uint_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bvec4_api_float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bvec4_api_float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bvec4_api_float_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bvec4_api_int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bvec4_api_int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bvec4_api_int_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bvec4_api_uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bvec4_api_uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.bvec4_api_uint_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.sampler2D_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.sampler2D_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.sampler2D_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.samplerCube_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.samplerCube_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic.samplerCube_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.float_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.int_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.uint_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.bool_api_float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.bool_api_float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.bool_api_float_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.bool_api_int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.bool_api_int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.bool_api_int_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.bool_api_uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.bool_api_uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.bool_api_uint_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.bvec4_api_float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.bvec4_api_float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.bvec4_api_float_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.bvec4_api_int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.bvec4_api_int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.bvec4_api_int_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.bvec4_api_uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.bvec4_api_uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.bvec4_api_uint_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.sampler2D_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.sampler2D_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array.sampler2D_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.float_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.int_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.uint_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.bool_api_float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.bool_api_float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.bool_api_float_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.bool_api_int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.bool_api_int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.bool_api_int_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.bool_api_uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.bool_api_uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.bool_api_uint_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.bvec4_api_float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.bvec4_api_float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.bvec4_api_float_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.bvec4_api_int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.bvec4_api_int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.bvec4_api_int_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.bvec4_api_uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.bvec4_api_uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.bvec4_api_uint_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.sampler2D_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.sampler2D_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_array_first_elem_without_brackets.sampler2D_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_struct.float_vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_struct.float_vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_struct.float_vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_struct.int_ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_struct.int_ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_struct.int_ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_struct.uint_uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_struct.uint_uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_struct.uint_uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_struct.bool_bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_struct.bool_bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_struct.bool_bvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_struct.sampler2D_samplerCube_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_struct.sampler2D_samplerCube_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.basic_struct.sampler2D_samplerCube_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.struct_in_array.float_vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.struct_in_array.float_vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.struct_in_array.float_vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.struct_in_array.int_ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.struct_in_array.int_ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.struct_in_array.int_ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.struct_in_array.uint_uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.struct_in_array.uint_uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.struct_in_array.uint_uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.struct_in_array.bool_bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.struct_in_array.bool_bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.struct_in_array.bool_bvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.struct_in_array.sampler2D_samplerCube_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.struct_in_array.sampler2D_samplerCube_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.struct_in_array.sampler2D_samplerCube_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.array_in_struct.float_vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.array_in_struct.float_vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.array_in_struct.float_vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.array_in_struct.int_ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.array_in_struct.int_ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.array_in_struct.int_ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.array_in_struct.uint_uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.array_in_struct.uint_uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.array_in_struct.uint_uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.array_in_struct.bool_bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.array_in_struct.bool_bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.array_in_struct.bool_bvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.array_in_struct.sampler2D_samplerCube_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.array_in_struct.sampler2D_samplerCube_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.array_in_struct.sampler2D_samplerCube_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.nested_structs_arrays.float_vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.nested_structs_arrays.float_vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.nested_structs_arrays.float_vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.nested_structs_arrays.int_ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.nested_structs_arrays.int_ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.nested_structs_arrays.int_ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.nested_structs_arrays.uint_uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.nested_structs_arrays.uint_uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.nested_structs_arrays.uint_uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.nested_structs_arrays.bool_bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.nested_structs_arrays.bool_bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.nested_structs_arrays.bool_bvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.nested_structs_arrays.sampler2D_samplerCube_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.nested_structs_arrays.sampler2D_samplerCube_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.nested_structs_arrays.sampler2D_samplerCube_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.multiple_basic_array.vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.multiple_basic_array.fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.multiple_basic_array.both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.multiple_nested_structs_arrays.vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.multiple_nested_structs_arrays.fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.get_uniform.multiple_nested_structs_arrays.both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.float_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.vec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.vec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.vec2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.vec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.vec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.vec3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.int_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.ivec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.ivec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.ivec2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.ivec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.ivec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.ivec3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.uint_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.uvec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.uvec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.uvec2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.uvec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.uvec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.uvec3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.bool_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.bool_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.bool_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.bvec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.bvec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.bvec2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.bvec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.bvec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.bvec3_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.bvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.sampler2D_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.sampler2D_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.sampler2D_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.samplerCube_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.samplerCube_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic.samplerCube_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_array.float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_array.float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_array.float_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_array.vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_array.vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_array.vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_array.int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_array.int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_array.int_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_array.ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_array.ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_array.ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_array.uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_array.uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_array.uint_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_array.uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_array.uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_array.uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_array.bool_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_array.bool_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_array.bool_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_array.bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_array.bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_array.bvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_array.sampler2D_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_array.sampler2D_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_array.sampler2D_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_struct.float_vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_struct.float_vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_struct.float_vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_struct.int_ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_struct.int_ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_struct.int_ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_struct.uint_uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_struct.uint_uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_struct.uint_uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_struct.bool_bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_struct.bool_bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_struct.bool_bvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_struct.sampler2D_samplerCube_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_struct.sampler2D_samplerCube_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.basic_struct.sampler2D_samplerCube_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.struct_in_array.float_vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.struct_in_array.float_vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.struct_in_array.float_vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.struct_in_array.int_ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.struct_in_array.int_ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.struct_in_array.int_ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.struct_in_array.uint_uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.struct_in_array.uint_uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.struct_in_array.uint_uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.struct_in_array.bool_bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.struct_in_array.bool_bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.struct_in_array.bool_bvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.struct_in_array.sampler2D_samplerCube_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.struct_in_array.sampler2D_samplerCube_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.struct_in_array.sampler2D_samplerCube_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.array_in_struct.float_vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.array_in_struct.float_vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.array_in_struct.float_vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.array_in_struct.int_ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.array_in_struct.int_ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.array_in_struct.int_ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.array_in_struct.uint_uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.array_in_struct.uint_uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.array_in_struct.uint_uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.array_in_struct.bool_bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.array_in_struct.bool_bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.array_in_struct.bool_bvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.array_in_struct.sampler2D_samplerCube_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.array_in_struct.sampler2D_samplerCube_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.array_in_struct.sampler2D_samplerCube_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.nested_structs_arrays.float_vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.nested_structs_arrays.float_vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.nested_structs_arrays.float_vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.nested_structs_arrays.int_ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.nested_structs_arrays.int_ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.nested_structs_arrays.int_ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.nested_structs_arrays.uint_uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.nested_structs_arrays.uint_uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.nested_structs_arrays.uint_uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.nested_structs_arrays.bool_bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.nested_structs_arrays.bool_bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.nested_structs_arrays.bool_bvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.nested_structs_arrays.sampler2D_samplerCube_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.nested_structs_arrays.sampler2D_samplerCube_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.nested_structs_arrays.sampler2D_samplerCube_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.multiple_basic_array.vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.multiple_basic_array.fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.multiple_basic_array.both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.multiple_nested_structs_arrays.vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.multiple_nested_structs_arrays.fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.by_value.render.multiple_nested_structs_arrays.both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.basic_array.float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.basic_array.float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.basic_array.float_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.basic_array.vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.basic_array.vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.basic_array.vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.basic_array.mat4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.basic_array.mat4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.basic_array.mat4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.basic_array.int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.basic_array.int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.basic_array.int_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.basic_array.ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.basic_array.ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.basic_array.ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.basic_array.uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.basic_array.uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.basic_array.uint_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.basic_array.uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.basic_array.uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.basic_array.uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.basic_array.bool_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.basic_array.bool_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.basic_array.bool_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.basic_array.bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.basic_array.bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.basic_array.bvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.basic_array.sampler2D_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.basic_array.sampler2D_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.basic_array.sampler2D_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.array_in_struct.float_vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.array_in_struct.float_vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.array_in_struct.float_vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.array_in_struct.mat4_mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.array_in_struct.mat4_mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.array_in_struct.mat4_mat2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.array_in_struct.int_ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.array_in_struct.int_ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.array_in_struct.int_ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.array_in_struct.uint_uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.array_in_struct.uint_uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.array_in_struct.uint_uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.array_in_struct.bool_bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.array_in_struct.bool_bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.array_in_struct.bool_bvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.array_in_struct.sampler2D_samplerCube_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.array_in_struct.sampler2D_samplerCube_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.array_in_struct.sampler2D_samplerCube_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.multiple_basic_array.vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.multiple_basic_array.fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_full.multiple_basic_array.both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.basic_array.float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.basic_array.float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.basic_array.float_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.basic_array.vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.basic_array.vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.basic_array.vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.basic_array.mat4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.basic_array.mat4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.basic_array.mat4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.basic_array.int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.basic_array.int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.basic_array.int_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.basic_array.ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.basic_array.ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.basic_array.ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.basic_array.uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.basic_array.uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.basic_array.uint_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.basic_array.uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.basic_array.uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.basic_array.uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.basic_array.bool_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.basic_array.bool_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.basic_array.bool_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.basic_array.bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.basic_array.bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.basic_array.bvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.basic_array.sampler2D_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.basic_array.sampler2D_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.basic_array.sampler2D_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.array_in_struct.float_vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.array_in_struct.float_vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.array_in_struct.float_vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.array_in_struct.mat4_mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.array_in_struct.mat4_mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.array_in_struct.mat4_mat2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.array_in_struct.int_ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.array_in_struct.int_ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.array_in_struct.int_ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.array_in_struct.uint_uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.array_in_struct.uint_uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.array_in_struct.uint_uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.array_in_struct.bool_bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.array_in_struct.bool_bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.array_in_struct.bool_bvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.array_in_struct.sampler2D_samplerCube_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.array_in_struct.sampler2D_samplerCube_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.array_in_struct.sampler2D_samplerCube_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.multiple_basic_array.vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.multiple_basic_array.fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.basic_array_assign_partial.multiple_basic_array.both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.unused_uniforms.float_vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.unused_uniforms.float_vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.unused_uniforms.float_vec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.unused_uniforms.mat4_mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.unused_uniforms.mat4_mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.unused_uniforms.mat4_mat2_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.unused_uniforms.int_ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.unused_uniforms.int_ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.unused_uniforms.int_ivec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.unused_uniforms.uint_uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.unused_uniforms.uint_uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.unused_uniforms.uint_uvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.unused_uniforms.bool_bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.unused_uniforms.bool_bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.unused_uniforms.bool_bvec4_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.unused_uniforms.sampler2D_samplerCube_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.unused_uniforms.sampler2D_samplerCube_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_uniform.unused_uniforms.sampler2D_samplerCube_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.pipeline.different_constant_separate_programs = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.pipeline.different_constant_separate_programs_add_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.pipeline.different_constant_separate_programs_add_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.pipeline.different_constant_separate_programs_add_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.pipeline.different_constant_single_program = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.pipeline.different_constant_single_program_add_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.pipeline.different_uniform_separate_programs = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.pipeline.different_uniform_separate_programs_add_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.pipeline.different_uniform_separate_programs_add_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.pipeline.different_uniform_separate_programs_add_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.pipeline.different_uniform_single_program = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.pipeline.different_uniform_single_program_add_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.pipeline.same_constant_separate_programs = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.pipeline.same_constant_separate_programs_add_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.pipeline.same_constant_separate_programs_add_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.pipeline.same_constant_separate_programs_add_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.pipeline.same_uniform_separate_programs = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.pipeline.same_uniform_separate_programs_add_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.pipeline.same_uniform_separate_programs_add_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.pipeline.same_uniform_separate_programs_add_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.program_uniform.separate_programs = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.program_uniform.separate_programs_add_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.program_uniform.separate_programs_add_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.program_uniform.separate_programs_add_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.program_uniform.single_program = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.program_uniform.single_program_add_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.create_shader_program.separate_programs = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.create_shader_program.separate_programs_add_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.create_shader_program.separate_programs_add_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.create_shader_program.separate_programs_add_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.create_shader_program.single_program_add_both = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.interface.same_name_vertex_smooth_fragment_smooth = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.interface.same_name_vertex_smooth_fragment_centroid = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.interface.same_name_vertex_smooth = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.interface.same_name_vertex_flat_fragment_flat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.interface.same_name_vertex_centroid_fragment_smooth = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.interface.same_name_vertex_centroid_fragment_centroid = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.interface.same_name_vertex_centroid = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.interface.same_name_fragment_smooth = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.interface.same_name_fragment_centroid = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.interface.same_name = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.interface.same_location_vertex_smooth_fragment_smooth = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.interface.same_location_vertex_smooth_fragment_centroid = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.interface.same_location_vertex_smooth = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.interface.same_location_vertex_flat_fragment_flat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.interface.same_location_vertex_centroid_fragment_smooth = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.interface.same_location_vertex_centroid_fragment_centroid = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.interface.same_location_vertex_centroid = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.interface.same_location_fragment_smooth = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.interface.same_location_fragment_centroid = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.interface.same_location = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.0 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.5 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.6 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.7 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.9 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.10 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.11 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.12 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.13 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.14 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.15 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.16 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.17 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.18 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.19 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.20 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.21 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.22 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.23 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.24 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.25 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.26 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.27 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.28 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.29 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.30 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.31 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.32 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.33 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.34 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.35 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.36 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.37 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.38 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.39 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.40 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.41 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.42 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.43 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.44 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.45 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.46 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.47 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.48 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.49 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.50 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.51 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.52 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.53 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.54 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.55 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.56 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.57 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.58 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.59 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.60 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.61 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.62 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.63 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.64 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.65 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.66 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.67 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.68 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.69 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.70 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.71 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.72 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.73 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.74 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.75 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.76 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.77 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.78 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.79 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.80 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.81 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.82 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.83 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.84 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.85 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.86 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.87 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.88 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.89 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.90 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.91 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.92 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.93 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.94 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.95 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.96 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.97 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.98 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.99 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.100 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.101 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.102 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.103 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.104 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.105 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.106 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.107 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.108 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.109 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.110 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.111 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.112 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.113 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.114 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.115 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.116 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.117 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.118 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.119 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.120 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.121 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.122 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.123 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.124 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.125 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.126 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.random.127 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.api.current_program_priority = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.api.active_program_uniform = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.api.pipeline_programs = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.api.pipeline_active = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.validation.varying.missing_input = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.validation.varying.missing_output = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.validation.varying.mismatch_type = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.validation.varying.mismatch_precision = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.validation.varying.mismatch_explicit_location_type = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.validation.varying.mismatch_explicit_location_precision = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.validation.varying.mismatch_explicit_location = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.validation.varying.mismatch_implicit_explicit_location_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.validation.varying.mismatch_implicit_explicit_location_2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.validation.varying.mismatch_implicit_explicit_location_3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.validation.varying.match_different_struct_names = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.validation.varying.mismatch_struct_member_name = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.validation.varying.mismatch_struct_member_type = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.validation.varying.mismatch_struct_member_precision = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.validation.varying.mismatch_struct_member_order = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.validation.varying.mismatch_array_element_type = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.validation.varying.mismatch_array_length = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.validation.varying.mismatch_array_precision = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.validation.varying.mismatch_qualifier_vertex_flat_fragment_none = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.validation.varying.mismatch_qualifier_vertex_flat_fragment_smooth = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.validation.varying.mismatch_qualifier_vertex_flat_fragment_centroid = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.validation.varying.mismatch_qualifier_vertex_smooth_fragment_flat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.separate_shader.validation.varying.mismatch_qualifier_vertex_centroid_fragment_flat = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.vec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.vec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.vec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.vec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.ivec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.ivec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.ivec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.ivec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.uvec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.uvec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.uvec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.uvec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.bool_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.bool_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.bvec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.bvec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.bvec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.bvec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.mat2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.mat2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.mat2x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.mat2x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.mat3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.mat3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.mat3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.mat3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.mat3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.mat3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.mat4x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.mat4x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.mat4x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.mat4x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.mat4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.mat4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.sampler2D_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.sampler2D_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.isampler2D_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.isampler2D_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.usampler2D_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.basic.usampler2D_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.vec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.vec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.vec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.vec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.ivec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.ivec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.ivec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.ivec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.uvec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.uvec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.uvec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.uvec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.bool_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.bool_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.bvec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.bvec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.bvec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.bvec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.mat2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.mat2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.mat2x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.mat2x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.mat3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.mat3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.mat3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.mat3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.mat3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.mat3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.mat4x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.mat4x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.mat4x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.mat4x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.mat4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.mat4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.sampler2D_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.sampler2D_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.isampler2D_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.isampler2D_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.usampler2D_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.array.usampler2D_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.float_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.float_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.vec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.vec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.vec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.vec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.vec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.vec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.int_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.int_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.ivec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.ivec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.ivec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.ivec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.ivec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.ivec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.uint_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.uint_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.uvec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.uvec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.uvec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.uvec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.uvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.uvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.bool_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.bool_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.bvec2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.bvec2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.bvec3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.bvec3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.bvec4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.bvec4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.mat2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.mat2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.mat2x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.mat2x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.mat2x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.mat2x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.mat3x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.mat3x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.mat3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.mat3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.mat3x4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.mat3x4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.mat4x2_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.mat4x2_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.mat4x3_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.mat4x3_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.mat4_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.mat4_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.sampler2D_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.sampler2D_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.isampler2D_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.isampler2D_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.usampler2D_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_array.usampler2D_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.struct.case_0 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.struct.case_2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.struct.case_3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.struct.case_4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.struct.case_6 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.struct.case_7 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.struct.case_8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.struct.case_9 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.struct.case_10 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.struct.case_12 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.struct.case_13 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.struct.case_14 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.struct.case_15 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_struct.case_0 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_struct.case_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_struct.case_2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_struct.case_3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_struct.case_4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_struct.case_5 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_struct.case_6 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_struct.case_7 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_struct.case_8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_struct.case_9 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_struct.case_10 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_struct.case_11 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_struct.case_12 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_struct.case_13 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_struct.case_14 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.nested_struct.case_15 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.float_vertex_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.float_vertex_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.float_fragment_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.float_fragment_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.vec2_vertex_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.vec2_vertex_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.vec2_fragment_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.vec2_fragment_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.vec3_vertex_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.vec3_vertex_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.vec3_fragment_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.vec3_fragment_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.vec4_vertex_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.vec4_vertex_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.vec4_fragment_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.vec4_fragment_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.int_vertex_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.int_vertex_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.int_fragment_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.int_fragment_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.ivec2_vertex_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.ivec2_vertex_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.ivec2_fragment_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.ivec2_fragment_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.ivec3_vertex_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.ivec3_vertex_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.ivec3_fragment_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.ivec3_fragment_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.ivec4_vertex_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.ivec4_vertex_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.ivec4_fragment_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.ivec4_fragment_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.uint_vertex_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.uint_vertex_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.uint_fragment_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.uint_fragment_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.uvec2_vertex_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.uvec2_vertex_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.uvec2_fragment_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.uvec2_fragment_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.uvec3_vertex_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.uvec3_vertex_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.uvec3_fragment_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.uvec3_fragment_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.uvec4_vertex_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.uvec4_vertex_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.uvec4_fragment_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.uvec4_fragment_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.bool_vertex_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.bool_vertex_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.bool_fragment_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.bool_fragment_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.bvec2_vertex_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.bvec2_vertex_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.bvec2_fragment_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.bvec2_fragment_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.bvec3_vertex_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.bvec3_vertex_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.bvec3_fragment_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.bvec3_fragment_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.bvec4_vertex_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.bvec4_vertex_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.bvec4_fragment_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.bvec4_fragment_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat2_vertex_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat2_vertex_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat2_fragment_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat2_fragment_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat2x3_vertex_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat2x3_vertex_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat2x3_fragment_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat2x3_fragment_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat2x4_vertex_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat2x4_vertex_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat2x4_fragment_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat2x4_fragment_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat3x2_vertex_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat3x2_vertex_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat3x2_fragment_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat3x2_fragment_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat3_vertex_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat3_vertex_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat3_fragment_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat3_fragment_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat3x4_vertex_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat3x4_vertex_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat3x4_fragment_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat3x4_fragment_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat4x2_vertex_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat4x2_vertex_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat4x2_fragment_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat4x2_fragment_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat4x3_vertex_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat4x3_vertex_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat4x3_fragment_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat4x3_fragment_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat4_vertex_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat4_vertex_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat4_fragment_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.mat4_fragment_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.sampler2D_vertex_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.sampler2D_vertex_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.sampler2D_fragment_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.sampler2D_fragment_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.isampler2D_vertex_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.isampler2D_vertex_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.isampler2D_fragment_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.isampler2D_fragment_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.usampler2D_vertex_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.usampler2D_vertex_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.usampler2D_fragment_min = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.min_max.usampler2D_fragment_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.link.case_0 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.link.case_1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.link.case_2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.link.case_3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.link.case_4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.link.case_5 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.link.case_6 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.link.case_7 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.link.case_8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.uniform_location.link.case_9 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.callbacks.shader.compile_compute_shader = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.callbacks.shader_directive.primitive_bounding_box = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.callbacks.shader_directive.geometry_shader = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.callbacks.shader_directive.tessellation_shader = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.log.shader.compile_compute_shader = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.log.shader_directive.primitive_bounding_box = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.log.shader_directive.geometry_shader = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.log.shader_directive.tessellation_shader = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.get_error.buffer.read_pixels_format_mismatch = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.get_error.buffer.framebuffer_texture2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.get_error.buffer.blit_framebuffer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.get_error.buffer.invalidate_sub_framebuffer = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.get_error.buffer.renderbuffer_storage_multisample = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.get_error.texture.copyteximage2d_invalid_format = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.get_error.texture.copyteximage2d_inequal_width_height_cube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.get_error.texture.copyteximage2d_max_width_height = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.get_error.texture.copytexsubimage2d_invalid_offset = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.get_error.texture.texparameteri = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.get_error.texture.texparameterf = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.get_error.texture.texparameteriv = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.get_error.texture.texparameterfv = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.get_error.texture.compressedtexsubimage2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.get_error.texture.compressedtexsubimage2d_invalid_size = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.get_error.texture.texsubimage3d_neg_level = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.get_error.texture.texsubimage3d_neg_offset = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.get_error.texture.copytexsubimage3d_invalid_offset = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.get_error.texture.compressedtexsubimage3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.get_error.texture.compressedtexsubimage3d_invalid_buffer_target = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.get_error.shader.compile_compute_shader = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.get_error.vertex_array.vertex_attrib_format = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.get_error.vertex_array.vertex_attrib_i_format = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.get_error.vertex_array.draw_range_elements = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.get_error.vertex_array.draw_range_elements_incomplete_primitive = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.get_error.shader_directive.primitive_bounding_box = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.get_error.shader_directive.geometry_shader = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.negative_coverage.get_error.shader_directive.tessellation_shader = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.debug.object_labels.program_pipeline = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.size.16x16 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.size.16x64 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.size.16x256 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.size.16x1024 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.size.64x16 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.size.64x64 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.size.64x256 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.size.64x1024 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.size.256x16 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.size.256x64 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.size.256x256 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.size.256x1024 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.size.1024x16 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.size.1024x64 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.size.1024x256 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.size.1024x1024 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.npot_size.1x1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.npot_size.3x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.npot_size.15x15 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.npot_size.17x17 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.npot_size.31x31 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.npot_size.33x33 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.npot_size.63x63 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.npot_size.65x65 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.npot_size.127x127 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.npot_size.129x129 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.npot_size.255x255 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.npot_size.257x257 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.npot_size.511x511 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.npot_size.513x513 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.npot_size.1023x1023 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.npot_size.1025x1025 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.npot_size.2047x2047 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.npot_size.15x511 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.npot_size.127x15 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.npot_size.129x127 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.npot_size.511x127 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.npot_size.2047x1025 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.multisample.samples0 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.multisample.samples1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.multisample.samples2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.multisample.samples3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.multisample.samples4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.random.0 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.random.1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.random.2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.random.3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.random.4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.random.5 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.random.6 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.random.7 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.random.8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.random.9 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.random.10 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.random.11 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.random.12 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.random.13 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.random.14 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.random.15 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.interaction.256x256ms0_default_128x128ms1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.interaction.256x256ms1_default_128x128ms0 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.interaction.256x256ms0_default_512x512ms2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.interaction.256x256ms2_default_128x512ms0 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.interaction.127x127ms0_default_129x129ms0 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.interaction.17x512ms4_default_16x16ms2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.interaction.2048x2048ms4_default_1x1ms0 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.interaction.1x1ms0_default_2048x2048ms4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.maximums.width = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.maximums.height = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.maximums.size = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.maximums.samples = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.no_attachments.maximums.all = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.fbo.completeness.no_attachments = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_limited_query.resource_name_query = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_limited_query.resource_query = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.default_block.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.default_block.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.default_block.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.default_block.var_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.default_block.var_struct_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.default_block.var_array_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.default_block.var_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.default_block.var_struct_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.default_block.var_array_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.default_block.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.default_block.var_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.default_block.var_struct_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.default_block.var_array_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.default_block.var_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.default_block.var_struct_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.default_block.var_array_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.default_block.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.default_block.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.default_block.var_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.default_block.var_struct_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.default_block.var_array_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.default_block.var_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.default_block.var_struct_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.default_block.var_array_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.default_block.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.default_block.var_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.default_block.var_struct_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.default_block.var_array_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.default_block.var_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.default_block.var_struct_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.default_block.var_array_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.named_block.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.named_block.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.named_block.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.named_block.var_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.named_block.var_struct_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.named_block.var_array_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.named_block.var_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.named_block.var_struct_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.named_block.var_array_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.named_block.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.named_block.var_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.named_block.var_struct_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.named_block.var_array_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.named_block.var_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.named_block.var_struct_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.named_block.var_array_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.named_block.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.named_block.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.named_block.var_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.named_block.var_struct_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.named_block.var_array_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.named_block.var_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.named_block.var_struct_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.named_block.var_array_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.named_block.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.named_block.var_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.named_block.var_struct_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.named_block.var_array_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.named_block.var_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.named_block.var_struct_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.named_block.var_array_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.unnamed_block.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.unnamed_block.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.unnamed_block.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.unnamed_block.var_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.unnamed_block.var_struct_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.unnamed_block.var_array_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.unnamed_block.var_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.unnamed_block.var_struct_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.unnamed_block.var_array_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.unnamed_block.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.unnamed_block.var_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.unnamed_block.var_struct_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.unnamed_block.var_array_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.unnamed_block.var_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.unnamed_block.var_struct_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.unnamed_block.var_array_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.unnamed_block.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.unnamed_block.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.unnamed_block.var_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.unnamed_block.var_struct_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.unnamed_block.var_array_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.unnamed_block.var_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.unnamed_block.var_struct_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.unnamed_block.var_array_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.unnamed_block.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.unnamed_block.var_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.unnamed_block.var_struct_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.unnamed_block.var_array_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.unnamed_block.var_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.unnamed_block.var_struct_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.unnamed_block.var_array_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.block_array.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.block_array.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.block_array.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.block_array.var_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.block_array.var_struct_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.block_array.var_array_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.block_array.var_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.block_array.var_struct_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.block_array.var_array_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.block_array.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.block_array.var_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.block_array.var_struct_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.block_array.var_array_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.block_array.var_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.block_array.var_struct_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.block_array.var_array_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.block_array.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.block_array.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.block_array.var_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.block_array.var_struct_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.block_array.var_array_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.block_array.var_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.block_array.var_struct_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.block_array.var_array_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.block_array.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.block_array.var_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.block_array.var_struct_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.block_array.var_array_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.block_array.var_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.block_array.var_struct_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.resource_list.block_array.var_array_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.sampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.sampler_cube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.sampler_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.sampler_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.sampler_2d_shadow = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.isampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.usampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.sampler_2d_ms = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.isampler_2d_ms = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.image_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.iimage_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.uimage_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.types.atomic_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.aggregates.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.aggregates.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.aggregates.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.aggregates.var_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.aggregates.var_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.aggregates.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.aggregates.var_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.aggregates.var_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.aggregates.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.aggregates.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.aggregates.var_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.aggregates.var_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.aggregates.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.aggregates.var_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.default_block.aggregates.var_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.named_block.types.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.named_block.types.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.named_block.types.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.named_block.types.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.named_block.types.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.named_block.types.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.named_block.types.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.named_block.types.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.named_block.types.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.named_block.types.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.named_block.types.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.named_block.types.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.named_block.types.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.named_block.types.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.named_block.aggregates.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.named_block.aggregates.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.named_block.aggregates.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.named_block.aggregates.var_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.named_block.aggregates.var_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.named_block.aggregates.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.named_block.aggregates.var_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.named_block.aggregates.var_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.named_block.aggregates.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.named_block.aggregates.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.named_block.aggregates.var_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.named_block.aggregates.var_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.named_block.aggregates.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.named_block.aggregates.var_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.named_block.aggregates.var_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.unnamed_block.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.unnamed_block.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.unnamed_block.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.unnamed_block.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.unnamed_block.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.unnamed_block.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.unnamed_block.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.block_array.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.block_array.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.block_array.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.block_array.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.block_array.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.block_array.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_size.block_array.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.sampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.sampler_cube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.sampler_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.sampler_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.sampler_2d_shadow = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.isampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.usampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.sampler_2d_ms = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.isampler_2d_ms = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.image_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.iimage_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.uimage_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.types.atomic_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.sampler2D_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.sampler2D_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.atomic_uint_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.float_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.float_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.float_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.float_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.bool_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.bool_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.bvec3_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.bvec3_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.bvec3_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.bvec3_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.bvec3_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.bvec3_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.vec3_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.vec3_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.vec3_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.vec3_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.vec3_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.vec3_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.ivec3_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.ivec3_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.ivec3_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.ivec3_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.ivec3_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.default_block.aggregates.ivec3_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.types.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.types.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.types.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.types.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.types.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.types.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.types.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.types.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.types.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.types.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.types.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.types.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.types.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.types.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.aggregates.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.aggregates.float_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.aggregates.float_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.aggregates.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.aggregates.float_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.aggregates.float_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.aggregates.bool_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.aggregates.bool_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.aggregates.bvec3_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.aggregates.bvec3_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.aggregates.bvec3_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.aggregates.bvec3_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.aggregates.bvec3_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.aggregates.bvec3_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.aggregates.vec3_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.aggregates.vec3_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.aggregates.vec3_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.aggregates.vec3_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.aggregates.vec3_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.aggregates.vec3_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.aggregates.ivec3_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.aggregates.ivec3_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.aggregates.ivec3_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.aggregates.ivec3_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.aggregates.ivec3_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.named_block.aggregates.ivec3_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.unnamed_block.basic_type.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.unnamed_block.basic_type.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.unnamed_block.basic_type.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.unnamed_block.basic_type.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.unnamed_block.basic_type.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.unnamed_block.basic_type.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.unnamed_block.array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.unnamed_block.array.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.unnamed_block.array.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.unnamed_block.array.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.unnamed_block.array.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.unnamed_block.array.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.unnamed_block.struct.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.unnamed_block.struct.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.unnamed_block.struct.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.unnamed_block.struct.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.unnamed_block.struct.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.unnamed_block.struct.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.block_array.basic_type.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.block_array.basic_type.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.block_array.basic_type.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.block_array.basic_type.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.block_array.basic_type.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.block_array.basic_type.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.block_array.array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.block_array.array.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.block_array.array.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.block_array.array.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.block_array.array.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.block_array.array.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.block_array.struct.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.block_array.struct.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.block_array.struct.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.block_array.struct.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.block_array.struct.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.array_stride.block_array.struct.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.basic_type.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.basic_type.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.basic_type.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.basic_type.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.basic_type.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.basic_type.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.basic_type.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.basic_type.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.basic_type.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.basic_type.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.basic_type.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.basic_type.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.basic_type.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.basic_type.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.basic_type.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.basic_type.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.basic_type.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.basic_type.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.basic_type.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.basic_type.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.basic_type.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.basic_type.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.basic_type.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.basic_type.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.basic_type.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.sampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.sampler_cube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.sampler_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.sampler_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.sampler_2d_shadow = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.sampler_cube_shadow = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.sampler_2d_array_shadow = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.isampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.isampler_cube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.isampler_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.isampler_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.usampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.usampler_cube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.usampler_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.usampler_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.sampler_2d_ms = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.isampler_2d_ms = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.usampler_2d_ms = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.image_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.image_cube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.image_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.image_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.iimage_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.iimage_cube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.iimage_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.iimage_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.uimage_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.uimage_cube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.uimage_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.uimage_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.opaque_type.atomic_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.array.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.default_block.array.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.named_block.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.named_block.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.named_block.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.named_block.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.named_block.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.atomic_counter_buffer_index.named_block.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.block_index.default_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.block_index.named_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.block_index.unnamed_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.block_index.block_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.basic_type.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.basic_type.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.basic_type.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.basic_type.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.basic_type.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.basic_type.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.basic_type.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.basic_type.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.basic_type.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.basic_type.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.basic_type.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.basic_type.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.basic_type.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.basic_type.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.basic_type.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.basic_type.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.basic_type.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.basic_type.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.basic_type.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.basic_type.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.basic_type.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.basic_type.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.basic_type.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.basic_type.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.basic_type.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.sampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.sampler_cube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.sampler_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.sampler_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.sampler_2d_shadow = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.sampler_cube_shadow = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.sampler_2d_array_shadow = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.isampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.isampler_cube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.isampler_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.isampler_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.usampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.usampler_cube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.usampler_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.usampler_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.sampler_2d_ms = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.isampler_2d_ms = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.usampler_2d_ms = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.image_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.image_cube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.image_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.image_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.iimage_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.iimage_cube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.iimage_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.iimage_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.uimage_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.uimage_cube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.uimage_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.uimage_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.opaque_type.atomic_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.basic_type.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.basic_type.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.basic_type.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.basic_type.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.basic_type.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.basic_type.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.basic_type.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.basic_type.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.basic_type.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.basic_type.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.basic_type.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.basic_type.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.basic_type.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.basic_type.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.opaque_type.sampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.opaque_type.sampler_cube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.opaque_type.sampler_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.opaque_type.sampler_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.opaque_type.sampler_2d_shadow = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.opaque_type.isampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.opaque_type.usampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.opaque_type.sampler_2d_ms = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.opaque_type.isampler_2d_ms = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.opaque_type.image_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.opaque_type.iimage_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.opaque_type.uimage_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.opaque_type.atomic_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.array.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.array.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.array.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.array.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.array.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.array.sampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.array.sampler_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.array.sampler_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.array.isampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.array.image_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.array.iimage_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.array.atomic_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.struct.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.struct.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.struct.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.struct.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.struct.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.struct.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.struct.sampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.struct.sampler_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.struct.sampler_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.struct.isampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.basic_type.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.basic_type.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.basic_type.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.basic_type.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.basic_type.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.basic_type.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.basic_type.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.basic_type.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.basic_type.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.basic_type.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.basic_type.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.basic_type.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.basic_type.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.basic_type.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.opaque_type.sampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.opaque_type.sampler_cube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.opaque_type.sampler_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.opaque_type.sampler_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.opaque_type.sampler_2d_shadow = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.opaque_type.isampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.opaque_type.usampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.opaque_type.sampler_2d_ms = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.opaque_type.isampler_2d_ms = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.array.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.array.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.array.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.array.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.array.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.array.sampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.array.sampler_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.array.sampler_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.array.isampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.struct.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.struct.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.struct.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.struct.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.struct.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.struct.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.struct.sampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.struct.sampler_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.struct.sampler_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.struct.struct.isampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.named_block.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.named_block.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.named_block.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.named_block.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.named_block.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.named_block.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.unnamed_block.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.unnamed_block.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.unnamed_block.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.unnamed_block.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.unnamed_block.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.location.unnamed_block.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.sampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.sampler_cube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.sampler_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.sampler_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.sampler_2d_shadow = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.isampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.usampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.sampler_2d_ms = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.isampler_2d_ms = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.image_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.iimage_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.uimage_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.types.atomic_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.aggregates.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.aggregates.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.default_block.no_qualifier.aggregates.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block.no_qualifier.types.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block.no_qualifier.types.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block.no_qualifier.types.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block.no_qualifier.types.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block.no_qualifier.types.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block.no_qualifier.types.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block.no_qualifier.types.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block.no_qualifier.types.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block.no_qualifier.types.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block.no_qualifier.types.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block.no_qualifier.types.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block.no_qualifier.types.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block.no_qualifier.aggregates.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block.no_qualifier.aggregates.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block.no_qualifier.aggregates.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block.row_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block.row_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block.row_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block.column_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block.column_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block.column_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_row_major.no_qualifier.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_row_major.no_qualifier.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_row_major.no_qualifier.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_row_major.row_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_row_major.row_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_row_major.row_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_row_major.column_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_row_major.column_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_row_major.column_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_col_major.no_qualifier.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_col_major.no_qualifier.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_col_major.no_qualifier.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_col_major.row_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_col_major.row_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_col_major.row_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_col_major.column_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_col_major.column_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.named_block_col_major.column_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block.no_qualifier.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block.no_qualifier.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block.no_qualifier.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block.row_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block.row_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block.row_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block.column_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block.column_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block.column_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_row_major.no_qualifier.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_row_major.no_qualifier.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_row_major.no_qualifier.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_row_major.row_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_row_major.row_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_row_major.row_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_row_major.column_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_row_major.column_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_row_major.column_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_col_major.no_qualifier.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_col_major.no_qualifier.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_col_major.no_qualifier.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_col_major.row_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_col_major.row_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_col_major.row_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_col_major.column_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_col_major.column_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_row_major.unnamed_block_col_major.column_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.sampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.sampler_cube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.sampler_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.sampler_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.sampler_2d_shadow = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.isampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.usampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.sampler_2d_ms = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.isampler_2d_ms = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.image_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.iimage_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.uimage_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.types.atomic_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.aggregates.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.aggregates.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.default_block.no_qualifier.aggregates.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.no_qualifier.types.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.no_qualifier.types.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.no_qualifier.types.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.no_qualifier.types.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.no_qualifier.types.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.no_qualifier.types.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.no_qualifier.types.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.no_qualifier.types.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.no_qualifier.types.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.no_qualifier.types.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.no_qualifier.types.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.no_qualifier.types.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.no_qualifier.aggregates.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.no_qualifier.aggregates.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.no_qualifier.aggregates.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.row_major.matrix.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.row_major.matrix.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.row_major.matrix.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.row_major.matrix.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.row_major.matrix.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.row_major.matrix.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.row_major.aggregates.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.row_major.aggregates.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.row_major.aggregates.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.column_major.matrix.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.column_major.matrix.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.column_major.matrix.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.column_major.matrix.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.column_major.matrix.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.column_major.matrix.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.column_major.aggregates.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.column_major.aggregates.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block.column_major.aggregates.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_row_major.no_qualifier.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_row_major.no_qualifier.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_row_major.no_qualifier.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_row_major.row_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_row_major.row_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_row_major.row_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_row_major.column_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_row_major.column_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_row_major.column_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_col_major.no_qualifier.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_col_major.no_qualifier.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_col_major.no_qualifier.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_col_major.row_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_col_major.row_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_col_major.row_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_col_major.column_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_col_major.column_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.named_block_col_major.column_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block.no_qualifier.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block.no_qualifier.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block.no_qualifier.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block.row_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block.row_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block.row_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block.column_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block.column_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block.column_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_row_major.no_qualifier.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_row_major.no_qualifier.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_row_major.no_qualifier.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_row_major.row_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_row_major.row_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_row_major.row_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_row_major.column_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_row_major.column_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_row_major.column_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_col_major.no_qualifier.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_col_major.no_qualifier.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_col_major.no_qualifier.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_col_major.row_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_col_major.row_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_col_major.row_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_col_major.column_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_col_major.column_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.matrix_stride.unnamed_block_col_major.column_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.name_length.default_block.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.name_length.default_block.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.name_length.default_block.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.name_length.default_block.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.name_length.default_block.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.name_length.default_block.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.name_length.default_block.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.name_length.named_block.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.name_length.named_block.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.name_length.named_block.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.name_length.named_block.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.name_length.named_block.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.name_length.named_block.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.name_length.named_block.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.name_length.unnamed_block.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.name_length.unnamed_block.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.name_length.unnamed_block.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.name_length.block_array.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.name_length.block_array.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.name_length.block_array.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.sampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.sampler_cube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.sampler_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.sampler_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.sampler_2d_shadow = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.sampler_cube_shadow = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.sampler_2d_array_shadow = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.isampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.isampler_cube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.isampler_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.isampler_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.usampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.usampler_cube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.usampler_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.usampler_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.sampler_2d_ms = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.isampler_2d_ms = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.usampler_2d_ms = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.image_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.image_cube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.image_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.image_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.iimage_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.iimage_cube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.iimage_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.iimage_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.uimage_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.uimage_cube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.uimage_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.uimage_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.types.atomic_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.aggregates.atomic_uint_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.aggregates.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.default_block.aggregates.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.named_block.types.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.named_block.types.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.named_block.types.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.named_block.types.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.named_block.types.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.named_block.types.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.named_block.types.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.named_block.types.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.named_block.types.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.named_block.types.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.named_block.types.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.named_block.types.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.named_block.types.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.named_block.types.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.named_block.types.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.named_block.types.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.named_block.types.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.named_block.types.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.named_block.types.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.named_block.types.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.named_block.types.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.named_block.types.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.named_block.types.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.named_block.types.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.named_block.types.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.named_block.aggregates.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.named_block.aggregates.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.unnamed_block.basic_type.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.unnamed_block.basic_type.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.unnamed_block.basic_type.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.unnamed_block.basic_type.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.unnamed_block.basic_type.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.unnamed_block.basic_type.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.unnamed_block.array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.unnamed_block.array.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.unnamed_block.array.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.unnamed_block.array.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.unnamed_block.array.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.unnamed_block.array.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.unnamed_block.struct.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.unnamed_block.struct.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.unnamed_block.struct.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.unnamed_block.struct.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.unnamed_block.struct.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.unnamed_block.struct.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.block_array.basic_type.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.block_array.basic_type.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.block_array.basic_type.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.block_array.basic_type.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.block_array.basic_type.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.block_array.basic_type.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.block_array.array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.block_array.array.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.block_array.array.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.block_array.array.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.block_array.array.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.block_array.array.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.block_array.struct.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.block_array.struct.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.block_array.struct.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.block_array.struct.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.block_array.struct.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.offset.block_array.struct.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.default_block.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.default_block.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.default_block.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.default_block.sampler = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.default_block.sampler_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.default_block.sampler_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.default_block.atomic_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.default_block.atomic_uint_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.default_block.float_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.default_block.float_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.default_block.float_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.default_block.float_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.uniform_block.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.uniform_block.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.uniform_block.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.uniform_block.float_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.uniform_block.float_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.uniform_block.float_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.uniform_block.float_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.unnamed_block.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.unnamed_block.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.unnamed_block.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.block_array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.block_array.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.compute.block_array.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_vertex.default_block.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_vertex.default_block.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_vertex.default_block.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_vertex.default_block.sampler = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_vertex.default_block.sampler_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_vertex.default_block.sampler_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_vertex.default_block.atomic_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_vertex.default_block.atomic_uint_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_vertex.default_block.float_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_vertex.default_block.float_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_vertex.default_block.float_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_vertex.default_block.float_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_vertex.uniform_block.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_vertex.uniform_block.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_vertex.uniform_block.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_vertex.uniform_block.float_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_vertex.uniform_block.float_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_vertex.uniform_block.float_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_vertex.uniform_block.float_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_vertex.unnamed_block.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_vertex.unnamed_block.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_vertex.unnamed_block.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_vertex.block_array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_vertex.block_array.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_vertex.block_array.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_fragment.default_block.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_fragment.default_block.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_fragment.default_block.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_fragment.default_block.sampler = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_fragment.default_block.sampler_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_fragment.default_block.sampler_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_fragment.default_block.atomic_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_fragment.default_block.atomic_uint_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_fragment.default_block.float_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_fragment.default_block.float_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_fragment.default_block.float_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_fragment.default_block.float_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_fragment.uniform_block.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_fragment.uniform_block.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_fragment.uniform_block.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_fragment.uniform_block.float_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_fragment.uniform_block.float_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_fragment.uniform_block.float_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_fragment.uniform_block.float_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_fragment.unnamed_block.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_fragment.unnamed_block.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_fragment.unnamed_block.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_fragment.block_array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_fragment.block_array.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.separable_fragment.block_array.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment.default_block.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment.default_block.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment.default_block.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment.default_block.sampler = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment.default_block.sampler_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment.default_block.sampler_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment.default_block.atomic_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment.default_block.atomic_uint_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment.uniform_block.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment.uniform_block.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment.uniform_block.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment.unnamed_block.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment.unnamed_block.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment.unnamed_block.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment.block_array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment.block_array.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment.block_array.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_vertex.default_block.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_vertex.default_block.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_vertex.default_block.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_vertex.default_block.sampler = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_vertex.default_block.sampler_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_vertex.default_block.sampler_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_vertex.default_block.atomic_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_vertex.default_block.atomic_uint_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_vertex.uniform_block.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_vertex.uniform_block.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_vertex.uniform_block.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_vertex.unnamed_block.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_vertex.unnamed_block.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_vertex.unnamed_block.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_vertex.block_array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_vertex.block_array.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_vertex.block_array.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_fragment.default_block.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_fragment.default_block.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_fragment.default_block.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_fragment.default_block.sampler = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_fragment.default_block.sampler_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_fragment.default_block.sampler_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_fragment.default_block.atomic_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_fragment.default_block.atomic_uint_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_fragment.uniform_block.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_fragment.uniform_block.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_fragment.uniform_block.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_fragment.unnamed_block.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_fragment.unnamed_block.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_fragment.unnamed_block.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_fragment.block_array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_fragment.block_array.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.vertex_fragment_only_fragment.block_array.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.sampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.sampler_cube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.sampler_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.sampler_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.sampler_2d_shadow = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.sampler_cube_shadow = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.sampler_2d_array_shadow = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.isampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.isampler_cube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.isampler_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.isampler_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.usampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.usampler_cube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.usampler_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.usampler_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.sampler_2d_ms = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.isampler_2d_ms = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.usampler_2d_ms = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.image_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.image_cube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.image_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.image_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.iimage_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.iimage_cube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.iimage_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.iimage_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.uimage_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.uimage_cube = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.uimage_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.uimage_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.types.atomic_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.array.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.array.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.array.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.array.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.array.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.array.sampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.array.sampler_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.array.sampler_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.array.isampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.array.image_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.array.iimage_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.array.atomic_uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.struct.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.struct.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.struct.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.struct.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.struct.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.struct.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.struct.sampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.struct.sampler_2d_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.struct.sampler_3d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.default_block.struct.isampler_2d = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.types.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.types.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.types.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.types.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.types.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.types.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.types.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.types.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.types.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.types.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.types.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.types.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.types.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.types.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.types.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.types.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.types.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.types.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.types.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.types.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.types.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.types.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.types.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.types.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.types.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.array.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.array.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.array.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.array.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.array.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.struct.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.struct.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.struct.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.struct.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.struct.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.named_block.struct.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.unnamed_block.basic_type.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.unnamed_block.basic_type.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.unnamed_block.basic_type.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.unnamed_block.basic_type.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.unnamed_block.basic_type.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.unnamed_block.basic_type.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.unnamed_block.array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.unnamed_block.array.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.unnamed_block.array.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.unnamed_block.array.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.unnamed_block.array.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.unnamed_block.array.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.unnamed_block.struct.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.unnamed_block.struct.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.unnamed_block.struct.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.unnamed_block.struct.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.unnamed_block.struct.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.unnamed_block.struct.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.block_array.basic_type.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.block_array.basic_type.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.block_array.basic_type.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.block_array.basic_type.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.block_array.basic_type.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.block_array.basic_type.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.block_array.array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.block_array.array.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.block_array.array.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.block_array.array.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.block_array.array.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.block_array.array.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.block_array.struct.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.block_array.struct.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.block_array.struct.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.block_array.struct.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.block_array.struct.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.type.block_array.struct.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.0 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.5 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.6 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.7 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.9 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.10 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.11 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.12 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.13 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.14 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.15 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.16 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.17 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.18 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.19 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.20 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.21 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.22 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.23 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.24 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.25 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.26 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.27 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.28 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.29 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.30 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.31 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.32 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.33 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.34 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.35 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.36 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.37 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.38 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform.random.39 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.resource_list.named_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.resource_list.unnamed_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.resource_list.block_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.resource_list.block_array_single_element = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.active_variables.named_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.active_variables.unnamed_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.active_variables.block_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.buffer_binding.named_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.buffer_binding.unnamed_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.buffer_binding.block_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.buffer_binding.named_block_explicit_binding = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.buffer_binding.unnamed_block_explicit_binding = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.buffer_binding.block_array_explicit_binding = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.buffer_data_size.named_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.buffer_data_size.unnamed_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.buffer_data_size.block_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.name_length.named_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.name_length.unnamed_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.name_length.block_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.name_length.block_array_single_element = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.compute.named_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.compute.unnamed_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.compute.block_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.separable_vertex.named_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.separable_vertex.unnamed_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.separable_vertex.block_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.separable_fragment.named_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.separable_fragment.unnamed_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.separable_fragment.block_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_fragment.named_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_fragment.unnamed_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_fragment.block_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_fragment_only_vertex.named_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_fragment_only_vertex.unnamed_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_fragment_only_vertex.block_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_fragment_only_fragment.named_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_fragment_only_fragment.unnamed_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.vertex_fragment_only_fragment.block_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.atomic_counter_buffer.resource_list = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.atomic_counter_buffer.active_variables = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.atomic_counter_buffer.buffer_binding = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.atomic_counter_buffer.buffer_data_size = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.atomic_counter_buffer.referenced_by_compute = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.atomic_counter_buffer.referenced_by_separable_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.atomic_counter_buffer.referenced_by_separable_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.atomic_counter_buffer.referenced_by_vertex_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.atomic_counter_buffer.referenced_by_vertex_fragment_only_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.atomic_counter_buffer.referenced_by_vertex_fragment_only_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.resource_list.vertex_fragment.empty = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.resource_list.vertex_fragment.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.resource_list.separable_vertex.empty = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.resource_list.separable_vertex.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.resource_list.separable_fragment.empty = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.resource_list.separable_fragment.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.resource_list.separable_fragment.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.resource_list.separable_fragment.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.resource_list.compute.empty = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.array_size.vertex_fragment.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.array_size.separable_vertex.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.array_size.separable_fragment.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.array_size.separable_fragment.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.array_size.separable_fragment.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.location.vertex_fragment.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.location.vertex_fragment.var_explicit_location = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.location.separable_vertex.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.location.separable_vertex.var_explicit_location = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.location.separable_fragment.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.location.separable_fragment.var_explicit_location = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.location.separable_fragment.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.location.separable_fragment.var_struct_explicit_location = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.location.separable_fragment.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.location.separable_fragment.var_array_explicit_location = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.name_length.vertex_fragment.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.name_length.separable_vertex.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.name_length.separable_fragment.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.name_length.separable_fragment.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.name_length.separable_fragment.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.referenced_by.referenced_by_vertex_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.referenced_by.referenced_by_separable_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.referenced_by.referenced_by_separable_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.vertex_fragment.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.vertex_fragment.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.vertex_fragment.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.vertex_fragment.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.vertex_fragment.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.vertex_fragment.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.vertex_fragment.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.vertex_fragment.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.vertex_fragment.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.vertex_fragment.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.vertex_fragment.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.vertex_fragment.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.vertex_fragment.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.vertex_fragment.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.vertex_fragment.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.vertex_fragment.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.vertex_fragment.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.vertex_fragment.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.vertex_fragment.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.vertex_fragment.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.vertex_fragment.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_vertex.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_vertex.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_vertex.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_vertex.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_vertex.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_vertex.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_vertex.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_vertex.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_vertex.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_vertex.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_vertex.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_vertex.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_vertex.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_vertex.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_vertex.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_vertex.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_vertex.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_vertex.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_vertex.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_vertex.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_vertex.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.basic_type.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.basic_type.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.basic_type.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.basic_type.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.basic_type.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.basic_type.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.basic_type.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.basic_type.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.basic_type.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.basic_type.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.basic_type.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.basic_type.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.basic_type.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.basic_type.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.basic_type.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.basic_type.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.basic_type.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.basic_type.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.basic_type.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.basic_type.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.basic_type.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.array.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.array.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.array.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.array.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.array.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.array.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.array.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.array.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.array.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.array.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.array.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.array.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.array.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.array.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.array.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.array.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.array.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.array.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.array.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.array.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.struct.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.struct.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.struct.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.struct.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.struct.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.struct.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.struct.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.struct.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.struct.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.struct.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.struct.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.struct.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.struct.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.struct.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.struct.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.struct.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.struct.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.struct.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.struct.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.struct.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_input.type.separable_fragment.struct.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.resource_list.vertex_fragment.empty = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.resource_list.vertex_fragment.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.resource_list.vertex_fragment.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.resource_list.separable_vertex.empty = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.resource_list.separable_vertex.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.resource_list.separable_vertex.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.resource_list.separable_vertex.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.resource_list.separable_fragment.empty = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.resource_list.separable_fragment.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.resource_list.separable_fragment.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.resource_list.compute.empty = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.array_size.vertex_fragment.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.array_size.vertex_fragment.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.array_size.separable_vertex.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.array_size.separable_vertex.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.array_size.separable_vertex.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.array_size.separable_fragment.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.array_size.separable_fragment.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.location.vertex_fragment.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.location.vertex_fragment.var_explicit_location = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.location.vertex_fragment.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.location.vertex_fragment.var_array_explicit_location = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.location.separable_vertex.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.location.separable_vertex.var_explicit_location = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.location.separable_vertex.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.location.separable_vertex.var_struct_explicit_location = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.location.separable_vertex.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.location.separable_vertex.var_array_explicit_location = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.location.separable_fragment.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.location.separable_fragment.var_explicit_location = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.location.separable_fragment.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.location.separable_fragment.var_array_explicit_location = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.name_length.vertex_fragment.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.name_length.vertex_fragment.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.name_length.separable_vertex.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.name_length.separable_vertex.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.name_length.separable_vertex.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.name_length.separable_fragment.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.name_length.separable_fragment.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.referenced_by.referenced_by_vertex_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.referenced_by.referenced_by_separable_vertex = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.referenced_by.referenced_by_separable_fragment = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.vertex_fragment.basic_type.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.vertex_fragment.basic_type.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.vertex_fragment.basic_type.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.vertex_fragment.basic_type.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.vertex_fragment.basic_type.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.vertex_fragment.basic_type.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.vertex_fragment.basic_type.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.vertex_fragment.basic_type.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.vertex_fragment.basic_type.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.vertex_fragment.basic_type.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.vertex_fragment.basic_type.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.vertex_fragment.basic_type.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.vertex_fragment.array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.vertex_fragment.array.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.vertex_fragment.array.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.vertex_fragment.array.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.vertex_fragment.array.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.vertex_fragment.array.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.vertex_fragment.array.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.vertex_fragment.array.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.vertex_fragment.array.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.vertex_fragment.array.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.vertex_fragment.array.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.vertex_fragment.array.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.basic_type.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.basic_type.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.basic_type.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.basic_type.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.basic_type.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.basic_type.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.basic_type.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.basic_type.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.basic_type.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.basic_type.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.basic_type.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.basic_type.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.basic_type.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.basic_type.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.basic_type.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.basic_type.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.basic_type.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.basic_type.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.basic_type.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.basic_type.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.basic_type.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.array.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.array.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.array.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.array.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.array.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.array.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.array.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.array.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.array.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.array.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.array.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.array.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.array.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.array.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.array.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.array.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.array.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.array.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.array.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.array.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.struct.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.struct.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.struct.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.struct.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.struct.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.struct.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.struct.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.struct.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.struct.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.struct.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.struct.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.struct.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.struct.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.struct.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.struct.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.struct.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.struct.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.struct.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.struct.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.struct.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_vertex.struct.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_fragment.basic_type.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_fragment.basic_type.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_fragment.basic_type.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_fragment.basic_type.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_fragment.basic_type.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_fragment.basic_type.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_fragment.basic_type.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_fragment.basic_type.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_fragment.basic_type.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_fragment.basic_type.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_fragment.basic_type.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_fragment.basic_type.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_fragment.array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_fragment.array.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_fragment.array.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_fragment.array.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_fragment.array.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_fragment.array.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_fragment.array.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_fragment.array.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_fragment.array.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_fragment.array.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_fragment.array.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.program_output.type.separable_fragment.array.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.vertex_fragment.builtin_gl_position = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.vertex_fragment.default_block_basic_type = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.vertex_fragment.default_block_struct_member = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.vertex_fragment.default_block_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.vertex_fragment.default_block_array_element = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.separable_vertex.builtin_gl_position = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.separable_vertex.default_block_basic_type = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.separable_vertex.default_block_struct_member = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.separable_vertex.default_block_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.resource_list.separable_vertex.default_block_array_element = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.vertex_fragment.builtin_gl_position = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.vertex_fragment.default_block_basic_type = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.vertex_fragment.default_block_struct_member = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.vertex_fragment.default_block_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.vertex_fragment.default_block_array_element = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.separable_vertex.builtin_gl_position = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.separable_vertex.default_block_basic_type = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.separable_vertex.default_block_struct_member = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.separable_vertex.default_block_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.array_size.separable_vertex.default_block_array_element = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.name_length.vertex_fragment.builtin_gl_position = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.name_length.vertex_fragment.default_block_basic_type = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.name_length.vertex_fragment.default_block_struct_member = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.name_length.vertex_fragment.default_block_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.name_length.vertex_fragment.default_block_array_element = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.name_length.separable_vertex.builtin_gl_position = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.name_length.separable_vertex.default_block_basic_type = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.name_length.separable_vertex.default_block_struct_member = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.name_length.separable_vertex.default_block_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.name_length.separable_vertex.default_block_array_element = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.builtin.gl_position = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.basic_type.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.basic_type.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.basic_type.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.basic_type.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.basic_type.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.basic_type.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.basic_type.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.basic_type.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.basic_type.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.basic_type.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.basic_type.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.basic_type.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.basic_type.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.basic_type.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.basic_type.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.basic_type.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.basic_type.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.basic_type.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.basic_type.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.basic_type.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.basic_type.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.array.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.array.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.array.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.array.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.array.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.array.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.array.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.array.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.array.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.array.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.array.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.array.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.array.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.array.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.array.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.array.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.array.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.array.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.array.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.array.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.whole_array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.whole_array.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.whole_array.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.whole_array.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.whole_array.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.whole_array.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.whole_array.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.whole_array.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.whole_array.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.whole_array.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.whole_array.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.whole_array.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.whole_array.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.whole_array.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.whole_array.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.whole_array.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.whole_array.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.whole_array.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.whole_array.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.whole_array.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.whole_array.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.builtin.gl_position = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.basic_type.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.basic_type.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.basic_type.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.basic_type.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.basic_type.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.basic_type.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.basic_type.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.basic_type.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.basic_type.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.basic_type.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.basic_type.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.basic_type.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.basic_type.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.basic_type.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.basic_type.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.basic_type.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.basic_type.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.basic_type.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.basic_type.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.basic_type.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.basic_type.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.array.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.array.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.array.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.array.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.array.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.array.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.array.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.array.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.array.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.array.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.array.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.array.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.array.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.array.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.array.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.array.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.array.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.array.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.array.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.array.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.whole_array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.whole_array.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.whole_array.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.whole_array.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.whole_array.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.whole_array.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.whole_array.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.whole_array.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.whole_array.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.whole_array.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.whole_array.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.whole_array.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.whole_array.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.whole_array.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.whole_array.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.whole_array.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.whole_array.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.whole_array.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.whole_array.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.whole_array.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.whole_array.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.separable_vertex.struct.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.named_block.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.named_block.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.named_block.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.named_block.var_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.named_block.var_struct_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.named_block.var_array_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.named_block.var_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.named_block.var_struct_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.named_block.var_array_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.named_block.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.named_block.var_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.named_block.var_struct_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.named_block.var_array_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.named_block.var_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.named_block.var_struct_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.named_block.var_array_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.named_block.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.named_block.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.named_block.var_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.named_block.var_struct_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.named_block.var_array_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.named_block.var_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.named_block.var_struct_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.named_block.var_array_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.named_block.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.named_block.var_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.named_block.var_struct_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.named_block.var_array_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.named_block.var_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.named_block.var_struct_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.named_block.var_array_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.unnamed_block.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.unnamed_block.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.unnamed_block.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.unnamed_block.var_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.unnamed_block.var_struct_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.unnamed_block.var_array_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.unnamed_block.var_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.unnamed_block.var_struct_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.unnamed_block.var_array_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.unnamed_block.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.unnamed_block.var_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.unnamed_block.var_struct_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.unnamed_block.var_array_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.unnamed_block.var_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.unnamed_block.var_struct_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.unnamed_block.var_array_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.unnamed_block.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.unnamed_block.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.unnamed_block.var_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.unnamed_block.var_struct_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.unnamed_block.var_array_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.unnamed_block.var_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.unnamed_block.var_struct_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.unnamed_block.var_array_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.unnamed_block.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.unnamed_block.var_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.unnamed_block.var_struct_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.unnamed_block.var_array_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.unnamed_block.var_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.unnamed_block.var_struct_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.unnamed_block.var_array_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.block_array.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.block_array.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.block_array.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.block_array.var_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.block_array.var_struct_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.block_array.var_array_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.block_array.var_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.block_array.var_struct_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.block_array.var_array_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.block_array.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.block_array.var_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.block_array.var_struct_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.block_array.var_array_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.block_array.var_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.block_array.var_struct_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.block_array.var_array_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.block_array.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.block_array.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.block_array.var_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.block_array.var_struct_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.block_array.var_array_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.block_array.var_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.block_array.var_struct_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.block_array.var_array_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.block_array.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.block_array.var_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.block_array.var_struct_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.block_array.var_array_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.block_array.var_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.block_array.var_struct_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.resource_list.block_array.var_array_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.non_array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.non_array.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.non_array.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.non_array.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.non_array.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.non_array.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.types.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.types.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.types.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.types.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.types.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.types.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.types.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.types.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.types.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.types.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.types.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.types.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.types.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.types.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.aggregates.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.aggregates.float_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.aggregates.float_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.aggregates.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.aggregates.float_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.aggregates.float_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.aggregates.bool_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.aggregates.bool_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.aggregates.bvec3_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.aggregates.bvec3_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.aggregates.bvec3_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.aggregates.bvec3_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.aggregates.bvec3_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.aggregates.bvec3_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.aggregates.vec4_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.aggregates.vec4_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.aggregates.vec4_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.aggregates.vec4_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.aggregates.vec4_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.aggregates.vec4_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.aggregates.ivec2_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.aggregates.ivec2_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.aggregates.ivec2_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.aggregates.ivec2_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.aggregates.ivec2_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.sized.aggregates.ivec2_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.unsized.types.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.unsized.types.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.unsized.types.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.unsized.types.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.unsized.types.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.unsized.types.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.unsized.aggregates.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.unsized.aggregates.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.unsized.aggregates.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.unsized.aggregates.bvec3_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.unsized.aggregates.bvec3_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.unsized.aggregates.vec4_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.unsized.aggregates.vec4_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.unsized.aggregates.ivec2_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.named_block.unsized.aggregates.ivec2_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.unnamed_block.sized.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.unnamed_block.sized.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.unnamed_block.sized.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.unnamed_block.sized.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.unnamed_block.sized.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.unnamed_block.sized.bvec3_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.unnamed_block.sized.bvec3_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.unnamed_block.sized.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.unnamed_block.sized.vec4_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.unnamed_block.sized.vec4_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.unnamed_block.sized.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.unnamed_block.sized.ivec2_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.unnamed_block.sized.ivec2_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.unnamed_block.unsized.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.unnamed_block.unsized.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.unnamed_block.unsized.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.unnamed_block.unsized.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.unnamed_block.unsized.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.unnamed_block.unsized.bvec3_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.unnamed_block.unsized.bvec3_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.unnamed_block.unsized.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.unnamed_block.unsized.vec4_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.unnamed_block.unsized.vec4_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.unnamed_block.unsized.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.unnamed_block.unsized.ivec2_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.unnamed_block.unsized.ivec2_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.block_array.sized.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.block_array.sized.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.block_array.sized.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.block_array.sized.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.block_array.sized.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.block_array.sized.bvec3_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.block_array.sized.bvec3_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.block_array.sized.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.block_array.sized.vec4_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.block_array.sized.vec4_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.block_array.sized.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.block_array.sized.ivec2_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.block_array.sized.ivec2_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.block_array.unsized.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.block_array.unsized.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.block_array.unsized.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.block_array.unsized.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.block_array.unsized.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.block_array.unsized.bvec3_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.block_array.unsized.bvec3_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.block_array.unsized.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.block_array.unsized.vec4_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.block_array.unsized.vec4_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.block_array.unsized.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.block_array.unsized.ivec2_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_size.block_array.unsized.ivec2_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.non_array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.non_array.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.non_array.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.non_array.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.non_array.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.non_array.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.types.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.types.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.types.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.types.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.types.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.types.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.types.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.types.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.types.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.types.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.types.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.types.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.types.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.types.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.aggregates.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.aggregates.float_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.aggregates.float_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.aggregates.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.aggregates.float_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.aggregates.float_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.aggregates.bool_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.aggregates.bool_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.aggregates.bvec3_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.aggregates.bvec3_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.aggregates.bvec3_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.aggregates.bvec3_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.aggregates.bvec3_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.aggregates.bvec3_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.aggregates.vec4_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.aggregates.vec4_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.aggregates.vec4_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.aggregates.vec4_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.aggregates.vec4_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.aggregates.vec4_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.aggregates.ivec2_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.aggregates.ivec2_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.aggregates.ivec2_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.aggregates.ivec2_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.aggregates.ivec2_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.sized.aggregates.ivec2_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.unsized.types.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.unsized.types.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.unsized.types.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.unsized.types.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.unsized.types.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.unsized.types.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.unsized.aggregates.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.unsized.aggregates.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.unsized.aggregates.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.unsized.aggregates.bvec3_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.unsized.aggregates.bvec3_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.unsized.aggregates.vec4_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.unsized.aggregates.vec4_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.unsized.aggregates.ivec2_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.named_block.unsized.aggregates.ivec2_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.unnamed_block.sized.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.unnamed_block.sized.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.unnamed_block.sized.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.unnamed_block.sized.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.unnamed_block.sized.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.unnamed_block.sized.bvec3_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.unnamed_block.sized.bvec3_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.unnamed_block.sized.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.unnamed_block.sized.vec4_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.unnamed_block.sized.vec4_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.unnamed_block.sized.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.unnamed_block.sized.ivec2_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.unnamed_block.sized.ivec2_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.unnamed_block.unsized.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.unnamed_block.unsized.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.unnamed_block.unsized.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.unnamed_block.unsized.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.unnamed_block.unsized.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.unnamed_block.unsized.bvec3_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.unnamed_block.unsized.bvec3_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.unnamed_block.unsized.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.unnamed_block.unsized.vec4_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.unnamed_block.unsized.vec4_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.unnamed_block.unsized.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.unnamed_block.unsized.ivec2_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.unnamed_block.unsized.ivec2_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.block_array.sized.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.block_array.sized.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.block_array.sized.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.block_array.sized.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.block_array.sized.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.block_array.sized.bvec3_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.block_array.sized.bvec3_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.block_array.sized.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.block_array.sized.vec4_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.block_array.sized.vec4_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.block_array.sized.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.block_array.sized.ivec2_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.block_array.sized.ivec2_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.block_array.unsized.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.block_array.unsized.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.block_array.unsized.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.block_array.unsized.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.block_array.unsized.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.block_array.unsized.bvec3_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.block_array.unsized.bvec3_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.block_array.unsized.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.block_array.unsized.vec4_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.block_array.unsized.vec4_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.block_array.unsized.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.block_array.unsized.ivec2_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.array_stride.block_array.unsized.ivec2_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.block_index.named_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.block_index.unnamed_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.block_index.block_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.types.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.types.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.types.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.types.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.types.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.types.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.types.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.types.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.types.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.types.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.types.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.no_qualifier.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.no_qualifier.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.no_qualifier.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.no_qualifier.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.no_qualifier.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.no_qualifier.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.no_qualifier.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.no_qualifier.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.column_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.column_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.column_major.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.column_major.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.column_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.column_major.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.column_major.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.column_major.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.row_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.row_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.row_major.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.row_major.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.row_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.row_major.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.row_major.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block.row_major.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_row_major.no_qualifier.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_row_major.no_qualifier.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_row_major.no_qualifier.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_row_major.no_qualifier.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_row_major.no_qualifier.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_row_major.no_qualifier.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_row_major.no_qualifier.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_row_major.no_qualifier.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_row_major.column_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_row_major.column_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_row_major.column_major.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_row_major.column_major.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_row_major.column_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_row_major.column_major.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_row_major.column_major.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_row_major.column_major.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_row_major.row_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_row_major.row_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_row_major.row_major.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_row_major.row_major.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_row_major.row_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_row_major.row_major.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_row_major.row_major.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_row_major.row_major.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_col_major.no_qualifier.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_col_major.no_qualifier.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_col_major.no_qualifier.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_col_major.no_qualifier.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_col_major.no_qualifier.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_col_major.no_qualifier.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_col_major.no_qualifier.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_col_major.no_qualifier.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_col_major.column_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_col_major.column_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_col_major.column_major.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_col_major.column_major.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_col_major.column_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_col_major.column_major.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_col_major.column_major.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_col_major.column_major.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_col_major.row_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_col_major.row_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_col_major.row_major.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_col_major.row_major.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_col_major.row_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_col_major.row_major.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_col_major.row_major.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.named_block_col_major.row_major.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block.no_qualifier.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block.no_qualifier.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block.no_qualifier.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block.no_qualifier.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block.no_qualifier.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block.no_qualifier.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block.no_qualifier.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block.no_qualifier.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block.column_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block.column_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block.column_major.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block.column_major.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block.column_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block.column_major.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block.column_major.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block.column_major.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block.row_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block.row_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block.row_major.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block.row_major.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block.row_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block.row_major.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block.row_major.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block.row_major.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_row_major.no_qualifier.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_row_major.no_qualifier.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_row_major.no_qualifier.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_row_major.no_qualifier.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_row_major.no_qualifier.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_row_major.no_qualifier.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_row_major.no_qualifier.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_row_major.no_qualifier.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_row_major.column_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_row_major.column_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_row_major.column_major.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_row_major.column_major.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_row_major.column_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_row_major.column_major.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_row_major.column_major.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_row_major.column_major.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_row_major.row_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_row_major.row_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_row_major.row_major.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_row_major.row_major.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_row_major.row_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_row_major.row_major.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_row_major.row_major.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_row_major.row_major.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_col_major.no_qualifier.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_col_major.no_qualifier.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_col_major.no_qualifier.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_col_major.no_qualifier.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_col_major.no_qualifier.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_col_major.no_qualifier.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_col_major.no_qualifier.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_col_major.no_qualifier.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_col_major.column_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_col_major.column_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_col_major.column_major.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_col_major.column_major.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_col_major.column_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_col_major.column_major.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_col_major.column_major.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_col_major.column_major.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_col_major.row_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_col_major.row_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_col_major.row_major.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_col_major.row_major.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_col_major.row_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_col_major.row_major.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_col_major.row_major.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.is_row_major.unnamed_block_col_major.row_major.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.types.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.types.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.types.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.types.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.types.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.types.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.types.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.types.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.types.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.types.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.types.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.no_qualifier.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.no_qualifier.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.no_qualifier.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.no_qualifier.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.no_qualifier.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.no_qualifier.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.no_qualifier.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.no_qualifier.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.column_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.column_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.column_major.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.column_major.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.column_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.column_major.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.column_major.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.column_major.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.row_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.row_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.row_major.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.row_major.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.row_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.row_major.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.row_major.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block.row_major.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_row_major.no_qualifier.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_row_major.no_qualifier.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_row_major.no_qualifier.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_row_major.no_qualifier.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_row_major.no_qualifier.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_row_major.no_qualifier.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_row_major.no_qualifier.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_row_major.no_qualifier.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_row_major.column_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_row_major.column_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_row_major.column_major.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_row_major.column_major.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_row_major.column_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_row_major.column_major.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_row_major.column_major.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_row_major.column_major.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_row_major.row_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_row_major.row_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_row_major.row_major.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_row_major.row_major.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_row_major.row_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_row_major.row_major.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_row_major.row_major.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_row_major.row_major.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_col_major.no_qualifier.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_col_major.no_qualifier.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_col_major.no_qualifier.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_col_major.no_qualifier.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_col_major.no_qualifier.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_col_major.no_qualifier.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_col_major.no_qualifier.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_col_major.no_qualifier.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_col_major.column_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_col_major.column_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_col_major.column_major.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_col_major.column_major.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_col_major.column_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_col_major.column_major.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_col_major.column_major.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_col_major.column_major.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_col_major.row_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_col_major.row_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_col_major.row_major.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_col_major.row_major.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_col_major.row_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_col_major.row_major.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_col_major.row_major.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.named_block_col_major.row_major.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block.no_qualifier.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block.no_qualifier.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block.no_qualifier.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block.no_qualifier.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block.no_qualifier.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block.no_qualifier.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block.no_qualifier.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block.no_qualifier.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block.column_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block.column_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block.column_major.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block.column_major.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block.column_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block.column_major.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block.column_major.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block.column_major.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block.row_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block.row_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block.row_major.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block.row_major.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block.row_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block.row_major.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block.row_major.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block.row_major.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_row_major.no_qualifier.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_row_major.no_qualifier.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_row_major.no_qualifier.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_row_major.no_qualifier.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_row_major.no_qualifier.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_row_major.no_qualifier.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_row_major.no_qualifier.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_row_major.no_qualifier.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_row_major.column_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_row_major.column_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_row_major.column_major.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_row_major.column_major.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_row_major.column_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_row_major.column_major.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_row_major.column_major.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_row_major.column_major.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_row_major.row_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_row_major.row_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_row_major.row_major.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_row_major.row_major.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_row_major.row_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_row_major.row_major.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_row_major.row_major.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_row_major.row_major.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_col_major.no_qualifier.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_col_major.no_qualifier.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_col_major.no_qualifier.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_col_major.no_qualifier.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_col_major.no_qualifier.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_col_major.no_qualifier.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_col_major.no_qualifier.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_col_major.no_qualifier.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_col_major.column_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_col_major.column_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_col_major.column_major.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_col_major.column_major.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_col_major.column_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_col_major.column_major.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_col_major.column_major.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_col_major.column_major.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_col_major.row_major.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_col_major.row_major.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_col_major.row_major.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_col_major.row_major.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_col_major.row_major.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_col_major.row_major.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_col_major.row_major.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.matrix_stride.unnamed_block_col_major.row_major.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.named_block.sized.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.named_block.sized.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.named_block.sized.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.named_block.sized.var_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.named_block.sized.var_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.named_block.sized.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.named_block.sized.var_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.named_block.sized.var_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.named_block.sized.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.named_block.sized.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.named_block.sized.var_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.named_block.sized.var_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.named_block.sized.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.named_block.sized.var_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.named_block.sized.var_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.named_block.unsized.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.named_block.unsized.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.named_block.unsized.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.named_block.unsized.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.named_block.unsized.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.named_block.unsized.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.named_block.unsized.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.unnamed_block.sized.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.unnamed_block.sized.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.unnamed_block.sized.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.unnamed_block.sized.var_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.unnamed_block.sized.var_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.unnamed_block.sized.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.unnamed_block.sized.var_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.unnamed_block.sized.var_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.unnamed_block.sized.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.unnamed_block.sized.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.unnamed_block.sized.var_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.unnamed_block.sized.var_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.unnamed_block.sized.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.unnamed_block.sized.var_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.unnamed_block.sized.var_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.unnamed_block.unsized.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.unnamed_block.unsized.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.unnamed_block.unsized.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.unnamed_block.unsized.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.unnamed_block.unsized.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.unnamed_block.unsized.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.unnamed_block.unsized.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.block_array.sized.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.block_array.sized.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.block_array.sized.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.block_array.sized.var_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.block_array.sized.var_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.block_array.sized.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.block_array.sized.var_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.block_array.sized.var_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.block_array.sized.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.block_array.sized.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.block_array.sized.var_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.block_array.sized.var_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.block_array.sized.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.block_array.sized.var_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.block_array.sized.var_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.block_array.unsized.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.block_array.unsized.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.block_array.unsized.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.block_array.unsized.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.block_array.unsized.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.block_array.unsized.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.name_length.block_array.unsized.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.named_block.sized.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.named_block.sized.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.named_block.sized.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.named_block.sized.var_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.named_block.sized.var_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.named_block.sized.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.named_block.sized.var_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.named_block.sized.var_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.named_block.sized.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.named_block.sized.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.named_block.sized.var_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.named_block.sized.var_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.named_block.sized.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.named_block.sized.var_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.named_block.sized.var_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.named_block.unsized.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.named_block.unsized.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.named_block.unsized.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.named_block.unsized.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.named_block.unsized.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.named_block.unsized.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.named_block.unsized.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.unnamed_block.sized.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.unnamed_block.sized.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.unnamed_block.sized.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.unnamed_block.sized.var_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.unnamed_block.sized.var_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.unnamed_block.sized.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.unnamed_block.sized.var_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.unnamed_block.sized.var_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.unnamed_block.sized.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.unnamed_block.sized.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.unnamed_block.sized.var_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.unnamed_block.sized.var_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.unnamed_block.sized.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.unnamed_block.sized.var_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.unnamed_block.sized.var_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.unnamed_block.unsized.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.unnamed_block.unsized.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.unnamed_block.unsized.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.unnamed_block.unsized.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.unnamed_block.unsized.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.unnamed_block.unsized.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.unnamed_block.unsized.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.block_array.sized.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.block_array.sized.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.block_array.sized.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.block_array.sized.var_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.block_array.sized.var_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.block_array.sized.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.block_array.sized.var_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.block_array.sized.var_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.block_array.sized.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.block_array.sized.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.block_array.sized.var_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.block_array.sized.var_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.block_array.sized.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.block_array.sized.var_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.block_array.sized.var_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.block_array.unsized.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.block_array.unsized.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.block_array.unsized.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.block_array.unsized.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.block_array.unsized.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.block_array.unsized.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.offset.block_array.unsized.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.compute.named_block.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.compute.named_block.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.compute.named_block.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.compute.named_block.float_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.compute.named_block.float_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.compute.named_block.float_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.compute.named_block.float_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.compute.named_block.float_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.compute.named_block.float_unsized_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.compute.unnamed_block.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.compute.unnamed_block.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.compute.unnamed_block.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.compute.block_array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.compute.block_array.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.compute.block_array.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_vertex.named_block.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_vertex.named_block.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_vertex.named_block.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_vertex.named_block.float_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_vertex.named_block.float_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_vertex.named_block.float_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_vertex.named_block.float_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_vertex.named_block.float_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_vertex.named_block.float_unsized_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_vertex.unnamed_block.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_vertex.unnamed_block.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_vertex.unnamed_block.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_vertex.block_array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_vertex.block_array.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_vertex.block_array.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_fragment.named_block.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_fragment.named_block.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_fragment.named_block.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_fragment.named_block.float_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_fragment.named_block.float_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_fragment.named_block.float_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_fragment.named_block.float_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_fragment.named_block.float_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_fragment.named_block.float_unsized_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_fragment.unnamed_block.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_fragment.unnamed_block.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_fragment.unnamed_block.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_fragment.block_array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_fragment.block_array.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_fragment.block_array.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_fragment.named_block.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_fragment.named_block.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_fragment.named_block.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_fragment.unnamed_block.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_fragment.unnamed_block.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_fragment.unnamed_block.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_fragment.block_array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_fragment.block_array.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_fragment.block_array.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_fragment_only_vertex.named_block.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_fragment_only_vertex.named_block.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_fragment_only_vertex.named_block.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_fragment_only_vertex.unnamed_block.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_fragment_only_vertex.unnamed_block.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_fragment_only_vertex.unnamed_block.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_fragment_only_vertex.block_array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_fragment_only_vertex.block_array.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_fragment_only_vertex.block_array.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_fragment_only_fragment.named_block.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_fragment_only_fragment.named_block.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_fragment_only_fragment.named_block.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_fragment_only_fragment.unnamed_block.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_fragment_only_fragment.unnamed_block.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_fragment_only_fragment.unnamed_block.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_fragment_only_fragment.block_array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_fragment_only_fragment.block_array.float_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.vertex_fragment_only_fragment.block_array.float_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.named_block.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.named_block.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.named_block.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.named_block.var_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.named_block.var_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.named_block.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.named_block.var_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.named_block.var_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.named_block.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.named_block.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.named_block.var_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.named_block.var_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.named_block.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.named_block.var_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.named_block.var_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.named_block.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.named_block.var_struct_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.named_block.var_struct_struct_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.named_block.var_array_struct_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.named_block.var_array_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.named_block.var_struct_array_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.named_block.var_array_array_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.unnamed_block.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.unnamed_block.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.unnamed_block.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.unnamed_block.var_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.unnamed_block.var_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.unnamed_block.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.unnamed_block.var_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.unnamed_block.var_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.unnamed_block.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.unnamed_block.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.unnamed_block.var_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.unnamed_block.var_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.unnamed_block.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.unnamed_block.var_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.unnamed_block.var_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.unnamed_block.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.unnamed_block.var_struct_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.unnamed_block.var_struct_struct_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.unnamed_block.var_array_struct_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.unnamed_block.var_array_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.unnamed_block.var_struct_array_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.unnamed_block.var_array_array_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.block_array.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.block_array.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.block_array.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.block_array.var_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.block_array.var_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.block_array.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.block_array.var_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.block_array.var_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.block_array.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.block_array.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.block_array.var_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.block_array.var_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.block_array.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.block_array.var_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.block_array.var_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.block_array.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.block_array.var_struct_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.block_array.var_struct_struct_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.block_array.var_array_struct_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.block_array.var_array_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.block_array.var_struct_array_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_size.block_array.var_array_array_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.named_block.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.named_block.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.named_block.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.named_block.var_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.named_block.var_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.named_block.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.named_block.var_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.named_block.var_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.named_block.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.named_block.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.named_block.var_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.named_block.var_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.named_block.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.named_block.var_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.named_block.var_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.named_block.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.named_block.var_struct_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.named_block.var_struct_struct_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.named_block.var_array_struct_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.named_block.var_array_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.named_block.var_struct_array_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.named_block.var_array_array_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.unnamed_block.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.unnamed_block.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.unnamed_block.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.unnamed_block.var_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.unnamed_block.var_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.unnamed_block.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.unnamed_block.var_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.unnamed_block.var_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.unnamed_block.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.unnamed_block.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.unnamed_block.var_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.unnamed_block.var_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.unnamed_block.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.unnamed_block.var_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.unnamed_block.var_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.unnamed_block.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.unnamed_block.var_struct_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.unnamed_block.var_struct_struct_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.unnamed_block.var_array_struct_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.unnamed_block.var_array_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.unnamed_block.var_struct_array_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.unnamed_block.var_array_array_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.block_array.var = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.block_array.var_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.block_array.var_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.block_array.var_struct_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.block_array.var_array_struct_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.block_array.var_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.block_array.var_struct_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.block_array.var_array_array_struct = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.block_array.var_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.block_array.var_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.block_array.var_struct_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.block_array.var_array_struct_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.block_array.var_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.block_array.var_struct_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.block_array.var_array_array_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.block_array.var_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.block_array.var_struct_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.block_array.var_struct_struct_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.block_array.var_array_struct_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.block_array.var_array_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.block_array.var_struct_array_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.top_level_array_stride.block_array.var_array_array_unsized_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.basic_type.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.basic_type.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.basic_type.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.basic_type.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.basic_type.vec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.basic_type.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.basic_type.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.basic_type.ivec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.basic_type.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.basic_type.ivec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.basic_type.uvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.basic_type.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.basic_type.uvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.basic_type.bvec2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.basic_type.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.basic_type.bvec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.basic_type.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.basic_type.mat2x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.basic_type.mat2x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.basic_type.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.basic_type.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.basic_type.mat3x4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.basic_type.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.basic_type.mat4x3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.basic_type.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.array.basic_type.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.array.basic_type.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.array.basic_type.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.array.basic_type.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.array.basic_type.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.array.basic_type.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.array.basic_type.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.array.basic_type.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.array.basic_type.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.array.basic_type.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.array.basic_type.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.array.basic_type.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.array.basic_type.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.array.basic_type.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.array.array.basic_type.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.array.array.basic_type.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.array.array.basic_type.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.array.array.basic_type.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.array.array.basic_type.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.array.array.basic_type.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.array.array.array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.array.array.struct.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.array.struct.basic_type.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.array.struct.basic_type.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.array.struct.basic_type.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.array.struct.basic_type.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.array.struct.basic_type.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.array.struct.basic_type.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.array.struct.array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.array.struct.struct.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.struct.basic_type.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.struct.basic_type.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.struct.basic_type.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.struct.basic_type.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.struct.basic_type.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.struct.basic_type.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.struct.basic_type.ivec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.struct.basic_type.uvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.struct.basic_type.bvec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.struct.basic_type.mat2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.struct.basic_type.mat3x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.struct.basic_type.mat3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.struct.basic_type.mat4x2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.struct.basic_type.mat4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.struct.array.basic_type.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.struct.array.basic_type.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.struct.array.basic_type.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.struct.array.basic_type.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.struct.array.basic_type.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.struct.array.basic_type.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.struct.array.array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.struct.array.struct.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.struct.struct.basic_type.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.struct.struct.basic_type.int = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.struct.struct.basic_type.uint = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.struct.struct.basic_type.bool = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.struct.struct.basic_type.vec3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.struct.struct.basic_type.vec4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.struct.struct.array.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.type.struct.struct.struct.float = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.0 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.1 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.2 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.3 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.4 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.5 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.6 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.7 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.8 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.9 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.10 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.11 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.12 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.13 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.14 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.15 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.16 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.17 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.18 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.19 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.20 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.21 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.22 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.23 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.24 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.25 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.26 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.27 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.28 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.29 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.30 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.31 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.32 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.33 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.34 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.35 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.36 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.37 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.38 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.39 = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.resource_list.named_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.resource_list.unnamed_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.resource_list.block_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.resource_list.block_array_single_element = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.active_variables.named_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.active_variables.unnamed_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.active_variables.block_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.buffer_binding.named_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.buffer_binding.unnamed_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.buffer_binding.block_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.buffer_binding.named_block_explicit_binding = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.buffer_binding.unnamed_block_explicit_binding = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.buffer_binding.block_array_explicit_binding = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.buffer_data_size.named_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.buffer_data_size.unnamed_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.buffer_data_size.block_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.name_length.named_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.name_length.unnamed_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.name_length.block_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.name_length.block_array_single_element = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.compute.named_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.compute.unnamed_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.compute.block_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.separable_vertex.named_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.separable_vertex.unnamed_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.separable_vertex.block_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.separable_fragment.named_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.separable_fragment.unnamed_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.separable_fragment.block_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_fragment.named_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_fragment.unnamed_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_fragment.block_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_fragment_only_vertex.named_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_fragment_only_vertex.unnamed_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_fragment_only_vertex.block_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_fragment_only_fragment.named_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_fragment_only_fragment.unnamed_block = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.vertex_fragment_only_fragment.block_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.sampler.sampler2d.vertex_binding_single = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.sampler.sampler2d.vertex_binding_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.sampler.sampler2d.vertex_binding_multiple = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.sampler.sampler2d.vertex_binding_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.sampler.sampler2d.vertex_binding_max_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.sampler.sampler2d.fragment_binding_single = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.sampler.sampler2d.fragment_binding_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.sampler.sampler2d.fragment_binding_multiple = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.sampler.sampler2d.fragment_binding_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.sampler.sampler2d.fragment_binding_max_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.sampler.sampler3d.vertex_binding_single = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.sampler.sampler3d.vertex_binding_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.sampler.sampler3d.vertex_binding_multiple = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.sampler.sampler3d.vertex_binding_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.sampler.sampler3d.vertex_binding_max_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.sampler.sampler3d.fragment_binding_single = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.sampler.sampler3d.fragment_binding_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.sampler.sampler3d.fragment_binding_multiple = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.sampler.sampler3d.fragment_binding_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.sampler.sampler3d.fragment_binding_max_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.ubo.vertex_binding_single = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.ubo.vertex_binding_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.ubo.vertex_binding_multiple = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.ubo.vertex_binding_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.ubo.vertex_binding_max_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.ubo.fragment_binding_single = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.ubo.fragment_binding_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.ubo.fragment_binding_multiple = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.ubo.fragment_binding_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.ubo.fragment_binding_max_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.ssbo.vertex_binding_single = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.ssbo.vertex_binding_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.ssbo.vertex_binding_multiple = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.ssbo.vertex_binding_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.ssbo.vertex_binding_max_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.ssbo.fragment_binding_single = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.ssbo.fragment_binding_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.ssbo.fragment_binding_multiple = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.ssbo.fragment_binding_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.ssbo.fragment_binding_max_array = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.image.image2d.vertex_binding_single = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.image.image2d.vertex_binding_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.image.image2d.vertex_binding_multiple = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.image.image2d.fragment_binding_single = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.image.image2d.fragment_binding_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.image.image2d.fragment_binding_multiple = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.image.image3d.vertex_binding_single = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.image.image3d.vertex_binding_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.image.image3d.vertex_binding_multiple = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.image.image3d.fragment_binding_single = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.image.image3d.fragment_binding_max = FAIL +1442 DEBUG RELEASE : dEQP-GLES31.functional.layout_binding.image.image3d.fragment_binding_multiple = FAIL diff --git a/gfx/angle/src/tests/deqp_support/deqp_gles3_test_expectations.txt b/gfx/angle/src/tests/deqp_support/deqp_gles3_test_expectations.txt new file mode 100755 index 000000000..da30e4faa --- /dev/null +++ b/gfx/angle/src/tests/deqp_support/deqp_gles3_test_expectations.txt @@ -0,0 +1,292 @@ +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This file contains a list of defective dEQP conformance tests. The expected +// format is: +// {BUG#} {MODIFIERS} : {TEST_NAME} = {PASS,FAIL,FLAKY,TIMEOUT,SKIP} +// +// MODIFIERS can be a combination of the below list: +// WIN XP VISTA WIN7 MAC LEOPARD SNOWLEOPARD LION LINUX CHROMEOS MOUNTAINLION +// MAVERICKS +// NVIDIA AMD INTEL +// 0xabcd - GPU PCI device ID. Specifying a PCI id requires a vendor. +// DEBUG RELEASE +// TODO(jmadill): Add ANGLE Renderer selection modifiers +// +// TEST_NAME can be a specific test name, or have a '*' in the end, which +// indicates a prefix matching. +// +// Examples: +// 91530 MAC WIN LINUX : context_lost_restored = TIMEOUT +// 91533 WIN : gl_min_uniforms = FAIL +// 91531 MAC WIN LINUX : conformance_more_* = SKIP +// 91532 MAC NVIDIA 0x0640 : tex_image_and_sub_image_2d_with_video = PASS FAIL + +// Don't run these tests for faster turnover +998 WIN LINUX : dEQP-GLES3.performance.* = SKIP +998 WIN LINUX : dEQP-GLES3.stress.* = SKIP +1101 WIN LINUX : dEQP-GLES3.functional.flush_finish.* = SKIP + +// TODO(jmadill): Figure out why these fail on the bots, but not locally. +1108 WIN : dEQP-GLES3.functional.shaders.struct.local.dynamic_loop_struct_array_fragment = FAIL +1094 WIN : dEQP-GLES3.functional.shaders.invariance.highp.loop_2 = FAIL +1094 WIN : dEQP-GLES3.functional.shaders.invariance.mediump.loop_2 = FAIL + +// We can't support distinct texture sizes in D3D11. +1097 WIN : dEQP-GLES3.functional.fbo.completeness.size.distinct = FAIL + +// Fail because we support these formats through the ANGLE_depth_texture extension instead of OES_depth_texture +605754 MAC WIN LINUX : dEQP-GLES3.functional.fbo.completeness.renderable.texture.depth.depth_component_unsigned_short = FAIL +605754 MAC WIN LINUX : dEQP-GLES3.functional.fbo.completeness.renderable.texture.depth.depth_component_unsigned_int = FAIL + +// Tests that we fail because they're not in line with the WebGL spec +1335 MAC WIN LINUX : dEQP-GLES3.functional.shaders.preprocessor.conditional_inclusion.basic_2* = FAIL +1335 MAC WIN LINUX : dEQP-GLES3.functional.shaders.preprocessor.conditional_inclusion.defined_macro_defined_test* = FAIL +1335 MAC WIN LINUX : dEQP-GLES3.functional.shaders.preprocessor.conditional_inclusion.defined_macro_undef* = FAIL +1335 MAC WIN LINUX : dEQP-GLES3.functional.shaders.preprocessor.conditional_inclusion.define_defined* = FAIL +1335 MAC WIN LINUX : dEQP-GLES3.functional.shaders.preprocessor.conditional_inclusion.define_defined_outside_if* = FAIL + +//////////////////////////////////////////////////////////////////////////////// +// +// Temporary entries: they should be removed once the bugs are fixed. +// +//////////////////////////////////////////////////////////////////////////////// + +// TODO(jmadill): Find why this fails when run in a certain sequence, but not singly. +1098 WIN : dEQP-GLES3.functional.uniform_api.random.50 = FAIL + +// Missing the SampleCmp instruction in vertex shaders. +1435 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturelod.sampler2dshadow_vertex = FAIL +1435 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturelodoffset.sampler2dshadow_vertex = FAIL +1435 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojlod.sampler2dshadow_vertex = FAIL +1435 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojlodoffset.sampler2dshadow_vertex = FAIL + +// SampleCmp is missing gradient/offset parameters in HLSL. +1436 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturelod.sampler2dshadow_fragment = FAIL +1436 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturelodoffset.sampler2dshadow_fragment = FAIL +1436 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojlod.sampler2dshadow_fragment = FAIL +1436 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojlodoffset.sampler2dshadow_fragment = FAIL +1436 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturegrad.sampler2dshadow_vertex = FAIL +1436 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturegrad.sampler2dshadow_fragment = FAIL +1436 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturegrad.sampler2darrayshadow_vertex = FAIL +1436 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturegrad.sampler2darrayshadow_fragment = FAIL +1436 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturegradoffset.sampler2dshadow_vertex = FAIL +1436 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturegradoffset.sampler2dshadow_fragment = FAIL +1436 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturegradoffset.sampler2darrayshadow_vertex = FAIL +1436 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturegradoffset.sampler2darrayshadow_fragment = FAIL +1436 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojgrad.sampler2dshadow_vertex = FAIL +1436 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojgrad.sampler2dshadow_fragment = FAIL +1436 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojgradoffset.sampler2dshadow_vertex = FAIL +1436 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojgradoffset.sampler2dshadow_fragment = FAIL + +// TODO(jmadill, cwallez): triage the failures below into permanent and temporary failures + +// Windows and Linux failures + +1101 WIN LINUX : dEQP-GLES3.functional.negative_api.texture.compressedtexsubimage2d = FAIL +1101 WIN LINUX : dEQP-GLES3.functional.negative_api.texture.compressedtexsubimage2d_invalid_size = FAIL +1101 WIN LINUX : dEQP-GLES3.functional.negative_api.texture.compressedtexsubimage3d = FAIL +1101 WIN LINUX : dEQP-GLES3.functional.negative_api.texture.compressedtexsubimage3d_invalid_buffer_target = FAIL +1095 WIN LINUX : dEQP-GLES3.functional.texture.mipmap.2d.projected.nearest_nearest_clamp = FAIL +1095 WIN LINUX : dEQP-GLES3.functional.texture.mipmap.2d.projected.nearest_nearest_repeat = FAIL +1095 WIN LINUX : dEQP-GLES3.functional.texture.mipmap.2d.projected.nearest_nearest_mirror = FAIL +1095 WIN LINUX : dEQP-GLES3.functional.texture.mipmap.2d.projected.linear_nearest_clamp = FAIL +1095 WIN LINUX : dEQP-GLES3.functional.texture.mipmap.2d.projected.linear_nearest_repeat = FAIL +1095 WIN LINUX : dEQP-GLES3.functional.texture.mipmap.2d.projected.linear_nearest_mirror = FAIL + +// Windows only failure + +1093 WIN : dEQP-GLES3.functional.shaders.builtin_functions.precision.tanh.highp_vertex.scalar = FAIL +1093 WIN : dEQP-GLES3.functional.shaders.builtin_functions.precision.tanh.highp_vertex.vec2 = FAIL +1093 WIN : dEQP-GLES3.functional.shaders.builtin_functions.precision.tanh.highp_vertex.vec3 = FAIL +1093 WIN : dEQP-GLES3.functional.shaders.builtin_functions.precision.tanh.highp_vertex.vec4 = FAIL +1093 WIN : dEQP-GLES3.functional.shaders.builtin_functions.precision.tanh.highp_fragment.scalar = FAIL +1093 WIN : dEQP-GLES3.functional.shaders.builtin_functions.precision.tanh.highp_fragment.vec2 = FAIL +1093 WIN : dEQP-GLES3.functional.shaders.builtin_functions.precision.tanh.highp_fragment.vec3 = FAIL +1093 WIN : dEQP-GLES3.functional.shaders.builtin_functions.precision.tanh.highp_fragment.vec4 = FAIL +1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureoffset.sampler3d_fixed_fragment = FAIL +1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureoffset.sampler3d_float_fragment = FAIL +1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojoffset.sampler3d_fixed_fragment = FAIL +1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojoffset.sampler3d_float_fragment = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.depth_stencil.stencil_depth_funcs.stencil_* = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.depth_stencil.stencil_ops.* = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.depth_stencil.write_mask.* = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.depth_stencil.random.* = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.add_constant_color_constant_alpha = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.add_constant_color_one_minus_constant_alpha = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.add_one_minus_constant_color_constant_alpha = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.add_one_minus_constant_color_one_minus_constant_alpha = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.add_constant_alpha_constant_color = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.add_constant_alpha_one_minus_constant_color = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.add_one_minus_constant_alpha_constant_color = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.add_one_minus_constant_alpha_one_minus_constant_color = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.subtract_constant_color_constant_alpha = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.subtract_constant_color_one_minus_constant_alpha = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.subtract_one_minus_constant_color_constant_alpha = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.subtract_one_minus_constant_color_one_minus_constant_alpha = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.subtract_constant_alpha_constant_color = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.subtract_constant_alpha_one_minus_constant_color = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.subtract_one_minus_constant_alpha_constant_color = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.subtract_one_minus_constant_alpha_one_minus_constant_color = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.reverse_subtract_constant_color_constant_alpha = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.reverse_subtract_constant_color_one_minus_constant_alpha = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.reverse_subtract_one_minus_constant_color_constant_alpha = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.reverse_subtract_one_minus_constant_color_one_minus_constant_alpha = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.reverse_subtract_constant_alpha_constant_color = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.reverse_subtract_constant_alpha_one_minus_constant_color = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.reverse_subtract_one_minus_constant_alpha_constant_color = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.default_framebuffer.equation_src_func_dst_func.reverse_subtract_one_minus_constant_alpha_one_minus_constant_color = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.add_constant_color_constant_alpha = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.add_constant_color_one_minus_constant_alpha = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.add_one_minus_constant_color_constant_alpha = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.add_one_minus_constant_color_one_minus_constant_alpha = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.add_constant_alpha_constant_color = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.add_constant_alpha_one_minus_constant_color = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.add_one_minus_constant_alpha_constant_color = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.add_one_minus_constant_alpha_one_minus_constant_color = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.subtract_constant_color_constant_alpha = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.subtract_constant_color_one_minus_constant_alpha = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.subtract_one_minus_constant_color_constant_alpha = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.subtract_one_minus_constant_color_one_minus_constant_alpha = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.subtract_constant_alpha_constant_color = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.subtract_constant_alpha_one_minus_constant_color = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.subtract_one_minus_constant_alpha_constant_color = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.subtract_one_minus_constant_alpha_one_minus_constant_color = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.reverse_subtract_constant_color_constant_alpha = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.reverse_subtract_constant_color_one_minus_constant_alpha = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.reverse_subtract_one_minus_constant_color_constant_alpha = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.reverse_subtract_one_minus_constant_color_one_minus_constant_alpha = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.reverse_subtract_constant_alpha_constant_color = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.reverse_subtract_constant_alpha_one_minus_constant_color = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.reverse_subtract_one_minus_constant_alpha_constant_color = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.blend.fbo_srgb.equation_src_func_dst_func.reverse_subtract_one_minus_constant_alpha_one_minus_constant_color = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.random.* = FAIL +1096 WIN : dEQP-GLES3.functional.fragment_ops.interaction.basic_shader.* = FAIL +1098 WIN : dEQP-GLES3.functional.uniform_api.random.8 = FAIL +1098 WIN : dEQP-GLES3.functional.uniform_api.random.81 = FAIL +1101 WIN : dEQP-GLES3.functional.polygon_offset.fixed16_render_with_units = FAIL +1101 WIN : dEQP-GLES3.functional.polygon_offset.fixed24_render_with_units = FAIL +1101 WIN : dEQP-GLES3.functional.lifetime.attach.deleted_input.buffer_vertex_array = FAIL + +// Windows Intel-specific failures + +1349 WIN INTEL : dEQP-GLES3.functional.shaders.texture_functions.texturelod.isamplercube_* = FAIL +1349 WIN INTEL : dEQP-GLES3.functional.shaders.texture_functions.texturelod.usamplercube_* = FAIL +1349 WIN INTEL : dEQP-GLES3.functional.shaders.texture_functions.texturegrad.isamplercube_vertex = FAIL +1349 WIN INTEL : dEQP-GLES3.functional.shaders.texture_functions.texturegrad.usamplercube_vertex = FAIL +1349 WIN INTEL : dEQP-GLES3.functional.shaders.texture_functions.texturegrad.usamplercube_fragment = FAIL +1349 WIN INTEL : dEQP-GLES3.functional.texture.units.2_units.only_cube.0 = FAIL +1349 WIN INTEL : dEQP-GLES3.functional.texture.units.2_units.only_cube.2 = FAIL +1349 WIN INTEL : dEQP-GLES3.functional.texture.units.2_units.only_cube.4 = FAIL +1349 WIN INTEL : dEQP-GLES3.functional.texture.units.2_units.only_cube.7 = FAIL +1349 WIN INTEL : dEQP-GLES3.functional.texture.units.2_units.only_cube.8 = FAIL +1349 WIN INTEL : dEQP-GLES3.functional.texture.units.2_units.mixed.4 = FAIL +1349 WIN INTEL : dEQP-GLES3.functional.texture.units.4_units.only_cube.0 = FAIL +1349 WIN INTEL : dEQP-GLES3.functional.texture.units.4_units.only_cube.1 = FAIL +1349 WIN INTEL : dEQP-GLES3.functional.texture.units.4_units.only_cube.2 = FAIL +1349 WIN INTEL : dEQP-GLES3.functional.texture.units.4_units.only_cube.6 = FAIL +1349 WIN INTEL : dEQP-GLES3.functional.texture.units.4_units.only_cube.7 = FAIL +1349 WIN INTEL : dEQP-GLES3.functional.texture.units.4_units.only_cube.8 = FAIL +1349 WIN INTEL : dEQP-GLES3.functional.texture.units.4_units.only_cube.9 = FAIL +1349 WIN INTEL : dEQP-GLES3.functional.texture.units.4_units.mixed.4 = FAIL +1349 WIN INTEL : dEQP-GLES3.functional.texture.units.4_units.mixed.6 = FAIL +1349 WIN INTEL : dEQP-GLES3.functional.texture.units.4_units.mixed.7 = FAIL +1349 WIN INTEL : dEQP-GLES3.functional.texture.units.8_units.only_cube.* = FAIL +1349 WIN INTEL : dEQP-GLES3.functional.texture.units.8_units.mixed.2 = FAIL +1349 WIN INTEL : dEQP-GLES3.functional.texture.units.8_units.mixed.3 = FAIL +1349 WIN INTEL : dEQP-GLES3.functional.texture.units.8_units.mixed.4 = FAIL +1349 WIN INTEL : dEQP-GLES3.functional.texture.units.8_units.mixed.6 = FAIL +1349 WIN INTEL : dEQP-GLES3.functional.texture.units.8_units.mixed.7 = FAIL +1349 WIN INTEL : dEQP-GLES3.functional.texture.units.all_units.only_cube.* = FAIL +1349 WIN INTEL : dEQP-GLES3.functional.texture.units.all_units.mixed.2 = FAIL +1349 WIN INTEL : dEQP-GLES3.functional.texture.units.all_units.mixed.3 = FAIL +1349 WIN INTEL : dEQP-GLES3.functional.texture.units.all_units.mixed.4 = FAIL +1349 WIN INTEL : dEQP-GLES3.functional.texture.units.all_units.mixed.6 = FAIL +1349 WIN INTEL : dEQP-GLES3.functional.texture.units.all_units.mixed.7 = FAIL + +// Linux only failures + +// UBO tests trigger crashes when getting the program info log, skip them until this is fixed. +1323 LINUX : dEQP-GLES3.functional.ubo.* = SKIP + +1323 LINUX : dEQP-GLES3.functional.draw.random.210 = FAIL +1323 LINUX : dEQP-GLES3.functional.fbo.blit.default_framebuffer.srgb8_alpha8 = FAIL +1323 LINUX : dEQP-GLES3.functional.fbo.blit.default_framebuffer.srgb8_alpha8_linear_out_of_bounds_blit_to_default = FAIL +1323 LINUX : dEQP-GLES3.functional.fbo.blit.default_framebuffer.srgb8_alpha8_linear_scale_blit_to_default = FAIL +1323 LINUX : dEQP-GLES3.functional.fbo.blit.default_framebuffer.srgb8_alpha8_nearest_scale_blit_to_default = FAIL +1323 LINUX : dEQP-GLES3.functional.fbo.depth.depth_test_clamp.depth_component32f = FAIL +1323 LINUX : dEQP-GLES3.functional.fbo.depth.depth_test_clamp.depth32f_stencil8 = FAIL +1323 LINUX : dEQP-GLES3.functional.fbo.depth.depth_write_clamp.depth_component32f = FAIL +1323 LINUX : dEQP-GLES3.functional.fbo.depth.depth_write_clamp.depth32f_stencil8 = FAIL +1323 LINUX : dEQP-GLES3.functional.rasterization.fbo.rbo_multisample_max.primitives.points = FAIL +1323 LINUX : dEQP-GLES3.functional.state_query.integers64.max_server_wait_timeout_getfloat = FAIL +1323 LINUX : dEQP-GLES3.functional.texture.mipmap.2d.projected.linear_linear_clamp = FAIL +1323 LINUX : dEQP-GLES3.functional.texture.mipmap.2d.projected.linear_linear_mirror = FAIL +1323 LINUX : dEQP-GLES3.functional.texture.mipmap.2d.projected.linear_linear_repeat = FAIL +1323 LINUX : dEQP-GLES3.functional.texture.mipmap.2d.projected.nearest_linear_clamp = FAIL +1323 LINUX : dEQP-GLES3.functional.texture.mipmap.2d.projected.nearest_linear_mirror = FAIL +1323 LINUX : dEQP-GLES3.functional.texture.mipmap.2d.projected.nearest_linear_repeat = FAIL +1098 LINUX : dEQP-GLES3.functional.uniform_api.random.6 = FAIL + +// While loops with 'continue' seem flaky on Linux. (Possibly all GL renderers) +1324 LINUX : dEQP-GLES3.functional.shaders.loops.while_constant_iterations.conditional_continue_vertex = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.while_constant_iterations.conditional_continue_fragment = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.while_constant_iterations.unconditional_continue_vertex = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.while_constant_iterations.unconditional_continue_fragment = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.while_constant_iterations.only_continue_vertex = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.while_constant_iterations.only_continue_fragment = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.while_constant_iterations.double_continue_vertex = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.while_constant_iterations.double_continue_fragment = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.while_constant_iterations.mixed_break_continue_vertex = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.while_constant_iterations.mixed_break_continue_fragment = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.while_uniform_iterations.conditional_continue_vertex = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.while_uniform_iterations.conditional_continue_fragment = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.while_uniform_iterations.unconditional_continue_vertex = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.while_uniform_iterations.unconditional_continue_fragment = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.while_uniform_iterations.only_continue_vertex = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.while_uniform_iterations.only_continue_fragment = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.while_uniform_iterations.double_continue_vertex = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.while_uniform_iterations.double_continue_fragment = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.while_uniform_iterations.mixed_break_continue_vertex = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.while_uniform_iterations.mixed_break_continue_fragment = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.while_dynamic_iterations.conditional_continue_vertex = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.while_dynamic_iterations.conditional_continue_fragment = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.while_dynamic_iterations.unconditional_continue_vertex = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.while_dynamic_iterations.unconditional_continue_fragment = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.while_dynamic_iterations.only_continue_vertex = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.while_dynamic_iterations.only_continue_fragment = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.while_dynamic_iterations.double_continue_vertex = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.while_dynamic_iterations.double_continue_fragment = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.while_dynamic_iterations.mixed_break_continue_vertex = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.while_dynamic_iterations.mixed_break_continue_fragment = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.do_while_constant_iterations.conditional_continue_vertex = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.do_while_constant_iterations.conditional_continue_fragment = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.do_while_constant_iterations.unconditional_continue_vertex = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.do_while_constant_iterations.unconditional_continue_fragment = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.do_while_constant_iterations.only_continue_vertex = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.do_while_constant_iterations.only_continue_fragment = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.do_while_constant_iterations.double_continue_vertex = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.do_while_constant_iterations.double_continue_fragment = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.do_while_constant_iterations.mixed_break_continue_vertex = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.do_while_constant_iterations.mixed_break_continue_fragment = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.do_while_uniform_iterations.conditional_continue_vertex = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.do_while_uniform_iterations.conditional_continue_fragment = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.do_while_uniform_iterations.unconditional_continue_vertex = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.do_while_uniform_iterations.unconditional_continue_fragment = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.do_while_uniform_iterations.only_continue_vertex = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.do_while_uniform_iterations.only_continue_fragment = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.do_while_uniform_iterations.double_continue_vertex = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.do_while_uniform_iterations.double_continue_fragment = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.do_while_uniform_iterations.mixed_break_continue_vertex = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.do_while_uniform_iterations.mixed_break_continue_fragment = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.do_while_dynamic_iterations.conditional_continue_vertex = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.do_while_dynamic_iterations.conditional_continue_fragment = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.do_while_dynamic_iterations.unconditional_continue_vertex = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.do_while_dynamic_iterations.unconditional_continue_fragment = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.do_while_dynamic_iterations.only_continue_vertex = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.do_while_dynamic_iterations.only_continue_fragment = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.do_while_dynamic_iterations.double_continue_vertex = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.do_while_dynamic_iterations.double_continue_fragment = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.do_while_dynamic_iterations.mixed_break_continue_vertex = FAIL +1324 LINUX : dEQP-GLES3.functional.shaders.loops.do_while_dynamic_iterations.mixed_break_continue_fragment = FAIL diff --git a/gfx/angle/src/tests/deqp_support/tcuANGLENativeDisplayFactory.cpp b/gfx/angle/src/tests/deqp_support/tcuANGLENativeDisplayFactory.cpp new file mode 100755 index 000000000..a7432b470 --- /dev/null +++ b/gfx/angle/src/tests/deqp_support/tcuANGLENativeDisplayFactory.cpp @@ -0,0 +1,326 @@ +/*------------------------------------------------------------------------- + * drawElements Quality Program Tester Core + * ---------------------------------------- + * + * Copyright 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "tcuANGLENativeDisplayFactory.h" + +#include <EGL/egl.h> +#include <EGL/eglext.h> + +#include "deClock.h" +#include "deMemory.h" +#include "deThread.h" +#include "egluDefs.hpp" +#include "eglwLibrary.hpp" +#include "OSPixmap.h" +#include "OSWindow.h" +#include "tcuTexture.hpp" + +// clang-format off +#if (DE_OS == DE_OS_WIN32) + #define ANGLE_EGL_LIBRARY_NAME "libEGL.dll" +#elif (DE_OS == DE_OS_UNIX) || (DE_OS == DE_OS_ANDROID) + #define ANGLE_EGL_LIBRARY_NAME "libEGL.so" +#elif (DE_OS == DE_OS_OSX) + #define ANGLE_EGL_LIBRARY_NAME "libEGL.dylib" +#else + #error "Unsupported platform" +#endif +// clang-format on + +namespace tcu +{ +namespace +{ + +enum +{ + DEFAULT_SURFACE_WIDTH = 400, + DEFAULT_SURFACE_HEIGHT = 300, + WAIT_WINDOW_VISIBLE_MS = 500 //!< Time to wait before issuing screenshot after changing window visibility (hack for DWM) +}; + +static const eglu::NativeDisplay::Capability DISPLAY_CAPABILITIES = eglu::NativeDisplay::CAPABILITY_GET_DISPLAY_PLATFORM; +static const eglu::NativePixmap::Capability BITMAP_CAPABILITIES = eglu::NativePixmap::CAPABILITY_CREATE_SURFACE_LEGACY; +static const eglu::NativeWindow::Capability WINDOW_CAPABILITIES = (eglu::NativeWindow::Capability) + (eglu::NativeWindow::CAPABILITY_CREATE_SURFACE_LEGACY | + eglu::NativeWindow::CAPABILITY_GET_SURFACE_SIZE | + eglu::NativeWindow::CAPABILITY_GET_SCREEN_SIZE | + eglu::NativeWindow::CAPABILITY_READ_SCREEN_PIXELS | + eglu::NativeWindow::CAPABILITY_SET_SURFACE_SIZE | + eglu::NativeWindow::CAPABILITY_CHANGE_VISIBILITY); + +class ANGLENativeDisplay : public eglu::NativeDisplay +{ + public: + ANGLENativeDisplay(const std::vector<eglw::EGLAttrib> &attribs); + virtual ~ANGLENativeDisplay() {} + + void *getPlatformNative() override { return mDeviceContext; } + const eglw::EGLAttrib *getPlatformAttributes() const override { return &mPlatformAttributes[0]; } + const eglw::Library &getLibrary() const override { return mLibrary; } + + EGLNativeDisplayType getDeviceContext() { return mDeviceContext; } + + private: + EGLNativeDisplayType mDeviceContext; + eglw::DefaultLibrary mLibrary; + std::vector<eglw::EGLAttrib> mPlatformAttributes; +}; + +class NativePixmapFactory : public eglu::NativePixmapFactory +{ + public: + NativePixmapFactory(); + ~NativePixmapFactory() {} + + eglu::NativePixmap *createPixmap(eglu::NativeDisplay *nativeDisplay, int width, int height) const override; + eglu::NativePixmap *createPixmap(eglu::NativeDisplay *nativeDisplay, eglw::EGLDisplay display, eglw::EGLConfig config, const eglw::EGLAttrib* attribList, int width, int height) const override; +}; + +class NativePixmap : public eglu::NativePixmap +{ + public: + NativePixmap(EGLNativeDisplayType display, int width, int height, int bitDepth); + virtual ~NativePixmap(); + + eglw::EGLNativePixmapType getLegacyNative() override; + + private: + OSPixmap *mPixmap; +}; + +class NativeWindowFactory : public eglu::NativeWindowFactory +{ + public: + NativeWindowFactory(EventState *eventState); + ~NativeWindowFactory() override {} + + eglu::NativeWindow *createWindow(eglu::NativeDisplay *nativeDisplay, const eglu::WindowParams ¶ms) const override; + + private: + EventState *mEvents; +}; + +class NativeWindow : public eglu::NativeWindow +{ + public: + NativeWindow(ANGLENativeDisplay *nativeDisplay, const eglu::WindowParams ¶ms, EventState *eventState); + ~NativeWindow() override; + + eglw::EGLNativeWindowType getLegacyNative() override; + IVec2 getSurfaceSize() const override; + IVec2 getScreenSize() const override { return getSurfaceSize(); } + void processEvents() override; + void setSurfaceSize(IVec2 size) override; + void setVisibility(eglu::WindowParams::Visibility visibility) override; + void readScreenPixels(tcu::TextureLevel* dst) const override; + + private: + OSWindow *mWindow; + EventState *mEvents; +}; + +// ANGLE NativeDisplay + +ANGLENativeDisplay::ANGLENativeDisplay(const std::vector<EGLAttrib> &attribs) + : eglu::NativeDisplay(DISPLAY_CAPABILITIES, EGL_PLATFORM_ANGLE_ANGLE, "EGL_EXT_platform_base"), + mDeviceContext(EGL_DEFAULT_DISPLAY), + mLibrary(ANGLE_EGL_LIBRARY_NAME), + mPlatformAttributes(attribs) +{ +} + +// NativePixmap + +NativePixmap::NativePixmap(EGLNativeDisplayType display, int width, int height, int bitDepth) + : eglu::NativePixmap(BITMAP_CAPABILITIES), + mPixmap(CreateOSPixmap()) +{ + if (!mPixmap) + { + throw ResourceError("Failed to create pixmap", DE_NULL, __FILE__, __LINE__); + } + + if (!mPixmap->initialize(display, width, height, bitDepth)) + { + throw ResourceError("Failed to initialize pixmap", DE_NULL, __FILE__, __LINE__); + } +} + +NativePixmap::~NativePixmap() +{ + delete mPixmap; +} + +eglw::EGLNativePixmapType NativePixmap::getLegacyNative() +{ + return reinterpret_cast<eglw::EGLNativePixmapType>(mPixmap->getNativePixmap()); +} + +// NativePixmapFactory + +NativePixmapFactory::NativePixmapFactory() + : eglu::NativePixmapFactory("bitmap", "ANGLE Bitmap", BITMAP_CAPABILITIES) +{ +} + +eglu::NativePixmap *NativePixmapFactory::createPixmap (eglu::NativeDisplay* nativeDisplay, eglw::EGLDisplay display, eglw::EGLConfig config, const eglw::EGLAttrib* attribList, int width, int height) const +{ + const eglw::Library& egl = nativeDisplay->getLibrary(); + int redBits = 0; + int greenBits = 0; + int blueBits = 0; + int alphaBits = 0; + int bitSum = 0; + + DE_ASSERT(display != EGL_NO_DISPLAY); + + egl.getConfigAttrib(display, config, EGL_RED_SIZE, &redBits); + egl.getConfigAttrib(display, config, EGL_GREEN_SIZE, &greenBits); + egl.getConfigAttrib(display, config, EGL_BLUE_SIZE, &blueBits); + egl.getConfigAttrib(display, config, EGL_ALPHA_SIZE, &alphaBits); + EGLU_CHECK_MSG(egl, "eglGetConfigAttrib()"); + + bitSum = redBits+greenBits+blueBits+alphaBits; + + return new NativePixmap(dynamic_cast<ANGLENativeDisplay*>(nativeDisplay)->getDeviceContext(), width, height, bitSum); +} + +eglu::NativePixmap *NativePixmapFactory::createPixmap(eglu::NativeDisplay* nativeDisplay, int width, int height) const +{ + const int defaultDepth = 32; + return new NativePixmap(dynamic_cast<ANGLENativeDisplay*>(nativeDisplay)->getDeviceContext(), width, height, defaultDepth); +} + +// NativeWindowFactory + +NativeWindowFactory::NativeWindowFactory(EventState *eventState) + : eglu::NativeWindowFactory("window", "ANGLE Window", WINDOW_CAPABILITIES), + mEvents(eventState) +{ +} + +eglu::NativeWindow *NativeWindowFactory::createWindow(eglu::NativeDisplay* nativeDisplay, const eglu::WindowParams& params) const +{ + return new NativeWindow(dynamic_cast<ANGLENativeDisplay*>(nativeDisplay), params, mEvents); +} + +// NativeWindow + +NativeWindow::NativeWindow(ANGLENativeDisplay *nativeDisplay, const eglu::WindowParams& params, EventState *eventState) + : eglu::NativeWindow(WINDOW_CAPABILITIES), + mWindow(CreateOSWindow()), + mEvents(eventState) +{ + bool initialized = mWindow->initialize("dEQP ANGLE Tests", + params.width == eglu::WindowParams::SIZE_DONT_CARE ? DEFAULT_SURFACE_WIDTH : params.width, + params.height == eglu::WindowParams::SIZE_DONT_CARE ? DEFAULT_SURFACE_HEIGHT : params.height); + TCU_CHECK(initialized); + + if (params.visibility != eglu::WindowParams::VISIBILITY_DONT_CARE) + setVisibility(params.visibility); +} + +void NativeWindow::setVisibility(eglu::WindowParams::Visibility visibility) +{ + switch (visibility) + { + case eglu::WindowParams::VISIBILITY_HIDDEN: + mWindow->setVisible(false); + break; + + case eglu::WindowParams::VISIBILITY_VISIBLE: + case eglu::WindowParams::VISIBILITY_FULLSCREEN: + // \todo [2014-03-12 pyry] Implement FULLSCREEN, or at least SW_MAXIMIZE. + mWindow->setVisible(true); + break; + + default: + DE_ASSERT(DE_FALSE); + } +} + +NativeWindow::~NativeWindow() +{ + delete mWindow; +} + +eglw::EGLNativeWindowType NativeWindow::getLegacyNative() +{ + return reinterpret_cast<eglw::EGLNativeWindowType>(mWindow->getNativeWindow()); +} + +IVec2 NativeWindow::getSurfaceSize() const +{ + return IVec2(mWindow->getWidth(), mWindow->getHeight()); +} + +void NativeWindow::processEvents() +{ + mWindow->messageLoop(); + + // Look for a quit event to forward to the EventState + Event event; + while (mWindow->popEvent(&event)) + { + if (event.Type == Event::EVENT_CLOSED) + { + mEvents->signalQuitEvent(); + } + } +} + +void NativeWindow::setSurfaceSize(IVec2 size) +{ + mWindow->resize(size.x(), size.y()); +} + +void NativeWindow::readScreenPixels(tcu::TextureLevel *dst) const +{ + dst->setStorage(TextureFormat(TextureFormat::BGRA, TextureFormat::UNORM_INT8), mWindow->getWidth(), mWindow->getHeight()); + bool success = mWindow->takeScreenshot(reinterpret_cast<uint8_t*>(dst->getAccess().getDataPtr())); + DE_ASSERT(success); + DE_UNREF(success); +} + +} // anonymous + +ANGLENativeDisplayFactory::ANGLENativeDisplayFactory(const std::string &name, + const std::string &description, + const std::vector<eglw::EGLAttrib> &platformAttributes, + EventState *eventState) + : eglu::NativeDisplayFactory(name, description, DISPLAY_CAPABILITIES, EGL_PLATFORM_ANGLE_ANGLE, "EGL_EXT_platform_base"), + mPlatformAttributes(platformAttributes) +{ + m_nativeWindowRegistry.registerFactory(new NativeWindowFactory(eventState)); + m_nativePixmapRegistry.registerFactory(new NativePixmapFactory()); +} + +ANGLENativeDisplayFactory::~ANGLENativeDisplayFactory() +{ +} + +eglu::NativeDisplay *ANGLENativeDisplayFactory::createDisplay(const eglw::EGLAttrib *attribList) const +{ + DE_UNREF(attribList); + return new ANGLENativeDisplay(mPlatformAttributes); +} + +} // tcu diff --git a/gfx/angle/src/tests/deqp_support/tcuANGLENativeDisplayFactory.h b/gfx/angle/src/tests/deqp_support/tcuANGLENativeDisplayFactory.h new file mode 100755 index 000000000..8eecf757f --- /dev/null +++ b/gfx/angle/src/tests/deqp_support/tcuANGLENativeDisplayFactory.h @@ -0,0 +1,62 @@ +/*------------------------------------------------------------------------- + * drawElements Quality Program Tester Core + * ---------------------------------------- + * + * Copyright 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef TCU_ANGLE_WIN32_NATIVE_DISPLAY_FACTORY_H_ +#define TCU_ANGLE_WIN32_NATIVE_DISPLAY_FACTORY_H_ + +#include "tcuDefs.hpp" +#include "egluNativeDisplay.hpp" +#include "eglwDefs.hpp" + +namespace tcu +{ + +class EventState +{ + public: + EventState() + : mQuit(false) + { + } + bool quitSignaled() const { return mQuit; }; + void signalQuitEvent() { mQuit = true; }; + + private: + bool mQuit; +}; + +class ANGLENativeDisplayFactory : public eglu::NativeDisplayFactory +{ + public: + ANGLENativeDisplayFactory(const std::string &name, + const std::string &description, + const std::vector<eglw::EGLAttrib> &platformAttributes, + EventState *eventState); + ~ANGLENativeDisplayFactory() override; + + eglu::NativeDisplay *createDisplay(const eglw::EGLAttrib* attribList) const override; + + private: + std::vector<eglw::EGLAttrib> mPlatformAttributes; +}; + +} // tcu + +#endif // TCU_ANGLE_WIN32_NATIVE_DISPLAY_FACTORY_H_ diff --git a/gfx/angle/src/tests/deqp_support/tcuANGLEPlatform.cpp b/gfx/angle/src/tests/deqp_support/tcuANGLEPlatform.cpp new file mode 100755 index 000000000..4441cde98 --- /dev/null +++ b/gfx/angle/src/tests/deqp_support/tcuANGLEPlatform.cpp @@ -0,0 +1,118 @@ +/*------------------------------------------------------------------------- + * drawElements Quality Program Tester Core + * ---------------------------------------- + * + * Copyright 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "tcuANGLEPlatform.h" + +#include <EGL/egl.h> +#include <EGL/eglext.h> + +#include "egluGLContextFactory.hpp" +#include "system_utils.h" +#include "tcuANGLENativeDisplayFactory.h" +#include "tcuNullContextFactory.hpp" + +namespace tcu +{ + +ANGLEPlatform::ANGLEPlatform() +{ + angle::SetLowPriorityProcess(); + +#if (DE_OS == DE_OS_WIN32) + std::vector<eglw::EGLAttrib> d3d11Attribs; + d3d11Attribs.push_back(EGL_PLATFORM_ANGLE_TYPE_ANGLE); + d3d11Attribs.push_back(EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE); + d3d11Attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE); + d3d11Attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE); + d3d11Attribs.push_back(EGL_NONE); + + auto *d3d11Factory = new ANGLENativeDisplayFactory( + "angle-d3d11", "ANGLE D3D11 Display", d3d11Attribs, &mEvents); + m_nativeDisplayFactoryRegistry.registerFactory(d3d11Factory); + + std::vector<eglw::EGLAttrib> d3d9Attribs; + d3d9Attribs.push_back(EGL_PLATFORM_ANGLE_TYPE_ANGLE); + d3d9Attribs.push_back(EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE); + d3d9Attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE); + d3d9Attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE); + d3d9Attribs.push_back(EGL_NONE); + + auto *d3d9Factory = new ANGLENativeDisplayFactory( + "angle-d3d9", "ANGLE D3D9 Display", d3d9Attribs, &mEvents); + m_nativeDisplayFactoryRegistry.registerFactory(d3d9Factory); + + std::vector<eglw::EGLAttrib> d3d1193Attribs; + d3d1193Attribs.push_back(EGL_PLATFORM_ANGLE_TYPE_ANGLE); + d3d1193Attribs.push_back(EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE); + d3d1193Attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE); + d3d1193Attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE); + d3d1193Attribs.push_back(EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE); + d3d1193Attribs.push_back(9); + d3d1193Attribs.push_back(EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE); + d3d1193Attribs.push_back(3); + d3d1193Attribs.push_back(EGL_NONE); + + auto *d3d1193Factory = new ANGLENativeDisplayFactory( + "angle-d3d11-fl93", "ANGLE D3D11 FL9_3 Display", d3d1193Attribs, &mEvents); + m_nativeDisplayFactoryRegistry.registerFactory(d3d1193Factory); +#endif // (DE_OS == DE_OS_WIN32) + +#if defined(ANGLE_USE_OZONE) || (DE_OS == DE_OS_ANDROID) + std::vector<eglw::EGLAttrib> glesAttribs; + glesAttribs.push_back(EGL_PLATFORM_ANGLE_TYPE_ANGLE); + glesAttribs.push_back(EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE); + glesAttribs.push_back(EGL_NONE); + + auto *glesFactory = new ANGLENativeDisplayFactory( + "angle-gles", "ANGLE OpenGL ES Display", glesAttribs, &mEvents); + m_nativeDisplayFactoryRegistry.registerFactory(glesFactory); +#endif + + std::vector<eglw::EGLAttrib> glAttribs; + glAttribs.push_back(EGL_PLATFORM_ANGLE_TYPE_ANGLE); + glAttribs.push_back(EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE); + glAttribs.push_back(EGL_NONE); + + auto *glFactory = new ANGLENativeDisplayFactory( + "angle-gl", "ANGLE OpenGL Display", glAttribs, &mEvents); + m_nativeDisplayFactoryRegistry.registerFactory(glFactory); + + m_contextFactoryRegistry.registerFactory(new eglu::GLContextFactory(m_nativeDisplayFactoryRegistry)); + + // Add Null context type for use in generating case lists + m_contextFactoryRegistry.registerFactory(new null::NullGLContextFactory()); +} + +ANGLEPlatform::~ANGLEPlatform() +{ +} + +bool ANGLEPlatform::processEvents() +{ + return !mEvents.quitSignaled(); +} + +} // tcu + +// Create platform +tcu::Platform *createPlatform() +{ + return new tcu::ANGLEPlatform(); +} diff --git a/gfx/angle/src/tests/deqp_support/tcuANGLEPlatform.h b/gfx/angle/src/tests/deqp_support/tcuANGLEPlatform.h new file mode 100755 index 000000000..d62c1c60f --- /dev/null +++ b/gfx/angle/src/tests/deqp_support/tcuANGLEPlatform.h @@ -0,0 +1,56 @@ +/*------------------------------------------------------------------------- + * drawElements Quality Program Tester Core + * ---------------------------------------- + * + * Copyright 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef TCU_ANGLE_WIN32_PLATFORM_H_ +#define TCU_ANGLE_WIN32_PLATFORM_H_ + +#include "tcuDefs.hpp" +#include "tcuPlatform.hpp" +#include "gluPlatform.hpp" + +#ifndef _EGLUPLATFORM_HPP +# include "egluPlatform.hpp" +#endif + +#include "tcuANGLENativeDisplayFactory.h" + +namespace tcu +{ + +class ANGLEPlatform : public tcu::Platform, + private glu::Platform, + private eglu::Platform +{ + public: + ANGLEPlatform(); + ~ANGLEPlatform(); + + bool processEvents() override; + + const glu::Platform &getGLPlatform() const override { return static_cast<const glu::Platform&>(*this); } + const eglu::Platform &getEGLPlatform() const override { return static_cast<const eglu::Platform&>(*this); } + + private: + EventState mEvents; +}; + +} // tcu + +#endif // TCU_ANGLE_WIN32_PLATFORM_H_ diff --git a/gfx/angle/src/tests/deqp_support/tcuRandomOrderExecutor.cpp b/gfx/angle/src/tests/deqp_support/tcuRandomOrderExecutor.cpp new file mode 100755 index 000000000..3745bc3ce --- /dev/null +++ b/gfx/angle/src/tests/deqp_support/tcuRandomOrderExecutor.cpp @@ -0,0 +1,282 @@ +/*------------------------------------------------------------------------- + * drawElements Quality Program Tester Core + * ---------------------------------------- + * + * Copyright 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *//*! + * \file + * \brief Executor which can run randomly accessed tests. + *//*--------------------------------------------------------------------*/ + +#include "tcuRandomOrderExecutor.h" + +#include "tcuCommandLine.hpp" +#include "tcuTestLog.hpp" +#include "deStringUtil.hpp" +#include "deClock.h" + +#include <cstdio> +#include <algorithm> +#include <fstream> + +using std::vector; +using std::string; + +namespace tcu +{ + +RandomOrderExecutor::RandomOrderExecutor(TestPackageRoot &root, TestContext &testCtx) + : m_testCtx(testCtx), m_inflater(testCtx) +{ + m_nodeStack.push_back(NodeStackEntry(&root)); + root.getChildren(m_nodeStack[0].children); +} + +RandomOrderExecutor::~RandomOrderExecutor(void) +{ + pruneStack(1); +} + +void RandomOrderExecutor::pruneStack(size_t newStackSize) +{ + // \note Root is not managed by us + DE_ASSERT(de::inRange(newStackSize, size_t(1), m_nodeStack.size())); + + while (m_nodeStack.size() > newStackSize) + { + NodeStackEntry &curEntry = m_nodeStack.back(); + const bool isPkg = curEntry.node->getNodeType() == NODETYPE_PACKAGE; + + DE_ASSERT((m_nodeStack.size() == 2) == isPkg); + + if (curEntry.node) // Just in case we are in + // cleanup path after partial + // prune + { + if (curEntry.node->getNodeType() == NODETYPE_GROUP) + m_inflater.leaveGroupNode(static_cast<TestCaseGroup *>(curEntry.node)); + else if (curEntry.node->getNodeType() == NODETYPE_PACKAGE) + m_inflater.leaveTestPackage(static_cast<TestPackage *>(curEntry.node)); + else + DE_ASSERT(curEntry.children.empty()); + + curEntry.node = DE_NULL; + curEntry.children.clear(); + } + + if (isPkg) + m_caseExecutor.clear(); + + m_nodeStack.pop_back(); + } +} + +static TestNode *findNodeByName(vector<TestNode *> &nodes, const std::string &name) +{ + for (vector<TestNode *>::const_iterator node = nodes.begin(); node != nodes.end(); ++node) + { + if (name == (*node)->getName()) + return *node; + } + + return DE_NULL; +} + +TestCase *RandomOrderExecutor::seekToCase(const string &path) +{ + const vector<string> components = de::splitString(path, '.'); + size_t compNdx; + + DE_ASSERT(!m_nodeStack.empty() && m_nodeStack.front().node->getNodeType() == NODETYPE_ROOT); + + for (compNdx = 0; compNdx < components.size(); compNdx++) + { + const size_t stackPos = compNdx + 1; + + if (stackPos >= m_nodeStack.size()) + break; // Stack end + else if (components[compNdx] != m_nodeStack[stackPos].node->getName()) + { + // Current stack doesn't match any more, prune. + pruneStack(stackPos); + break; + } + } + + DE_ASSERT(m_nodeStack.size() == compNdx + 1); + + for (; compNdx < components.size(); compNdx++) + { + const size_t parentStackPos = compNdx; + TestNode *const curNode = + findNodeByName(m_nodeStack[parentStackPos].children, components[compNdx]); + + if (!curNode) + throw Exception(string("Test hierarchy node not found: ") + path); + + m_nodeStack.push_back(NodeStackEntry(curNode)); + + if (curNode->getNodeType() == NODETYPE_PACKAGE) + { + TestPackage *const testPackage = static_cast<TestPackage *>(curNode); + + m_inflater.enterTestPackage(testPackage, m_nodeStack.back().children); + DE_ASSERT(!m_caseExecutor); + m_caseExecutor = de::MovePtr<TestCaseExecutor>(testPackage->createExecutor()); + } + else if (curNode->getNodeType() == NODETYPE_GROUP) + m_inflater.enterGroupNode(static_cast<TestCaseGroup *>(curNode), + m_nodeStack.back().children); + else if (compNdx + 1 != components.size()) + throw Exception(string("Invalid test hierarchy path: ") + path); + } + + DE_ASSERT(m_nodeStack.size() == components.size() + 1); + + if (isTestNodeTypeExecutable(m_nodeStack.back().node->getNodeType())) + return dynamic_cast<TestCase *>(m_nodeStack.back().node); + else + throw Exception(string("Not a test case: ") + path); +} + +static qpTestCaseType nodeTypeToTestCaseType(TestNodeType nodeType) +{ + switch (nodeType) + { + case NODETYPE_SELF_VALIDATE: + return QP_TEST_CASE_TYPE_SELF_VALIDATE; + case NODETYPE_PERFORMANCE: + return QP_TEST_CASE_TYPE_PERFORMANCE; + case NODETYPE_CAPABILITY: + return QP_TEST_CASE_TYPE_CAPABILITY; + case NODETYPE_ACCURACY: + return QP_TEST_CASE_TYPE_ACCURACY; + default: + DE_ASSERT(false); + return QP_TEST_CASE_TYPE_LAST; + } +} + +TestStatus RandomOrderExecutor::execute(const std::string &casePath) +{ + TestCase *const testCase = seekToCase(casePath); + TestLog &log = m_testCtx.getLog(); + const qpTestCaseType caseType = nodeTypeToTestCaseType(testCase->getNodeType()); + + m_testCtx.setTerminateAfter(false); + log.startCase(casePath.c_str(), caseType); + + { + const TestStatus result = executeInner(testCase, casePath); + log.endCase(result.getCode(), result.getDescription().c_str()); + return result; + } +} + +tcu::TestStatus RandomOrderExecutor::executeInner(TestCase *testCase, const std::string &casePath) +{ + TestLog &log = m_testCtx.getLog(); + const deUint64 testStartTime = deGetMicroseconds(); + + m_testCtx.setTestResult(QP_TEST_RESULT_LAST, ""); + + // Initialize, will return immediately if fails + try + { + m_caseExecutor->init(testCase, casePath); + } + catch (const std::bad_alloc &) + { + m_testCtx.setTerminateAfter(true); + return TestStatus(QP_TEST_RESULT_RESOURCE_ERROR, + "Failed to allocate memory in test case init"); + } + catch (const TestException &e) + { + DE_ASSERT(e.getTestResult() != QP_TEST_RESULT_LAST); + m_testCtx.setTerminateAfter(e.isFatal()); + log << e; + return TestStatus(e.getTestResult(), e.getMessage()); + } + catch (const Exception &e) + { + log << e; + return TestStatus(QP_TEST_RESULT_FAIL, e.getMessage()); + } + + // Execute + for (;;) + { + TestCase::IterateResult iterateResult = TestCase::STOP; + + m_testCtx.touchWatchdog(); + + try + { + iterateResult = m_caseExecutor->iterate(testCase); + } + catch (const std::bad_alloc &) + { + m_testCtx.setTestResult(QP_TEST_RESULT_RESOURCE_ERROR, + "Failed to allocate memory during test " + "execution"); + } + catch (const TestException &e) + { + log << e; + m_testCtx.setTestResult(e.getTestResult(), e.getMessage()); + m_testCtx.setTerminateAfter(e.isFatal()); + } + catch (const Exception &e) + { + log << e; + m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, e.getMessage()); + } + + if (iterateResult == TestCase::STOP) + break; + } + + DE_ASSERT(m_testCtx.getTestResult() != QP_TEST_RESULT_LAST); + + if (m_testCtx.getTestResult() == QP_TEST_RESULT_RESOURCE_ERROR) + m_testCtx.setTerminateAfter(true); + + // De-initialize + try + { + m_caseExecutor->deinit(testCase); + } + catch (const tcu::Exception &e) + { + log << e << TestLog::Message << "Error in test case deinit, test program " + "will terminate." + << TestLog::EndMessage; + m_testCtx.setTerminateAfter(true); + } + + if (m_testCtx.getWatchDog()) + qpWatchDog_reset(m_testCtx.getWatchDog()); + + { + const TestStatus result = + TestStatus(m_testCtx.getTestResult(), m_testCtx.getTestResultDesc()); + m_testCtx.setTestResult(QP_TEST_RESULT_LAST, ""); + return result; + } +} + +} // tcu diff --git a/gfx/angle/src/tests/deqp_support/tcuRandomOrderExecutor.h b/gfx/angle/src/tests/deqp_support/tcuRandomOrderExecutor.h new file mode 100755 index 000000000..f8c708529 --- /dev/null +++ b/gfx/angle/src/tests/deqp_support/tcuRandomOrderExecutor.h @@ -0,0 +1,66 @@ +/*------------------------------------------------------------------------- + * drawElements Quality Program Tester Core + * ---------------------------------------- + * + * Copyright 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ /*! + * \file + * \brief Generic main(). + */ /*--------------------------------------------------------------------*/ + +#ifndef TCU_RANDOM_ORDER_EXECUTOR_H_ +#define TCU_RANDOM_ORDER_EXECUTOR_H_ + +#include "tcuTestHierarchyIterator.hpp" +#include "deUniquePtr.hpp" + +namespace tcu +{ + +class RandomOrderExecutor +{ + public: + RandomOrderExecutor(TestPackageRoot &root, TestContext &testCtx); + ~RandomOrderExecutor(void); + + TestStatus execute(const std::string &path); + + private: + void pruneStack(size_t newStackSize); + TestCase *seekToCase(const std::string &path); + + TestStatus executeInner(TestCase *testCase, const std::string &casePath); + + struct NodeStackEntry + { + TestNode *node; + std::vector<TestNode *> children; + + NodeStackEntry(void) : node(DE_NULL) {} + NodeStackEntry(TestNode *node_) : node(node_) {} + }; + + TestContext &m_testCtx; + + DefaultHierarchyInflater m_inflater; + std::vector<NodeStackEntry> m_nodeStack; + + de::MovePtr<TestCaseExecutor> m_caseExecutor; +}; + +} // tcu + +#endif // TCU_RANDOM_ORDER_EXECUTOR_H_ diff --git a/gfx/angle/src/tests/egl_tests/EGLContextCompatibilityTest.cpp b/gfx/angle/src/tests/egl_tests/EGLContextCompatibilityTest.cpp new file mode 100755 index 000000000..63c58afba --- /dev/null +++ b/gfx/angle/src/tests/egl_tests/EGLContextCompatibilityTest.cpp @@ -0,0 +1,287 @@ +// +// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +// EGLContextCompatibilityTest.cpp: +// This test will try to use all combinations of context configs and +// surface configs. If the configs are compatible, it checks that simple +// rendering works, otherwise it checks an error is generated one MakeCurrent. +#include <gtest/gtest.h> + +#include <vector> +#include <EGL/egl.h> +#include <EGL/eglext.h> + +#include "OSWindow.h" +#include "test_utils/ANGLETest.h" +#include "test_utils/angle_test_configs.h" + +using namespace angle; + +namespace +{ + +const EGLint contextAttribs[] = +{ + EGL_CONTEXT_CLIENT_VERSION, 2, + EGL_NONE +}; + +} + +class EGLContextCompatibilityTest : public ANGLETest +{ + public: + EGLContextCompatibilityTest() + : mDisplay(0) + { + } + + void SetUp() override + { + PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT = reinterpret_cast<PFNEGLGETPLATFORMDISPLAYEXTPROC>(eglGetProcAddress("eglGetPlatformDisplayEXT")); + ASSERT_TRUE(eglGetPlatformDisplayEXT != nullptr); + + EGLint dispattrs[] = + { + EGL_PLATFORM_ANGLE_TYPE_ANGLE, GetParam().getRenderer(), + EGL_NONE + }; + mDisplay = eglGetPlatformDisplayEXT( + EGL_PLATFORM_ANGLE_ANGLE, reinterpret_cast<void *>(EGL_DEFAULT_DISPLAY), dispattrs); + ASSERT_TRUE(mDisplay != EGL_NO_DISPLAY); + + ASSERT_TRUE(eglInitialize(mDisplay, nullptr, nullptr) == EGL_TRUE); + + int nConfigs = 0; + ASSERT_TRUE(eglGetConfigs(mDisplay, nullptr, 0, &nConfigs) == EGL_TRUE); + ASSERT_TRUE(nConfigs != 0); + + int nReturnedConfigs = 0; + mConfigs.resize(nConfigs); + ASSERT_TRUE(eglGetConfigs(mDisplay, mConfigs.data(), nConfigs, &nReturnedConfigs) == EGL_TRUE); + ASSERT_TRUE(nConfigs == nReturnedConfigs); + } + + void TearDown() override + { + eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + eglTerminate(mDisplay); + }; + + protected: + bool areConfigsCompatible(EGLConfig c1, EGLConfig c2, EGLint surfaceBit) + { + EGLint colorBufferType1, colorBufferType2; + EGLint red1, red2, green1, green2, blue1, blue2, alpha1, alpha2; + EGLint depth1, depth2, stencil1, stencil2; + EGLint surfaceType1, surfaceType2; + + eglGetConfigAttrib(mDisplay, c1, EGL_COLOR_BUFFER_TYPE, &colorBufferType1); + eglGetConfigAttrib(mDisplay, c2, EGL_COLOR_BUFFER_TYPE, &colorBufferType2); + + eglGetConfigAttrib(mDisplay, c1, EGL_RED_SIZE, &red1); + eglGetConfigAttrib(mDisplay, c2, EGL_RED_SIZE, &red2); + eglGetConfigAttrib(mDisplay, c1, EGL_GREEN_SIZE, &green1); + eglGetConfigAttrib(mDisplay, c2, EGL_GREEN_SIZE, &green2); + eglGetConfigAttrib(mDisplay, c1, EGL_BLUE_SIZE, &blue1); + eglGetConfigAttrib(mDisplay, c2, EGL_BLUE_SIZE, &blue2); + eglGetConfigAttrib(mDisplay, c1, EGL_ALPHA_SIZE, &alpha1); + eglGetConfigAttrib(mDisplay, c2, EGL_ALPHA_SIZE, &alpha2); + + eglGetConfigAttrib(mDisplay, c1, EGL_DEPTH_SIZE, &depth1); + eglGetConfigAttrib(mDisplay, c2, EGL_DEPTH_SIZE, &depth2); + eglGetConfigAttrib(mDisplay, c1, EGL_STENCIL_SIZE, &stencil1); + eglGetConfigAttrib(mDisplay, c2, EGL_STENCIL_SIZE, &stencil2); + + eglGetConfigAttrib(mDisplay, c1, EGL_SURFACE_TYPE, &surfaceType1); + eglGetConfigAttrib(mDisplay, c2, EGL_SURFACE_TYPE, &surfaceType2); + + return colorBufferType1 == colorBufferType2 && + red1 == red2 && green1 == green2 && blue1 == blue2 && alpha1 == alpha2 && + depth1 == depth2 && stencil1 == stencil2 && + (surfaceType1 & surfaceBit) != 0 && + (surfaceType2 & surfaceBit) != 0; + } + + void testWindowCompatibility(EGLConfig windowConfig, EGLConfig contextConfig, bool compatible) const + { + OSWindow *osWindow = CreateOSWindow(); + ASSERT_TRUE(osWindow != nullptr); + osWindow->initialize("EGLContextCompatibilityTest", 500, 500); + osWindow->setVisible(true); + + EGLContext context = eglCreateContext(mDisplay, contextConfig, EGL_NO_CONTEXT, contextAttribs); + ASSERT_TRUE(context != EGL_NO_CONTEXT); + + EGLSurface window = eglCreateWindowSurface(mDisplay, windowConfig, osWindow->getNativeWindow(), nullptr); + ASSERT_EGL_SUCCESS(); + + if (compatible) + { + testClearSurface(window, context); + } + else + { + testMakeCurrentFails(window, context); + } + + eglDestroySurface(mDisplay, window); + ASSERT_EGL_SUCCESS(); + + eglDestroyContext(mDisplay, context); + ASSERT_EGL_SUCCESS(); + + SafeDelete(osWindow); + } + + void testPbufferCompatibility(EGLConfig pbufferConfig, EGLConfig contextConfig, bool compatible) const + { + EGLContext context = eglCreateContext(mDisplay, contextConfig, EGL_NO_CONTEXT, contextAttribs); + ASSERT_TRUE(context != EGL_NO_CONTEXT); + + const EGLint pBufferAttribs[] = + { + EGL_WIDTH, 500, + EGL_HEIGHT, 500, + EGL_NONE, + }; + EGLSurface pbuffer = eglCreatePbufferSurface(mDisplay, pbufferConfig, pBufferAttribs); + ASSERT_TRUE(pbuffer != EGL_NO_SURFACE); + + if (compatible) + { + testClearSurface(pbuffer, context); + } + else + { + testMakeCurrentFails(pbuffer, context); + } + + eglDestroySurface(mDisplay, pbuffer); + ASSERT_EGL_SUCCESS(); + + eglDestroyContext(mDisplay, context); + ASSERT_EGL_SUCCESS(); + } + + std::vector<EGLConfig> mConfigs; + EGLDisplay mDisplay; + + private: + void testClearSurface(EGLSurface surface, EGLContext context) const + { + eglMakeCurrent(mDisplay, surface, surface, context); + ASSERT_EGL_SUCCESS(); + + glViewport(0, 0, 500, 500); + glClearColor(0.0f, 0.0f, 1.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + ASSERT_GL_NO_ERROR(); + EXPECT_PIXEL_EQ(250, 250, 0, 0, 255, 255); + + eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + ASSERT_EGL_SUCCESS(); + } + + void testMakeCurrentFails(EGLSurface surface, EGLContext context) const + { + eglMakeCurrent(mDisplay, surface, surface, context); + EXPECT_EGL_ERROR(EGL_BAD_MATCH); + } +}; + +// The test is split in several subtest so that simple cases +// are tested separately. Also each surface types are not tested +// together. + +// Basic test checking contexts and windows created with the +// same config can render. +TEST_P(EGLContextCompatibilityTest, WindowSameConfig) +{ + for (size_t i = 0; i < mConfigs.size(); i++) + { + EGLConfig config = mConfigs[i]; + + EGLint surfaceType; + eglGetConfigAttrib(mDisplay, config, EGL_SURFACE_TYPE, &surfaceType); + ASSERT_EGL_SUCCESS(); + + if ((surfaceType & EGL_WINDOW_BIT) != 0) + { + testWindowCompatibility(config, config, true); + } + } +} + +// Basic test checking contexts and pbuffers created with the +// same config can render. +TEST_P(EGLContextCompatibilityTest, PbufferSameConfig) +{ + for (size_t i = 0; i < mConfigs.size(); i++) + { + EGLConfig config = mConfigs[i]; + + EGLint surfaceType; + eglGetConfigAttrib(mDisplay, config, EGL_SURFACE_TYPE, &surfaceType); + ASSERT_EGL_SUCCESS(); + + if ((surfaceType & EGL_PBUFFER_BIT) != 0) + { + testPbufferCompatibility(config, config, true); + } + } +} + +// Check that a context rendering to a window with a different +// config works or errors according to the EGL compatibility rules +TEST_P(EGLContextCompatibilityTest, WindowDifferentConfig) +{ + for (size_t i = 0; i < mConfigs.size(); i++) + { + EGLConfig config1 = mConfigs[i]; + EGLint surfaceType; + eglGetConfigAttrib(mDisplay, config1, EGL_SURFACE_TYPE, &surfaceType); + ASSERT_EGL_SUCCESS(); + + if ((surfaceType & EGL_WINDOW_BIT) == 0) + { + continue; + } + + for (size_t j = 0; j < mConfigs.size(); j++) + { + EGLConfig config2 = mConfigs[j]; + testWindowCompatibility(config1, config2, + areConfigsCompatible(config1, config2, EGL_WINDOW_BIT)); + } + } +} + +// Check that a context rendering to a pbuffer with a different +// config works or errors according to the EGL compatibility rules +TEST_P(EGLContextCompatibilityTest, PbufferDifferentConfig) +{ + for (size_t i = 0; i < mConfigs.size(); i++) + { + EGLConfig config1 = mConfigs[i]; + EGLint surfaceType; + eglGetConfigAttrib(mDisplay, config1, EGL_SURFACE_TYPE, &surfaceType); + ASSERT_EGL_SUCCESS(); + + if ((surfaceType & EGL_PBUFFER_BIT) == 0) + { + continue; + } + + for (size_t j = 0; j < mConfigs.size(); j++) + { + EGLConfig config2 = mConfigs[j]; + testPbufferCompatibility(config1, config2, areConfigsCompatible(config1, config2, EGL_PBUFFER_BIT)); + } + } +} + +ANGLE_INSTANTIATE_TEST(EGLContextCompatibilityTest, ES2_D3D9(), ES2_D3D11(), ES2_OPENGL()); diff --git a/gfx/angle/src/tests/egl_tests/EGLContextSharingTest.cpp b/gfx/angle/src/tests/egl_tests/EGLContextSharingTest.cpp new file mode 100755 index 000000000..fc66b7909 --- /dev/null +++ b/gfx/angle/src/tests/egl_tests/EGLContextSharingTest.cpp @@ -0,0 +1,87 @@ +// +// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// EGLContextSharingTest.cpp: +// Tests relating to shared Contexts. + +#include <gtest/gtest.h> + +#include <EGL/egl.h> +#include <EGL/eglext.h> + +#include "test_utils/ANGLETest.h" +#include "test_utils/angle_test_configs.h" + +using namespace angle; + +namespace +{ + +EGLBoolean SafeDestroyContext(EGLDisplay display, EGLContext &context) +{ + EGLBoolean result = EGL_TRUE; + if (context != EGL_NO_CONTEXT) + { + result = eglDestroyContext(display, context); + context = EGL_NO_CONTEXT; + } + return result; +} + +class EGLContextSharingTest : public ANGLETest +{ + public: + EGLContextSharingTest() : mContexts{EGL_NO_CONTEXT, EGL_NO_CONTEXT}, mTexture(0) {} + + void TearDown() override + { + glDeleteTextures(1, &mTexture); + + EGLDisplay display = getEGLWindow()->getDisplay(); + + if (display != EGL_NO_DISPLAY) + { + for (auto &context : mContexts) + { + SafeDestroyContext(display, context); + } + } + + ANGLETest::TearDown(); + } + + EGLContext mContexts[2]; + GLuint mTexture; +}; + +// Tests that creating resources works after freeing the share context. +TEST_P(EGLContextSharingTest, BindTextureAfterShareContextFree) +{ + EGLDisplay display = getEGLWindow()->getDisplay(); + EGLConfig config = getEGLWindow()->getConfig(); + EGLSurface surface = getEGLWindow()->getSurface(); + + const EGLint contextAttribs[] = {EGL_CONTEXT_CLIENT_VERSION, + getEGLWindow()->getClientMajorVersion(), EGL_NONE}; + + mContexts[0] = eglCreateContext(display, config, nullptr, contextAttribs); + ASSERT_EGL_SUCCESS(); + ASSERT_TRUE(mContexts[0] != EGL_NO_CONTEXT); + mContexts[1] = eglCreateContext(display, config, mContexts[1], contextAttribs); + ASSERT_EGL_SUCCESS(); + ASSERT_TRUE(mContexts[1] != EGL_NO_CONTEXT); + + ASSERT_EGL_TRUE(SafeDestroyContext(display, mContexts[0])); + ASSERT_EGL_TRUE(eglMakeCurrent(display, surface, surface, mContexts[1])); + ASSERT_EGL_SUCCESS(); + + glGenTextures(1, &mTexture); + glBindTexture(GL_TEXTURE_2D, mTexture); + ASSERT_GL_NO_ERROR(); +} + +} // anonymous namespace + +ANGLE_INSTANTIATE_TEST(EGLContextSharingTest, ES2_D3D9(), ES2_D3D11(), ES2_OPENGL()); diff --git a/gfx/angle/src/tests/egl_tests/EGLDeviceTest.cpp b/gfx/angle/src/tests/egl_tests/EGLDeviceTest.cpp new file mode 100755 index 000000000..721754181 --- /dev/null +++ b/gfx/angle/src/tests/egl_tests/EGLDeviceTest.cpp @@ -0,0 +1,587 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#ifndef ANGLE_ENABLE_D3D9 +#define ANGLE_ENABLE_D3D9 +#endif + +#ifndef ANGLE_ENABLE_D3D11 +#define ANGLE_ENABLE_D3D11 +#endif + +#include <d3d11.h> + +#include "com_utils.h" +#include "OSWindow.h" +#include "test_utils/ANGLETest.h" + +using namespace angle; + +class EGLDeviceCreationTest : public testing::Test +{ + protected: + EGLDeviceCreationTest() + : mD3D11Available(false), + mD3D11Module(nullptr), + mD3D11CreateDevice(nullptr), + mDevice(nullptr), + mDeviceContext(nullptr), + mDeviceCreationD3D11ExtAvailable(false), + mOSWindow(nullptr), + mDisplay(EGL_NO_DISPLAY), + mSurface(EGL_NO_SURFACE), + mContext(EGL_NO_CONTEXT), + mConfig(0) + { + } + + void SetUp() override + { + mD3D11Module = LoadLibrary(TEXT("d3d11.dll")); + if (mD3D11Module == nullptr) + { + std::cout << "Unable to LoadLibrary D3D11" << std::endl; + return; + } + + mD3D11CreateDevice = reinterpret_cast<PFN_D3D11_CREATE_DEVICE>( + GetProcAddress(mD3D11Module, "D3D11CreateDevice")); + if (mD3D11CreateDevice == nullptr) + { + std::cout << "Could not retrieve D3D11CreateDevice from d3d11.dll" << std::endl; + return; + } + + mD3D11Available = true; + + const char *extensionString = + static_cast<const char *>(eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS)); + if (strstr(extensionString, "EGL_ANGLE_device_creation")) + { + if (strstr(extensionString, "EGL_ANGLE_device_creation_d3d11")) + { + mDeviceCreationD3D11ExtAvailable = true; + } + } + } + + void TearDown() override + { + SafeRelease(mDevice); + SafeRelease(mDeviceContext); + + SafeDelete(mOSWindow); + + if (mSurface != EGL_NO_SURFACE) + { + eglDestroySurface(mDisplay, mSurface); + mSurface = EGL_NO_SURFACE; + } + + if (mContext != EGL_NO_CONTEXT) + { + eglDestroyContext(mDisplay, mContext); + mContext = EGL_NO_CONTEXT; + } + + if (mDisplay != EGL_NO_DISPLAY) + { + eglTerminate(mDisplay); + mDisplay = EGL_NO_DISPLAY; + } + } + + void CreateD3D11Device() + { + ASSERT_TRUE(mD3D11Available); + ASSERT_EQ(nullptr, mDevice); // The device shouldn't be created twice + + HRESULT hr = + mD3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, 0, 0, nullptr, 0, + D3D11_SDK_VERSION, &mDevice, &mFeatureLevel, &mDeviceContext); + + ASSERT_TRUE(SUCCEEDED(hr)); + ASSERT_GE(mFeatureLevel, D3D_FEATURE_LEVEL_9_3); + } + + void CreateD3D11FL9_3Device() + { + ASSERT_TRUE(mD3D11Available); + ASSERT_EQ(nullptr, mDevice); + + D3D_FEATURE_LEVEL fl93 = D3D_FEATURE_LEVEL_9_3; + + HRESULT hr = + mD3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, 0, 0, &fl93, 1, D3D11_SDK_VERSION, + &mDevice, &mFeatureLevel, &mDeviceContext); + + ASSERT_TRUE(SUCCEEDED(hr)); + } + + void CreateWindowSurface() + { + EGLint majorVersion, minorVersion; + ASSERT_EGL_TRUE(eglInitialize(mDisplay, &majorVersion, &minorVersion)); + + eglBindAPI(EGL_OPENGL_ES_API); + ASSERT_EGL_SUCCESS(); + + // Choose a config + const EGLint configAttributes[] = {EGL_NONE}; + EGLint configCount = 0; + ASSERT_EGL_TRUE(eglChooseConfig(mDisplay, configAttributes, &mConfig, 1, &configCount)); + + // Create an OS Window + mOSWindow = CreateOSWindow(); + mOSWindow->initialize("EGLSurfaceTest", 64, 64); + + // Create window surface + mSurface = eglCreateWindowSurface(mDisplay, mConfig, mOSWindow->getNativeWindow(), nullptr); + ASSERT_EGL_SUCCESS(); + + // Create EGL context + EGLint contextAttibutes[] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE}; + mContext = eglCreateContext(mDisplay, mConfig, nullptr, contextAttibutes); + ASSERT_EGL_SUCCESS(); + + // Make the surface current + eglMakeCurrent(mDisplay, mSurface, mSurface, mContext); + ASSERT_EGL_SUCCESS(); + } + + // This triggers a D3D device lost on current Windows systems + // This behavior could potentially change in the future + void trigger9_3DeviceLost() + { + ID3D11Buffer *gsBuffer = nullptr; + D3D11_BUFFER_DESC bufferDesc = {0}; + bufferDesc.ByteWidth = 64; + bufferDesc.Usage = D3D11_USAGE_DEFAULT; + bufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; + + HRESULT result = mDevice->CreateBuffer(&bufferDesc, nullptr, &gsBuffer); + ASSERT_TRUE(SUCCEEDED(result)); + + mDeviceContext->GSSetConstantBuffers(0, 1, &gsBuffer); + SafeRelease(gsBuffer); + gsBuffer = nullptr; + + result = mDevice->GetDeviceRemovedReason(); + ASSERT_TRUE(FAILED(result)); + } + + bool mD3D11Available; + HMODULE mD3D11Module; + PFN_D3D11_CREATE_DEVICE mD3D11CreateDevice; + + ID3D11Device *mDevice; + ID3D11DeviceContext *mDeviceContext; + D3D_FEATURE_LEVEL mFeatureLevel; + + bool mDeviceCreationD3D11ExtAvailable; + + OSWindow *mOSWindow; + + EGLDisplay mDisplay; + EGLSurface mSurface; + EGLContext mContext; + EGLConfig mConfig; +}; + +// Test that creating a EGLDeviceEXT from D3D11 device works, and it can be queried to retrieve +// D3D11 device +TEST_F(EGLDeviceCreationTest, BasicD3D11Device) +{ + if (!mDeviceCreationD3D11ExtAvailable || !mD3D11Available) + { + std::cout << "EGLDevice creation and/or D3D11 not available, skipping test" << std::endl; + return; + } + + CreateD3D11Device(); + + EGLDeviceEXT eglDevice = + eglCreateDeviceANGLE(EGL_D3D11_DEVICE_ANGLE, reinterpret_cast<void *>(mDevice), nullptr); + ASSERT_NE(EGL_NO_DEVICE_EXT, eglDevice); + ASSERT_EGL_SUCCESS(); + + EGLAttrib deviceAttrib; + eglQueryDeviceAttribEXT(eglDevice, EGL_D3D11_DEVICE_ANGLE, &deviceAttrib); + ASSERT_EGL_SUCCESS(); + + ID3D11Device *queriedDevice = reinterpret_cast<ID3D11Device *>(deviceAttrib); + ASSERT_EQ(mFeatureLevel, queriedDevice->GetFeatureLevel()); + + eglReleaseDeviceANGLE(eglDevice); +} + +// Test that creating a EGLDeviceEXT from D3D11 device works, and it can be queried to retrieve +// D3D11 device +TEST_F(EGLDeviceCreationTest, BasicD3D11DeviceViaFuncPointer) +{ + if (!mDeviceCreationD3D11ExtAvailable || !mD3D11Available) + { + std::cout << "EGLDevice creation and/or D3D11 not available, skipping test" << std::endl; + return; + } + + CreateD3D11Device(); + + PFNEGLCREATEDEVICEANGLEPROC createDeviceANGLE = + (PFNEGLCREATEDEVICEANGLEPROC)eglGetProcAddress("eglCreateDeviceANGLE"); + PFNEGLRELEASEDEVICEANGLEPROC releaseDeviceANGLE = + (PFNEGLRELEASEDEVICEANGLEPROC)eglGetProcAddress("eglReleaseDeviceANGLE"); + + EGLDeviceEXT eglDevice = + createDeviceANGLE(EGL_D3D11_DEVICE_ANGLE, reinterpret_cast<void *>(mDevice), nullptr); + ASSERT_NE(EGL_NO_DEVICE_EXT, eglDevice); + ASSERT_EGL_SUCCESS(); + + EGLAttrib deviceAttrib; + eglQueryDeviceAttribEXT(eglDevice, EGL_D3D11_DEVICE_ANGLE, &deviceAttrib); + ASSERT_EGL_SUCCESS(); + + ID3D11Device *queriedDevice = reinterpret_cast<ID3D11Device *>(deviceAttrib); + ASSERT_EQ(mFeatureLevel, queriedDevice->GetFeatureLevel()); + + releaseDeviceANGLE(eglDevice); +} + +// Test that creating a EGLDeviceEXT from D3D11 device works, and can be used for rendering +TEST_F(EGLDeviceCreationTest, RenderingUsingD3D11Device) +{ + if (!mD3D11Available) + { + std::cout << "D3D11 not available, skipping test" << std::endl; + return; + } + + CreateD3D11Device(); + + EGLDeviceEXT eglDevice = + eglCreateDeviceANGLE(EGL_D3D11_DEVICE_ANGLE, reinterpret_cast<void *>(mDevice), nullptr); + ASSERT_EGL_SUCCESS(); + + // Create an EGLDisplay using the EGLDevice + mDisplay = eglGetPlatformDisplayEXT(EGL_PLATFORM_DEVICE_EXT, eglDevice, nullptr); + ASSERT_NE(EGL_NO_DISPLAY, mDisplay); + + // Create a surface using the display + CreateWindowSurface(); + + // Perform some very basic rendering + glClearColor(1.0f, 0.0f, 1.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + EXPECT_PIXEL_EQ(32, 32, 255, 0, 255, 255); + + // Note that we must call TearDown() before we release the EGL device, since the display + // depends on the device + TearDown(); + + eglReleaseDeviceANGLE(eglDevice); +} + +// Test that ANGLE doesn't try to recreate a D3D11 device if the inputted one is lost +TEST_F(EGLDeviceCreationTest, D3D11DeviceRecovery) +{ + if (!mD3D11Available) + { + std::cout << "D3D11 not available, skipping test" << std::endl; + return; + } + + // Force Feature Level 9_3 so we can easily trigger a device lost later + CreateD3D11FL9_3Device(); + + EGLDeviceEXT eglDevice = + eglCreateDeviceANGLE(EGL_D3D11_DEVICE_ANGLE, reinterpret_cast<void *>(mDevice), nullptr); + ASSERT_EGL_SUCCESS(); + + // Create an EGLDisplay using the EGLDevice + mDisplay = eglGetPlatformDisplayEXT(EGL_PLATFORM_DEVICE_EXT, eglDevice, nullptr); + ASSERT_TRUE(mDisplay != EGL_NO_DISPLAY); + + // Create a surface using the display + CreateWindowSurface(); + + // Perform some very basic rendering + glClearColor(1.0f, 0.0f, 1.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + EXPECT_PIXEL_EQ(32, 32, 255, 0, 255, 255); + ASSERT_GL_NO_ERROR(); + + // ANGLE's SwapChain11::initPassThroughResources doesn't handle device lost before + // eglSwapBuffers, so we must call eglSwapBuffers before we lose the device. + ASSERT_EGL_TRUE(eglSwapBuffers(mDisplay, mSurface)); + + // Trigger a lost device + trigger9_3DeviceLost(); + + // Destroy the old EGL Window Surface + if (mSurface != EGL_NO_SURFACE) + { + eglDestroySurface(mDisplay, mSurface); + mSurface = EGL_NO_SURFACE; + } + + // Try to create a new window surface. In certain configurations this will recreate the D3D11 + // device. We want to test that it doesn't recreate the D3D11 device when EGLDeviceEXT is + // used. The window surface creation should fail if a new D3D11 device isn't created. + mSurface = eglCreateWindowSurface(mDisplay, mConfig, mOSWindow->getNativeWindow(), nullptr); + ASSERT_EQ(EGL_NO_SURFACE, mSurface); + ASSERT_EGL_ERROR(EGL_BAD_ALLOC); + + // Get the D3D11 device out of the EGLDisplay again. It should be the same one as above. + EGLAttrib device = 0; + EGLAttrib newEglDevice = 0; + ASSERT_EGL_TRUE(eglQueryDisplayAttribEXT(mDisplay, EGL_DEVICE_EXT, &newEglDevice)); + ASSERT_EGL_TRUE(eglQueryDeviceAttribEXT(reinterpret_cast<EGLDeviceEXT>(newEglDevice), + EGL_D3D11_DEVICE_ANGLE, &device)); + ID3D11Device *newDevice = reinterpret_cast<ID3D11Device *>(device); + + ASSERT_EQ(reinterpret_cast<EGLDeviceEXT>(newEglDevice), eglDevice); + ASSERT_EQ(newDevice, mDevice); + + // Note that we must call TearDown() before we release the EGL device, since the display + // depends on the device + TearDown(); + + eglReleaseDeviceANGLE(eglDevice); +} + +// Test that calling eglGetPlatformDisplayEXT with the same device returns the same display +TEST_F(EGLDeviceCreationTest, getPlatformDisplayTwice) +{ + if (!mD3D11Available) + { + std::cout << "D3D11 not available, skipping test" << std::endl; + return; + } + + CreateD3D11Device(); + + EGLDeviceEXT eglDevice = + eglCreateDeviceANGLE(EGL_D3D11_DEVICE_ANGLE, reinterpret_cast<void *>(mDevice), nullptr); + ASSERT_EGL_SUCCESS(); + + // Create an EGLDisplay using the EGLDevice + EGLDisplay display1 = eglGetPlatformDisplayEXT(EGL_PLATFORM_DEVICE_EXT, eglDevice, nullptr); + ASSERT_NE(EGL_NO_DISPLAY, display1); + + EGLDisplay display2 = eglGetPlatformDisplayEXT(EGL_PLATFORM_DEVICE_EXT, eglDevice, nullptr); + ASSERT_NE(EGL_NO_DISPLAY, display2); + + ASSERT_EQ(display1, display2); + + eglTerminate(display1); + eglReleaseDeviceANGLE(eglDevice); +} + +// Test that creating a EGLDeviceEXT from an invalid D3D11 device fails +TEST_F(EGLDeviceCreationTest, InvalidD3D11Device) +{ + if (!mDeviceCreationD3D11ExtAvailable || !mD3D11Available) + { + std::cout << "EGLDevice creation and/or D3D11 not available, skipping test" << std::endl; + return; + } + + CreateD3D11Device(); + + // Use mDeviceContext instead of mDevice + EGLDeviceEXT eglDevice = eglCreateDeviceANGLE( + EGL_D3D11_DEVICE_ANGLE, reinterpret_cast<void *>(mDeviceContext), nullptr); + EXPECT_EQ(EGL_NO_DEVICE_EXT, eglDevice); + EXPECT_EGL_ERROR(EGL_BAD_ATTRIBUTE); +} + +// Test that EGLDeviceEXT holds a ref to the D3D11 device +TEST_F(EGLDeviceCreationTest, D3D11DeviceReferenceCounting) +{ + if (!mDeviceCreationD3D11ExtAvailable || !mD3D11Available) + { + std::cout << "EGLDevice creation and/or D3D11 not available, skipping test" << std::endl; + return; + } + + CreateD3D11Device(); + + EGLDeviceEXT eglDevice = + eglCreateDeviceANGLE(EGL_D3D11_DEVICE_ANGLE, reinterpret_cast<void *>(mDevice), nullptr); + ASSERT_NE(EGL_NO_DEVICE_EXT, eglDevice); + ASSERT_EGL_SUCCESS(); + + // Now release our D3D11 device/context + SafeRelease(mDevice); + SafeRelease(mDeviceContext); + + EGLAttrib deviceAttrib; + eglQueryDeviceAttribEXT(eglDevice, EGL_D3D11_DEVICE_ANGLE, &deviceAttrib); + ASSERT_EGL_SUCCESS(); + + ID3D11Device *queriedDevice = reinterpret_cast<ID3D11Device *>(deviceAttrib); + ASSERT_EQ(mFeatureLevel, queriedDevice->GetFeatureLevel()); + + eglReleaseDeviceANGLE(eglDevice); +} + +// Test that creating a EGLDeviceEXT from a D3D9 device fails +TEST_F(EGLDeviceCreationTest, AnyD3D9Device) +{ + if (!mDeviceCreationD3D11ExtAvailable) + { + std::cout << "EGLDevice creation not available, skipping test" << std::endl; + return; + } + + std::string fakeD3DDevice = "This is a string, not a D3D device"; + + EGLDeviceEXT eglDevice = eglCreateDeviceANGLE( + EGL_D3D9_DEVICE_ANGLE, reinterpret_cast<void *>(&fakeD3DDevice), nullptr); + EXPECT_EQ(EGL_NO_DEVICE_EXT, eglDevice); + EXPECT_EGL_ERROR(EGL_BAD_ATTRIBUTE); +} + +class EGLDeviceQueryTest : public ANGLETest +{ + protected: + EGLDeviceQueryTest() + { + mQueryDisplayAttribEXT = nullptr; + mQueryDeviceAttribEXT = nullptr; + mQueryDeviceStringEXT = nullptr; + } + + void SetUp() override + { + ANGLETest::SetUp(); + + const char *extensionString = + static_cast<const char *>(eglQueryString(getEGLWindow()->getDisplay(), EGL_EXTENSIONS)); + if (strstr(extensionString, "EGL_EXT_device_query")) + { + mQueryDisplayAttribEXT = + (PFNEGLQUERYDISPLAYATTRIBEXTPROC)eglGetProcAddress("eglQueryDisplayAttribEXT"); + mQueryDeviceAttribEXT = + (PFNEGLQUERYDEVICEATTRIBEXTPROC)eglGetProcAddress("eglQueryDeviceAttribEXT"); + mQueryDeviceStringEXT = + (PFNEGLQUERYDEVICESTRINGEXTPROC)eglGetProcAddress("eglQueryDeviceStringEXT"); + } + + if (!mQueryDeviceStringEXT) + { + FAIL() << "ANGLE extension EGL_EXT_device_query export eglQueryDeviceStringEXT was not " + "found"; + } + + if (!mQueryDisplayAttribEXT) + { + FAIL() << "ANGLE extension EGL_EXT_device_query export eglQueryDisplayAttribEXT was " + "not found"; + } + + if (!mQueryDeviceAttribEXT) + { + FAIL() << "ANGLE extension EGL_EXT_device_query export eglQueryDeviceAttribEXT was not " + "found"; + } + + EGLAttrib angleDevice = 0; + EXPECT_EGL_TRUE( + mQueryDisplayAttribEXT(getEGLWindow()->getDisplay(), EGL_DEVICE_EXT, &angleDevice)); + extensionString = static_cast<const char *>( + mQueryDeviceStringEXT(reinterpret_cast<EGLDeviceEXT>(angleDevice), EGL_EXTENSIONS)); + if (strstr(extensionString, "EGL_ANGLE_device_d3d") == NULL) + { + FAIL() << "ANGLE extension EGL_ANGLE_device_d3d was not found"; + } + } + + void TearDown() override { ANGLETest::TearDown(); } + + PFNEGLQUERYDISPLAYATTRIBEXTPROC mQueryDisplayAttribEXT; + PFNEGLQUERYDEVICEATTRIBEXTPROC mQueryDeviceAttribEXT; + PFNEGLQUERYDEVICESTRINGEXTPROC mQueryDeviceStringEXT; +}; + +// This test attempts to obtain a D3D11 device and a D3D9 device using the eglQueryDeviceAttribEXT +// function. +// If the test is configured to use D3D11 then it should succeed to obtain a D3D11 device. +// If the test is confitured to use D3D9, then it should succeed to obtain a D3D9 device. +TEST_P(EGLDeviceQueryTest, QueryDevice) +{ + EGLAttrib device = 0; + EGLAttrib angleDevice = 0; + if (getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE) + { + EXPECT_EGL_TRUE( + mQueryDisplayAttribEXT(getEGLWindow()->getDisplay(), EGL_DEVICE_EXT, &angleDevice)); + EXPECT_EGL_TRUE(mQueryDeviceAttribEXT(reinterpret_cast<EGLDeviceEXT>(angleDevice), + EGL_D3D11_DEVICE_ANGLE, &device)); + ID3D11Device *d3d11Device = reinterpret_cast<ID3D11Device *>(device); + IDXGIDevice *dxgiDevice = DynamicCastComObject<IDXGIDevice>(d3d11Device); + EXPECT_TRUE(dxgiDevice != nullptr); + SafeRelease(dxgiDevice); + } + + if (getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE) + { + EXPECT_EGL_TRUE( + mQueryDisplayAttribEXT(getEGLWindow()->getDisplay(), EGL_DEVICE_EXT, &angleDevice)); + EXPECT_EGL_TRUE(mQueryDeviceAttribEXT(reinterpret_cast<EGLDeviceEXT>(angleDevice), + EGL_D3D9_DEVICE_ANGLE, &device)); + IDirect3DDevice9 *d3d9Device = reinterpret_cast<IDirect3DDevice9 *>(device); + IDirect3D9 *d3d9 = nullptr; + EXPECT_EQ(S_OK, d3d9Device->GetDirect3D(&d3d9)); + EXPECT_TRUE(d3d9 != nullptr); + SafeRelease(d3d9); + } +} + +// This test attempts to obtain a D3D11 device from a D3D9 configured system and a D3D9 device from +// a D3D11 configured system using the eglQueryDeviceAttribEXT function. +// If the test is configured to use D3D11 then it should fail to obtain a D3D11 device. +// If the test is confitured to use D3D9, then it should fail to obtain a D3D9 device. +TEST_P(EGLDeviceQueryTest, QueryDeviceBadAttribute) +{ + EGLAttrib device = 0; + EGLAttrib angleDevice = 0; + if (getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE) + { + EXPECT_EGL_TRUE( + mQueryDisplayAttribEXT(getEGLWindow()->getDisplay(), EGL_DEVICE_EXT, &angleDevice)); + EXPECT_EGL_FALSE(mQueryDeviceAttribEXT(reinterpret_cast<EGLDeviceEXT>(angleDevice), + EGL_D3D9_DEVICE_ANGLE, &device)); + } + + if (getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE) + { + EXPECT_EGL_TRUE( + mQueryDisplayAttribEXT(getEGLWindow()->getDisplay(), EGL_DEVICE_EXT, &angleDevice)); + EXPECT_EGL_FALSE(mQueryDeviceAttribEXT(reinterpret_cast<EGLDeviceEXT>(angleDevice), + EGL_D3D11_DEVICE_ANGLE, &device)); + } +} + +// Ensure that: +// - calling getPlatformDisplayEXT using ANGLE_Platform with some parameters +// - extracting the EGLDeviceEXT from the EGLDisplay +// - calling getPlatformDisplayEXT with this EGLDeviceEXT +// results in the same EGLDisplay being returned from getPlatformDisplayEXT both times +TEST_P(EGLDeviceQueryTest, getPlatformDisplayDeviceReuse) +{ + EGLAttrib eglDevice = 0; + EXPECT_EGL_TRUE( + eglQueryDisplayAttribEXT(getEGLWindow()->getDisplay(), EGL_DEVICE_EXT, &eglDevice)); + + EGLDisplay display2 = eglGetPlatformDisplayEXT( + EGL_PLATFORM_DEVICE_EXT, reinterpret_cast<EGLDeviceEXT>(eglDevice), nullptr); + EXPECT_EQ(getEGLWindow()->getDisplay(), display2); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these +// tests should be run against. +ANGLE_INSTANTIATE_TEST(EGLDeviceQueryTest, ES2_D3D9(), ES2_D3D11()); diff --git a/gfx/angle/src/tests/egl_tests/EGLPresentPathD3D11Test.cpp b/gfx/angle/src/tests/egl_tests/EGLPresentPathD3D11Test.cpp new file mode 100755 index 000000000..c73c7c4ff --- /dev/null +++ b/gfx/angle/src/tests/egl_tests/EGLPresentPathD3D11Test.cpp @@ -0,0 +1,378 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "test_utils/ANGLETest.h" + +#include <cstdint> +#include "com_utils.h" +#include "OSWindow.h" +#include <d3d11.h> + +using namespace angle; + +class EGLPresentPathD3D11 : public testing::TestWithParam<PlatformParameters> +{ + protected: + EGLPresentPathD3D11() + : mDisplay(EGL_NO_DISPLAY), + mContext(EGL_NO_CONTEXT), + mSurface(EGL_NO_SURFACE), + mOffscreenSurfaceD3D11Texture(nullptr), + mConfig(0), + mOSWindow(nullptr), + mWindowWidth(0) + { + } + + void SetUp() override + { + mOSWindow = CreateOSWindow(); + mWindowWidth = 64; + mOSWindow->initialize("EGLPresentPathD3D11", mWindowWidth, mWindowWidth); + } + + void initializeEGL(bool usePresentPathFast) + { + int clientVersion = GetParam().majorVersion; + + const char *extensionString = + static_cast<const char *>(eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS)); + ASSERT_NE(nullptr, strstr(extensionString, "EGL_ANGLE_experimental_present_path")); + + PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT = + reinterpret_cast<PFNEGLGETPLATFORMDISPLAYEXTPROC>( + eglGetProcAddress("eglGetPlatformDisplayEXT")); + ASSERT_NE(nullptr, eglGetPlatformDisplayEXT); + + // Set up EGL Display + EGLint displayAttribs[] = { + EGL_PLATFORM_ANGLE_TYPE_ANGLE, GetParam().getRenderer(), + EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE, GetParam().eglParameters.majorVersion, + EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE, GetParam().eglParameters.majorVersion, + EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE, + usePresentPathFast ? EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE + : EGL_EXPERIMENTAL_PRESENT_PATH_COPY_ANGLE, + EGL_NONE}; + mDisplay = + eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, EGL_DEFAULT_DISPLAY, displayAttribs); + ASSERT_TRUE(EGL_NO_DISPLAY != mDisplay); + ASSERT_EGL_TRUE(eglInitialize(mDisplay, NULL, NULL)); + + // Choose the EGL config + EGLint numConfigs; + EGLint configAttribs[] = {EGL_RED_SIZE, + 8, + EGL_GREEN_SIZE, + 8, + EGL_BLUE_SIZE, + 8, + EGL_ALPHA_SIZE, + 8, + EGL_RENDERABLE_TYPE, + clientVersion == 3 ? EGL_OPENGL_ES3_BIT : EGL_OPENGL_ES2_BIT, + EGL_SURFACE_TYPE, + EGL_PBUFFER_BIT, + EGL_NONE}; + ASSERT_EGL_TRUE(eglChooseConfig(mDisplay, configAttribs, &mConfig, 1, &numConfigs)); + ASSERT_EQ(1, numConfigs); + + // Set up the EGL context + EGLint contextAttribs[] = {EGL_CONTEXT_CLIENT_VERSION, clientVersion, EGL_NONE}; + mContext = eglCreateContext(mDisplay, mConfig, NULL, contextAttribs); + ASSERT_TRUE(EGL_NO_CONTEXT != mContext); + } + + void createWindowSurface() + { + mSurface = eglCreateWindowSurface(mDisplay, mConfig, mOSWindow->getNativeWindow(), nullptr); + } + + void createPbufferFromClientBufferSurface() + { + EGLAttrib device = 0; + EGLAttrib angleDevice = 0; + + PFNEGLQUERYDISPLAYATTRIBEXTPROC queryDisplayAttribEXT; + PFNEGLQUERYDEVICEATTRIBEXTPROC queryDeviceAttribEXT; + + const char *extensionString = + static_cast<const char *>(eglQueryString(mDisplay, EGL_EXTENSIONS)); + EXPECT_TRUE(strstr(extensionString, "EGL_EXT_device_query")); + + queryDisplayAttribEXT = + (PFNEGLQUERYDISPLAYATTRIBEXTPROC)eglGetProcAddress("eglQueryDisplayAttribEXT"); + queryDeviceAttribEXT = + (PFNEGLQUERYDEVICEATTRIBEXTPROC)eglGetProcAddress("eglQueryDeviceAttribEXT"); + ASSERT_NE(nullptr, queryDisplayAttribEXT); + ASSERT_NE(nullptr, queryDeviceAttribEXT); + + ASSERT_EGL_TRUE(queryDisplayAttribEXT(mDisplay, EGL_DEVICE_EXT, &angleDevice)); + ASSERT_EGL_TRUE(queryDeviceAttribEXT(reinterpret_cast<EGLDeviceEXT>(angleDevice), + EGL_D3D11_DEVICE_ANGLE, &device)); + ID3D11Device *d3d11Device = reinterpret_cast<ID3D11Device *>(device); + + D3D11_TEXTURE2D_DESC textureDesc = {0}; + textureDesc.Width = mWindowWidth; + textureDesc.Height = mWindowWidth; + textureDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; + textureDesc.MipLevels = 1; + textureDesc.ArraySize = 1; + textureDesc.SampleDesc.Count = 1; + textureDesc.SampleDesc.Quality = 0; + textureDesc.Usage = D3D11_USAGE_DEFAULT; + textureDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE; + textureDesc.CPUAccessFlags = 0; + textureDesc.MiscFlags = D3D11_RESOURCE_MISC_SHARED; + + ASSERT_TRUE(SUCCEEDED( + d3d11Device->CreateTexture2D(&textureDesc, nullptr, &mOffscreenSurfaceD3D11Texture))); + + IDXGIResource *dxgiResource = + DynamicCastComObject<IDXGIResource>(mOffscreenSurfaceD3D11Texture); + ASSERT_NE(nullptr, dxgiResource); + + HANDLE sharedHandle = 0; + ASSERT_TRUE(SUCCEEDED(dxgiResource->GetSharedHandle(&sharedHandle))); + SafeRelease(dxgiResource); + + EGLint pBufferAttributes[] = {EGL_WIDTH, mWindowWidth, EGL_HEIGHT, + mWindowWidth, EGL_TEXTURE_TARGET, EGL_TEXTURE_2D, + EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGBA, EGL_NONE}; + + mSurface = eglCreatePbufferFromClientBuffer(mDisplay, EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE, + sharedHandle, mConfig, pBufferAttributes); + ASSERT_TRUE(EGL_NO_SURFACE != mSurface); + } + + void makeCurrent() { ASSERT_EGL_TRUE(eglMakeCurrent(mDisplay, mSurface, mSurface, mContext)); } + + void TearDown() override + { + SafeRelease(mOffscreenSurfaceD3D11Texture); + + if (mDisplay != EGL_NO_DISPLAY) + { + eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + + if (mSurface != EGL_NO_SURFACE) + { + eglDestroySurface(mDisplay, mSurface); + mSurface = EGL_NO_SURFACE; + } + + if (mContext != EGL_NO_CONTEXT) + { + eglDestroyContext(mDisplay, mContext); + mContext = EGL_NO_CONTEXT; + } + + eglTerminate(mDisplay); + mDisplay = EGL_NO_DISPLAY; + } + + mOSWindow->destroy(); + SafeDelete(mOSWindow); + } + + void drawQuadUsingGL() + { + GLuint m2DProgram; + GLint mTexture2DUniformLocation; + + const std::string vertexShaderSource = + SHADER_SOURCE(precision highp float; attribute vec4 position; varying vec2 texcoord; + + void main() + { + gl_Position = vec4(position.xy, 0.0, 1.0); + texcoord = (position.xy * 0.5) + 0.5; + }); + + const std::string fragmentShaderSource2D = + SHADER_SOURCE(precision highp float; uniform sampler2D tex; varying vec2 texcoord; + + void main() + { + gl_FragColor = texture2D(tex, texcoord); + }); + + m2DProgram = CompileProgram(vertexShaderSource, fragmentShaderSource2D); + mTexture2DUniformLocation = glGetUniformLocation(m2DProgram, "tex"); + + uint8_t textureInitData[16] = { + 255, 0, 0, 255, // Red + 0, 255, 0, 255, // Green + 0, 0, 255, 255, // Blue + 255, 255, 0, 255 // Red + Green + }; + + // Create a simple RGBA texture + GLuint tex = 0; + glGenTextures(1, &tex); + glBindTexture(GL_TEXTURE_2D, tex); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, + textureInitData); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + ASSERT_GL_NO_ERROR(); + + // Draw a quad using the texture + glClear(GL_COLOR_BUFFER_BIT); + glUseProgram(m2DProgram); + glUniform1i(mTexture2DUniformLocation, 0); + + GLint positionLocation = glGetAttribLocation(m2DProgram, "position"); + glUseProgram(m2DProgram); + const GLfloat vertices[] = + { + -1.0f, 1.0f, 0.5f, + -1.0f, -1.0f, 0.5f, + 1.0f, -1.0f, 0.5f, + -1.0f, 1.0f, 0.5f, + 1.0f, -1.0f, 0.5f, + 1.0f, 1.0f, 0.5f, + }; + + glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, vertices); + glEnableVertexAttribArray(positionLocation); + + glDrawArrays(GL_TRIANGLES, 0, 6); + ASSERT_GL_NO_ERROR(); + + glDeleteProgram(m2DProgram); + } + + void checkPixelsUsingGL() + { + // Note that the texture is in BGRA format + EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255); // Red + EXPECT_PIXEL_EQ(mWindowWidth - 1, 0, 0, 255, 0, 255); // Green + EXPECT_PIXEL_EQ(0, mWindowWidth - 1, 0, 0, 255, 255); // Blue + EXPECT_PIXEL_EQ(mWindowWidth - 1, mWindowWidth - 1, 255, 255, 0, 255); // Red + green + } + + void checkPixelsUsingD3D(bool usingPresentPathFast) + { + ASSERT_NE(nullptr, mOffscreenSurfaceD3D11Texture); + + D3D11_TEXTURE2D_DESC textureDesc = {0}; + ID3D11Device *device; + ID3D11DeviceContext *context; + mOffscreenSurfaceD3D11Texture->GetDesc(&textureDesc); + mOffscreenSurfaceD3D11Texture->GetDevice(&device); + device->GetImmediateContext(&context); + ASSERT_NE(nullptr, device); + ASSERT_NE(nullptr, context); + + textureDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; + textureDesc.Usage = D3D11_USAGE_STAGING; + textureDesc.BindFlags = 0; + textureDesc.MiscFlags = 0; + ID3D11Texture2D *cpuTexture = nullptr; + ASSERT_TRUE(SUCCEEDED(device->CreateTexture2D(&textureDesc, nullptr, &cpuTexture))); + + context->CopyResource(cpuTexture, mOffscreenSurfaceD3D11Texture); + + D3D11_MAPPED_SUBRESOURCE mappedSubresource; + context->Map(cpuTexture, 0, D3D11_MAP_READ, 0, &mappedSubresource); + ASSERT_EQ(static_cast<UINT>(mWindowWidth * 4), mappedSubresource.RowPitch); + ASSERT_EQ(static_cast<UINT>(mWindowWidth * mWindowWidth * 4), mappedSubresource.DepthPitch); + + angle::GLColor *byteData = reinterpret_cast<angle::GLColor *>(mappedSubresource.pData); + + // Note that the texture is in BGRA format, although the GLColor struct is RGBA + GLColor expectedTopLeftPixel = GLColor(0, 0, 255, 255); // Red + GLColor expectedTopRightPixel = GLColor(0, 255, 0, 255); // Green + GLColor expectedBottomLeftPixel = GLColor(255, 0, 0, 255); // Blue + GLColor expectedBottomRightPixel = GLColor(0, 255, 255, 255); // Red + Green + + if (usingPresentPathFast) + { + // Invert the expected values + GLColor tempTopLeft = expectedTopLeftPixel; + GLColor tempTopRight = expectedTopRightPixel; + expectedTopLeftPixel = expectedBottomLeftPixel; + expectedTopRightPixel = expectedBottomRightPixel; + expectedBottomLeftPixel = tempTopLeft; + expectedBottomRightPixel = tempTopRight; + } + + EXPECT_EQ(expectedTopLeftPixel, byteData[0]); + EXPECT_EQ(expectedTopRightPixel, byteData[(mWindowWidth - 1)]); + EXPECT_EQ(expectedBottomLeftPixel, byteData[(mWindowWidth - 1) * mWindowWidth]); + EXPECT_EQ(expectedBottomRightPixel, + byteData[(mWindowWidth - 1) * mWindowWidth + (mWindowWidth - 1)]); + + context->Unmap(cpuTexture, 0); + SafeRelease(cpuTexture); + SafeRelease(device); + SafeRelease(context); + } + + EGLDisplay mDisplay; + EGLContext mContext; + EGLSurface mSurface; + ID3D11Texture2D *mOffscreenSurfaceD3D11Texture; + EGLConfig mConfig; + OSWindow *mOSWindow; + GLint mWindowWidth; +}; + +// Test that rendering basic content onto a window surface when present path fast +// is enabled works as expected +TEST_P(EGLPresentPathD3D11, WindowPresentPathFast) +{ + initializeEGL(true); + createWindowSurface(); + makeCurrent(); + + drawQuadUsingGL(); + + checkPixelsUsingGL(); +} + +// Test that rendering basic content onto a client buffer surface when present path fast +// works as expected, and is also oriented the correct way around +TEST_P(EGLPresentPathD3D11, ClientBufferPresentPathFast) +{ + initializeEGL(true); + createPbufferFromClientBufferSurface(); + makeCurrent(); + + drawQuadUsingGL(); + + checkPixelsUsingGL(); + checkPixelsUsingD3D(true); +} + +// Test that rendering basic content onto a window surface when present path fast +// is disabled works as expected +TEST_P(EGLPresentPathD3D11, WindowPresentPathCopy) +{ + initializeEGL(false); + createWindowSurface(); + makeCurrent(); + + drawQuadUsingGL(); + + checkPixelsUsingGL(); +} + +// Test that rendering basic content onto a client buffer surface when present path +// fast is disabled works as expected, and is also oriented the correct way around +TEST_P(EGLPresentPathD3D11, ClientBufferPresentPathCopy) +{ + initializeEGL(false); + createPbufferFromClientBufferSurface(); + makeCurrent(); + + drawQuadUsingGL(); + + checkPixelsUsingGL(); + checkPixelsUsingD3D(false); +} + +ANGLE_INSTANTIATE_TEST(EGLPresentPathD3D11, ES2_D3D11(), ES2_D3D11_FL9_3());
\ No newline at end of file diff --git a/gfx/angle/src/tests/egl_tests/EGLQueryContextTest.cpp b/gfx/angle/src/tests/egl_tests/EGLQueryContextTest.cpp new file mode 100755 index 000000000..ff4a43f23 --- /dev/null +++ b/gfx/angle/src/tests/egl_tests/EGLQueryContextTest.cpp @@ -0,0 +1,153 @@ +// +// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include <gtest/gtest.h> + +#include <EGL/egl.h> +#include <EGL/eglext.h> + +#include "test_utils/angle_test_configs.h" + +using namespace angle; + +class EGLQueryContextTest : public testing::TestWithParam<PlatformParameters> +{ + public: + void SetUp() override + { + int clientVersion = GetParam().majorVersion; + + PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT = reinterpret_cast<PFNEGLGETPLATFORMDISPLAYEXTPROC>(eglGetProcAddress("eglGetPlatformDisplayEXT")); + EXPECT_TRUE(eglGetPlatformDisplayEXT != NULL); + + EGLint dispattrs[] = + { + EGL_PLATFORM_ANGLE_TYPE_ANGLE, GetParam().getRenderer(), + EGL_NONE + }; + mDisplay = eglGetPlatformDisplayEXT( + EGL_PLATFORM_ANGLE_ANGLE, reinterpret_cast<void *>(EGL_DEFAULT_DISPLAY), dispattrs); + EXPECT_TRUE(mDisplay != EGL_NO_DISPLAY); + EXPECT_TRUE(eglInitialize(mDisplay, NULL, NULL) != EGL_FALSE); + + EGLint ncfg; + EGLint cfgattrs[] = + { + EGL_RED_SIZE, 8, + EGL_GREEN_SIZE, 8, + EGL_BLUE_SIZE, 8, + EGL_RENDERABLE_TYPE, clientVersion == 3 ? EGL_OPENGL_ES3_BIT : EGL_OPENGL_ES2_BIT, + EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, + EGL_NONE + }; + EXPECT_TRUE(eglChooseConfig(mDisplay, cfgattrs, &mConfig, 1, &ncfg) != EGL_FALSE); + EXPECT_TRUE(ncfg == 1); + + EGLint ctxattrs[] = + { + EGL_CONTEXT_CLIENT_VERSION, clientVersion, + EGL_NONE + }; + mContext = eglCreateContext(mDisplay, mConfig, NULL, ctxattrs); + EXPECT_TRUE(mContext != EGL_NO_CONTEXT); + + EGLint surfattrs[] = + { + EGL_WIDTH, 16, + EGL_HEIGHT, 16, + EGL_NONE + }; + mSurface = eglCreatePbufferSurface(mDisplay, mConfig, surfattrs); + EXPECT_TRUE(mSurface != EGL_NO_SURFACE); + } + + void TearDown() override + { + eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + eglDestroyContext(mDisplay, mContext); + eglDestroySurface(mDisplay, mSurface); + eglTerminate(mDisplay); + } + + EGLDisplay mDisplay; + EGLConfig mConfig; + EGLContext mContext; + EGLSurface mSurface; +}; + +TEST_P(EGLQueryContextTest, GetConfigID) +{ + EGLint configId, contextConfigId; + EXPECT_TRUE(eglGetConfigAttrib(mDisplay, mConfig, EGL_CONFIG_ID, &configId) != EGL_FALSE); + EXPECT_TRUE(eglQueryContext(mDisplay, mContext, EGL_CONFIG_ID, &contextConfigId) != EGL_FALSE); + EXPECT_TRUE(configId == contextConfigId); +} + +TEST_P(EGLQueryContextTest, GetClientType) +{ + EGLint clientType; + EXPECT_TRUE(eglQueryContext(mDisplay, mContext, EGL_CONTEXT_CLIENT_TYPE, &clientType) != EGL_FALSE); + EXPECT_TRUE(clientType == EGL_OPENGL_ES_API); +} + +TEST_P(EGLQueryContextTest, GetClientVersion) +{ + EGLint clientVersion; + EXPECT_TRUE(eglQueryContext(mDisplay, mContext, EGL_CONTEXT_CLIENT_VERSION, &clientVersion) != EGL_FALSE); + EXPECT_TRUE(clientVersion == GetParam().majorVersion); +} + +TEST_P(EGLQueryContextTest, GetRenderBufferNoSurface) +{ + EGLint renderBuffer; + EXPECT_TRUE(eglQueryContext(mDisplay, mContext, EGL_RENDER_BUFFER, &renderBuffer) != EGL_FALSE); + EXPECT_TRUE(renderBuffer == EGL_NONE); +} + +TEST_P(EGLQueryContextTest, GetRenderBufferBoundSurface) +{ + EGLint renderBuffer, contextRenderBuffer; + EXPECT_TRUE(eglQuerySurface(mDisplay, mSurface, EGL_RENDER_BUFFER, &renderBuffer) != EGL_FALSE); + EXPECT_TRUE(eglMakeCurrent(mDisplay, mSurface, mSurface, mContext) != EGL_FALSE); + EXPECT_TRUE(eglQueryContext(mDisplay, mContext, EGL_RENDER_BUFFER, &contextRenderBuffer) != EGL_FALSE); + EXPECT_TRUE(renderBuffer == contextRenderBuffer); +} + +TEST_P(EGLQueryContextTest, BadDisplay) +{ + EGLint val; + EXPECT_TRUE(eglQueryContext(EGL_NO_DISPLAY, mContext, EGL_CONTEXT_CLIENT_TYPE, &val) == EGL_FALSE); + EXPECT_TRUE(eglGetError() == EGL_BAD_DISPLAY); +} + +TEST_P(EGLQueryContextTest, NotInitialized) +{ + EGLint val; + TearDown(); + EXPECT_TRUE(eglQueryContext(mDisplay, mContext, EGL_CONTEXT_CLIENT_TYPE, &val) == EGL_FALSE); + EXPECT_TRUE(eglGetError() == EGL_NOT_INITIALIZED); + + mDisplay = EGL_NO_DISPLAY; + mSurface = EGL_NO_SURFACE; + mContext = EGL_NO_CONTEXT; +} + +TEST_P(EGLQueryContextTest, BadContext) +{ + EGLint val; + EXPECT_TRUE(eglQueryContext(mDisplay, EGL_NO_CONTEXT, EGL_CONTEXT_CLIENT_TYPE, &val) == EGL_FALSE); + EXPECT_TRUE(eglGetError() == EGL_BAD_CONTEXT); +} + +TEST_P(EGLQueryContextTest, BadAttribute) +{ + EGLint val; + EXPECT_TRUE(eglQueryContext(mDisplay, mContext, EGL_HEIGHT, &val) == EGL_FALSE); + EXPECT_TRUE(eglGetError() == EGL_BAD_ATTRIBUTE); +} + +ANGLE_INSTANTIATE_TEST(EGLQueryContextTest, ES2_D3D9(), ES2_D3D11(), ES2_D3D11_FL9_3(), ES2_OPENGL(), + ES3_D3D11(), ES3_OPENGL()); diff --git a/gfx/angle/src/tests/egl_tests/EGLRobustnessTest.cpp b/gfx/angle/src/tests/egl_tests/EGLRobustnessTest.cpp new file mode 100755 index 000000000..0482a7fe5 --- /dev/null +++ b/gfx/angle/src/tests/egl_tests/EGLRobustnessTest.cpp @@ -0,0 +1,234 @@ +// +// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +// EGLRobustnessTest.cpp: tests for EGL_EXT_create_context_robustness + +#include <gtest/gtest.h> + +#include <EGL/egl.h> +#include <EGL/eglext.h> + +#include "OSWindow.h" +#include "test_utils/ANGLETest.h" + +using namespace angle; + +class EGLRobustnessTest : public ::testing::TestWithParam<angle::PlatformParameters> +{ + public: + void SetUp() override + { + mOSWindow = CreateOSWindow(); + mOSWindow->initialize("EGLRobustnessTest", 500, 500); + mOSWindow->setVisible(true); + + auto eglGetPlatformDisplayEXT = reinterpret_cast<PFNEGLGETPLATFORMDISPLAYEXTPROC>( + eglGetProcAddress("eglGetPlatformDisplayEXT")); + + const auto &platform = GetParam().eglParameters; + + std::vector<EGLint> displayAttributes; + displayAttributes.push_back(EGL_PLATFORM_ANGLE_TYPE_ANGLE); + displayAttributes.push_back(platform.renderer); + displayAttributes.push_back(EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE); + displayAttributes.push_back(platform.majorVersion); + displayAttributes.push_back(EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE); + displayAttributes.push_back(platform.minorVersion); + + if (platform.deviceType != EGL_DONT_CARE) + { + displayAttributes.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE); + displayAttributes.push_back(platform.deviceType); + } + + displayAttributes.push_back(EGL_NONE); + + mDisplay = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, + reinterpret_cast<void *>(mOSWindow->getNativeDisplay()), + &displayAttributes[0]); + ASSERT_NE(EGL_NO_DISPLAY, mDisplay); + + ASSERT_TRUE(eglInitialize(mDisplay, nullptr, nullptr) == EGL_TRUE); + + const char *extensions = eglQueryString(mDisplay, EGL_EXTENSIONS); + if (strstr(extensions, "EGL_EXT_create_context_robustness") == nullptr) + { + std::cout << "Test skipped due to missing EGL_EXT_create_context_robustness" + << std::endl; + return; + } + + int nConfigs = 0; + ASSERT_TRUE(eglGetConfigs(mDisplay, nullptr, 0, &nConfigs) == EGL_TRUE); + ASSERT_LE(1, nConfigs); + + int nReturnedConfigs = 0; + ASSERT_TRUE(eglGetConfigs(mDisplay, &mConfig, 1, &nReturnedConfigs) == EGL_TRUE); + ASSERT_EQ(1, nReturnedConfigs); + + mWindow = eglCreateWindowSurface(mDisplay, mConfig, mOSWindow->getNativeWindow(), nullptr); + ASSERT_EGL_SUCCESS(); + + mInitialized = true; + } + + void TearDown() override + { + eglDestroySurface(mDisplay, mWindow); + eglDestroyContext(mDisplay, mContext); + eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + eglTerminate(mDisplay); + EXPECT_EGL_SUCCESS(); + + SafeDelete(mOSWindow); + } + + void createContext(EGLint resetStrategy) + { + const EGLint contextAttribs[] = {EGL_CONTEXT_CLIENT_VERSION, 2, + EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT, + resetStrategy, EGL_NONE}; + mContext = eglCreateContext(mDisplay, mConfig, EGL_NO_CONTEXT, contextAttribs); + ASSERT_NE(EGL_NO_CONTEXT, mContext); + + eglMakeCurrent(mDisplay, mWindow, mWindow, mContext); + ASSERT_EGL_SUCCESS(); + + const char *extensionString = reinterpret_cast<const char *>(glGetString(GL_EXTENSIONS)); + ASSERT_NE(nullptr, strstr(extensionString, "GL_ANGLE_instanced_arrays")); + + mDrawElementsInstancedANGLE = + (PFNGLDRAWELEMENTSINSTANCEDANGLEPROC)eglGetProcAddress("glDrawElementsInstancedANGLE"); + ASSERT_NE(nullptr, mDrawElementsInstancedANGLE); + } + + void forceContextReset() + { + // Cause a GPU reset by drawing 100,000,000 fullscreen quads + GLuint program = CompileProgram( + "attribute vec4 pos;\n" + "void main() {gl_Position = pos;}\n", + "precision mediump float;\n" + "void main() {gl_FragColor = vec4(1.0);}\n"); + ASSERT_NE(0u, program); + glUseProgram(program); + + GLfloat vertices[] = { + -1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 1.0f, 0.0f, 1.0f, + 1.0f, -1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, + }; + + const int kNumQuads = 10000; + std::vector<GLushort> indices(6 * kNumQuads); + + for (size_t i = 0; i < kNumQuads; i++) + { + indices[i * 6 + 0] = 0; + indices[i * 6 + 1] = 1; + indices[i * 6 + 2] = 2; + indices[i * 6 + 3] = 1; + indices[i * 6 + 4] = 2; + indices[i * 6 + 5] = 3; + } + + glBindAttribLocation(program, 0, "pos"); + glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, vertices); + glEnableVertexAttribArray(0); + + glViewport(0, 0, mOSWindow->getWidth(), mOSWindow->getHeight()); + glClearColor(1.0, 0.0, 0.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT); + mDrawElementsInstancedANGLE(GL_TRIANGLES, kNumQuads * 6, GL_UNSIGNED_SHORT, indices.data(), + 10000); + + glFinish(); + } + + protected: + EGLDisplay mDisplay = EGL_NO_DISPLAY; + EGLSurface mWindow = EGL_NO_SURFACE; + bool mInitialized = false; + PFNGLDRAWELEMENTSINSTANCEDANGLEPROC mDrawElementsInstancedANGLE = nullptr; + + private: + EGLContext mContext = EGL_NO_CONTEXT; + EGLConfig mConfig = 0; + OSWindow *mOSWindow = nullptr; +}; + +// Check glGetGraphicsResetStatusEXT returns GL_NO_ERROR if we did nothing +TEST_P(EGLRobustnessTest, NoErrorByDefault) +{ + if (!mInitialized) + { + return; + } + ASSERT_TRUE(glGetGraphicsResetStatusEXT() == GL_NO_ERROR); +} + +// Checks that the application gets no loss with NO_RESET_NOTIFICATION +TEST_P(EGLRobustnessTest, DISABLED_NoResetNotification) +{ + if (!mInitialized) + { + return; + } + + createContext(EGL_NO_RESET_NOTIFICATION_EXT); + + if (!IsWindows()) + { + std::cout << "Test disabled on non Windows platforms because drivers can't recover. " + << "See " << __FILE__ << ":" << __LINE__ << std::endl; + return; + } + std::cout << "Causing a GPU reset, brace for impact." << std::endl; + + forceContextReset(); + ASSERT_TRUE(glGetGraphicsResetStatusEXT() == GL_NO_ERROR); +} + +// Checks that resetting the ANGLE display allows to get rid of the context loss. +// Also checks that the application gets notified of the loss of the display. +// We coalesce both tests to reduce the number of TDRs done on Windows: by default +// having more than 5 TDRs in a minute will cause Windows to disable the GPU until +// the computer is rebooted. +TEST_P(EGLRobustnessTest, DISABLED_ResettingDisplayWorks) +{ + if (!mInitialized) + { + return; + } + + createContext(EGL_LOSE_CONTEXT_ON_RESET_EXT); + + if (!IsWindows()) + { + std::cout << "Test disabled on non Windows platforms because drivers can't recover. " + << "See " << __FILE__ << ":" << __LINE__ << std::endl; + return; + } + std::cout << "Causing a GPU reset, brace for impact." << std::endl; + + forceContextReset(); + ASSERT_TRUE(glGetGraphicsResetStatusEXT() != GL_NO_ERROR); + + TearDown(); + SetUp(); + ASSERT_TRUE(glGetGraphicsResetStatusEXT() == GL_NO_ERROR); +} + +// Tests causing GPU resets are disabled, use the following args to run them: +// --gtest_also_run_disabled_tests --gtest_filter=EGLRobustnessTest\* + +// Note that on Windows the OpenGL driver fails hard (popup that closes the application) +// if there was a TDR caused by D3D so we don't run D3D tests at the same time as the OpenGL tests. +#define D3D_HAS_PRIORITY 1 +#if D3D_HAS_PRIORITY && (defined(ANGLE_ENABLE_D3D9) || defined(ANGLE_ENABLE_D3D11)) +ANGLE_INSTANTIATE_TEST(EGLRobustnessTest, ES2_D3D9(), ES2_D3D11()); +#else +ANGLE_INSTANTIATE_TEST(EGLRobustnessTest, ES2_OPENGL()); +#endif diff --git a/gfx/angle/src/tests/egl_tests/EGLSanityCheckTest.cpp b/gfx/angle/src/tests/egl_tests/EGLSanityCheckTest.cpp new file mode 100755 index 000000000..b92f9bc16 --- /dev/null +++ b/gfx/angle/src/tests/egl_tests/EGLSanityCheckTest.cpp @@ -0,0 +1,30 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +// EGLSanityCheckTest.cpp: +// tests used to check setup in which tests are run. + +#include <gtest/gtest.h> + +#include "test_utils/ANGLETest.h" + +// Checks the tests are running against ANGLE +TEST(EGLSanityCheckTest, IsRunningOnANGLE) +{ + const char *extensionString = + static_cast<const char *>(eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS)); + ASSERT_NE(strstr(extensionString, "EGL_ANGLE_platform_angle"), nullptr); +} + +// Checks that getting function pointer works +TEST(EGLSanityCheckTest, HasGetPlatformDisplayEXT) +{ + PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT = + reinterpret_cast<PFNEGLGETPLATFORMDISPLAYEXTPROC>( + eglGetProcAddress("eglGetPlatformDisplayEXT")); + + ASSERT_NE(eglGetPlatformDisplayEXT, nullptr); +} diff --git a/gfx/angle/src/tests/egl_tests/EGLStreamTest.cpp b/gfx/angle/src/tests/egl_tests/EGLStreamTest.cpp new file mode 100755 index 000000000..b667cf778 --- /dev/null +++ b/gfx/angle/src/tests/egl_tests/EGLStreamTest.cpp @@ -0,0 +1,547 @@ +// +// Copyright 2016 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// EGLStreamTest: +// Tests pertaining to egl::Stream. +// + +#include <gtest/gtest.h> + +#include <vector> + +#include "media/yuvtest.inl" +#include "OSWindow.h" +#include "test_utils/ANGLETest.h" + +using namespace angle; + +namespace +{ + +class EGLStreamTest : public ANGLETest +{ + protected: + EGLStreamTest() + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + setConfigDepthBits(24); + } +}; + +// Tests validation of the stream API +TEST_P(EGLStreamTest, StreamValidationTest) +{ + EGLWindow *window = getEGLWindow(); + EGLDisplay display = window->getDisplay(); + const char *extensionsString = eglQueryString(display, EGL_EXTENSIONS); + if (strstr(extensionsString, "EGL_KHR_stream") == nullptr) + { + std::cout << "Stream extension not supported" << std::endl; + return; + } + + const EGLint streamAttributesBad[] = { + EGL_STREAM_STATE_KHR, + 0, + EGL_NONE, + EGL_PRODUCER_FRAME_KHR, + 0, + EGL_NONE, + EGL_CONSUMER_FRAME_KHR, + 0, + EGL_NONE, + EGL_CONSUMER_LATENCY_USEC_KHR, + -1, + EGL_NONE, + EGL_RED_SIZE, + EGL_DONT_CARE, + EGL_NONE, + }; + + // Validate create stream attributes + EGLStreamKHR stream = eglCreateStreamKHR(display, &streamAttributesBad[0]); + ASSERT_EGL_ERROR(EGL_BAD_ACCESS); + ASSERT_EQ(EGL_NO_STREAM_KHR, stream); + + stream = eglCreateStreamKHR(display, &streamAttributesBad[3]); + ASSERT_EGL_ERROR(EGL_BAD_ACCESS); + ASSERT_EQ(EGL_NO_STREAM_KHR, stream); + + stream = eglCreateStreamKHR(display, &streamAttributesBad[6]); + ASSERT_EGL_ERROR(EGL_BAD_ACCESS); + ASSERT_EQ(EGL_NO_STREAM_KHR, stream); + + stream = eglCreateStreamKHR(display, &streamAttributesBad[9]); + ASSERT_EGL_ERROR(EGL_BAD_PARAMETER); + ASSERT_EQ(EGL_NO_STREAM_KHR, stream); + + stream = eglCreateStreamKHR(display, &streamAttributesBad[12]); + ASSERT_EGL_ERROR(EGL_BAD_ATTRIBUTE); + ASSERT_EQ(EGL_NO_STREAM_KHR, stream); + + const EGLint streamAttributes[] = { + EGL_CONSUMER_LATENCY_USEC_KHR, 0, EGL_NONE, + }; + + stream = eglCreateStreamKHR(EGL_NO_DISPLAY, streamAttributes); + ASSERT_EGL_ERROR(EGL_BAD_DISPLAY); + ASSERT_EQ(EGL_NO_STREAM_KHR, stream); + + // Create an actual stream + stream = eglCreateStreamKHR(display, streamAttributes); + ASSERT_EGL_SUCCESS(); + ASSERT_NE(EGL_NO_STREAM_KHR, stream); + + // Assert it is in the created state + EGLint state; + eglQueryStreamKHR(display, stream, EGL_STREAM_STATE_KHR, &state); + ASSERT_EGL_SUCCESS(); + ASSERT_EQ(EGL_STREAM_STATE_CREATED_KHR, state); + + // Test getting and setting the latency + EGLint latency = 10; + eglStreamAttribKHR(display, stream, EGL_CONSUMER_LATENCY_USEC_KHR, latency); + ASSERT_EGL_SUCCESS(); + eglQueryStreamKHR(display, stream, EGL_CONSUMER_LATENCY_USEC_KHR, &latency); + ASSERT_EGL_SUCCESS(); + ASSERT_EQ(10, latency); + eglStreamAttribKHR(display, stream, EGL_CONSUMER_LATENCY_USEC_KHR, -1); + ASSERT_EGL_ERROR(EGL_BAD_PARAMETER); + ASSERT_EQ(10, latency); + + // Test the 64-bit queries + EGLuint64KHR value; + eglQueryStreamu64KHR(display, stream, EGL_CONSUMER_FRAME_KHR, &value); + ASSERT_EGL_SUCCESS(); + eglQueryStreamu64KHR(display, stream, EGL_PRODUCER_FRAME_KHR, &value); + ASSERT_EGL_SUCCESS(); + + // Destroy the stream + eglDestroyStreamKHR(display, stream); + ASSERT_EGL_SUCCESS(); +} + +// Tests validation of stream consumer gltexture API +TEST_P(EGLStreamTest, StreamConsumerGLTextureValidationTest) +{ + EGLWindow *window = getEGLWindow(); + EGLDisplay display = window->getDisplay(); + const char *extensionsString = eglQueryString(display, EGL_EXTENSIONS); + if (strstr(extensionsString, "EGL_KHR_stream_consumer_gltexture") == nullptr) + { + std::cout << "Stream consumer gltexture extension not supported" << std::endl; + return; + } + + const EGLint streamAttributes[] = { + EGL_CONSUMER_LATENCY_USEC_KHR, 0, EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR, 0, EGL_NONE, + }; + + EGLStreamKHR stream = eglCreateStreamKHR(display, streamAttributes); + ASSERT_EGL_SUCCESS(); + + EGLBoolean result = eglStreamConsumerGLTextureExternalKHR(display, stream); + ASSERT_EGL_FALSE(result); + ASSERT_EGL_ERROR(EGL_BAD_ACCESS); + + GLuint tex; + glGenTextures(1, &tex); + glBindTexture(GL_TEXTURE_EXTERNAL_OES, tex); + result = eglStreamConsumerGLTextureExternalKHR(display, stream); + ASSERT_EGL_TRUE(result); + ASSERT_EGL_SUCCESS(); + + EGLint state; + eglQueryStreamKHR(display, stream, EGL_STREAM_STATE_KHR, &state); + ASSERT_EGL_SUCCESS(); + ASSERT_EQ(EGL_STREAM_STATE_CONNECTING_KHR, state); + + eglDestroyStreamKHR(display, stream); + ASSERT_EGL_SUCCESS(); +} + +// Tests validation of stream consumer gltexture yuv API +TEST_P(EGLStreamTest, StreamConsumerGLTextureYUVValidationTest) +{ + EGLWindow *window = getEGLWindow(); + EGLDisplay display = window->getDisplay(); + const char *extensionsString = eglQueryString(display, EGL_EXTENSIONS); + if (strstr(extensionsString, "EGL_NV_stream_consumer_gltexture_yuv") == nullptr) + { + std::cout << "Stream consumer gltexture yuv extension not supported" << std::endl; + return; + } + + const EGLint streamAttributes[] = { + EGL_CONSUMER_LATENCY_USEC_KHR, 0, EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR, 0, EGL_NONE, + }; + + EGLStreamKHR stream = eglCreateStreamKHR(display, streamAttributes); + ASSERT_EGL_SUCCESS(); + + EGLAttrib consumerAttributesBad[] = { + EGL_COLOR_BUFFER_TYPE, + EGL_YUV_BUFFER_EXT, // 0 + EGL_YUV_NUMBER_OF_PLANES_EXT, + 0, + EGL_NONE, + EGL_COLOR_BUFFER_TYPE, + EGL_YUV_BUFFER_EXT, // 5 + EGL_YUV_NUMBER_OF_PLANES_EXT, + 1, + EGL_NONE, + EGL_COLOR_BUFFER_TYPE, + EGL_YUV_BUFFER_EXT, // 10 + EGL_YUV_NUMBER_OF_PLANES_EXT, + 1, + EGL_YUV_PLANE0_TEXTURE_UNIT_NV, + 9999, + EGL_NONE, + EGL_COLOR_BUFFER_TYPE, + EGL_YUV_BUFFER_EXT, // 17 + EGL_YUV_NUMBER_OF_PLANES_EXT, + 1, + EGL_YUV_PLANE0_TEXTURE_UNIT_NV, + 0, + EGL_YUV_PLANE1_TEXTURE_UNIT_NV, + 1, + EGL_NONE, + EGL_COLOR_BUFFER_TYPE, + EGL_YUV_BUFFER_EXT, // 26 + EGL_YUV_NUMBER_OF_PLANES_EXT, + 2, + EGL_YUV_PLANE0_TEXTURE_UNIT_NV, + 0, + EGL_YUV_PLANE1_TEXTURE_UNIT_NV, + 0, + EGL_NONE, + }; + + EGLAttrib consumerAttributes[] = { + EGL_COLOR_BUFFER_TYPE, + EGL_YUV_BUFFER_EXT, + EGL_YUV_NUMBER_OF_PLANES_EXT, + 2, + EGL_YUV_PLANE0_TEXTURE_UNIT_NV, + 0, + EGL_YUV_PLANE1_TEXTURE_UNIT_NV, + 1, + EGL_NONE, + }; + + EGLBoolean result = + eglStreamConsumerGLTextureExternalAttribsNV(display, stream, &consumerAttributesBad[0]); + ASSERT_EGL_FALSE(result); + ASSERT_EGL_ERROR(EGL_BAD_MATCH); + + result = + eglStreamConsumerGLTextureExternalAttribsNV(display, stream, &consumerAttributesBad[5]); + ASSERT_EGL_FALSE(result); + ASSERT_EGL_ERROR(EGL_BAD_MATCH); + + result = + eglStreamConsumerGLTextureExternalAttribsNV(display, stream, &consumerAttributesBad[10]); + ASSERT_EGL_FALSE(result); + ASSERT_EGL_ERROR(EGL_BAD_ACCESS); + + result = + eglStreamConsumerGLTextureExternalAttribsNV(display, stream, &consumerAttributesBad[17]); + ASSERT_EGL_FALSE(result); + ASSERT_EGL_ERROR(EGL_BAD_MATCH); + + result = eglStreamConsumerGLTextureExternalAttribsNV(display, stream, consumerAttributes); + ASSERT_EGL_FALSE(result); + ASSERT_EGL_ERROR(EGL_BAD_ACCESS); + + GLuint tex[2]; + glGenTextures(2, tex); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_EXTERNAL_OES, tex[0]); + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_EXTERNAL_OES, tex[1]); + + result = + eglStreamConsumerGLTextureExternalAttribsNV(display, stream, &consumerAttributesBad[26]); + ASSERT_EGL_FALSE(result); + ASSERT_EGL_ERROR(EGL_BAD_ACCESS); + + result = eglStreamConsumerGLTextureExternalAttribsNV(display, stream, consumerAttributes); + ASSERT_EGL_TRUE(result); + ASSERT_EGL_SUCCESS(); + + EGLint state; + eglQueryStreamKHR(display, stream, EGL_STREAM_STATE_KHR, &state); + ASSERT_EGL_SUCCESS(); + ASSERT_EQ(EGL_STREAM_STATE_CONNECTING_KHR, state); + + eglDestroyStreamKHR(display, stream); + ASSERT_EGL_SUCCESS(); +} + +// Tests that deleting a texture invalidates the associated stream +TEST_P(EGLStreamTest, StreamConsumerGLTextureYUVDeletionTest) +{ + EGLWindow *window = getEGLWindow(); + EGLDisplay display = window->getDisplay(); + const char *extensionsString = eglQueryString(display, EGL_EXTENSIONS); + if (strstr(extensionsString, "EGL_ANGLE_stream_producer_d3d_texture_nv12") == nullptr) + { + std::cout << "Stream producer d3d nv12 texture not supported" << std::endl; + return; + } + + const EGLint streamAttributes[] = { + EGL_CONSUMER_LATENCY_USEC_KHR, 0, EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR, 0, EGL_NONE, + }; + + EGLStreamKHR stream = eglCreateStreamKHR(display, streamAttributes); + ASSERT_EGL_SUCCESS(); + + EGLAttrib consumerAttributes[] = { + EGL_COLOR_BUFFER_TYPE, + EGL_YUV_BUFFER_EXT, + EGL_YUV_NUMBER_OF_PLANES_EXT, + 2, + EGL_YUV_PLANE0_TEXTURE_UNIT_NV, + 0, + EGL_YUV_PLANE1_TEXTURE_UNIT_NV, + 1, + EGL_NONE, + }; + + GLuint tex[2]; + glGenTextures(2, tex); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_EXTERNAL_OES, tex[0]); + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_EXTERNAL_OES, tex[1]); + + EGLBoolean result = + eglStreamConsumerGLTextureExternalAttribsNV(display, stream, consumerAttributes); + ASSERT_EGL_TRUE(result); + ASSERT_EGL_SUCCESS(); + + EGLAttrib producerAttributes[] = { + EGL_NONE, + }; + + result = eglCreateStreamProducerD3DTextureNV12ANGLE(display, stream, producerAttributes); + ASSERT_EGL_TRUE(result); + ASSERT_EGL_SUCCESS(); + + EGLint state; + eglQueryStreamKHR(display, stream, EGL_STREAM_STATE_KHR, &state); + ASSERT_EGL_SUCCESS(); + ASSERT_EQ(EGL_STREAM_STATE_EMPTY_KHR, state); + + // Delete the first texture, which should be enough to invalidate the stream + glDeleteTextures(1, tex); + + eglQueryStreamKHR(display, stream, EGL_STREAM_STATE_KHR, &state); + ASSERT_EGL_SUCCESS(); + ASSERT_EQ(EGL_STREAM_STATE_DISCONNECTED_KHR, state); + + eglDestroyStreamKHR(display, stream); + ASSERT_EGL_SUCCESS(); +} + +// End2end test for rendering an NV12 texture. Renders a YUV quad, reads back the RGB values, and +// ensures they are correct +TEST_P(EGLStreamTest, StreamProducerTextureNV12End2End) +{ + EGLWindow *window = getEGLWindow(); + EGLDisplay display = window->getDisplay(); + if (!eglDisplayExtensionEnabled(display, "EGL_ANGLE_stream_producer_d3d_texture_nv12")) + { + std::cout << "Stream producer d3d nv12 texture not supported" << std::endl; + return; + } + + bool useESSL3Shaders = + getClientMajorVersion() >= 3 && extensionEnabled("GL_OES_EGL_image_external_essl3"); + + // yuv to rgb conversion shader using Microsoft's given conversion formulas + std::string yuvVS, yuvPS; + if (useESSL3Shaders) + { + yuvVS = + "#version 300 es\n" + "in highp vec4 position;\n" + "out vec2 texcoord;\n" + "void main(void)\n" + "{\n" + " gl_Position = position;\n" + " texcoord = (position.xy * 0.5) + 0.5;\n" + " texcoord.y = 1.0 - texcoord.y;\n" + "}\n"; + yuvPS = + "#version 300 es\n" + "#extension GL_OES_EGL_image_external_essl3 : require\n" + "#extension GL_NV_EGL_stream_consumer_external : require\n" + "precision highp float;\n" + "in vec2 texcoord;\n" + "out vec4 color;\n" + "uniform samplerExternalOES y;\n" + "uniform samplerExternalOES uv\n;" + "void main(void)\n" + "{\n" + " float c = texture(y, texcoord).r - (16.0 / 256.0);\n" + " float d = texture(uv, texcoord).r - 0.5;\n" + " float e = texture(uv, texcoord).g - 0.5;\n" + " float r = 1.164383 * c + 1.596027 * e;\n" + " float g = 1.164383 * c - 0.391762 * d - 0.812968 * e;\n" + " float b = 1.164383 * c + 2.017232 * d;\n" + " color = vec4(r, g, b, 1.0);\n" + "}\n"; + } + else + { + yuvVS = + "attribute highp vec4 position;\n" + "varying vec2 texcoord;\n" + "void main(void)\n" + "{\n" + " gl_Position = position;\n" + " texcoord = (position.xy * 0.5) + 0.5;\n" + " texcoord.y = 1.0 - texcoord.y;\n" + "}\n"; + + yuvPS = + "#extension GL_NV_EGL_stream_consumer_external : require\n" + "precision highp float;\n" + "varying vec2 texcoord;\n" + "uniform samplerExternalOES y;\n" + "uniform samplerExternalOES uv\n;" + "void main(void)\n" + "{\n" + " float c = texture2D(y, texcoord).r - (16.0 / 256.0);\n" + " float d = texture2D(uv, texcoord).r - 0.5;\n" + " float e = texture2D(uv, texcoord).g - 0.5;\n" + " float r = 1.164383 * c + 1.596027 * e;\n" + " float g = 1.164383 * c - 0.391762 * d - 0.812968 * e;\n" + " float b = 1.164383 * c + 2.017232 * d;\n" + " gl_FragColor = vec4(r, g, b, 1.0);\n" + "}\n"; + } + + GLuint program = CompileProgram(yuvVS, yuvPS); + ASSERT_NE(0u, program); + GLuint yUniform = glGetUniformLocation(program, "y"); + GLuint uvUniform = glGetUniformLocation(program, "uv"); + + // Fetch the D3D11 device + EGLDeviceEXT eglDevice; + eglQueryDisplayAttribEXT(display, EGL_DEVICE_EXT, (EGLAttrib *)&eglDevice); + ID3D11Device *device; + eglQueryDeviceAttribEXT(eglDevice, EGL_D3D11_DEVICE_ANGLE, (EGLAttrib *)&device); + + // Create the NV12 D3D11 texture + HRESULT res; + D3D11_TEXTURE2D_DESC desc; + desc.Width = yuvtest_width; + desc.Height = yuvtest_height; + desc.Format = DXGI_FORMAT_NV12; + desc.MipLevels = 1; + desc.ArraySize = 1; + desc.SampleDesc.Count = 1; + desc.SampleDesc.Quality = 0; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + desc.CPUAccessFlags = 0; + desc.MiscFlags = 0; + + D3D11_SUBRESOURCE_DATA subres; + subres.pSysMem = yuvtest_data; + subres.SysMemPitch = yuvtest_width; + subres.SysMemSlicePitch = yuvtest_width * yuvtest_height * 3 / 2; + + ID3D11Texture2D *texture = nullptr; + res = device->CreateTexture2D(&desc, &subres, &texture); + + // Create the stream + const EGLint streamAttributes[] = { + EGL_CONSUMER_LATENCY_USEC_KHR, 0, EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR, 0, EGL_NONE, + }; + + EGLStreamKHR stream = eglCreateStreamKHR(display, streamAttributes); + ASSERT_EGL_SUCCESS(); + + EGLAttrib consumerAttributes[] = { + EGL_COLOR_BUFFER_TYPE, + EGL_YUV_BUFFER_EXT, + EGL_YUV_NUMBER_OF_PLANES_EXT, + 2, + EGL_YUV_PLANE0_TEXTURE_UNIT_NV, + 0, + EGL_YUV_PLANE1_TEXTURE_UNIT_NV, + 1, + EGL_NONE, + }; + + GLuint tex[2]; + glGenTextures(2, tex); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_EXTERNAL_OES, tex[0]); + glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + ASSERT_GL_NO_ERROR(); + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_EXTERNAL_OES, tex[1]); + glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + ASSERT_GL_NO_ERROR(); + + EGLBoolean result = + eglStreamConsumerGLTextureExternalAttribsNV(display, stream, consumerAttributes); + ASSERT_EGL_TRUE(result); + ASSERT_EGL_SUCCESS(); + + EGLAttrib producerAttributes[] = { + EGL_NONE, + }; + + result = eglCreateStreamProducerD3DTextureNV12ANGLE(display, stream, producerAttributes); + ASSERT_EGL_TRUE(result); + ASSERT_EGL_SUCCESS(); + + // Insert the frame + EGLAttrib frameAttributes[] = { + EGL_D3D_TEXTURE_SUBRESOURCE_ID_ANGLE, 0, EGL_NONE, + }; + result = eglStreamPostD3DTextureNV12ANGLE(display, stream, (void *)texture, frameAttributes); + ASSERT_EGL_TRUE(result); + ASSERT_EGL_SUCCESS(); + + EGLint state; + eglQueryStreamKHR(display, stream, EGL_STREAM_STATE_KHR, &state); + ASSERT_EGL_SUCCESS(); + ASSERT_EQ(EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR, state); + + eglStreamConsumerAcquireKHR(display, stream); + ASSERT_EGL_SUCCESS(); + + glUseProgram(program); + glUniform1i(yUniform, 0); + glUniform1i(uvUniform, 1); + drawQuad(program, "position", 0.0f); + ASSERT_GL_NO_ERROR(); + + eglStreamConsumerReleaseKHR(display, stream); + ASSERT_EGL_SUCCESS(); + + eglSwapBuffers(display, window->getSurface()); + SafeRelease(texture); +} + +ANGLE_INSTANTIATE_TEST(EGLStreamTest, + ES2_D3D9(), + ES2_D3D11(), + ES3_D3D11(), + ES2_OPENGL(), + ES3_OPENGL()); +} // anonymous namespace diff --git a/gfx/angle/src/tests/egl_tests/EGLSurfaceTest.cpp b/gfx/angle/src/tests/egl_tests/EGLSurfaceTest.cpp new file mode 100755 index 000000000..513b01d44 --- /dev/null +++ b/gfx/angle/src/tests/egl_tests/EGLSurfaceTest.cpp @@ -0,0 +1,517 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// EGLSurfaceTest: +// Tests pertaining to egl::Surface. +// + +#include <gtest/gtest.h> + +#include <vector> + +#include "OSWindow.h" +#include "test_utils/ANGLETest.h" + +namespace +{ + +class EGLSurfaceTest : public testing::Test +{ + protected: + EGLSurfaceTest() + : mDisplay(EGL_NO_DISPLAY), + mWindowSurface(EGL_NO_SURFACE), + mPbufferSurface(EGL_NO_SURFACE), + mContext(EGL_NO_CONTEXT), + mSecondContext(EGL_NO_CONTEXT), + mOSWindow(nullptr) + { + } + + void SetUp() override + { + mOSWindow = CreateOSWindow(); + mOSWindow->initialize("EGLSurfaceTest", 64, 64); + } + + // Release any resources created in the test body + void TearDown() override + { + if (mDisplay != EGL_NO_DISPLAY) + { + eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + + if (mWindowSurface != EGL_NO_SURFACE) + { + eglDestroySurface(mDisplay, mWindowSurface); + mWindowSurface = EGL_NO_SURFACE; + } + + if (mPbufferSurface != EGL_NO_SURFACE) + { + eglDestroySurface(mDisplay, mPbufferSurface); + mPbufferSurface = EGL_NO_SURFACE; + } + + if (mContext != EGL_NO_CONTEXT) + { + eglDestroyContext(mDisplay, mContext); + mContext = EGL_NO_CONTEXT; + } + + if (mSecondContext != EGL_NO_CONTEXT) + { + eglDestroyContext(mDisplay, mSecondContext); + mSecondContext = EGL_NO_CONTEXT; + } + + eglTerminate(mDisplay); + mDisplay = EGL_NO_DISPLAY; + } + + mOSWindow->destroy(); + SafeDelete(mOSWindow); + + ASSERT_TRUE(mWindowSurface == EGL_NO_SURFACE && mContext == EGL_NO_CONTEXT); + } + + void initializeDisplay(EGLenum platformType) + { + PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT = reinterpret_cast<PFNEGLGETPLATFORMDISPLAYEXTPROC>(eglGetProcAddress("eglGetPlatformDisplayEXT")); + ASSERT_TRUE(eglGetPlatformDisplayEXT != nullptr); + + std::vector<EGLint> displayAttributes; + displayAttributes.push_back(EGL_PLATFORM_ANGLE_TYPE_ANGLE); + displayAttributes.push_back(platformType); + displayAttributes.push_back(EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE); + displayAttributes.push_back(EGL_DONT_CARE); + displayAttributes.push_back(EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE); + displayAttributes.push_back(EGL_DONT_CARE); + + if (platformType == EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE || platformType == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE) + { + displayAttributes.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE); + displayAttributes.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE); + } + displayAttributes.push_back(EGL_NONE); + + mDisplay = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, + reinterpret_cast<void *>(mOSWindow->getNativeDisplay()), + displayAttributes.data()); + ASSERT_TRUE(mDisplay != EGL_NO_DISPLAY); + + EGLint majorVersion, minorVersion; + ASSERT_TRUE(eglInitialize(mDisplay, &majorVersion, &minorVersion) == EGL_TRUE); + + eglBindAPI(EGL_OPENGL_ES_API); + ASSERT_TRUE(eglGetError() == EGL_SUCCESS); + } + + void initializeSurface(EGLConfig config) + { + mConfig = config; + + std::vector<EGLint> surfaceAttributes; + surfaceAttributes.push_back(EGL_NONE); + surfaceAttributes.push_back(EGL_NONE); + + // Create first window surface + mWindowSurface = eglCreateWindowSurface(mDisplay, mConfig, mOSWindow->getNativeWindow(), &surfaceAttributes[0]); + ASSERT_TRUE(eglGetError() == EGL_SUCCESS); + + mPbufferSurface = eglCreatePbufferSurface(mDisplay, mConfig, &surfaceAttributes[0]); + + EGLint contextAttibutes[] = + { + EGL_CONTEXT_CLIENT_VERSION, 2, + EGL_NONE + }; + + mContext = eglCreateContext(mDisplay, mConfig, nullptr, contextAttibutes); + ASSERT_TRUE(eglGetError() == EGL_SUCCESS); + + mSecondContext = eglCreateContext(mDisplay, mConfig, nullptr, contextAttibutes); + ASSERT_TRUE(eglGetError() == EGL_SUCCESS); + } + + void initializeSurfaceWithDefaultConfig() + { + const EGLint configAttributes[] = + { + EGL_RED_SIZE, EGL_DONT_CARE, + EGL_GREEN_SIZE, EGL_DONT_CARE, + EGL_BLUE_SIZE, EGL_DONT_CARE, + EGL_ALPHA_SIZE, EGL_DONT_CARE, + EGL_DEPTH_SIZE, EGL_DONT_CARE, + EGL_STENCIL_SIZE, EGL_DONT_CARE, + EGL_SAMPLE_BUFFERS, 0, + EGL_NONE + }; + + EGLint configCount; + EGLConfig config; + ASSERT_TRUE(eglChooseConfig(mDisplay, configAttributes, &config, 1, &configCount) || (configCount != 1) == EGL_TRUE); + + initializeSurface(config); + } + + GLuint createProgram() + { + const std::string testVertexShaderSource = SHADER_SOURCE + ( + attribute highp vec4 position; + + void main(void) + { + gl_Position = position; + } + ); + + const std::string testFragmentShaderSource = SHADER_SOURCE + ( + void main(void) + { + gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); + } + ); + + return CompileProgram(testVertexShaderSource, testFragmentShaderSource); + } + + void drawWithProgram(GLuint program) + { + glClearColor(0, 0, 0, 1); + glClear(GL_COLOR_BUFFER_BIT); + + GLint positionLocation = glGetAttribLocation(program, "position"); + + glUseProgram(program); + + const GLfloat vertices[] = + { + -1.0f, 1.0f, 0.5f, + -1.0f, -1.0f, 0.5f, + 1.0f, -1.0f, 0.5f, + + -1.0f, 1.0f, 0.5f, + 1.0f, -1.0f, 0.5f, + 1.0f, 1.0f, 0.5f, + }; + + glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, vertices); + glEnableVertexAttribArray(positionLocation); + + glDrawArrays(GL_TRIANGLES, 0, 6); + + glDisableVertexAttribArray(positionLocation); + glVertexAttribPointer(positionLocation, 4, GL_FLOAT, GL_FALSE, 0, NULL); + + EXPECT_PIXEL_EQ(mOSWindow->getWidth() / 2, mOSWindow->getHeight() / 2, 255, 0, 0, 255); + } + + void runMessageLoopTest(EGLSurface secondSurface, EGLContext secondContext) + { + eglMakeCurrent(mDisplay, mWindowSurface, mWindowSurface, mContext); + ASSERT_TRUE(eglGetError() == EGL_SUCCESS); + + // Make a second context current + eglMakeCurrent(mDisplay, secondSurface, secondSurface, secondContext); + eglDestroySurface(mDisplay, mWindowSurface); + + // Create second window surface + std::vector<EGLint> surfaceAttributes; + surfaceAttributes.push_back(EGL_NONE); + surfaceAttributes.push_back(EGL_NONE); + + mWindowSurface = eglCreateWindowSurface(mDisplay, mConfig, mOSWindow->getNativeWindow(), &surfaceAttributes[0]); + ASSERT_TRUE(eglGetError() == EGL_SUCCESS); + + eglMakeCurrent(mDisplay, mWindowSurface, mWindowSurface, mContext); + ASSERT_TRUE(eglGetError() == EGL_SUCCESS); + + mOSWindow->signalTestEvent(); + mOSWindow->messageLoop(); + ASSERT_TRUE(mOSWindow->didTestEventFire()); + + // Simple operation to test the FBO is set appropriately + glClear(GL_COLOR_BUFFER_BIT); + } + + EGLDisplay mDisplay; + EGLSurface mWindowSurface; + EGLSurface mPbufferSurface; + EGLContext mContext; + EGLContext mSecondContext; + EGLConfig mConfig; + OSWindow *mOSWindow; +}; + +// Test a surface bug where we could have two Window surfaces active +// at one time, blocking message loops. See http://crbug.com/475085 +TEST_F(EGLSurfaceTest, MessageLoopBug) +{ + const char *extensionsString = eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS); + if (strstr(extensionsString, "EGL_ANGLE_platform_angle_d3d") == nullptr) + { + std::cout << "D3D Platform not supported in ANGLE" << std::endl; + return; + } + + initializeDisplay(EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE); + initializeSurfaceWithDefaultConfig(); + + runMessageLoopTest(EGL_NO_SURFACE, EGL_NO_CONTEXT); +} + +// Tests the message loop bug, but with setting a second context +// instead of null. +TEST_F(EGLSurfaceTest, MessageLoopBugContext) +{ + const char *extensionsString = eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS); + if (strstr(extensionsString, "EGL_ANGLE_platform_angle_d3d") == nullptr) + { + std::cout << "D3D Platform not supported in ANGLE" << std::endl; + return; + } + + initializeDisplay(EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE); + initializeSurfaceWithDefaultConfig(); + + runMessageLoopTest(mPbufferSurface, mSecondContext); +} + +// Test a bug where calling makeCurrent twice would release the surface +TEST_F(EGLSurfaceTest, MakeCurrentTwice) +{ +#if defined(ANGLE_PLATFORM_APPLE) && !defined(ANGLE_STANDALONE_BUILD) + // TODO(cwallez) Make context creation return at least an OpenGL ES 2 context on + // the Mac trybots. + std::cout << "Test skipped temporarily skipped on the Mac trybots" << std::endl; + return; +#endif + + initializeDisplay(EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE); + initializeSurfaceWithDefaultConfig(); + + eglMakeCurrent(mDisplay, mWindowSurface, mWindowSurface, mContext); + ASSERT_TRUE(eglGetError() == EGL_SUCCESS); + + eglMakeCurrent(mDisplay, mWindowSurface, mWindowSurface, mContext); + ASSERT_TRUE(eglGetError() == EGL_SUCCESS); + + // Simple operation to test the FBO is set appropriately + glClear(GL_COLOR_BUFFER_BIT); +} + +// Test that the D3D window surface is correctly resized after calling swapBuffers +TEST_F(EGLSurfaceTest, ResizeD3DWindow) +{ + const char *extensionsString = eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS); + if (strstr(extensionsString, "EGL_ANGLE_platform_angle_d3d") == nullptr) + { + std::cout << "D3D Platform not supported in ANGLE" << std::endl; + return; + } + + initializeDisplay(EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE); + initializeSurfaceWithDefaultConfig(); + + eglSwapBuffers(mDisplay, mWindowSurface); + ASSERT_EGL_SUCCESS(); + + EGLint height; + eglQuerySurface(mDisplay, mWindowSurface, EGL_HEIGHT, &height); + ASSERT_EGL_SUCCESS(); + ASSERT_EQ(64, height); // initial size + + // set window's height to 0 + mOSWindow->resize(64, 0); + + eglSwapBuffers(mDisplay, mWindowSurface); + ASSERT_EGL_SUCCESS(); + + eglQuerySurface(mDisplay, mWindowSurface, EGL_HEIGHT, &height); + ASSERT_EGL_SUCCESS(); + ASSERT_EQ(0, height); + + // restore window's height + mOSWindow->resize(64, 64); + + eglSwapBuffers(mDisplay, mWindowSurface); + ASSERT_EGL_SUCCESS(); + + eglQuerySurface(mDisplay, mWindowSurface, EGL_HEIGHT, &height); + ASSERT_EGL_SUCCESS(); + ASSERT_EQ(64, height); +} + +// Test creating a surface that supports a EGLConfig with 16bit +// support GL_RGB565 +TEST_F(EGLSurfaceTest, CreateWithEGLConfig5650Support) +{ + if (!ANGLETest::eglDisplayExtensionEnabled(EGL_NO_DISPLAY, "EGL_ANGLE_platform_angle_d3d")) + { + std::cout << "D3D Platform not supported in ANGLE" << std::endl; + return; + } + + const EGLint configAttributes[] = + { + EGL_RED_SIZE, 5, + EGL_GREEN_SIZE, 6, + EGL_BLUE_SIZE, 5, + EGL_ALPHA_SIZE, 0, + EGL_DEPTH_SIZE, 0, + EGL_STENCIL_SIZE, 0, + EGL_SAMPLE_BUFFERS, 0, + EGL_NONE + }; + + initializeDisplay(EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE); + EGLConfig config; + if (EGLWindow::FindEGLConfig(mDisplay, configAttributes, &config) == EGL_FALSE) + { + std::cout << "EGLConfig for a GL_RGB565 surface is not supported, skipping test" << std::endl; + return; + } + + initializeSurface(config); + + eglMakeCurrent(mDisplay, mWindowSurface, mWindowSurface, mContext); + ASSERT_EGL_SUCCESS(); + + GLuint program = createProgram(); + ASSERT_NE(0u, program); + drawWithProgram(program); + EXPECT_GL_NO_ERROR(); + glDeleteProgram(program); +} + +// Test creating a surface that supports a EGLConfig with 16bit +// support GL_RGBA4 +TEST_F(EGLSurfaceTest, CreateWithEGLConfig4444Support) +{ + if (!ANGLETest::eglDisplayExtensionEnabled(EGL_NO_DISPLAY, "EGL_ANGLE_platform_angle_d3d")) + { + std::cout << "D3D Platform not supported in ANGLE" << std::endl; + return; + } + + const EGLint configAttributes[] = + { + EGL_RED_SIZE, 4, + EGL_GREEN_SIZE, 4, + EGL_BLUE_SIZE, 4, + EGL_ALPHA_SIZE, 4, + EGL_DEPTH_SIZE, 0, + EGL_STENCIL_SIZE, 0, + EGL_SAMPLE_BUFFERS, 0, + EGL_NONE + }; + + initializeDisplay(EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE); + EGLConfig config; + if (EGLWindow::FindEGLConfig(mDisplay, configAttributes, &config) == EGL_FALSE) + { + std::cout << "EGLConfig for a GL_RGBA4 surface is not supported, skipping test" << std::endl; + return; + } + + initializeSurface(config); + + eglMakeCurrent(mDisplay, mWindowSurface, mWindowSurface, mContext); + ASSERT_EGL_SUCCESS(); + + GLuint program = createProgram(); + ASSERT_NE(0u, program); + drawWithProgram(program); + EXPECT_GL_NO_ERROR(); + glDeleteProgram(program); +} + +// Test creating a surface that supports a EGLConfig with 16bit +// support GL_RGB5_A1 +TEST_F(EGLSurfaceTest, CreateWithEGLConfig5551Support) +{ + if (!ANGLETest::eglDisplayExtensionEnabled(EGL_NO_DISPLAY, "EGL_ANGLE_platform_angle_d3d")) + { + std::cout << "D3D Platform not supported in ANGLE" << std::endl; + return; + } + + const EGLint configAttributes[] = + { + EGL_RED_SIZE, 5, + EGL_GREEN_SIZE, 5, + EGL_BLUE_SIZE, 5, + EGL_ALPHA_SIZE, 1, + EGL_DEPTH_SIZE, 0, + EGL_STENCIL_SIZE, 0, + EGL_SAMPLE_BUFFERS, 0, + EGL_NONE + }; + + initializeDisplay(EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE); + EGLConfig config; + if (EGLWindow::FindEGLConfig(mDisplay, configAttributes, &config) == EGL_FALSE) + { + std::cout << "EGLConfig for a GL_RGB5_A1 surface is not supported, skipping test" << std::endl; + return; + } + + initializeSurface(config); + + eglMakeCurrent(mDisplay, mWindowSurface, mWindowSurface, mContext); + ASSERT_EGL_SUCCESS(); + + GLuint program = createProgram(); + ASSERT_NE(0u, program); + drawWithProgram(program); + EXPECT_GL_NO_ERROR(); + glDeleteProgram(program); +} + +// Test creating a surface that supports a EGLConfig without alpha support +TEST_F(EGLSurfaceTest, CreateWithEGLConfig8880Support) +{ + if (!ANGLETest::eglDisplayExtensionEnabled(EGL_NO_DISPLAY, "EGL_ANGLE_platform_angle_d3d")) + { + std::cout << "D3D Platform not supported in ANGLE" << std::endl; + return; + } + + const EGLint configAttributes[] = + { + EGL_RED_SIZE, 8, + EGL_GREEN_SIZE, 8, + EGL_BLUE_SIZE, 8, + EGL_ALPHA_SIZE, 0, + EGL_DEPTH_SIZE, 0, + EGL_STENCIL_SIZE, 0, + EGL_SAMPLE_BUFFERS, 0, + EGL_NONE + }; + + initializeDisplay(EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE); + EGLConfig config; + if (EGLWindow::FindEGLConfig(mDisplay, configAttributes, &config) == EGL_FALSE) + { + std::cout << "EGLConfig for a GL_RGB8_OES surface is not supported, skipping test" + << std::endl; + return; + } + + initializeSurface(config); + + eglMakeCurrent(mDisplay, mWindowSurface, mWindowSurface, mContext); + ASSERT_EGL_SUCCESS(); + + GLuint program = createProgram(); + ASSERT_NE(0u, program); + drawWithProgram(program); + EXPECT_GL_NO_ERROR(); + glDeleteProgram(program); +} +} diff --git a/gfx/angle/src/tests/egl_tests/EGLThreadTest.cpp b/gfx/angle/src/tests/egl_tests/EGLThreadTest.cpp new file mode 100755 index 000000000..305ccc25f --- /dev/null +++ b/gfx/angle/src/tests/egl_tests/EGLThreadTest.cpp @@ -0,0 +1,83 @@ +#include "gtest/gtest.h" + +#include <EGL/egl.h> +#include <EGL/eglext.h> + +typedef EGLAPI EGLDisplay EGLAPIENTRY EGLGetDisplay(EGLNativeDisplayType display_id); +typedef EGLAPI EGLBoolean EGLAPIENTRY EGLInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor); +typedef EGLAPI EGLContext EGLAPIENTRY EGLGetCurrentContext(void); +typedef EGLAPI EGLSurface EGLAPIENTRY EGLGetCurrentSurface(EGLint readdraw); +typedef EGLAPI EGLBoolean EGLAPIENTRY EGLTerminate(EGLDisplay dpy); + +class EGLThreadTest : public testing::Test +{ + public: + virtual void SetUp() {} + virtual void TearDown() {} + + EGLGetDisplay *mGetDisplay; + EGLInitialize *mInitialize; + EGLGetCurrentContext *mGetCurrentContext; + EGLGetCurrentSurface *mGetCurrentSurface; + + EGLDisplay mDisplay; + + HMODULE mEGL; + HMODULE mGLESv2; + + static DWORD WINAPI ThreadingTestEntryPoint(LPVOID thisPointer); + + private: + void ThreadingTest(); +}; + +DWORD WINAPI EGLThreadTest::ThreadingTestEntryPoint(LPVOID lpParameter) +{ + EGLThreadTest *test = (EGLThreadTest *)lpParameter; + test->ThreadingTest(); + return 0; +} + +void EGLThreadTest::ThreadingTest() +{ + mEGL = LoadLibrary(TEXT("libEGL.dll")); + mGLESv2 = LoadLibrary(TEXT("libGLESv2.dll")); + + EXPECT_TRUE(mEGL != NULL); + EXPECT_TRUE(mGLESv2 != NULL); + + mGetDisplay = (EGLGetDisplay *)GetProcAddress(mEGL, "eglGetDisplay"); + mInitialize = (EGLInitialize *)GetProcAddress(mEGL, "eglInitialize"); + mGetCurrentContext = (EGLGetCurrentContext *)GetProcAddress(mEGL, "eglGetCurrentContext"); + mGetCurrentSurface = (EGLGetCurrentSurface *)GetProcAddress(mEGL, "eglGetCurrentSurface"); + + EXPECT_TRUE(mGetDisplay != NULL); + EXPECT_TRUE(mInitialize != NULL); + EXPECT_TRUE(mGetCurrentContext != NULL); + EXPECT_TRUE(mGetCurrentSurface != NULL); + + mDisplay = mGetDisplay(EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE); + + EXPECT_TRUE(mDisplay!= EGL_NO_DISPLAY); + + mInitialize(mDisplay, NULL, NULL); + mGetCurrentContext(); +} + +TEST_F(EGLThreadTest, thread_init_crash) +{ + DWORD threadId; + HANDLE threadHandle = CreateThread(NULL, 0, EGLThreadTest::ThreadingTestEntryPoint, this, 0, &threadId); + EXPECT_TRUE(threadHandle != NULL); + + // wait for signal from thread + DWORD waitResult = WaitForSingleObject(threadHandle, 1000); + EXPECT_EQ(waitResult, WAIT_OBJECT_0); + + // crash, because the TLS value is NULL on main thread + mGetCurrentSurface(EGL_DRAW); + mGetCurrentContext(); + + auto terminate = (EGLTerminate *)GetProcAddress(mEGL, "eglTerminate"); + terminate(mDisplay); +} diff --git a/gfx/angle/src/tests/egl_tests/EGLX11VisualTest.cpp b/gfx/angle/src/tests/egl_tests/EGLX11VisualTest.cpp new file mode 100755 index 000000000..4d5179964 --- /dev/null +++ b/gfx/angle/src/tests/egl_tests/EGLX11VisualTest.cpp @@ -0,0 +1,216 @@ +// +// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +// EGLX11VisualTest.cpp: tests for EGL_ANGLE_x11_visual extension + +#include <gtest/gtest.h> + +#include <EGL/egl.h> +#include <EGL/eglext.h> +#include <X11/Xlib.h> + +#include "OSWindow.h" +#include "test_utils/ANGLETest.h" +#include "x11/X11Window.h" + +using namespace angle; + +namespace +{ + +const EGLint contextAttribs[] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE}; +} + +class EGLX11VisualHintTest : public ::testing::TestWithParam<angle::PlatformParameters> +{ + public: + void SetUp() override + { + mEglGetPlatformDisplayEXT = reinterpret_cast<PFNEGLGETPLATFORMDISPLAYEXTPROC>( + eglGetProcAddress("eglGetPlatformDisplayEXT")); + + mDisplay = XOpenDisplay(NULL); + } + + std::vector<EGLint> getDisplayAttributes(int visualId) const + { + std::vector<EGLint> attribs; + + attribs.push_back(EGL_PLATFORM_ANGLE_TYPE_ANGLE); + attribs.push_back(GetParam().getRenderer()); + attribs.push_back(EGL_X11_VISUAL_ID_ANGLE); + attribs.push_back(visualId); + attribs.push_back(EGL_NONE); + + return attribs; + } + + unsigned int chooseDifferentVisual(unsigned int visualId) + { + int numVisuals; + XVisualInfo visualTemplate; + visualTemplate.screen = DefaultScreen(mDisplay); + + XVisualInfo *visuals = + XGetVisualInfo(mDisplay, VisualScreenMask, &visualTemplate, &numVisuals); + EXPECT_TRUE(numVisuals >= 2); + + for (int i = 0; i < numVisuals; ++i) + { + if (visuals[i].visualid != visualId) + { + int result = visuals[i].visualid; + XFree(visuals); + return result; + } + } + + UNREACHABLE(); + return -1; + } + + protected: + PFNEGLGETPLATFORMDISPLAYEXTPROC mEglGetPlatformDisplayEXT; + Display *mDisplay; +}; + +// Test that display creation fails if the visual ID passed in invalid. +TEST_P(EGLX11VisualHintTest, InvalidVisualID) +{ + // The test platform will log an error in this negative test. + IgnoreANGLEPlatformMessages(); + + static const int gInvalidVisualId = -1; + auto attributes = getDisplayAttributes(gInvalidVisualId); + + EGLDisplay display = + mEglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, EGL_DEFAULT_DISPLAY, attributes.data()); + ASSERT_TRUE(display != EGL_NO_DISPLAY); + + ASSERT_TRUE(EGL_FALSE == eglInitialize(display, nullptr, nullptr)); + ASSERT_EGL_ERROR(EGL_NOT_INITIALIZED); +} + +// Test that context creation with a visual ID succeeds, that the context exposes +// only one config, and that a clear on a surface with this config works. +TEST_P(EGLX11VisualHintTest, ValidVisualIDAndClear) +{ + // We'll test the extension with one visual ID but we don't care which one. This means we + // can use OSWindow to create a window and just grab its visual. + OSWindow *osWindow = CreateOSWindow(); + osWindow->initialize("EGLX11VisualHintTest", 500, 500); + osWindow->setVisible(true); + + Window xWindow = osWindow->getNativeWindow(); + + XWindowAttributes windowAttributes; + ASSERT_NE(0, XGetWindowAttributes(mDisplay, xWindow, &windowAttributes)); + int visualId = windowAttributes.visual->visualid; + + auto attributes = getDisplayAttributes(visualId); + EGLDisplay display = + mEglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, EGL_DEFAULT_DISPLAY, attributes.data()); + ASSERT_NE(EGL_NO_DISPLAY, display); + + ASSERT_TRUE(EGL_TRUE == eglInitialize(display, nullptr, nullptr)); + + // While this is not required by the extension, test that our implementation returns only one + // config, with the same native visual Id that we provided. + int nConfigs = 0; + ASSERT_TRUE(EGL_TRUE == eglGetConfigs(display, nullptr, 0, &nConfigs)); + ASSERT_EQ(1, nConfigs); + + int nReturnedConfigs = 0; + EGLConfig config; + ASSERT_TRUE(EGL_TRUE == eglGetConfigs(display, &config, 1, &nReturnedConfigs)); + ASSERT_EQ(nConfigs, nReturnedConfigs); + + EGLint eglNativeId; + ASSERT_TRUE(EGL_TRUE == eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &eglNativeId)); + ASSERT_EQ(visualId, eglNativeId); + + // Finally, try to do a clear on the window. + EGLContext context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribs); + ASSERT_NE(EGL_NO_CONTEXT, context); + + EGLSurface window = eglCreateWindowSurface(display, config, xWindow, nullptr); + ASSERT_EGL_SUCCESS(); + + eglMakeCurrent(display, window, window, context); + ASSERT_EGL_SUCCESS(); + + glViewport(0, 0, 500, 500); + glClearColor(0.0f, 0.0f, 1.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + ASSERT_GL_NO_ERROR(); + EXPECT_PIXEL_EQ(250, 250, 0, 0, 255, 255); + + // Teardown + eglDestroySurface(display, window); + ASSERT_EGL_SUCCESS(); + + eglDestroyContext(display, context); + ASSERT_EGL_SUCCESS(); + + SafeDelete(osWindow); + + eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + eglTerminate(display); +} + +// Test that EGL_BAD_MATCH is generated when trying to create an EGL window from +// an X11 window whose visual ID doesn't match the visual ID passed at display creation. +TEST_P(EGLX11VisualHintTest, InvalidWindowVisualID) +{ + // Get the default visual ID, as a good guess of a visual id for which display + // creation will succeed. + int visualId; + { + OSWindow *osWindow = CreateOSWindow(); + osWindow->initialize("EGLX11VisualHintTest", 500, 500); + osWindow->setVisible(true); + + Window xWindow = osWindow->getNativeWindow(); + + XWindowAttributes windowAttributes; + ASSERT_NE(0, XGetWindowAttributes(mDisplay, xWindow, &windowAttributes)); + visualId = windowAttributes.visual->visualid; + + SafeDelete(osWindow); + } + + auto attributes = getDisplayAttributes(visualId); + EGLDisplay display = + mEglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, EGL_DEFAULT_DISPLAY, attributes.data()); + ASSERT_NE(EGL_NO_DISPLAY, display); + + ASSERT_TRUE(EGL_TRUE == eglInitialize(display, nullptr, nullptr)); + + + // Initialize the window with a visual id different from the display's visual id + int otherVisualId = chooseDifferentVisual(visualId); + ASSERT_NE(visualId, otherVisualId); + + OSWindow *osWindow = new X11Window(otherVisualId); + osWindow->initialize("EGLX11VisualHintTest", 500, 500); + osWindow->setVisible(true); + + Window xWindow = osWindow->getNativeWindow(); + + // Creating the EGL window should fail with EGL_BAD_MATCH + int nReturnedConfigs = 0; + EGLConfig config; + ASSERT_TRUE(EGL_TRUE == eglGetConfigs(display, &config, 1, &nReturnedConfigs)); + ASSERT_EQ(1, nReturnedConfigs); + + EGLSurface window = eglCreateWindowSurface(display, config, xWindow, nullptr); + ASSERT_EQ(EGL_NO_SURFACE, window); + ASSERT_EGL_ERROR(EGL_BAD_MATCH); + + SafeDelete(osWindow); +} + +ANGLE_INSTANTIATE_TEST(EGLX11VisualHintTest, ES2_OPENGL()); diff --git a/gfx/angle/src/tests/egl_tests/media/yuvtest.inl b/gfx/angle/src/tests/egl_tests/media/yuvtest.inl new file mode 100755 index 000000000..7271cf80a --- /dev/null +++ b/gfx/angle/src/tests/egl_tests/media/yuvtest.inl @@ -0,0 +1,1548 @@ +// GENERATED FILE - DO NOT EDIT. +// Generated by scripts/bmp_to_yuv.py using data from yuvtest.bmp +// +// Copyright 2016 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +static const size_t yuvtest_width = 128; +static const size_t yuvtest_height = 128; +static const unsigned char yuvtest_data[] = +{ + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,132,16,16,16,16,105,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,23,16,16,16,16,16,16,44,153,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,16,16,16,16,16,16,16,16,16,78,228,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,16,16,16,173,44,16,16,16,16,16,16,44,153,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,16,16,16,228,235,235,221,112,16,16,16,16,16,78,228, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,37,16,16,92,235,235,235,235,153,44,16,16,16,16,16, + 92,228,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,212,186,186,186,186,186,186,186,186,186,203,234,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,146,16,16,16,235,235,235,235,235,235,221,112,16,16,16, + 16,16,16,92,228,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,219,187,160,150,150,150,140,127,121,121,121, + 152,186,186,186,186,186,186,186,186,186,186,186,186,186,203,234, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,16,16,16,105,235,235,235,235,235,235,235,153,44,16, + 16,16,16,16,78,228,235,235,235,235,235,235,235,235,235,219, + 187,160,150,150,150,150,150,149,132,121,121,121,121,121,121,152, + 186,186,186,186,186,186,186,185,154,134,134,134,134,134,134,134, + 134,134,134,169,232,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,213,171,135,120,120,120,120,120,120,120, + 120,120,120,120,120,167,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,232, + 172,134,27,16,16,16,130,134,134,134,134,134,134,134,169,151, + 44,16,16,16,16,44,153,235,235,235,235,235,219,187,160,150, + 150,150,150,150,150,150,149,129,121,121,121,121,121,121,121,185, + 186,186,185,146,121,121,122,131,134,134,134,134,134,134,134,134, + 134,134,134,134,134,134,134,134,169,232,235,235,235,235,235,235, + 235,235,235,235,231,156,120,120,120,120,120,120,120,120,120,120, + 120,120,120,120,120,124,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,187,134, + 134,134,101,24,16,16,57,134,134,134,134,134,134,134,134,134, + 134,134,75,16,16,16,16,78,228,219,187,160,150,150,150,150, + 150,150,150,150,150,148,134,121,121,121,121,136,172,225,212,186, + 186,186,163,150,150,149,138,134,134,134,134,134,134,134,134,134, + 134,134,134,134,134,134,134,134,134,134,134,169,232,235,235,235, + 235,235,213,171,135,120,120,120,120,120,120,120,120,120,120,120, + 120,120,120,120,135,192,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,137,134, + 134,134,134,86,16,16,16,134,134,134,134,134,134,134,134,134, + 134,134,134,86,24,16,16,16,45,129,150,150,150,150,150,158, + 184,214,235,235,172,121,121,121,121,178,235,235,235,235,188,186, + 186,188,200,158,149,139,134,134,134,143,158,136,121,121,121,121, + 146,178,166,140,134,134,134,134,134,134,134,134,147,197,199,142, + 120,120,120,120,120,120,120,164,206,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,134,134, + 134,194,235,235,37,16,16,166,235,235,235,235,235,197,147,134, + 134,134,134,134,126,68,16,16,16,20,87,150,158,184,214,235, + 235,235,235,199,125,121,121,125,181,235,235,235,235,226,186,186, + 186,217,235,232,155,134,134,134,141,150,150,174,225,178,136,121, + 121,121,154,186,186,186,200,196,147,134,134,134,130,123,120,120, + 120,120,120,120,120,131,185,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,134,134, + 134,235,235,235,112,16,16,57,235,235,235,235,235,235,235,235, + 235,235,206,147,134,134,82,20,16,16,16,72,228,235,235,235, + 235,232,157,121,121,121,125,225,235,235,235,235,235,203,186,186, + 202,235,232,163,134,134,134,161,155,150,150,150,174,232,235,235, + 228,172,121,151,186,186,186,165,113,111,120,122,120,120,120,120, + 120,120,135,167,206,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,134,134, + 134,235,235,235,215,16,16,16,235,235,235,235,235,235,235,235, + 235,235,235,235,145,136,134,115,42,16,16,16,78,228,235,235, + 235,172,121,121,121,125,181,235,235,235,235,235,235,188,186,186, + 226,232,163,134,134,134,184,235,230,187,150,150,150,160,203,235, + 231,158,111,111,149,186,186,186,151,119,120,120,120,120,121,126, + 133,142,231,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,233,169,189, + 189,189,189,189,189,16,16,16,87,189,189,189,195,217,235,235, + 235,235,235,235,150,150,150,167,134,71,16,16,16,71,228,235, + 235,125,121,121,168,225,235,235,235,235,235,235,235,186,186,186, + 232,163,134,134,134,184,235,235,235,235,192,150,150,150,148,130, + 111,111,111,111,111,149,166,133,120,120,120,120,120,121,133,134, + 134,134,134,152,232,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,233,202,189,189, + 189,189,189,189,189,32,16,16,16,87,189,189,189,189,195,217, + 235,235,235,235,150,150,150,235,184,134,75,16,16,16,20,77, + 121,98,121,121,235,235,235,235,235,235,235,235,212,186,186,185, + 163,134,134,134,184,235,235,235,235,235,235,200,153,126,111,111, + 111,111,111,125,148,134,120,120,120,120,121,152,224,200,129,132, + 134,134,134,134,137,232,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,233,202,189,189,189, + 189,189,189,189,189,140,27,16,16,16,189,189,189,189,189,189, + 195,217,235,235,150,150,150,235,235,194,147,75,16,16,16,16, + 16,16,52,157,235,235,235,235,235,235,235,235,188,186,185,149, + 134,134,134,184,235,235,235,235,235,235,235,235,163,111,111,111, + 112,118,127,120,120,120,120,120,122,150,139,121,153,235,235,206, + 140,134,134,134,134,134,175,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,233,202,189,189,189,161, + 134,134,134,235,235,235,173,16,16,16,235,232,212,192,189,189, + 189,189,189,189,189,189,176,233,235,235,235,216,109,31,16,16, + 16,16,16,152,235,235,235,235,235,235,235,235,186,185,149,134, + 134,134,184,235,235,235,235,235,235,235,231,158,111,111,115,120, + 120,120,120,120,120,120,131,159,180,186,174,121,121,199,235,235, + 235,227,144,134,134,134,134,146,231,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,220,198,189,189,189,212,197, + 134,134,134,163,235,235,235,37,16,16,166,235,235,232,212,192, + 189,189,189,189,189,189,189,189,189,189,205,233,235,184,119,89, + 49,16,16,37,153,235,235,235,235,235,235,234,170,144,134,134, + 134,184,235,235,235,235,235,235,235,231,146,112,116,120,120,120, + 120,120,120,128,167,206,235,231,186,186,186,123,121,143,235,235, + 235,235,223,122,132,134,134,134,137,228,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,210,189,189,189,189,212,235,235, + 144,134,134,134,203,235,235,112,16,16,57,235,235,235,235,232, + 212,195,189,189,189,189,189,189,189,189,189,189,194,208,165,133, + 123,20,16,16,16,59,225,235,235,235,232,157,134,134,134,134, + 184,235,235,235,235,235,235,235,235,153,117,120,120,120,120,120, + 123,132,142,150,174,235,235,235,191,186,186,165,121,121,199,235, + 235,235,235,196,129,132,134,134,134,139,232,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,213,189,189,189,191,213,235,235,235, + 206,147,134,134,134,175,235,215,23,16,16,166,235,235,235,235, + 235,235,235,179,150,164,187,189,189,189,189,189,189,189,189,183, + 165,111,24,16,16,16,57,225,235,235,166,135,169,189,189,189, + 189,189,189,189,189,189,185,171,127,120,120,120,120,120,135,188, + 208,155,150,150,150,208,235,235,215,186,186,186,121,121,143,232, + 235,235,235,235,235,229,151,134,134,134,163,232,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,191,189,189,191,231,235,235,235,235, + 235,225,137,134,134,134,235,235,112,16,16,57,228,235,235,235, + 235,235,235,152,150,150,219,235,235,217,195,189,189,189,189,189, + 189,189,178,92,16,16,16,16,57,140,135,173,189,189,189,189, + 189,189,189,189,180,148,125,120,120,120,120,120,149,199,235,235, + 235,230,179,150,150,166,235,235,235,186,186,186,125,121,121,161, + 235,235,235,235,235,235,235,122,134,134,134,169,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,189,189,189,217,235,235,235,235,235, + 235,235,203,134,134,134,170,217,215,23,16,16,92,235,235,235, + 235,235,235,150,150,150,235,235,235,235,235,235,227,177,180,189, + 189,189,189,189,102,16,16,16,16,57,169,189,189,189,189,189, + 189,189,170,140,120,120,120,120,120,122,146,178,233,235,235,235, + 235,235,227,152,150,150,195,235,235,186,186,186,189,121,121,121, + 235,235,235,235,235,235,235,111,122,134,134,134,160,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,189,189,189,235,235,235,235,235,235, + 235,235,235,144,134,134,134,149,185,127,16,16,16,105,235,235, + 235,235,235,150,150,150,235,235,235,235,235,235,235,125,121,135, + 200,191,189,189,189,124,38,16,16,16,124,178,172,143,156,149, + 139,120,120,120,120,120,120,128,156,185,189,189,195,176,95,95, + 152,235,235,195,150,150,152,222,235,186,186,186,235,121,121,121, + 235,235,235,235,235,235,235,111,111,132,134,134,134,213,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,233,189,189,189,235,235,235,235,235,235, + 235,235,235,203,139,134,134,134,152,186,33,16,16,16,235,235, + 235,235,235,150,150,150,235,235,235,235,235,235,228,121,121,121, + 208,189,189,189,189,189,189,32,23,58,107,120,120,120,120,120, + 120,120,120,120,120,149,150,111,111,152,189,189,189,189,163,97, + 95,95,95,152,168,150,150,168,235,186,186,186,235,121,121,121, + 235,235,235,235,235,235,235,111,111,117,147,134,134,182,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,210,189,189,191,235,235,235,235,235,235, + 235,235,235,235,229,177,134,134,134,149,138,16,16,16,78,235, + 235,235,235,150,150,150,235,235,235,235,235,235,192,121,121,158, + 189,189,189,189,189,189,180,126,115,120,120,120,120,120,120,120, + 120,120,123,134,203,235,115,111,111,176,216,192,189,189,189,163, + 97,95,95,95,224,152,150,150,208,186,186,186,235,121,121,121, + 235,235,235,235,235,235,235,111,111,111,210,134,134,140,197,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,191,189,189,213,235,235,235,235,235,235, + 235,235,235,235,235,235,144,134,134,134,170,32,16,16,16,144, + 234,235,235,150,150,150,235,235,235,235,235,235,153,121,127,189, + 189,189,201,213,162,128,120,120,120,120,120,117,101,140,156,172, + 173,166,148,134,137,187,111,111,111,235,235,232,210,189,189,189, + 163,97,95,95,235,187,150,150,166,186,186,186,235,121,121,121, + 235,235,235,235,235,235,235,111,111,111,235,144,134,134,134,163, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,233,189,189,189,235,235,235,235,235,235,235, + 235,235,235,235,235,235,206,147,134,134,146,138,37,16,16,48, + 194,234,235,150,150,150,235,235,235,235,235,235,125,146,185,189, + 185,165,139,121,120,120,120,120,120,127,68,23,16,21,108,189, + 189,189,189,189,189,189,182,154,132,175,210,235,235,212,189,189, + 189,157,95,95,235,227,152,150,150,186,186,186,235,121,121,121, + 235,235,235,235,235,235,235,111,111,111,235,210,140,134,134,134, + 203,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,210,189,189,191,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,225,137,134,134,157,174,21,16,16, + 64,187,217,150,150,150,235,235,235,235,235,233,168,174,156,136, + 120,120,120,120,120,120,120,138,165,212,160,21,16,16,16,65, + 184,189,189,189,189,189,189,189,188,173,160,146,134,147,193,189, + 189,189,95,95,235,235,192,150,150,186,186,186,235,121,121,121, + 235,235,235,235,235,235,235,123,111,115,235,235,229,169,134,134, + 153,232,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,191,189,189,213,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,194,134,134,134,147,123,16,16, + 16,64,186,182,163,150,235,235,235,235,235,178,134,120,120,120, + 120,120,120,120,124,154,178,189,189,235,235,163,53,16,16,16, + 70,184,189,189,189,189,189,189,189,189,189,189,182,154,134,184, + 189,189,142,96,235,235,232,166,150,186,186,186,235,121,121,121, + 235,235,235,235,235,235,235,200,142,188,235,235,235,225,137,134, + 134,163,232,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,189,189,189,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,184,134,134,134,134,89,16, + 16,16,133,186,186,178,227,235,235,199,139,120,120,120,120,120, + 120,123,127,170,235,227,189,189,189,235,235,215,186,96,16,16, + 16,69,189,189,191,128,150,179,189,189,189,189,189,189,182,181, + 189,189,179,123,232,235,235,219,150,186,186,186,235,121,121,121, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,194,134, + 134,134,169,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,189,189,189,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,194,140,134,134,134,90, + 16,16,49,181,186,186,188,183,142,120,120,120,120,122,124,128, + 133,134,184,235,233,201,189,189,204,235,235,235,191,186,101,16, + 16,16,139,189,189,172,113,111,229,217,207,192,189,189,189,189, + 189,189,189,151,134,169,232,235,150,186,186,186,235,121,121,121, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,184, + 134,134,134,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,189,189,189,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,229,144,134,134,123, + 20,16,16,59,168,150,129,120,120,120,120,122,148,133,134,134, + 134,184,235,235,210,189,189,189,227,235,235,235,215,186,186,86, + 16,16,36,125,189,189,167,113,235,235,235,232,212,192,189,189, + 189,189,189,184,166,148,162,181,150,186,186,186,235,121,121,121, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 134,134,134,197,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,189,189,189,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,203,140,134,134, + 86,35,75,107,120,120,120,120,120,122,150,183,148,134,134,137, + 187,235,235,235,191,189,189,212,235,235,235,235,235,211,186,170, + 21,16,16,16,65,189,189,167,233,235,235,235,235,232,210,184, + 189,189,189,189,189,189,182,156,148,186,186,186,235,121,121,121, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 144,134,134,134,163,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,227,189,189,189,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,229,179,133, + 124,120,120,120,120,120,120,127,150,183,189,168,134,134,131,225, + 235,235,235,235,189,189,189,235,235,235,235,235,235,235,217,192, + 143,28,16,16,16,135,189,189,202,235,235,235,235,152,95,105, + 137,176,189,189,189,189,189,189,189,189,189,184,165,121,121,121, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 203,140,134,134,134,232,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,205,189,189,204,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,192,122, + 120,120,120,120,111,93,182,189,189,189,169,134,134,134,176,189, + 227,235,235,235,189,189,189,235,235,235,235,235,235,235,235,235, + 235,209,84,16,16,41,189,189,189,167,150,150,150,150,150,150, + 150,153,189,189,189,186,189,189,189,189,189,189,173,131,122,125, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,229,144,134,134,169,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,191,189,189,227,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,213,171,135,120,120, + 120,120,106,42,16,16,76,189,189,175,134,134,134,160,186,186, + 186,212,235,235,189,189,189,187,160,150,150,150,150,150,150,150, + 150,150,137,20,16,16,88,189,189,186,153,150,150,150,150,150, + 150,150,189,189,189,126,157,185,189,189,189,189,189,182,155,191, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,194,134,134,134,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,189,189,189,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,231,156,120,120,120,120,120, + 139,202,137,75,16,16,16,184,189,134,134,134,163,186,186,186, + 186,186,194,217,189,189,189,150,150,150,150,150,150,150,150,150, + 150,150,150,95,16,16,19,151,189,189,175,149,132,121,121,121, + 121,121,189,189,189,162,186,186,186,182,164,189,189,189,189,185, + 225,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,134,134,134,232,235,235,235,235,235,235,235,235,235, + 235,235,235,235,189,189,189,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,231,153,120,120,120,120,131,174, + 231,235,203,147,27,16,16,65,184,134,134,184,235,199,137,172, + 186,186,186,186,189,189,189,150,150,150,150,150,150,150,150,150, + 150,160,174,192,58,16,16,42,189,189,189,132,121,121,121,121, + 121,121,189,189,189,186,186,186,186,152,136,179,188,189,189,189, + 188,176,232,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,144,134,134,169,235,235,235,235,235,235,235,235,235, + 235,235,235,235,189,189,189,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,231,164,120,120,120,120,164,206,235,235, + 235,235,235,235,125,16,16,16,65,134,160,235,235,235,199,129, + 152,182,186,186,189,189,189,182,214,235,235,235,235,235,235,235, + 235,235,235,235,198,19,16,16,99,189,189,179,134,134,134,134, + 134,134,189,189,189,134,134,134,134,134,134,134,137,161,188,189, + 189,189,173,197,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,194,134,134,134,235,235,235,235,235,235,235,235,235, + 235,235,235,235,189,189,189,235,235,235,235,235,235,235,235,235, + 235,235,235,235,231,164,120,120,120,120,120,177,235,235,235,235, + 235,235,235,235,175,76,16,16,16,97,134,147,197,235,235,225, + 149,127,158,186,189,189,189,188,212,225,235,235,235,235,235,232, + 172,134,134,134,134,75,16,16,20,161,189,189,146,134,134,134, + 134,134,189,189,189,134,134,134,134,134,134,134,134,134,146,182, + 189,189,189,184,178,222,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,134,134,134,235,235,235,235,235,235,235,235,235, + 235,235,235,235,189,189,189,235,235,235,235,235,235,235,235,235, + 235,235,235,199,142,120,120,120,120,135,188,235,235,235,235,235, + 235,235,235,216,134,154,87,16,16,38,130,134,134,163,229,174, + 150,146,128,154,189,189,189,186,186,186,205,235,235,232,172,134, + 134,134,134,134,134,130,38,16,16,49,184,189,163,134,134,134, + 134,134,189,189,189,134,134,134,134,134,134,134,134,134,134,137, + 172,189,189,189,189,189,190,208,224,235,235,235,235,235,235,235, + 235,235,235,235,134,134,134,235,235,235,235,235,235,235,235,235, + 235,235,235,235,189,189,189,235,235,235,235,235,235,235,235,235, + 235,231,156,120,120,120,120,135,188,235,235,235,235,235,235,235, + 235,235,175,134,134,173,173,21,16,16,49,134,134,134,136,143, + 150,150,184,177,189,189,189,186,186,186,186,170,229,163,134,134, + 134,134,134,134,134,131,100,19,16,16,65,189,190,186,186,186, + 186,175,189,189,189,235,235,235,235,235,235,235,229,184,147,134, + 134,156,182,189,189,189,189,189,189,202,233,235,235,235,235,235, + 235,235,235,235,134,134,134,235,235,235,235,235,235,235,235,235, + 235,235,235,235,189,189,189,235,235,235,235,235,235,235,235,235, + 231,153,120,120,120,120,115,111,111,111,111,111,111,111,154,231, + 235,216,134,134,134,188,189,118,16,16,16,102,134,134,134,134, + 136,170,235,235,189,189,189,146,180,186,185,154,134,134,134,134, + 147,194,199,142,111,111,111,83,16,16,16,135,189,188,186,192, + 173,95,189,189,189,231,235,235,235,235,235,235,235,235,235,235, + 229,179,134,144,165,182,189,189,189,189,173,169,232,235,235,235, + 235,235,235,235,134,134,134,235,235,235,235,235,235,235,235,235, + 235,235,235,235,189,189,189,233,235,235,235,235,235,235,235,231, + 153,120,120,120,117,112,111,111,111,111,111,111,111,111,111,111, + 111,140,134,134,147,189,189,189,71,16,16,41,139,134,134,134, + 134,134,134,169,189,189,189,192,152,182,157,134,134,134,134,149, + 121,121,121,114,111,111,113,234,92,16,16,49,184,189,207,235, + 235,165,189,189,189,134,235,235,235,235,235,235,235,235,235,235, + 235,235,197,147,134,134,144,169,189,189,189,189,189,170,135,147, + 197,235,235,235,134,134,134,235,235,235,235,235,235,235,235,235, + 235,235,235,235,194,189,189,202,233,235,235,235,235,235,199,142, + 120,120,120,115,111,111,111,111,111,111,111,111,111,111,111,111, + 115,134,134,134,115,189,189,189,102,19,16,16,16,51,147,138, + 134,134,134,134,189,189,189,235,235,186,134,134,134,140,165,168, + 121,121,114,111,111,111,176,208,170,21,16,16,65,184,199,235, + 235,235,189,189,189,95,169,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,197,147,161,189,189,189,189,189,184,166, + 148,163,235,235,134,134,134,235,235,235,235,235,235,235,235,235, + 235,235,235,235,216,189,189,189,202,233,235,235,231,156,120,120, + 120,120,117,111,111,176,235,235,235,235,235,235,235,188,127,124, + 134,134,134,127,111,189,189,189,111,72,16,16,16,16,92,185, + 184,147,134,134,189,189,189,156,179,134,134,134,135,186,186,186, + 146,115,111,111,111,173,212,186,186,117,16,16,16,65,184,227, + 235,235,189,189,189,95,99,213,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,229,182,182,189,189,189,189,189, + 189,182,154,134,134,134,134,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,212,189,189,189,202,233,231,153,120,120,120, + 124,156,111,111,142,235,235,235,235,235,235,235,235,235,216,134, + 134,134,134,115,111,189,189,189,111,111,75,28,16,16,34,108, + 111,111,122,134,189,189,189,134,134,134,134,133,129,180,186,186, + 186,165,111,111,173,212,186,186,186,188,125,16,16,16,65,208, + 235,235,189,189,189,95,95,130,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,197,147,156,182,189,189, + 189,189,189,173,134,134,137,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,212,189,189,189,202,170,120,120,120,167, + 224,146,111,111,184,235,235,235,235,235,235,235,235,235,166,134, + 134,147,187,235,235,189,189,189,150,150,150,148,21,16,16,43, + 108,111,111,120,189,189,189,134,134,134,134,122,116,140,183,186, + 186,186,140,137,234,188,186,186,188,217,235,125,16,16,16,69, + 235,235,189,189,189,95,95,95,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,197,155,165, + 186,189,189,189,134,134,137,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,212,189,189,187,123,120,120,177,235, + 235,115,111,111,223,235,235,235,235,235,235,235,235,216,134,134, + 134,216,235,235,227,189,189,189,192,150,150,150,102,16,16,16, + 43,108,111,111,182,189,189,151,134,134,134,128,112,111,126,180, + 186,186,186,168,175,186,186,188,217,235,235,235,121,16,16,16, + 132,232,189,189,189,95,95,95,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 232,194,189,188,134,147,197,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,209,146,120,120,120,124,235,235, + 235,111,111,111,235,235,235,235,235,235,235,235,187,134,134,134, + 166,235,235,235,205,189,189,204,235,192,150,150,150,82,16,16, + 16,78,228,235,192,189,189,179,135,134,134,134,131,120,111,135, + 182,186,186,186,186,186,186,212,235,235,235,235,235,100,16,16, + 22,186,189,189,201,95,95,95,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,199,142,120, + 156,222,201,217,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,171,120,120,120,120,163,233,235, + 235,111,111,111,235,235,235,235,235,235,235,235,137,134,134,134, + 216,235,235,235,191,189,189,227,235,235,200,155,150,150,82,16, + 16,16,92,232,146,188,189,189,173,172,134,134,134,134,131,120, + 116,170,186,186,186,186,149,137,232,235,235,235,235,206,49,16, + 16,39,124,189,216,95,95,95,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,181,120,120,120,120,120, + 120,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,231,124,120,120,129,161,189,202,233, + 235,111,111,111,235,235,235,235,235,235,235,232,134,134,134,187, + 235,235,235,235,189,189,189,235,235,235,235,230,192,155,150,82, + 16,16,16,167,133,156,189,189,189,202,191,134,134,134,134,134, + 137,166,186,186,186,186,135,111,118,188,235,235,235,233,163,21, + 16,16,16,65,224,95,95,95,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,181,120,120,120,120,120,120,120,124, + 192,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,171,120,120,124,212,189,189,189,189, + 189,172,123,111,235,235,235,235,235,235,232,163,134,134,137,235, + 235,235,235,235,189,189,189,235,235,235,235,235,235,230,187,150, + 29,16,16,48,130,134,161,189,189,189,166,112,122,132,134,134, + 134,134,149,185,186,186,173,113,111,111,123,162,204,235,227,130, + 27,16,16,16,78,92,95,95,235,235,235,235,235,235,235,235, + 235,235,199,142,120,120,120,120,120,120,120,120,120,135,171,224, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,124,120,120,181,235,212,189,189,189, + 189,189,187,148,235,235,235,235,235,235,179,134,134,134,113,95, + 95,95,95,95,189,189,189,113,182,235,235,235,235,235,235,176, + 95,16,16,16,57,134,137,211,189,189,187,123,111,164,177,137, + 134,134,134,157,187,186,186,165,113,111,111,111,111,111,138,178, + 178,92,16,16,16,38,95,95,235,235,235,235,235,213,171,135, + 120,120,120,120,120,120,120,120,120,120,120,135,192,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,231,120,120,120,235,235,235,217,195,189, + 189,189,189,189,189,189,208,235,235,235,137,134,134,116,95,95, + 95,95,95,95,189,189,189,95,95,113,182,235,235,235,235,230, + 160,75,16,16,16,136,197,214,178,189,189,172,173,208,186,183, + 157,134,134,134,134,134,149,186,167,114,111,111,111,111,111,131, + 189,187,114,120,120,120,120,120,120,120,120,120,120,120,120,120, + 120,120,120,120,120,120,120,120,135,192,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,164,120,120,124,235,235,235,235,235,235, + 228,172,189,189,189,189,189,217,235,216,134,134,134,95,95,95, + 95,95,95,95,189,189,189,95,95,95,95,113,182,235,235,235, + 216,129,27,16,16,60,185,119,125,187,189,189,194,186,186,186, + 188,175,134,134,134,134,134,170,186,178,165,166,131,111,111,122, + 120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120, + 120,120,135,171,224,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,213,120,120,120,181,235,235,235,235,235,235, + 235,111,148,179,189,189,189,189,189,189,189,184,179,119,95,95, + 235,235,235,235,189,189,189,165,103,95,95,95,95,126,231,235, + 216,134,86,16,16,16,43,111,111,149,189,189,189,188,186,188, + 231,235,197,147,134,134,134,139,166,186,166,135,120,120,120,120, + 120,120,120,120,120,120,120,120,120,120,120,120,120,135,167,206, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,160,120,120,156,235,235,235,235,235,235,235, + 235,111,111,111,220,192,189,189,189,189,189,189,189,189,178,130, + 235,235,235,235,189,189,189,235,226,165,103,95,95,95,148,187, + 134,134,134,74,16,16,16,81,120,199,212,189,189,189,190,216, + 235,235,235,235,225,137,134,134,130,126,120,120,120,120,120,120, + 120,120,129,147,93,19,16,16,16,43,119,162,204,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,124,120,120,213,235,235,235,235,235,235,235, + 235,111,111,111,235,232,212,194,189,189,189,189,189,189,189,189, + 189,189,195,217,189,189,189,235,235,235,226,157,95,95,118,134, + 134,134,134,117,55,16,16,16,70,150,190,188,189,189,189,195, + 217,235,235,235,235,206,134,123,120,120,120,120,120,120,120,129, + 161,189,189,183,103,77,22,16,16,16,37,96,111,146,231,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,120,120,120,235,235,235,235,235,235,235,235, + 235,111,111,111,235,235,235,197,134,134,160,227,210,187,189,189, + 189,189,189,189,189,189,189,217,235,235,235,235,139,102,134,134, + 134,133,122,111,102,19,16,16,16,150,151,186,188,189,189,189, + 189,195,187,142,120,120,120,120,120,120,121,129,152,186,189,189, + 189,189,189,189,95,165,206,93,16,16,16,19,66,111,123,162, + 204,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,231,120,120,120,235,235,235,235,235,235,235,235, + 235,111,111,111,235,235,232,156,134,134,194,235,235,220,144,178, + 189,189,189,189,189,189,189,189,194,208,224,235,223,129,134,134, + 132,120,111,111,113,138,16,16,16,145,171,186,186,185,147,120, + 120,120,120,120,120,120,120,120,122,126,133,134,151,188,189,189, + 189,189,189,189,139,235,235,235,139,23,16,16,16,58,111,111, + 111,146,231,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,171,120,120,124,235,235,235,235,235,235,235,235, + 235,111,111,111,231,235,179,134,134,134,225,235,235,235,157,95, + 95,126,210,195,189,189,189,189,189,189,189,189,189,189,189,189, + 189,189,189,189,189,189,32,16,16,91,120,120,120,120,120,120, + 120,120,120,120,120,120,129,150,183,189,189,189,189,189,189,187, + 133,189,189,189,208,235,235,235,235,201,64,16,16,16,55,111, + 111,111,146,231,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,124,120,120,181,235,235,235,235,235,235,235,235, + 235,123,111,111,154,235,137,134,134,187,235,235,235,235,222,99, + 95,95,134,231,235,189,189,189,189,189,189,189,189,189,189,189, + 189,189,189,189,189,189,118,81,120,120,120,120,120,120,120,120, + 120,120,129,150,183,189,189,189,189,189,189,189,189,189,188,162, + 106,189,189,189,235,235,235,235,235,235,235,37,16,16,16,16, + 49,108,111,123,162,204,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,120,120,120,235,235,235,235,235,235,235,235,235, + 235,184,111,111,111,229,134,134,134,235,235,235,235,235,235,178, + 95,95,95,134,235,194,189,189,189,189,189,189,189,189,189,189, + 189,189,189,176,150,129,120,120,120,120,120,120,120,120,129,161, + 189,189,189,189,189,189,189,189,189,189,189,189,188,165,139,134, + 134,189,189,189,235,235,235,235,235,235,235,173,30,16,16,16, + 16,28,75,111,111,111,111,154,231,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,120,120,120,235,235,235,235,235,235,235,235,235, + 235,235,111,111,111,194,134,134,160,235,235,235,235,235,235,235, + 165,95,95,95,191,222,194,189,189,189,189,188,173,159,135,118, + 102,109,121,120,120,120,120,120,120,120,107,55,166,227,179,150, + 150,150,150,167,203,189,189,189,189,189,189,184,164,170,137,134, + 134,189,189,189,235,235,235,235,235,235,235,235,173,44,16,16, + 16,16,16,16,16,49,108,111,146,231,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,120,120,120,235,235,235,235,235,235,235,235,235, + 235,235,123,111,112,136,134,134,194,235,235,235,235,235,235,235, + 235,152,95,95,95,96,132,139,188,189,189,189,178,161,142,125, + 120,120,120,120,120,120,120,128,159,86,16,16,57,235,235,214, + 163,150,150,150,174,216,195,189,189,189,189,189,189,189,188,165, + 134,189,189,189,134,158,210,235,235,235,235,235,235,235,235,146, + 30,16,16,16,16,16,28,75,111,127,188,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,120,120,120,235,235,235,235,235,235,235,235,235, + 235,235,184,111,124,134,134,134,225,235,235,235,235,235,235,235, + 235,222,99,113,134,134,134,134,151,170,150,129,120,120,120,120, + 120,120,120,128,167,200,179,186,186,169,21,16,16,132,235,235, + 235,192,150,150,150,175,173,146,135,154,178,189,189,189,189,189, + 184,189,189,189,134,134,134,138,216,235,235,235,235,235,235,235, + 221,125,44,16,16,16,16,16,16,16,55,123,162,204,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,120,120,120,235,235,235,235,235,235,235,235,235, + 235,235,235,173,133,134,134,144,231,235,235,235,235,235,235,235, + 235,235,164,131,126,122,120,120,120,120,120,120,120,120,120,120, + 127,146,162,208,223,200,186,186,186,152,68,16,16,23,201,235, + 235,235,187,150,150,150,119,95,95,95,95,131,196,192,189,189, + 189,189,189,187,134,134,134,134,133,150,232,235,235,235,235,235, + 235,235,235,235,146,30,16,16,16,16,16,16,49,108,127,188, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,120,120,120,235,235,235,235,235,235,235,235,235, + 235,235,235,216,134,134,134,111,154,235,235,235,235,235,235,235, + 235,197,124,120,120,120,120,120,120,120,120,120,118,112,114,164, + 189,189,189,189,189,189,188,187,158,121,118,36,16,16,44,153, + 235,191,121,132,150,150,150,110,95,108,161,231,235,232,210,189, + 189,189,189,194,170,135,133,134,134,134,144,232,235,235,235,235, + 235,235,235,235,235,221,125,44,16,16,16,16,16,43,108,111, + 146,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,120,120,120,235,235,235,235,235,235,235,235,235, + 235,235,235,169,134,134,127,111,111,111,111,111,111,111,112,116, + 119,120,120,120,120,120,120,120,120,117,110,101,95,95,95,95, + 139,178,189,189,189,189,189,189,189,170,160,124,20,16,16,16, + 38,95,95,96,139,150,150,150,201,235,235,235,235,235,235,217, + 192,189,187,186,200,235,179,134,134,134,134,146,197,235,235,235, + 235,235,235,235,235,235,235,235,173,44,16,16,16,16,16,49, + 108,111,162,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,120,120,120,235,235,235,235,235,235,235,235,235, + 235,235,235,137,134,134,125,111,111,112,116,119,120,120,120,120, + 120,120,120,121,121,114,111,173,235,231,200,169,143,121,95,95, + 95,95,113,148,189,189,189,189,189,189,189,189,129,27,16,16, + 16,142,121,116,156,158,150,150,160,224,235,235,235,235,235,235, + 235,211,186,186,186,220,235,229,152,134,134,134,134,163,232,235, + 235,235,235,235,235,235,235,235,235,235,235,125,16,16,16,16, + 28,75,115,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,120,120,120,235,235,235,235,235,235,235,235,235, + 235,235,235,134,134,134,200,125,119,120,120,120,120,120,120,120, + 120,121,126,132,111,127,184,235,235,235,235,235,235,235,235,208, + 95,95,95,113,186,187,188,171,189,189,189,189,189,178,16,16, + 16,76,184,189,189,194,179,169,162,168,222,235,235,235,235,235, + 235,235,206,186,186,196,235,235,235,190,140,134,134,134,163,232, + 235,235,235,235,235,235,235,235,235,235,235,235,153,44,16,16, + 16,16,65,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,120,120,120,235,235,235,235,235,235,235,235,235, + 235,235,235,134,131,126,135,120,120,120,120,120,120,120,134,137, + 130,134,147,197,235,235,235,235,235,235,235,235,235,235,235,235, + 95,95,95,235,186,186,186,235,235,224,213,204,180,189,32,16, + 16,16,65,189,189,189,189,189,189,189,189,189,189,189,189,195, + 217,235,231,188,186,186,220,235,235,235,229,179,134,134,134,163, + 232,235,235,235,235,235,235,235,235,235,235,235,235,235,146,30, + 16,16,16,92,228,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,120,120,120,167,235,235,235,235,199,142,120,120, + 120,120,120,120,120,120,120,120,120,124,167,206,235,235,179,134, + 134,134,216,235,235,235,235,235,235,235,235,235,235,235,235,235, + 95,95,95,235,186,186,186,235,235,235,235,235,213,125,98,31, + 16,16,16,141,189,189,189,189,189,189,189,189,189,189,189,189, + 189,189,189,189,188,186,186,203,234,235,235,235,184,134,134,134, + 147,197,235,235,235,235,235,235,235,235,235,235,235,235,235,221, + 37,16,16,16,92,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,131,120,120,120,120,120,120,120,120,120,120,120, + 120,120,120,120,120,120,120,131,171,224,235,235,235,235,137,134, + 134,184,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 95,95,95,235,186,186,186,235,235,235,235,235,235,192,125,121, + 59,16,16,57,228,227,220,212,198,185,189,189,189,189,189,189, + 189,189,189,189,189,186,186,186,200,235,235,235,235,184,134,134, + 134,134,156,219,235,235,235,235,235,235,235,235,235,235,235,235, + 173,44,16,16,16,16,105,235,235,235,235,235,235,235,235,235, + 235,235,235,235,203,128,120,120,120,120,120,120,120,120,120,120, + 120,120,120,120,122,126,206,235,235,235,235,235,235,232,134,134, + 134,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 95,95,95,235,186,186,186,235,235,235,235,235,235,235,210,136, + 111,19,16,16,78,228,235,235,235,230,176,150,150,150,195,212, + 195,189,189,195,208,192,186,186,186,220,235,235,235,235,194,140, + 134,134,134,137,187,235,235,235,235,235,235,235,235,235,235,235, + 235,235,37,16,16,16,16,105,235,235,235,235,235,235,235,235, + 235,235,235,235,235,203,135,120,120,120,120,120,135,171,224,235, + 235,235,235,134,134,134,235,235,235,235,235,235,235,179,134,134, + 137,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 95,95,95,235,186,186,186,235,235,235,235,235,235,235,235,228, + 157,78,16,16,16,78,235,235,235,235,235,190,150,150,152,222, + 235,235,235,235,235,235,206,186,186,196,235,235,235,235,235,229, + 184,137,134,134,134,163,232,235,235,235,235,235,235,235,235,235, + 235,235,173,44,16,16,16,16,78,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,134,134,134,235,235,235,235,235,235,232,137,134,134, + 187,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 95,95,95,235,186,186,186,235,235,235,235,235,235,235,235,235, + 235,175,68,16,16,16,166,235,235,235,235,232,166,150,150,168, + 232,235,235,235,235,235,231,188,186,186,220,235,235,235,235,235, + 235,219,156,134,134,134,163,232,235,235,235,235,235,235,235,235, + 235,235,235,235,173,30,16,16,16,166,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,134,134,134,235,235,235,235,235,235,175,134,134,137, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 95,95,95,235,186,186,186,235,235,235,235,235,235,235,235,235, + 235,232,143,59,16,16,44,201,235,235,235,235,219,152,150,150, + 174,232,235,235,235,235,235,208,186,186,186,200,235,235,235,235, + 235,235,235,182,134,134,134,163,232,235,235,235,235,235,235,235, + 235,235,235,235,235,173,44,16,16,16,105,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,134,134,134,235,235,235,235,235,229,137,134,134,187, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 95,95,95,235,186,186,186,235,235,235,235,235,235,235,235,235, + 235,235,213,114,19,16,16,46,153,235,235,235,235,198,150,150, + 150,174,232,235,235,235,235,231,188,186,186,186,220,235,235,235, + 235,235,235,235,184,134,134,134,163,232,235,235,235,235,235,235, + 235,235,235,235,235,235,215,23,16,16,16,105,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,134,134,134,235,235,235,235,235,197,134,134,160,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 95,95,95,235,186,186,186,235,235,235,235,235,235,235,235,235, + 235,235,235,203,87,16,16,16,46,199,235,235,235,235,192,150, + 150,150,174,232,235,235,235,235,220,192,186,186,186,200,235,235, + 235,235,235,235,235,184,134,134,134,163,232,235,235,235,235,235, + 235,235,235,235,235,235,235,166,30,16,16,16,228,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,134,134,134,235,235,235,235,232,156,134,134,194,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,208, + 95,95,95,235,186,186,186,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,115,16,16,16,96,192,235,235,235,235,192, + 150,150,150,174,232,235,235,235,235,231,188,186,186,186,220,235, + 235,235,235,235,235,235,184,134,134,134,163,232,235,235,235,235, + 235,235,235,235,235,235,235,235,173,30,16,16,92,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,134,134,134,232,235,235,235,172,134,134,134,225,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,139, + 95,95,139,235,191,186,186,220,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,101,16,16,36,118,153,232,235,235,235, + 192,150,150,150,174,235,235,235,235,235,220,192,186,186,196,234, + 235,235,235,235,235,235,235,184,134,134,134,163,235,235,235,235, + 235,235,235,235,235,235,235,235,235,146,16,16,23,228,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,144,134,134,163,232,235,216,134,134,134,187,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,208,95, + 95,95,208,235,208,186,186,196,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,215,22,16,16,46,118,153,232,235,235, + 235,192,150,150,150,208,235,235,235,235,235,231,188,186,186,200, + 235,235,235,235,235,235,235,235,184,134,134,134,187,235,235,235, + 235,235,235,235,235,235,235,235,235,235,153,71,153,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,194,134,134,134,169,235,169,134,134,166,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,139,95, + 95,139,235,235,231,186,186,186,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,146,16,16,16,46,118,153,232,235, + 235,235,184,150,150,166,235,235,235,235,235,235,215,186,186,186, + 220,235,235,235,235,235,235,235,235,182,134,134,137,219,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,184,134,134,134,175,137,134,134,216,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,208,95,95, + 95,208,235,235,235,186,186,186,234,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,125,16,16,16,39,118,121,168, + 235,235,227,152,150,150,195,235,235,235,235,235,235,206,186,186, + 186,203,234,235,235,235,235,235,235,232,153,134,134,144,175,210, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,144,134,134,134,134,134,134,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,139,95,95, + 139,235,235,235,235,191,186,186,203,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,125,16,16,16,56,121,125, + 235,235,235,192,150,150,152,222,235,235,235,235,235,231,188,186, + 186,186,203,235,235,235,235,235,235,235,216,137,134,134,134,134, + 166,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,206,140,134,134,134,134,137,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,226,99,95,95, + 208,235,235,235,235,215,186,186,186,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,125,16,16,16,98,192, + 235,235,235,232,166,150,150,168,235,235,235,235,235,235,220,192, + 186,186,186,235,235,235,235,235,235,235,235,206,147,134,134,134, + 134,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,206,147,134,134,147,197,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,182,95,95,130, + 235,235,235,235,235,235,186,186,186,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,85,16,16,30,208, + 235,235,235,235,219,152,150,150,216,235,235,235,235,235,235,235, + 186,186,186,235,235,235,235,235,235,235,235,235,235,216,179,160, + 197,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,130,95,95,178, + 235,235,235,235,235,235,186,186,186,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,221,44,16,16,64, + 235,235,235,235,235,184,150,150,190,235,235,235,235,235,235,235, + 186,186,186,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,182,95,95,95,222, + 235,235,235,235,235,235,186,186,186,234,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,187,23,16,16, + 132,235,235,235,235,214,150,150,150,184,235,235,235,235,235,235, + 186,186,186,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,169,95, + 152,235,235,235,235,235,235,235,235,235,222,103,95,95,152,235, + 235,235,235,235,235,235,191,186,186,203,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,125,16,16, + 23,201,235,235,235,235,158,150,150,152,235,235,235,235,235,235, + 186,186,186,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,99,95, + 95,235,235,235,235,235,235,235,235,235,143,95,95,113,231,235, + 235,235,235,235,235,235,215,186,186,186,234,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,228,57,16, + 16,64,228,235,235,235,208,160,160,203,235,235,235,235,235,235, + 186,186,186,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,95,95, + 95,95,152,235,235,235,235,235,235,191,99,95,95,200,235,235, + 235,235,235,235,235,235,235,191,186,186,203,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,194,23, + 16,16,78,228,235,235,235,235,235,235,235,235,235,235,235,235, + 186,186,186,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,108,95, + 95,95,95,95,95,95,95,95,95,95,95,95,99,235,235,235, + 235,235,235,235,235,235,235,215,186,186,186,234,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,139, + 16,16,16,78,228,235,235,235,235,235,235,235,235,235,235,235, + 186,186,186,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,196,113, + 95,95,95,95,95,95,95,95,95,95,95,99,169,235,235,235, + 235,235,235,235,235,235,235,235,191,186,186,200,234,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 125,16,16,16,78,235,235,235,235,235,235,235,235,235,235,234, + 186,186,186,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 196,113,95,95,95,95,95,95,95,113,157,222,235,235,235,235, + 235,235,235,235,235,235,235,235,215,186,186,186,200,234,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,125,16,16,16,187,235,235,235,235,235,235,235,235,234,200, + 186,186,188,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,211,186,186,186,200,234,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,99,16,16,119,235,235,235,235,235,235,235,234,200,186, + 186,186,212,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,211,186,186,186,192,217, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,180,16,16,44,228,235,235,235,235,235,235,208,186,186, + 186,211,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,211,186,186,186,186, + 200,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,37,16,16,78,228,234,205,186,186,186,186,186,186, + 211,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,215,190,186,186, + 186,220,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,234,128,16,16,16,64,181,186,186,186,186,186,186,188, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,232,203,186, + 186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186, + 186,186,186,186,101,16,16,16,64,181,186,186,186,186,192,217, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,231,188, + 186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186, + 186,186,186,186,186,101,16,16,16,66,209,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,220, + 192,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186, + 186,186,186,192,215,235,125,16,16,16,78,228,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,125,16,16,16,78,228,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,125,16,16,16,78,228,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,125,16,16,16,78,228,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,125,16,16,16,78,228, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,125,16,16,16,78, + 228,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,125,16,16,16, + 78,228,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,125,16,16, + 16,78,228,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,125,16, + 16,16,16,16,105,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,125, + 16,16,16,16,23,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 153,44,16,44,153,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,136,128,136,128,136,128,136,128,136,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 112,145,99,159,99,159,83,176,81,153,88,131,101,84,105,73, + 133,114,144,129,144,129,144,129,131,138,123,143,123,143,121,143, + 115,143,115,143,127,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,133,121,152,95,155,90,155,90,155,90, + 155,90,155,90,155,90,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,122,135, + 107,152,118,140,128,128,111,147,103,158,103,158,103,158,107,153, + 115,143,122,135,128,128,128,128,128,128,112,145,94,165,74,186, + 71,190,71,190,71,190,87,138,105,73,105,73,110,85,120,100, + 144,129,120,147,88,131,100,120,103,158,103,158,103,158,103,158, + 103,158,103,158,103,158,103,158,107,153,115,143,127,128,128,128, + 128,128,133,121,153,94,183,52,183,52,183,52,183,52,183,52, + 183,52,183,52,179,57,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,103,157, + 103,158,115,143,128,128,128,128,115,143,115,143,115,143,104,156, + 103,158,103,158,115,143,128,128,122,135,84,175,73,187,92,167, + 111,146,128,128,110,85,105,73,111,87,128,128,128,128,144,129, + 144,129,116,140,88,172,103,158,95,166,88,148,115,99,106,76, + 112,83,127,120,123,143,121,143,104,156,103,158,117,139,164,78, + 183,52,183,52,183,52,167,73,135,118,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,103,158, + 103,158,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,124,132,93,167,108,151,125,131,128,128,128,128,128,128, + 128,128,108,81,105,73,111,88,128,128,128,128,128,128,144,129, + 135,128,118,139,103,158,109,150,99,159,71,190,79,181,117,139, + 128,126,130,118,147,137,144,129,156,135,166,89,183,52,181,53, + 147,100,152,95,135,118,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,123,161, + 128,162,128,162,128,162,128,128,128,135,128,162,128,159,128,142, + 128,128,128,128,71,190,71,190,109,150,122,135,128,128,127,128, + 127,125,105,73,121,111,128,128,128,128,128,128,131,128,144,129, + 118,139,103,158,109,150,128,128,128,128,113,143,74,187,113,175, + 154,161,154,161,159,126,170,78,183,52,181,52,157,88,122,152, + 103,158,103,158,121,142,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,157,128,162, + 115,160,115,160,128,145,128,129,128,128,128,145,128,153,128,162, + 128,159,128,145,99,176,89,180,128,128,117,141,123,133,128,128, + 128,128,124,118,128,128,128,128,128,128,128,128,144,129,129,140, + 103,158,109,150,128,128,128,128,128,128,128,128,147,155,159,140, + 171,96,179,58,183,52,180,55,164,88,130,103,108,80,128,128, + 117,142,114,156,103,158,108,152,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,137,128,158,128,162,128,136, + 104,156,103,158,124,133,128,128,128,128,128,128,128,128,128,136, + 128,153,128,162,128,162,128,162,128,162,128,156,128,143,110,142, + 113,146,128,128,128,128,127,128,128,128,127,128,117,148,103,158, + 109,150,128,128,128,128,128,128,128,128,160,119,176,78,183,52, + 179,56,140,104,124,128,128,128,143,129,144,129,105,73,124,119, + 128,128,129,129,121,157,103,158,109,157,127,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,162,128,161,128,136,128,128, + 124,132,103,157,103,158,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,71,190,120,151,128,145,128,159,128,162,128,162, + 123,153,127,144,128,128,125,131,123,133,107,153,123,161,128,162, + 128,162,128,162,131,155,155,107,180,58,183,52,176,61,152,95, + 123,133,81,179,71,190,128,128,131,128,144,129,105,73,107,78, + 128,128,128,128,128,128,124,140,103,158,106,153,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,162,128,134,128,128,128,128, + 128,128,124,133,103,158,115,149,135,129,128,128,128,128,128,128, + 128,128,128,128,71,190,128,128,128,128,128,128,128,131,115,111, + 127,152,128,162,128,153,128,130,128,128,123,154,135,148,140,127, + 151,113,163,91,183,52,183,52,168,81,145,127,128,143,114,173, + 119,155,125,131,71,190,86,172,128,128,144,129,123,117,105,73, + 128,128,128,128,128,128,128,128,141,160,103,158,106,154,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,138,128,162,128,128,128,128,128,128, + 128,128,128,128,116,143,103,158,110,153,134,128,128,128,128,128, + 128,128,128,128,71,190,128,128,128,128,128,128,123,115,105,73, + 128,155,128,162,128,162,131,155,155,90,179,57,183,52,183,52, + 183,52,176,60,158,86,155,137,154,161,128,152,128,162,124,170, + 100,218,100,219,102,156,71,190,119,137,144,129,128,128,105,73, + 128,128,128,128,128,128,128,128,154,161,114,144,103,158,123,133, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,161,128,162,128,128,128,128,128,128, + 128,128,128,128,128,128,113,146,103,158,121,145,129,128,128,128, + 134,128,128,128,71,190,128,128,128,128,128,128,109,81,116,118, + 129,158,142,121,158,85,183,52,183,52,168,72,148,100,140,128, + 131,153,118,160,116,159,139,161,131,159,125,131,128,137,128,162, + 124,170,100,219,128,128,71,189,76,184,144,129,128,128,105,73, + 128,128,128,128,128,128,128,128,154,161,128,128,104,157,103,158, + 124,133,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,162,128,152,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,111,148,103,158,123,142,128,128, + 130,128,139,128,84,178,128,128,128,128,128,128,146,102,168,81, + 183,52,183,52,180,55,159,98,137,143,128,128,130,128,128,128, + 128,147,128,162,128,162,128,162,127,161,121,161,114,159,113,154, + 128,162,105,196,128,128,112,144,71,190,144,129,128,128,105,73, + 128,128,128,128,128,128,128,128,151,157,128,128,127,129,103,157, + 105,155,127,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,162,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,110,149,103,158,111,148, + 128,128,135,128,144,129,137,128,150,97,178,60,183,52,169,67, + 147,100,131,122,128,128,128,162,128,156,128,128,143,129,132,128, + 128,128,128,155,128,161,147,161,128,147,128,155,128,162,126,161, + 128,162,125,161,115,143,127,128,71,190,144,129,128,128,105,73, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,123,134, + 103,158,107,153,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,162,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,113,146,103,158, + 120,137,143,106,165,85,180,57,183,52,171,76,133,128,103,158, + 110,150,128,128,128,153,128,162,128,131,128,128,131,128,144,129, + 128,128,128,128,128,150,131,161,128,128,128,128,128,136,128,154, + 128,162,128,162,123,161,117,155,81,180,144,129,128,128,105,73, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 104,156,103,158,119,138,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,142,128,162,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,131,122, + 172,67,183,52,180,55,162,87,143,131,125,159,103,158,120,135, + 129,128,128,128,128,162,128,162,128,128,128,128,128,128,131,128, + 133,128,125,131,128,128,128,162,128,157,99,159,99,159,85,204, + 81,192,128,162,128,162,128,162,128,162,128,162,117,128,105,74, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 124,133,104,156,103,158,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,161,128,162,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,147,102,171,68,183,52, + 178,58,129,124,128,128,127,134,128,162,103,158,113,150,144,129, + 143,128,135,128,128,162,128,162,74,186,71,190,71,190,71,190, + 71,190,73,187,128,128,131,137,128,162,91,180,81,153,88,131, + 88,131,128,162,128,162,130,125,136,145,124,153,128,162,120,154, + 127,131,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,123,134,103,158,127,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,162,128,162,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,129,127,156,89,183,52,172,66,152,93, + 129,127,124,133,120,137,128,128,128,149,106,154,128,128,116,97, + 133,114,144,129,128,162,128,162,92,167,99,159,99,159,99,159, + 99,159,107,150,125,131,128,128,126,153,128,162,104,115,104,115, + 104,115,128,162,128,162,123,143,123,143,105,119,116,159,127,161, + 127,161,123,144,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,103,158,107,153,128,128,128,128,128,128,128,128, + 128,128,128,128,128,162,128,162,128,128,128,128,128,128,128,128, + 128,128,128,128,151,96,183,52,183,52,166,74,128,128,128,128, + 128,128,128,128,108,152,128,135,128,128,103,157,111,148,126,129, + 84,155,112,102,128,162,128,162,139,128,133,128,128,128,120,137, + 107,152,103,158,103,158,125,131,127,128,128,161,113,159,103,158, + 103,158,128,162,128,162,103,158,103,158,103,158,103,158,106,158, + 124,161,128,162,124,159,127,143,128,132,128,128,128,128,128,128, + 128,128,128,128,103,158,103,158,128,128,128,128,128,128,128,128, + 128,128,128,128,128,162,128,162,128,128,128,128,128,128,128,128, + 129,127,174,64,183,52,175,81,152,129,141,144,141,144,136,139, + 128,128,108,152,103,158,128,160,128,128,124,132,103,158,101,160, + 85,176,111,146,128,162,128,162,142,126,143,129,114,142,103,158, + 104,156,112,134,128,159,143,157,128,128,128,133,129,160,144,129, + 135,142,128,162,128,162,128,128,128,128,128,128,127,129,117,141, + 114,144,114,159,122,161,128,162,128,162,124,145,127,128,128,128, + 128,128,128,128,103,158,103,158,128,128,128,128,128,128,128,128, + 128,128,128,128,128,160,128,162,128,128,128,128,128,128,136,116, + 175,63,183,52,162,128,154,161,154,161,154,161,154,161,154,161, + 149,160,103,158,125,157,128,162,128,155,128,128,106,151,97,164, + 103,158,103,158,128,162,128,162,123,112,112,151,103,158,115,149, + 105,73,123,106,154,161,147,151,137,129,128,128,128,149,131,144, + 128,128,128,162,128,162,121,149,128,128,128,128,128,128,128,128, + 128,128,123,133,115,143,113,148,122,161,128,162,128,162,114,159, + 114,149,128,128,103,158,103,158,128,128,128,128,128,128,128,128, + 128,128,128,128,128,135,128,162,128,157,128,128,149,100,183,52, + 182,53,161,133,151,157,128,128,128,128,128,128,128,128,137,145, + 103,158,103,158,154,161,128,162,154,161,136,138,128,128,138,141, + 135,152,116,159,128,162,128,162,108,151,103,158,105,132,144,129, + 132,111,154,161,147,153,139,128,144,129,128,128,128,128,128,149, + 128,128,128,162,128,162,100,217,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,127,129,122,150,121,161,128,162, + 128,162,120,160,103,158,103,157,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,136,128,162,128,155,183,52,169,71, + 130,124,154,161,134,136,128,128,128,128,128,128,128,128,107,153, + 103,158,122,135,128,131,128,162,85,174,71,190,113,144,128,128, + 144,148,154,161,129,161,128,162,103,158,103,158,140,137,146,141, + 144,129,147,139,131,122,144,129,139,128,128,128,128,129,128,128, + 128,128,128,162,128,162,100,219,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,119,141, + 127,145,128,162,103,158,111,148,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,144,113,183,52,183,52,128,128, + 128,128,154,161,128,128,128,128,128,128,128,128,110,149,103,158, + 117,141,128,128,128,155,128,162,128,128,88,171,71,190,113,143, + 128,128,128,128,118,135,128,162,112,159,103,158,106,158,132,159, + 149,145,144,129,144,129,145,134,127,127,128,128,128,128,128,131, + 128,128,128,155,128,147,100,219,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,141,110,155,90,178,59, + 174,64,128,140,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,182,53,182,53,139,139,128,157, + 128,145,152,161,128,128,128,128,128,128,127,128,103,158,103,157, + 128,128,128,128,128,162,128,162,128,128,128,128,113,143,83,176, + 125,131,128,128,103,156,122,161,128,162,128,148,116,159,103,158, + 106,157,129,139,144,129,148,143,151,156,140,143,131,132,128,142, + 128,129,128,128,128,129,100,219,128,128,128,128,128,128,128,128, + 128,128,136,116,155,90,155,90,183,52,183,52,183,52,171,68, + 138,113,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,129,127,183,52,141,110,128,136,128,159, + 128,162,128,161,128,145,128,138,128,128,109,151,103,158,101,204, + 100,219,100,219,128,162,128,162,109,190,123,145,128,128,128,128, + 86,173,128,128,123,133,111,148,130,161,128,161,147,153,131,136, + 112,151,103,158,123,144,129,139,147,143,154,161,154,161,151,157, + 128,160,145,107,155,90,141,135,155,90,155,90,155,90,171,68, + 183,52,183,52,183,52,183,52,179,57,155,90,138,113,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,172,66,183,52,128,128,128,128,128,128, + 128,130,135,161,128,162,128,162,128,145,115,160,112,157,100,219, + 114,173,114,173,128,162,128,162,101,216,100,219,109,190,127,129, + 119,138,120,138,128,128,133,139,152,161,128,162,129,157,144,129, + 137,128,111,148,103,158,103,158,136,134,143,109,166,104,169,105, + 183,52,183,52,183,52,183,52,183,52,183,52,183,52,172,67, + 155,90,152,95,130,124,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,183,52,152,95,128,128,128,128,128,128, + 128,128,154,161,128,133,128,153,128,162,128,162,128,162,126,165, + 128,145,128,142,128,162,128,162,127,131,114,173,100,219,107,184, + 103,158,103,158,133,134,128,128,124,158,113,153,128,162,130,157, + 128,134,128,128,127,129,116,141,155,88,183,52,183,52,183,52, + 166,84,152,114,138,172,128,129,128,128,143,146,144,148,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,129,127,183,52,128,128,128,128,128,128,128,128, + 128,128,154,161,128,128,127,128,103,158,113,145,128,137,121,175, + 128,162,128,162,128,162,128,162,128,143,128,132,117,163,103,158, + 105,159,141,159,152,157,128,128,128,128,92,172,140,137,145,127, + 155,107,164,82,183,52,183,52,181,53,145,101,118,148,128,162, + 128,162,128,162,104,205,130,130,128,128,128,128,135,136,153,159, + 144,148,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,170,70,183,52,128,128,128,128,128,128,128,128, + 128,128,154,161,137,139,109,151,103,158,127,129,128,128,118,157, + 100,219,118,169,128,145,128,162,128,162,128,162,128,162,128,162, + 128,162,128,162,128,162,128,138,155,90,183,52,183,52,183,52, + 183,52,179,59,158,101,152,114,130,156,128,162,128,162,127,161, + 106,197,128,162,125,136,128,128,128,128,128,128,128,128,133,134, + 145,150,150,156,136,138,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,183,52,183,52,128,128,128,128,128,128,128,128, + 128,128,154,161,154,161,103,158,106,154,128,128,128,128,128,128, + 107,196,100,219,123,142,128,160,128,162,128,162,124,161,130,161, + 127,169,150,116,171,76,183,52,183,52,179,57,155,90,133,117, + 99,176,99,176,127,156,128,162,128,162,128,162,126,160,106,157, + 103,158,128,162,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,136,138,141,144,154,160,138,140,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,183,52,183,52,128,128,128,128,128,128,128,128, + 128,128,145,149,139,160,103,158,122,135,128,128,128,128,128,128, + 128,128,100,217,101,188,103,163,119,160,143,131,159,98,174,69, + 183,52,183,52,172,67,159,85,152,113,128,127,128,128,128,128, + 104,154,71,190,79,181,122,162,120,178,126,165,128,162,128,160, + 116,156,128,162,103,154,112,146,126,129,128,128,128,128,128,128, + 128,128,128,128,128,128,130,130,141,144,138,140,136,138,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,183,52,183,52,128,128,128,128,128,128,128,128, + 128,128,128,128,104,158,103,158,137,139,128,128,128,128,128,128, + 128,128,140,114,165,75,183,52,183,52,183,52,179,60,159,99, + 153,112,135,146,128,149,139,139,134,115,111,87,128,128,128,128, + 128,128,100,182,71,190,79,198,100,219,106,197,126,141,128,154, + 128,162,128,162,109,135,103,156,103,156,117,129,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,132,133,152,158, + 137,140,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,183,52,183,52,128,128,128,128,128,128,128,128, + 128,128,128,128,103,158,131,158,154,161,162,130,168,106,171,96, + 181,59,183,52,172,74,168,106,155,90,135,135,105,203,100,219, + 106,205,117,185,129,159,128,162,128,162,123,142,127,138,128,128, + 124,141,104,211,92,188,71,190,95,166,128,128,128,128,128,128, + 128,142,141,135,142,129,122,123,105,150,103,158,111,148,127,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 143,146,149,154,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,183,52,183,52,128,128,128,128,128,128,128,128, + 128,128,128,128,111,148,155,99,180,62,183,52,183,52,179,57, + 153,92,127,126,141,144,133,134,128,128,128,128,128,128,128,128, + 100,219,100,219,144,129,139,138,128,145,128,153,126,154,128,129, + 128,128,128,149,128,162,119,165,108,171,123,150,128,145,128,145, + 128,134,134,128,144,129,130,128,128,128,115,143,103,158,106,153, + 127,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,129,129,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,180,55,183,52,155,90,155,90,164,78,183,52, + 183,52,183,52,183,52,183,52,171,68,144,105,128,128,109,151, + 103,158,125,131,128,128,128,128,128,128,128,128,128,128,128,128, + 100,219,100,219,144,129,144,129,128,128,128,128,126,123,109,85, + 123,117,128,128,128,145,128,150,126,158,128,162,128,162,128,162, + 128,162,128,162,131,154,144,129,134,128,128,128,122,135,103,158, + 104,156,118,140,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,135,117,179,57,183,52,183,52,179,57,158,86, + 155,90,155,90,138,111,135,118,128,128,128,128,128,128,103,158, + 103,157,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 100,219,100,219,144,129,144,129,128,128,128,128,128,128,125,122, + 109,84,128,128,128,128,128,128,128,128,108,149,71,190,87,172, + 128,142,128,145,129,134,141,129,144,129,128,128,128,128,123,134, + 109,150,103,158,110,150,127,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,103,158,128,128,128,128,128,128,120,137,103,158, + 122,135,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 100,219,100,219,144,129,144,129,128,128,128,128,128,128,128,128, + 128,128,113,91,128,128,127,125,128,128,128,128,99,159,71,190, + 106,151,128,128,128,128,129,128,144,129,138,128,128,128,128,128, + 128,128,118,140,103,158,106,153,127,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,103,158,128,128,128,128,128,128,103,157,106,154, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 100,219,100,219,144,129,144,129,128,128,128,128,128,128,128,128, + 128,128,126,123,121,112,128,128,117,102,128,128,128,128,85,174, + 71,190,106,151,128,128,128,128,138,128,144,129,138,128,128,128, + 128,128,128,128,122,135,103,158,106,153,127,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,103,158,127,128,128,128,119,138,103,158,122,135, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 100,219,104,205,143,129,144,129,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,127,127,128,128,113,90,127,127,128,128, + 85,174,71,190,106,151,128,128,128,128,138,128,144,129,137,128, + 128,128,128,128,128,128,122,135,103,158,106,153,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,103,158,106,153,128,128,103,158,107,153,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,116,168, + 100,219,125,136,133,128,144,129,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,124,120,109,81,127,127, + 128,128,82,177,71,190,128,128,128,128,128,128,139,128,144,129, + 130,128,128,128,128,128,128,128,122,135,103,158,110,149,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,122,135,103,158,108,152,103,158,125,131,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,100,219, + 104,205,128,128,128,128,144,129,133,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,125,122,105,73, + 128,128,125,131,71,190,86,172,128,128,128,128,128,128,144,129, + 144,129,133,128,128,128,128,128,128,128,115,143,103,158,108,152, + 119,138,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,113,146,103,158,104,156,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,122,148,100,219, + 125,136,128,128,128,128,144,129,144,129,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,121,111, + 128,128,128,128,99,159,71,190,122,135,128,128,128,128,130,128, + 144,129,144,129,128,128,128,128,128,128,128,128,117,141,108,151, + 111,148,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,103,207,100,219, + 128,128,128,128,128,128,144,129,144,129,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,71,190,84,175,128,128,128,128,128,128, + 144,129,144,129,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,108,193, + 105,200,128,128,128,128,128,128,128,128,117,162,100,219,119,156, + 128,128,128,128,128,128,139,128,144,129,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,93,165,74,186,128,128,128,128,128,128, + 144,129,144,129,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,101,215, + 100,219,105,200,114,173,114,173,114,173,100,217,100,217,128,128, + 128,128,128,128,128,128,128,128,144,129,141,129,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 144,129,144,129,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,124,141, + 110,186,100,219,100,219,100,219,100,219,106,199,121,149,128,128, + 128,128,128,128,128,128,128,128,139,128,144,129,134,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 144,129,144,129,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,140,128,144,129,135,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,142,129, + 144,129,131,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,139,128,144,129, + 142,129,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,136,128,144,129,144,129,144,129, + 132,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,134,128, + 144,129,144,129,144,129,144,129,144,129,144,129,144,129,144,129, + 144,129,144,129,140,129,128,128,130,128,139,128,136,128,135,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 135,128,136,128,136,128,136,128,136,128,136,128,136,128,136,128, + 136,128,136,128,131,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, +};
\ No newline at end of file diff --git a/gfx/angle/src/tests/gl_tests/BindGeneratesResourceTest.cpp b/gfx/angle/src/tests/gl_tests/BindGeneratesResourceTest.cpp new file mode 100644 index 000000000..e8ae739f8 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/BindGeneratesResourceTest.cpp @@ -0,0 +1,123 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +// BindGeneratesResourceTest.cpp : Tests of the GL_CHROMIUM_bind_generates_resource extension. + +#include "test_utils/ANGLETest.h" + +namespace angle +{ + +class BindGeneratesResourceTest : public ANGLETest +{ + protected: + BindGeneratesResourceTest() { setBindGeneratesResource(false); } +}; + +// Context creation would fail if EGL_CHROMIUM_create_context_bind_generates_resource was not +// available so the GL extension should always be present +TEST_P(BindGeneratesResourceTest, ExtensionStringExposed) +{ + EXPECT_TRUE(extensionEnabled("GL_CHROMIUM_bind_generates_resource")); +} + +// Verify that GL_BIND_GENERATES_RESOURCE_CHROMIUM can be queried but not changed +TEST_P(BindGeneratesResourceTest, QueryValidation) +{ + GLint intValue = 2; + glGetIntegerv(GL_BIND_GENERATES_RESOURCE_CHROMIUM, &intValue); + EXPECT_GL_NO_ERROR(); + EXPECT_EQ(intValue, GL_FALSE); + + float floatValue = 2.0f; + glGetFloatv(GL_BIND_GENERATES_RESOURCE_CHROMIUM, &floatValue); + EXPECT_GL_NO_ERROR(); + EXPECT_EQ(floatValue, 0.0f); + + GLboolean boolValue = GL_TRUE; + glGetBooleanv(GL_BIND_GENERATES_RESOURCE_CHROMIUM, &boolValue); + EXPECT_GL_NO_ERROR(); + EXPECT_EQ(boolValue, GL_FALSE); + + boolValue = glIsEnabled(GL_BIND_GENERATES_RESOURCE_CHROMIUM); + EXPECT_GL_NO_ERROR(); + EXPECT_EQ(boolValue, GL_FALSE); + + glEnable(GL_BIND_GENERATES_RESOURCE_CHROMIUM); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + glDisable(GL_BIND_GENERATES_RESOURCE_CHROMIUM); + EXPECT_GL_ERROR(GL_INVALID_ENUM); +} + +// Test that buffers cannot be generated on bind +TEST_P(BindGeneratesResourceTest, Buffers) +{ + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 2); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + EXPECT_GL_NO_ERROR(); + + if (getClientMajorVersion() >= 3) + { + glBindBufferBase(GL_UNIFORM_BUFFER, 0, 3); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + glBindBufferBase(GL_UNIFORM_BUFFER, 0, 0); + EXPECT_GL_NO_ERROR(); + + glBindBufferRange(GL_UNIFORM_BUFFER, 0, 4, 1, 2); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + glBindBufferRange(GL_UNIFORM_BUFFER, 0, 0, 1, 2); + EXPECT_GL_NO_ERROR(); + } +} + +// Test that textures cannot be generated on bind +TEST_P(BindGeneratesResourceTest, Textures) +{ + glBindTexture(GL_TEXTURE_2D, 2); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + glBindTexture(GL_TEXTURE_2D, 0); + EXPECT_GL_NO_ERROR(); +} + +// Test that framebuffers cannot be generated on bind +TEST_P(BindGeneratesResourceTest, Framebuffers) +{ + glBindFramebuffer(GL_FRAMEBUFFER, 2); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + EXPECT_GL_NO_ERROR(); +} + +// Test that renderbuffer cannot be generated on bind +TEST_P(BindGeneratesResourceTest, Renderbuffers) +{ + glBindRenderbuffer(GL_RENDERBUFFER, 2); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + glBindRenderbuffer(GL_RENDERBUFFER, 0); + EXPECT_GL_NO_ERROR(); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these +// tests should be run against. +ANGLE_INSTANTIATE_TEST(BindGeneratesResourceTest, + ES2_D3D9(), + ES2_D3D11(), + ES3_D3D11(), + ES2_D3D11_FL9_3(), + ES2_OPENGL(), + ES3_OPENGL(), + ES2_OPENGLES(), + ES3_OPENGLES()); + +} // namespace diff --git a/gfx/angle/src/tests/gl_tests/BindUniformLocationTest.cpp b/gfx/angle/src/tests/gl_tests/BindUniformLocationTest.cpp new file mode 100755 index 000000000..732a11068 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/BindUniformLocationTest.cpp @@ -0,0 +1,484 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +// BindUniformLocationTest.cpp : Tests of the GL_CHROMIUM_bind_uniform_location extension. + +#include "test_utils/ANGLETest.h" + +#include <cmath> + +using namespace angle; + +namespace +{ + +class BindUniformLocationTest : public ANGLETest +{ + protected: + BindUniformLocationTest() + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + void SetUp() override + { + ANGLETest::SetUp(); + mBindUniformLocation = reinterpret_cast<PFNGLBINDUNIFORMLOCATIONCHROMIUMPROC>( + eglGetProcAddress("glBindUniformLocationCHROMIUM")); + } + + void TearDown() override + { + if (mProgram != 0) + { + glDeleteProgram(mProgram); + } + ANGLETest::TearDown(); + } + + typedef void(GL_APIENTRYP PFNGLBINDUNIFORMLOCATIONCHROMIUMPROC)(GLuint mProgram, + GLint location, + const GLchar *name); + PFNGLBINDUNIFORMLOCATIONCHROMIUMPROC mBindUniformLocation = nullptr; + + GLuint mProgram = 0; +}; + +// Test basic functionality of GL_CHROMIUM_bind_uniform_location +TEST_P(BindUniformLocationTest, Basic) +{ + if (!extensionEnabled("GL_CHROMIUM_bind_uniform_location")) + { + std::cout << "Test skipped because GL_CHROMIUM_bind_uniform_location is not available." + << std::endl; + return; + } + + ASSERT_NE(mBindUniformLocation, nullptr); + + // clang-format off + const std::string vsSource = SHADER_SOURCE + ( + attribute vec4 a_position; + void main() + { + gl_Position = a_position; + } + ); + + const std::string fsSource = SHADER_SOURCE + ( + precision mediump float; + uniform vec4 u_colorC; + uniform vec4 u_colorB[2]; + uniform vec4 u_colorA; + void main() + { + gl_FragColor = u_colorA + u_colorB[0] + u_colorB[1] + u_colorC; + } + ); + // clang-format on + + GLint colorALocation = 3; + GLint colorBLocation = 10; + GLint colorCLocation = 5; + + GLuint vs = CompileShader(GL_VERTEX_SHADER, vsSource); + GLuint fs = CompileShader(GL_FRAGMENT_SHADER, fsSource); + + mProgram = glCreateProgram(); + + mBindUniformLocation(mProgram, colorALocation, "u_colorA"); + mBindUniformLocation(mProgram, colorBLocation, "u_colorB[0]"); + mBindUniformLocation(mProgram, colorCLocation, "u_colorC"); + + glAttachShader(mProgram, vs); + glDeleteShader(vs); + + glAttachShader(mProgram, fs); + glDeleteShader(fs); + + // Link the mProgram + glLinkProgram(mProgram); + // Check the link status + GLint linked = 0; + glGetProgramiv(mProgram, GL_LINK_STATUS, &linked); + ASSERT_EQ(1, linked); + + glUseProgram(mProgram); + + static const float colorB[] = { + 0.0f, 0.50f, 0.0f, 0.0f, 0.0f, 0.0f, 0.75f, 0.0f, + }; + + glUniform4f(colorALocation, 0.25f, 0.0f, 0.0f, 0.0f); + glUniform4fv(colorBLocation, 2, colorB); + glUniform4f(colorCLocation, 0.0f, 0.0f, 0.0f, 1.0f); + + drawQuad(mProgram, "a_position", 0.5f); + + EXPECT_GL_NO_ERROR(); + EXPECT_PIXEL_NEAR(0, 0, 64, 128, 192, 255, 1.0); +} + +// Test that conflicts are detected when two uniforms are bound to the same location +TEST_P(BindUniformLocationTest, ConflictsDetection) +{ + if (!extensionEnabled("GL_CHROMIUM_bind_uniform_location")) + { + std::cout << "Test skipped because GL_CHROMIUM_bind_uniform_location is not available." + << std::endl; + return; + } + + ASSERT_NE(nullptr, mBindUniformLocation); + + // clang-format off + const std::string vsSource = SHADER_SOURCE + ( + attribute vec4 a_position; + void main() + { + gl_Position = a_position; + } + ); + + const std::string fsSource = SHADER_SOURCE + ( + precision mediump float; + uniform vec4 u_colorA; + uniform vec4 u_colorB; + void main() + { + gl_FragColor = u_colorA + u_colorB; + } + ); + // clang-format on + + GLint colorALocation = 3; + GLint colorBLocation = 4; + + GLuint vs = CompileShader(GL_VERTEX_SHADER, vsSource); + GLuint fs = CompileShader(GL_FRAGMENT_SHADER, fsSource); + + mProgram = glCreateProgram(); + glAttachShader(mProgram, vs); + glDeleteShader(vs); + glAttachShader(mProgram, fs); + glDeleteShader(fs); + + mBindUniformLocation(mProgram, colorALocation, "u_colorA"); + // Bind u_colorB to location a, causing conflicts, link should fail. + mBindUniformLocation(mProgram, colorALocation, "u_colorB"); + glLinkProgram(mProgram); + GLint linked = 0; + glGetProgramiv(mProgram, GL_LINK_STATUS, &linked); + ASSERT_EQ(0, linked); + + // Bind u_colorB to location b, no conflicts, link should succeed. + mBindUniformLocation(mProgram, colorBLocation, "u_colorB"); + glLinkProgram(mProgram); + linked = 0; + glGetProgramiv(mProgram, GL_LINK_STATUS, &linked); + EXPECT_EQ(1, linked); +} + +// Test a use case of the chromium compositor +TEST_P(BindUniformLocationTest, Compositor) +{ + if (!extensionEnabled("GL_CHROMIUM_bind_uniform_location")) + { + std::cout << "Test skipped because GL_CHROMIUM_bind_uniform_location is not available." + << std::endl; + return; + } + + ASSERT_NE(nullptr, mBindUniformLocation); + + // clang-format off + const std::string vsSource = SHADER_SOURCE + ( + attribute vec4 a_position; + attribute vec2 a_texCoord; + uniform mat4 matrix; + uniform vec2 color_a[4]; + uniform vec4 color_b; + varying vec4 v_color; + void main() + { + v_color.xy = color_a[0] + color_a[1]; + v_color.zw = color_a[2] + color_a[3]; + v_color += color_b; + gl_Position = matrix * a_position; + } + ); + + const std::string fsSource = SHADER_SOURCE + ( + precision mediump float; + varying vec4 v_color; + uniform float alpha; + uniform vec4 multiplier; + uniform vec3 color_c[8]; + void main() + { + vec4 color_c_sum = vec4(0.0); + color_c_sum.xyz += color_c[0]; + color_c_sum.xyz += color_c[1]; + color_c_sum.xyz += color_c[2]; + color_c_sum.xyz += color_c[3]; + color_c_sum.xyz += color_c[4]; + color_c_sum.xyz += color_c[5]; + color_c_sum.xyz += color_c[6]; + color_c_sum.xyz += color_c[7]; + color_c_sum.w = alpha; + color_c_sum *= multiplier; + gl_FragColor = v_color + color_c_sum; + } + ); + // clang-format on + + int counter = 6; + int matrixLocation = counter++; + int colorALocation = counter++; + int colorBLocation = counter++; + int alphaLocation = counter++; + int multiplierLocation = counter++; + int colorCLocation = counter++; + + GLuint vs = CompileShader(GL_VERTEX_SHADER, vsSource); + GLuint fs = CompileShader(GL_FRAGMENT_SHADER, fsSource); + + mProgram = glCreateProgram(); + + mBindUniformLocation(mProgram, matrixLocation, "matrix"); + mBindUniformLocation(mProgram, colorALocation, "color_a"); + mBindUniformLocation(mProgram, colorBLocation, "color_b"); + mBindUniformLocation(mProgram, alphaLocation, "alpha"); + mBindUniformLocation(mProgram, multiplierLocation, "multiplier"); + mBindUniformLocation(mProgram, colorCLocation, "color_c"); + + glAttachShader(mProgram, vs); + glDeleteShader(vs); + glAttachShader(mProgram, fs); + glDeleteShader(fs); + + // Link the mProgram + glLinkProgram(mProgram); + // Check the link status + GLint linked = 0; + glGetProgramiv(mProgram, GL_LINK_STATUS, &linked); + ASSERT_EQ(1, linked); + + glUseProgram(mProgram); + + static const float colorA[] = { + 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, + }; + + static const float colorC[] = { + 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, + 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, + }; + + static const float identity[] = { + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, + }; + + glUniformMatrix4fv(matrixLocation, 1, false, identity); + glUniform2fv(colorALocation, 4, colorA); + glUniform4f(colorBLocation, 0.2f, 0.2f, 0.2f, 0.2f); + glUniform1f(alphaLocation, 0.8f); + glUniform4f(multiplierLocation, 0.5f, 0.5f, 0.5f, 0.5f); + glUniform3fv(colorCLocation, 8, colorC); + + glDrawArrays(GL_TRIANGLES, 0, 6); + + drawQuad(mProgram, "a_position", 0.5f); + + EXPECT_PIXEL_EQ(0, 0, 204, 204, 204, 204); +} + +// Test that unused uniforms don't conflict when bound to the same location +TEST_P(BindUniformLocationTest, UnusedUniformUpdate) +{ + if (!extensionEnabled("GL_CHROMIUM_bind_uniform_location")) + { + std::cout << "Test skipped because GL_CHROMIUM_bind_uniform_location is not available." + << std::endl; + return; + } + + ASSERT_NE(nullptr, mBindUniformLocation); + + // clang-format off + const std::string vsSource = SHADER_SOURCE + ( + attribute vec4 a_position; + void main() + { + gl_Position = a_position; + } + ); + + const std::string fsSource = SHADER_SOURCE + ( + precision mediump float; + uniform vec4 u_colorA; + uniform float u_colorU; + uniform vec4 u_colorC; + void main() + { + gl_FragColor = u_colorA + u_colorC; + } + ); + // clang-format on + + const GLint colorULocation = 1; + const GLint nonexistingLocation = 5; + const GLint unboundLocation = 6; + + GLuint vs = CompileShader(GL_VERTEX_SHADER, vsSource); + GLuint fs = CompileShader(GL_FRAGMENT_SHADER, fsSource); + + mProgram = glCreateProgram(); + mBindUniformLocation(mProgram, colorULocation, "u_colorU"); + // The non-existing uniform should behave like existing, but optimized away + // uniform. + mBindUniformLocation(mProgram, nonexistingLocation, "nonexisting"); + // Let A and C be assigned automatic locations. + glAttachShader(mProgram, vs); + glDeleteShader(vs); + glAttachShader(mProgram, fs); + glDeleteShader(fs); + glLinkProgram(mProgram); + GLint linked = 0; + glGetProgramiv(mProgram, GL_LINK_STATUS, &linked); + ASSERT_EQ(1, linked); + glUseProgram(mProgram); + + // No errors on bound locations, since caller does not know + // if the driver optimizes them away or not. + glUniform1f(colorULocation, 0.25f); + EXPECT_GL_NO_ERROR(); + + // No errors on bound locations of names that do not exist + // in the shader. Otherwise it would be inconsistent wrt the + // optimization case. + glUniform1f(nonexistingLocation, 0.25f); + EXPECT_GL_NO_ERROR(); + + // The above are equal to updating -1. + glUniform1f(-1, 0.25f); + EXPECT_GL_NO_ERROR(); + + // No errors when updating with other type either. + // The type can not be known with the non-existing case. + glUniform2f(colorULocation, 0.25f, 0.25f); + EXPECT_GL_NO_ERROR(); + glUniform2f(nonexistingLocation, 0.25f, 0.25f); + EXPECT_GL_NO_ERROR(); + glUniform2f(-1, 0.25f, 0.25f); + EXPECT_GL_NO_ERROR(); + + // Ensure that driver or ANGLE has optimized the variable + // away and the test tests what it is supposed to. + EXPECT_EQ(-1, glGetUniformLocation(mProgram, "u_colorU")); + + // The bound location gets marked as used and the driver + // does not allocate other variables to that location. + EXPECT_NE(colorULocation, glGetUniformLocation(mProgram, "u_colorA")); + EXPECT_NE(colorULocation, glGetUniformLocation(mProgram, "u_colorC")); + EXPECT_NE(nonexistingLocation, glGetUniformLocation(mProgram, "u_colorA")); + EXPECT_NE(nonexistingLocation, glGetUniformLocation(mProgram, "u_colorC")); + + // Unintuitive: while specifying value works, getting the value does not. + GLfloat getResult = 0.0f; + glGetUniformfv(mProgram, colorULocation, &getResult); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + glGetUniformfv(mProgram, nonexistingLocation, &getResult); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + glGetUniformfv(mProgram, -1, &getResult); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + // Updating an unbound, non-existing location still causes + // an error. + glUniform1f(unboundLocation, 0.25f); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); +} + +// Test for a bug where using a sampler caused GL error if the mProgram had +// uniforms that were optimized away by the driver. This was only a problem with +// glBindUniformLocationCHROMIUM implementation. This could be reproed by +// binding the sampler to a location higher than the amount of active uniforms. +TEST_P(BindUniformLocationTest, UseSamplerWhenUnusedUniforms) +{ + if (!extensionEnabled("GL_CHROMIUM_bind_uniform_location")) + { + std::cout << "Test skipped because GL_CHROMIUM_bind_uniform_location is not available." + << std::endl; + return; + } + + ASSERT_NE(nullptr, mBindUniformLocation); + + // clang-format off + const std::string vsSource = SHADER_SOURCE + ( + void main() + { + gl_Position = vec4(0); + } + ); + + const std::string fsSource = SHADER_SOURCE + ( + uniform sampler2D tex; + void main() + { + gl_FragColor = texture2D(tex, vec2(1)); + } + ); + // clang-format on + + const GLuint texLocation = 54; + + GLuint vs = CompileShader(GL_VERTEX_SHADER, vsSource); + GLuint fs = CompileShader(GL_FRAGMENT_SHADER, fsSource); + + mProgram = glCreateProgram(); + mBindUniformLocation(mProgram, texLocation, "tex"); + + glAttachShader(mProgram, vs); + glDeleteShader(vs); + glAttachShader(mProgram, fs); + glDeleteShader(fs); + + glLinkProgram(mProgram); + + GLint linked = 0; + glGetProgramiv(mProgram, GL_LINK_STATUS, &linked); + EXPECT_NE(0, linked); + glUseProgram(mProgram); + glUniform1i(texLocation, 0); + EXPECT_GL_NO_ERROR(); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these +// tests should be run against. +ANGLE_INSTANTIATE_TEST(BindUniformLocationTest, + ES2_D3D9(), + ES2_D3D11(), + ES2_D3D11_FL9_3(), + ES2_OPENGL(), + ES2_OPENGLES()); + +} // namespace diff --git a/gfx/angle/src/tests/gl_tests/BlendMinMaxTest.cpp b/gfx/angle/src/tests/gl_tests/BlendMinMaxTest.cpp new file mode 100755 index 000000000..39f5251e5 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/BlendMinMaxTest.cpp @@ -0,0 +1,255 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "test_utils/ANGLETest.h" + +using namespace angle; + +class BlendMinMaxTest : public ANGLETest +{ + protected: + BlendMinMaxTest() + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + setConfigDepthBits(24); + + mProgram = 0; + mColorLocation = -1; + mFramebuffer = 0; + mColorRenderbuffer = 0; + } + + struct Color + { + float values[4]; + }; + + static float getExpected(bool blendMin, float curColor, float prevColor) + { + return blendMin ? std::min(curColor, prevColor) : std::max(curColor, prevColor); + } + + void runTest(GLenum colorFormat, GLenum type) + { + if (getClientMajorVersion() < 3 && !extensionEnabled("GL_EXT_blend_minmax")) + { + std::cout << "Test skipped because ES3 or GL_EXT_blend_minmax is not available." << std::endl; + return; + } + + // TODO(geofflang): figure out why this fails + if (IsIntel() && GetParam() == ES2_OPENGL()) + { + std::cout << "Test skipped on OpenGL Intel due to flakyness." << std::endl; + return; + } + + SetUpFramebuffer(colorFormat); + + int minValue = 0; + int maxValue = 1; + if (type == GL_FLOAT) + { + minValue = -1024; + maxValue = 1024; + } + + const size_t colorCount = 128; + Color colors[colorCount]; + for (size_t i = 0; i < colorCount; i++) + { + for (size_t j = 0; j < 4; j++) + { + colors[i].values[j] = + static_cast<float>(minValue + (rand() % (maxValue - minValue))); + } + } + + float prevColor[4]; + for (size_t i = 0; i < colorCount; i++) + { + const Color &color = colors[i]; + glUseProgram(mProgram); + glUniform4f(mColorLocation, color.values[0], color.values[1], color.values[2], color.values[3]); + + bool blendMin = (rand() % 2 == 0); + glBlendEquation(blendMin ? GL_MIN : GL_MAX); + + drawQuad(mProgram, "aPosition", 0.5f); + + float pixel[4]; + if (type == GL_UNSIGNED_BYTE) + { + GLubyte ubytePixel[4]; + glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, ubytePixel); + for (size_t componentIdx = 0; componentIdx < ArraySize(pixel); componentIdx++) + { + pixel[componentIdx] = ubytePixel[componentIdx] / 255.0f; + } + } + else if (type == GL_FLOAT) + { + glReadPixels(0, 0, 1, 1, GL_RGBA, GL_FLOAT, pixel); + } + else + { + FAIL() << "Unexpected pixel type"; + } + + if (i > 0) + { + const float errorRange = 1.0f / 255.0f; + for (size_t componentIdx = 0; componentIdx < ArraySize(pixel); componentIdx++) + { + EXPECT_NEAR( + getExpected(blendMin, color.values[componentIdx], prevColor[componentIdx]), + pixel[componentIdx], errorRange); + } + } + + memcpy(prevColor, pixel, sizeof(pixel)); + } + } + + virtual void SetUp() + { + ANGLETest::SetUp(); + + const std::string testVertexShaderSource = SHADER_SOURCE + ( + attribute highp vec4 aPosition; + + void main(void) + { + gl_Position = aPosition; + } + ); + + const std::string testFragmentShaderSource = SHADER_SOURCE + ( + uniform highp vec4 color; + void main(void) + { + gl_FragColor = color; + } + ); + + mProgram = CompileProgram(testVertexShaderSource, testFragmentShaderSource); + if (mProgram == 0) + { + FAIL() << "shader compilation failed."; + } + + mColorLocation = glGetUniformLocation(mProgram, "color"); + + glUseProgram(mProgram); + + glClearColor(0, 0, 0, 0); + glClearDepthf(0.0); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glEnable(GL_BLEND); + glDisable(GL_DEPTH_TEST); + } + + void SetUpFramebuffer(GLenum colorFormat) + { + glGenFramebuffers(1, &mFramebuffer); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mFramebuffer); + glBindFramebuffer(GL_READ_FRAMEBUFFER, mFramebuffer); + + glGenRenderbuffers(1, &mColorRenderbuffer); + glBindRenderbuffer(GL_RENDERBUFFER, mColorRenderbuffer); + glRenderbufferStorage(GL_RENDERBUFFER, colorFormat, getWindowWidth(), getWindowHeight()); + glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, mColorRenderbuffer); + + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + glClear(GL_COLOR_BUFFER_BIT); + + ASSERT_GL_NO_ERROR(); + } + + virtual void TearDown() + { + glDeleteProgram(mProgram); + glDeleteFramebuffers(1, &mFramebuffer); + glDeleteRenderbuffers(1, &mColorRenderbuffer); + + ANGLETest::TearDown(); + } + + GLuint mProgram; + GLint mColorLocation; + + GLuint mFramebuffer; + GLuint mColorRenderbuffer; +}; + +TEST_P(BlendMinMaxTest, RGBA8) +{ + runTest(GL_RGBA8, GL_UNSIGNED_BYTE); +} + +TEST_P(BlendMinMaxTest, RGBA32F) +{ + if (getClientMajorVersion() < 3 || !extensionEnabled("GL_EXT_color_buffer_float")) + { + std::cout << "Test skipped because ES3 and GL_EXT_color_buffer_float are not available." + << std::endl; + return; + } + + // TODO(jmadill): Figure out why this is broken on Intel + if (IsIntel() && (GetParam() == ES2_D3D11() || GetParam() == ES2_D3D9())) + { + std::cout << "Test skipped on Intel OpenGL." << std::endl; + return; + } + + // TODO (bug 1284): Investigate RGBA32f D3D SDK Layers messages on D3D11_FL9_3 + if (IsD3D11_FL93()) + { + std::cout << "Test skipped on Feature Level 9_3." << std::endl; + return; + } + + runTest(GL_RGBA32F, GL_FLOAT); +} + +TEST_P(BlendMinMaxTest, RGBA16F) +{ + if (getClientMajorVersion() < 3 && !extensionEnabled("GL_EXT_color_buffer_half_float")) + { + std::cout << "Test skipped because ES3 or GL_EXT_color_buffer_half_float is not available." + << std::endl; + return; + } + + // TODO(jmadill): figure out why this fails + if (IsIntel() && (GetParam() == ES2_D3D11() || GetParam() == ES2_D3D9())) + { + std::cout << "Test skipped on Intel due to failures." << std::endl; + return; + } + + runTest(GL_RGBA16F, GL_FLOAT); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(BlendMinMaxTest, + ES2_D3D9(), + ES2_D3D11(), + ES3_D3D11(), + ES2_D3D11_FL9_3(), + ES2_OPENGL(), + ES3_OPENGL(), + ES2_OPENGLES(), + ES3_OPENGLES()); diff --git a/gfx/angle/src/tests/gl_tests/BlitFramebufferANGLETest.cpp b/gfx/angle/src/tests/gl_tests/BlitFramebufferANGLETest.cpp new file mode 100755 index 000000000..e40a411db --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/BlitFramebufferANGLETest.cpp @@ -0,0 +1,1070 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "test_utils/ANGLETest.h" + +#include "test_utils/gl_raii.h" + +using namespace angle; + +class BlitFramebufferANGLETest : public ANGLETest +{ + protected: + BlitFramebufferANGLETest() + { + setWindowWidth(256); + setWindowHeight(256); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + setConfigDepthBits(24); + setConfigStencilBits(8); + + mCheckerProgram = 0; + mBlueProgram = 0; + + mOriginalFBO = 0; + + mUserFBO = 0; + mUserColorBuffer = 0; + mUserDepthStencilBuffer = 0; + + mSmallFBO = 0; + mSmallColorBuffer = 0; + mSmallDepthStencilBuffer = 0; + + mColorOnlyFBO = 0; + mColorOnlyColorBuffer = 0; + + mDiffFormatFBO = 0; + mDiffFormatColorBuffer = 0; + + mDiffSizeFBO = 0; + mDiffSizeColorBuffer = 0; + + mMRTFBO = 0; + mMRTColorBuffer0 = 0; + mMRTColorBuffer1 = 0; + + mRGBAColorbuffer = 0; + mRGBAFBO = 0; + + mBGRAMultisampledRenderbuffer = 0; + mBGRAMultisampledFBO = 0; + } + + virtual void SetUp() + { + ANGLETest::SetUp(); + + const std::string passthroughVS = SHADER_SOURCE + ( + precision highp float; + attribute vec4 position; + varying vec4 pos; + + void main() + { + gl_Position = position; + pos = position; + } + ); + + const std::string checkeredFS = SHADER_SOURCE + ( + precision highp float; + varying vec4 pos; + + void main() + { + if (pos.x * pos.y > 0.0) + { + gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); + } + else + { + gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); + } + } + ); + + const std::string blueFS = SHADER_SOURCE + ( + precision highp float; + varying vec4 pos; + + void main() + { + gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0); + } + ); + + mCheckerProgram = CompileProgram(passthroughVS, checkeredFS); + mBlueProgram = CompileProgram(passthroughVS, blueFS); + if (mCheckerProgram == 0 || mBlueProgram == 0) + { + FAIL() << "shader compilation failed."; + } + + EXPECT_GL_NO_ERROR(); + + GLint originalFBO; + glGetIntegerv(GL_FRAMEBUFFER_BINDING, &originalFBO); + if (originalFBO >= 0) + { + mOriginalFBO = (GLuint)originalFBO; + } + + GLenum format = GL_BGRA8_EXT; + + glGenFramebuffers(1, &mUserFBO); + glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO); + glGenTextures(1, &mUserColorBuffer); + glGenRenderbuffers(1, &mUserDepthStencilBuffer); + glBindTexture(GL_TEXTURE_2D, mUserColorBuffer); + glTexStorage2DEXT(GL_TEXTURE_2D, 1, format, getWindowWidth(), getWindowHeight()); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mUserColorBuffer, 0); + glBindRenderbuffer(GL_RENDERBUFFER, mUserDepthStencilBuffer); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES, getWindowWidth(), getWindowHeight()); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mUserDepthStencilBuffer); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, mUserDepthStencilBuffer); + + ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + ASSERT_GL_NO_ERROR(); + + glGenFramebuffers(1, &mSmallFBO); + glBindFramebuffer(GL_FRAMEBUFFER, mSmallFBO); + glGenTextures(1, &mSmallColorBuffer); + glGenRenderbuffers(1, &mSmallDepthStencilBuffer); + glBindTexture(GL_TEXTURE_2D, mSmallColorBuffer); + glTexStorage2DEXT(GL_TEXTURE_2D, 1, format, getWindowWidth() / 2, getWindowHeight() / 2); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mSmallColorBuffer, 0); + glBindRenderbuffer(GL_RENDERBUFFER, mSmallDepthStencilBuffer); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES, getWindowWidth() / 2, getWindowHeight() / 2); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mSmallDepthStencilBuffer); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, mSmallDepthStencilBuffer); + + ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + ASSERT_GL_NO_ERROR(); + + glGenFramebuffers(1, &mColorOnlyFBO); + glBindFramebuffer(GL_FRAMEBUFFER, mColorOnlyFBO); + glGenTextures(1, &mColorOnlyColorBuffer); + glBindTexture(GL_TEXTURE_2D, mColorOnlyColorBuffer); + glTexStorage2DEXT(GL_TEXTURE_2D, 1, format, getWindowWidth(), getWindowHeight()); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mColorOnlyColorBuffer, 0); + + ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + ASSERT_GL_NO_ERROR(); + + glGenFramebuffers(1, &mDiffFormatFBO); + glBindFramebuffer(GL_FRAMEBUFFER, mDiffFormatFBO); + glGenTextures(1, &mDiffFormatColorBuffer); + glBindTexture(GL_TEXTURE_2D, mDiffFormatColorBuffer); + glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGB565, getWindowWidth(), getWindowHeight()); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mDiffFormatColorBuffer, 0); + + ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + ASSERT_GL_NO_ERROR(); + + glGenFramebuffers(1, &mDiffSizeFBO); + glBindFramebuffer(GL_FRAMEBUFFER, mDiffSizeFBO); + glGenTextures(1, &mDiffSizeColorBuffer); + glBindTexture(GL_TEXTURE_2D, mDiffSizeColorBuffer); + glTexStorage2DEXT(GL_TEXTURE_2D, 1, format, getWindowWidth()*2, getWindowHeight()*2); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mDiffSizeColorBuffer, 0); + + ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + ASSERT_GL_NO_ERROR(); + + if (extensionEnabled("GL_EXT_draw_buffers")) + { + glGenFramebuffers(1, &mMRTFBO); + glBindFramebuffer(GL_FRAMEBUFFER, mMRTFBO); + glGenTextures(1, &mMRTColorBuffer0); + glGenTextures(1, &mMRTColorBuffer1); + glBindTexture(GL_TEXTURE_2D, mMRTColorBuffer0); + glTexStorage2DEXT(GL_TEXTURE_2D, 1, format, getWindowWidth(), getWindowHeight()); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, mMRTColorBuffer0, 0); + glBindTexture(GL_TEXTURE_2D, mMRTColorBuffer1); + glTexStorage2DEXT(GL_TEXTURE_2D, 1, format, getWindowWidth(), getWindowHeight()); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, mMRTColorBuffer1, 0); + + ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + ASSERT_GL_NO_ERROR(); + } + + if (extensionEnabled("GL_ANGLE_framebuffer_multisample")) + { + // Test blit between RGBA and multisampled BGRA + glGenTextures(1, &mRGBAColorbuffer); + glBindTexture(GL_TEXTURE_2D, mRGBAColorbuffer); + glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, getWindowWidth(), getWindowHeight()); + + glGenFramebuffers(1, &mRGBAFBO); + glBindFramebuffer(GL_FRAMEBUFFER, mRGBAFBO); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mRGBAColorbuffer, 0); + + ASSERT_GL_NO_ERROR(); + ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + glGenRenderbuffers(1, &mBGRAMultisampledRenderbuffer); + glBindRenderbuffer(GL_RENDERBUFFER, mBGRAMultisampledRenderbuffer); + glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER, 1, GL_BGRA8_EXT, getWindowWidth(), getWindowHeight()); + + glGenFramebuffers(1, &mBGRAMultisampledFBO); + glBindFramebuffer(GL_FRAMEBUFFER, mBGRAMultisampledFBO); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, mBGRAMultisampledRenderbuffer); + + ASSERT_GL_NO_ERROR(); + ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + } + + glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO); + } + + virtual void TearDown() + { + glDeleteProgram(mCheckerProgram); + glDeleteProgram(mBlueProgram); + + glDeleteFramebuffers(1, &mUserFBO); + glDeleteTextures(1, &mUserColorBuffer); + glDeleteRenderbuffers(1, &mUserDepthStencilBuffer); + + glDeleteFramebuffers(1, &mSmallFBO); + glDeleteTextures(1, &mSmallColorBuffer); + glDeleteRenderbuffers(1, &mSmallDepthStencilBuffer); + + glDeleteFramebuffers(1, &mColorOnlyFBO); + glDeleteTextures(1, &mSmallDepthStencilBuffer); + + glDeleteFramebuffers(1, &mDiffFormatFBO); + glDeleteTextures(1, &mDiffFormatColorBuffer); + + glDeleteFramebuffers(1, &mDiffSizeFBO); + glDeleteTextures(1, &mDiffSizeColorBuffer); + + if (extensionEnabled("GL_EXT_draw_buffers")) + { + glDeleteFramebuffers(1, &mMRTFBO); + glDeleteTextures(1, &mMRTColorBuffer0); + glDeleteTextures(1, &mMRTColorBuffer1); + } + + if (mRGBAColorbuffer != 0) + { + glDeleteTextures(1, &mRGBAColorbuffer); + } + + if (mRGBAFBO != 0) + { + glDeleteFramebuffers(1, &mBGRAMultisampledFBO); + } + + if (mBGRAMultisampledRenderbuffer != 0) + { + glDeleteRenderbuffers(1, &mBGRAMultisampledRenderbuffer); + } + + if (mBGRAMultisampledFBO != 0) + { + glDeleteFramebuffers(1, &mBGRAMultisampledFBO); + } + + ANGLETest::TearDown(); + } + + GLuint mCheckerProgram; + GLuint mBlueProgram; + + GLuint mOriginalFBO; + + GLuint mUserFBO; + GLuint mUserColorBuffer; + GLuint mUserDepthStencilBuffer; + + GLuint mSmallFBO; + GLuint mSmallColorBuffer; + GLuint mSmallDepthStencilBuffer; + + GLuint mColorOnlyFBO; + GLuint mColorOnlyColorBuffer; + + GLuint mDiffFormatFBO; + GLuint mDiffFormatColorBuffer; + + GLuint mDiffSizeFBO; + GLuint mDiffSizeColorBuffer; + + GLuint mMRTFBO; + GLuint mMRTColorBuffer0; + GLuint mMRTColorBuffer1; + + GLuint mRGBAColorbuffer; + GLuint mRGBAFBO; + + GLuint mBGRAMultisampledRenderbuffer; + GLuint mBGRAMultisampledFBO; +}; + +// Draw to user-created framebuffer, blit whole-buffer color to original framebuffer. +TEST_P(BlitFramebufferANGLETest, BlitColorToDefault) +{ + glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + drawQuad(mCheckerProgram, "position", 0.8f); + + EXPECT_GL_NO_ERROR(); + + glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO); + + glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(), + GL_COLOR_BUFFER_BIT, GL_NEAREST); + + EXPECT_GL_NO_ERROR(); + + glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO); + + EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255); + EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255); + EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255); + EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255); +} + +// Draw to system framebuffer, blit whole-buffer color to user-created framebuffer. +TEST_P(BlitFramebufferANGLETest, ReverseColorBlit) +{ + glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + drawQuad(mCheckerProgram, "position", 0.8f); + + EXPECT_GL_NO_ERROR(); + + glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO); + + glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(), + GL_COLOR_BUFFER_BIT, GL_NEAREST); + + EXPECT_GL_NO_ERROR(); + + glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO); + + EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255); + EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255); + EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255); + EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255); +} + +// blit from user-created FBO to system framebuffer, with the scissor test enabled. +TEST_P(BlitFramebufferANGLETest, ScissoredBlit) +{ + glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + drawQuad(mCheckerProgram, "position", 0.8f); + + EXPECT_GL_NO_ERROR(); + + glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO); + glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO); + + glClearColor(1.0, 1.0, 1.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + glScissor(getWindowWidth() / 2, 0, getWindowWidth() / 2, getWindowHeight()); + glEnable(GL_SCISSOR_TEST); + + glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(), + GL_COLOR_BUFFER_BIT, GL_NEAREST); + + EXPECT_GL_NO_ERROR(); + + glDisable(GL_SCISSOR_TEST); + + glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO); + + EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 255, 255, 255); + EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255); + EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255); + EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 255, 255, 255); +} + +// blit from system FBO to user-created framebuffer, with the scissor test enabled. +TEST_P(BlitFramebufferANGLETest, ReverseScissoredBlit) +{ + // TODO(jmadill): Triage this driver bug. + if (IsAMD() && IsD3D11()) + { + std::cout << "Test skipped on AMD D3D11." << std::endl; + return; + } + + glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + drawQuad(mCheckerProgram, "position", 0.8f); + + EXPECT_GL_NO_ERROR(); + + glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO); + glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO); + + glClearColor(1.0, 1.0, 1.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + glScissor(getWindowWidth() / 2, 0, getWindowWidth() / 2, getWindowHeight()); + glEnable(GL_SCISSOR_TEST); + + glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(), + GL_COLOR_BUFFER_BIT, GL_NEAREST); + + EXPECT_GL_NO_ERROR(); + + glDisable(GL_SCISSOR_TEST); + + glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO); + + EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 255, 255, 255); + EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255); + EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255); + EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 255, 255, 255); +} + +// blit from user-created FBO to system framebuffer, using region larger than buffer. +TEST_P(BlitFramebufferANGLETest, OversizedBlit) +{ + glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + drawQuad(mCheckerProgram, "position", 0.8f); + + EXPECT_GL_NO_ERROR(); + + glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO); + glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO); + + glClearColor(1.0, 1.0, 1.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + glBlitFramebufferANGLE(0, 0, getWindowWidth() * 2, getWindowHeight() * 2, 0, 0, getWindowWidth() * 2, getWindowHeight() * 2, + GL_COLOR_BUFFER_BIT, GL_NEAREST); + + EXPECT_GL_NO_ERROR(); + + glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO); + + EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255); + EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255); + EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255); + EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255); +} + +// blit from system FBO to user-created framebuffer, using region larger than buffer. +TEST_P(BlitFramebufferANGLETest, ReverseOversizedBlit) +{ + glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + drawQuad(mCheckerProgram, "position", 0.8f); + + EXPECT_GL_NO_ERROR(); + + glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO); + glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO); + + glClearColor(1.0, 1.0, 1.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + glBlitFramebufferANGLE(0, 0, getWindowWidth() * 2, getWindowHeight() * 2, 0, 0, getWindowWidth() * 2, getWindowHeight() * 2, + GL_COLOR_BUFFER_BIT, GL_NEAREST); + EXPECT_GL_NO_ERROR(); + + glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO); + + EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255); + EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255); + EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255); + EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255); +} + +// blit from user-created FBO to system framebuffer, with depth buffer. +TEST_P(BlitFramebufferANGLETest, BlitWithDepth) +{ + glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO); + + glDepthMask(GL_TRUE); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + glEnable(GL_DEPTH_TEST); + + drawQuad(mCheckerProgram, "position", 0.3f); + + EXPECT_GL_NO_ERROR(); + + glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO); + glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO); + + glClearColor(1.0, 1.0, 1.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(), + GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST); + EXPECT_GL_NO_ERROR(); + + glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO); + + // if blit is happening correctly, this quad will not draw, because it is behind the blitted one + drawQuad(mBlueProgram, "position", 0.8f); + + glDisable(GL_DEPTH_TEST); + + EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255); + EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255); + EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255); + EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255); +} + +// blit from system FBO to user-created framebuffer, with depth buffer. +TEST_P(BlitFramebufferANGLETest, ReverseBlitWithDepth) +{ + glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + glEnable(GL_DEPTH_TEST); + + drawQuad(mCheckerProgram, "position", 0.3f); + + EXPECT_GL_NO_ERROR(); + + glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO); + glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO); + + glClearColor(1.0f, 1.0f, 1.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(), + GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST); + EXPECT_GL_NO_ERROR(); + + glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO); + + // if blit is happening correctly, this quad will not draw, because it is behind the blitted one + + drawQuad(mBlueProgram, "position", 0.8f); + + glDisable(GL_DEPTH_TEST); + + EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255); + EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255); + EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255); + EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255); +} + +// blit from one region of the system fbo to another-- this should fail. +TEST_P(BlitFramebufferANGLETest, BlitSameBufferOriginal) +{ + glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + drawQuad(mCheckerProgram, "position", 0.3f); + + EXPECT_GL_NO_ERROR(); + + glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight(), getWindowWidth() / 2, 0, getWindowWidth(), getWindowHeight(), + GL_COLOR_BUFFER_BIT, GL_NEAREST); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); +} + +// blit from one region of the system fbo to another. +TEST_P(BlitFramebufferANGLETest, BlitSameBufferUser) +{ + glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + drawQuad(mCheckerProgram, "position", 0.3f); + + EXPECT_GL_NO_ERROR(); + + glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight(), getWindowWidth() / 2, 0, getWindowWidth(), getWindowHeight(), + GL_COLOR_BUFFER_BIT, GL_NEAREST); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); +} + +TEST_P(BlitFramebufferANGLETest, BlitPartialColor) +{ + glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + drawQuad(mCheckerProgram, "position", 0.5f); + + EXPECT_GL_NO_ERROR(); + + glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO); + glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO); + + glClearColor(1.0, 1.0, 1.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, 0, getWindowHeight() / 2, getWindowWidth() / 2, getWindowHeight(), + GL_COLOR_BUFFER_BIT, GL_NEAREST); + + EXPECT_GL_NO_ERROR(); + + glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO); + + EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 255, 255, 255); + EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 255, 255, 255, 255); + EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 255, 255, 255); + EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255); +} + +TEST_P(BlitFramebufferANGLETest, BlitDifferentSizes) +{ + glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + drawQuad(mCheckerProgram, "position", 0.5f); + + EXPECT_GL_NO_ERROR(); + + glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mSmallFBO); + glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO); + + glClearColor(1.0, 1.0, 1.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(), + GL_COLOR_BUFFER_BIT, GL_NEAREST); + + EXPECT_GL_NO_ERROR(); + + glBindFramebuffer(GL_FRAMEBUFFER, mSmallFBO); + + EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255); + + EXPECT_GL_NO_ERROR(); +} + +TEST_P(BlitFramebufferANGLETest, BlitWithMissingAttachments) +{ + glBindFramebuffer(GL_FRAMEBUFFER, mColorOnlyFBO); + + glClear(GL_COLOR_BUFFER_BIT); + drawQuad(mCheckerProgram, "position", 0.3f); + + glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO); + glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mColorOnlyFBO); + + glClearColor(1.0, 1.0, 1.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + // depth blit request should be silently ignored, because the read FBO has no depth attachment + glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(), + GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST); + + EXPECT_GL_NO_ERROR(); + + glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO); + + EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255); + EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255); + EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255); + EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255); + + // unlike in the depth blit tests, this *should* draw a blue quad, because depth info + // has not been copied + glEnable(GL_DEPTH_TEST); + drawQuad(mBlueProgram, "position", 0.8f); + glDisable(GL_DEPTH_TEST); + + EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 0, 0, 255, 255); + EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 0, 255, 255); + EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 0, 255, 255); + EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 0, 255, 255); +} + +TEST_P(BlitFramebufferANGLETest, BlitStencil) +{ + // TODO(jmadill): Figure out if we can fix this on D3D9. + // https://code.google.com/p/angleproject/issues/detail?id=809 + if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE) + { + std::cout << "Test skipped on Intel D3D9." << std::endl; + return; + } + + glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO); + + glClear(GL_COLOR_BUFFER_BIT); + // fill the stencil buffer with 0x1 + glStencilFunc(GL_ALWAYS, 0x1, 0xFF); + glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); + glEnable(GL_STENCIL_TEST); + drawQuad(mCheckerProgram, "position", 0.3f); + + glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO); + glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO); + + glClearColor(1.0, 1.0, 1.0, 1.0); + glClearStencil(0x0); + glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + // depth blit request should be silently ignored, because the read FBO has no depth attachment + glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(), + GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST); + + EXPECT_GL_NO_ERROR(); + + glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO); + + EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255); + EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255); + EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255); + EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255); + + glStencilFunc(GL_EQUAL, 0x1, 0xFF); // only pass if stencil buffer at pixel reads 0x1 + drawQuad(mBlueProgram, "position", 0.8f); // blue quad will draw if stencil buffer was copied + glDisable(GL_STENCIL_TEST); + + EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 0, 0, 255, 255); + EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 0, 255, 255); + EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 0, 255, 255); + EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 0, 255, 255); +} + +// make sure that attempting to blit a partial depth buffer issues an error +TEST_P(BlitFramebufferANGLETest, BlitPartialDepthStencil) +{ + glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + drawQuad(mCheckerProgram, "position", 0.5f); + + EXPECT_GL_NO_ERROR(); + + glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO); + glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO); + + glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, 0, 0, + getWindowWidth() / 2, getWindowHeight() / 2, GL_DEPTH_BUFFER_BIT, GL_NEAREST); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); +} + +// Test blit with MRT framebuffers +TEST_P(BlitFramebufferANGLETest, BlitMRT) +{ + if (!extensionEnabled("GL_EXT_draw_buffers")) + { + return; + } + + GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT }; + + glBindFramebuffer(GL_FRAMEBUFFER, mMRTFBO); + glDrawBuffersEXT(2, drawBuffers); + + glBindFramebuffer(GL_FRAMEBUFFER, mColorOnlyFBO); + + glClear(GL_COLOR_BUFFER_BIT); + + drawQuad(mCheckerProgram, "position", 0.8f); + + EXPECT_GL_NO_ERROR(); + + glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mColorOnlyFBO); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mMRTFBO); + + glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(), + GL_COLOR_BUFFER_BIT, GL_NEAREST); + + EXPECT_GL_NO_ERROR(); + + glBindFramebuffer(GL_FRAMEBUFFER, mMRTFBO); + + EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255); + EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255); + EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255); + EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255); + + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, 0, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mMRTColorBuffer0, 0); + + EXPECT_PIXEL_EQ( getWindowWidth() / 4, getWindowHeight() / 4, 255, 0, 0, 255); + EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, 0, 255, 0, 255); + EXPECT_PIXEL_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 255, 0, 0, 255); + EXPECT_PIXEL_EQ( getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 255, 0, 255); + + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mMRTColorBuffer0, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, mMRTColorBuffer1, 0); +} + +// Make sure that attempts to stretch in a blit call issue an error +TEST_P(BlitFramebufferANGLETest, ErrorStretching) +{ + glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + drawQuad(mCheckerProgram, "position", 0.5f); + + EXPECT_GL_NO_ERROR(); + + glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO); + glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO); + + glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, 0, 0, + getWindowWidth(), getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); +} + +// Make sure that attempts to flip in a blit call issue an error +TEST_P(BlitFramebufferANGLETest, ErrorFlipping) +{ + glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + drawQuad(mCheckerProgram, "position", 0.5f); + + EXPECT_GL_NO_ERROR(); + + glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO); + glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO); + + glBlitFramebufferANGLE(0, 0, getWindowWidth() / 2, getWindowHeight() / 2, getWindowWidth() / 2, getWindowHeight() / 2, + 0, 0, GL_COLOR_BUFFER_BIT, GL_NEAREST); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); +} + +TEST_P(BlitFramebufferANGLETest, Errors) +{ + glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + drawQuad(mCheckerProgram, "position", 0.5f); + + EXPECT_GL_NO_ERROR(); + + glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO); + glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO); + + glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(), + GL_COLOR_BUFFER_BIT, GL_LINEAR); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(), + GL_COLOR_BUFFER_BIT | 234, GL_NEAREST); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mDiffFormatFBO); + + glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(), + GL_COLOR_BUFFER_BIT, GL_NEAREST); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + if (extensionEnabled("GL_ANGLE_framebuffer_multisample")) + { + glBindFramebuffer(GL_READ_FRAMEBUFFER, mBGRAMultisampledFBO); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mRGBAFBO); + EXPECT_GL_NO_ERROR(); + + glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), getWindowHeight(), + GL_COLOR_BUFFER_BIT, GL_NEAREST); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + } + +} + +// TODO(geofflang): Fix the dependence on glBlitFramebufferANGLE without checks and assuming the +// default framebuffer is BGRA to enable the GL and GLES backends. (http://anglebug.com/1289) + +class BlitFramebufferTest : public ANGLETest +{ + protected: + BlitFramebufferTest() + { + setWindowWidth(256); + setWindowHeight(256); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + setConfigDepthBits(24); + setConfigStencilBits(8); + } +}; + +// Tests resolving a multisample depth buffer. +TEST_P(BlitFramebufferTest, MultisampleDepth) +{ + // TODO(jmadill): Triage this driver bug. + if (IsAMD() && IsD3D11()) + { + std::cout << "Test skipped on AMD D3D11." << std::endl; + return; + } + + GLRenderbuffer renderbuf; + glBindRenderbuffer(GL_RENDERBUFFER, renderbuf.get()); + glRenderbufferStorageMultisample(GL_RENDERBUFFER, 2, GL_DEPTH_COMPONENT24, 256, 256); + + const std::string &vertex = + "#version 300 es\n" + "in vec2 position;\n" + "void main() {\n" + " gl_Position = vec4(position, 0.0, 0.5);\n" + "}"; + const std::string &fragment = + "#version 300 es\n" + "out mediump vec4 red;\n" + "void main() {\n" + " red = vec4(1.0, 0.0, 0.0, 1.0);\n" + " gl_FragDepth = 0.5;\n" + "}"; + + ANGLE_GL_PROGRAM(drawRed, vertex, fragment); + + GLFramebuffer framebuffer; + glBindFramebuffer(GL_FRAMEBUFFER, framebuffer.get()); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, + renderbuf.get()); + + ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + glClearDepthf(0.5f); + glClear(GL_DEPTH_BUFFER_BIT); + + GLRenderbuffer destRenderbuf; + glBindRenderbuffer(GL_RENDERBUFFER, destRenderbuf.get()); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, 256, 256); + + GLFramebuffer resolved; + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolved.get()); + glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, + destRenderbuf.get()); + + glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer.get()); + glBlitFramebuffer(0, 0, 256, 256, 0, 0, 256, 256, GL_DEPTH_BUFFER_BIT, GL_NEAREST); + + glBindFramebuffer(GL_FRAMEBUFFER, resolved.get()); + + GLTexture colorbuf; + glBindTexture(GL_TEXTURE_2D, colorbuf.get()); + glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 256, 256); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorbuf.get(), 0); + + ASSERT_GL_NO_ERROR(); + + // Clear to green + glClearColor(0.0f, 1.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); + + // Draw with 0.5f test and the test should pass. + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_EQUAL); + drawQuad(drawRed.get(), "position", 0.5f); + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red); + + ASSERT_GL_NO_ERROR(); +} + +// Test resolving a multisampled stencil buffer. +TEST_P(BlitFramebufferTest, MultisampleStencil) +{ + GLRenderbuffer renderbuf; + glBindRenderbuffer(GL_RENDERBUFFER, renderbuf.get()); + glRenderbufferStorageMultisample(GL_RENDERBUFFER, 2, GL_STENCIL_INDEX8, 256, 256); + + const std::string &vertex = + "#version 300 es\n" + "in vec2 position;\n" + "void main() {\n" + " gl_Position = vec4(position, 0.0, 1.0);\n" + "}"; + const std::string &fragment = + "#version 300 es\n" + "out mediump vec4 red;\n" + "void main() {\n" + " red = vec4(1.0, 0.0, 0.0, 1.0);\n" + "}"; + + ANGLE_GL_PROGRAM(drawRed, vertex, fragment); + + GLFramebuffer framebuffer; + glBindFramebuffer(GL_FRAMEBUFFER, framebuffer.get()); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, + renderbuf.get()); + + ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + // fill the stencil buffer with 0x1 + glStencilFunc(GL_ALWAYS, 0x1, 0xFF); + glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); + glEnable(GL_STENCIL_TEST); + drawQuad(drawRed.get(), "position", 0.5f); + + GLTexture destColorbuf; + glBindTexture(GL_TEXTURE_2D, destColorbuf.get()); + glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 256, 256); + + GLRenderbuffer destRenderbuf; + glBindRenderbuffer(GL_RENDERBUFFER, destRenderbuf.get()); + glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, 256, 256); + + GLFramebuffer resolved; + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolved.get()); + glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, + destColorbuf.get(), 0); + glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, + destRenderbuf.get()); + + glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer.get()); + glBlitFramebuffer(0, 0, 256, 256, 0, 0, 256, 256, GL_STENCIL_BUFFER_BIT, GL_NEAREST); + + glBindFramebuffer(GL_FRAMEBUFFER, resolved.get()); + + ASSERT_GL_NO_ERROR(); + + // Clear to green + glClearColor(0.0f, 1.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); + + // Draw red if the stencil is 0x1, which should be true after the blit/resolve. + glStencilFunc(GL_EQUAL, 0x1, 0xFF); + drawQuad(drawRed.get(), "position", 0.5f); + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red); + + ASSERT_GL_NO_ERROR(); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(BlitFramebufferANGLETest, + ES2_D3D9(), + ES2_D3D11(EGL_EXPERIMENTAL_PRESENT_PATH_COPY_ANGLE), + ES2_D3D11(EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE)); + +ANGLE_INSTANTIATE_TEST(BlitFramebufferTest, ES3_D3D11());
\ No newline at end of file diff --git a/gfx/angle/src/tests/gl_tests/BufferDataTest.cpp b/gfx/angle/src/tests/gl_tests/BufferDataTest.cpp new file mode 100755 index 000000000..7707a4a56 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/BufferDataTest.cpp @@ -0,0 +1,544 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "test_utils/ANGLETest.h" +#include "test_utils/gl_raii.h" + +#include <stdint.h> + +using namespace angle; + +class BufferDataTest : public ANGLETest +{ + protected: + BufferDataTest() + { + setWindowWidth(16); + setWindowHeight(16); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + setConfigDepthBits(24); + + mBuffer = 0; + mProgram = 0; + mAttribLocation = -1; + } + + void SetUp() override + { + ANGLETest::SetUp(); + + const char * vsSource = SHADER_SOURCE + ( + attribute vec4 position; + attribute float in_attrib; + varying float v_attrib; + void main() + { + v_attrib = in_attrib; + gl_Position = position; + } + ); + + const char * fsSource = SHADER_SOURCE + ( + precision mediump float; + varying float v_attrib; + void main() + { + gl_FragColor = vec4(v_attrib, 0, 0, 1); + } + ); + + glGenBuffers(1, &mBuffer); + ASSERT_NE(mBuffer, 0U); + + mProgram = CompileProgram(vsSource, fsSource); + ASSERT_NE(mProgram, 0U); + + mAttribLocation = glGetAttribLocation(mProgram, "in_attrib"); + ASSERT_NE(mAttribLocation, -1); + + glClearColor(0, 0, 0, 0); + glClearDepthf(0.0); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glDisable(GL_DEPTH_TEST); + + ASSERT_GL_NO_ERROR(); + } + + void TearDown() override + { + glDeleteBuffers(1, &mBuffer); + glDeleteProgram(mProgram); + + ANGLETest::TearDown(); + } + + GLuint mBuffer; + GLuint mProgram; + GLint mAttribLocation; +}; + +TEST_P(BufferDataTest, NULLData) +{ + glBindBuffer(GL_ARRAY_BUFFER, mBuffer); + EXPECT_GL_NO_ERROR(); + + const int numIterations = 128; + for (int i = 0; i < numIterations; ++i) + { + GLsizei bufferSize = sizeof(GLfloat) * (i + 1); + glBufferData(GL_ARRAY_BUFFER, bufferSize, NULL, GL_STATIC_DRAW); + EXPECT_GL_NO_ERROR(); + + for (int j = 0; j < bufferSize; j++) + { + for (int k = 0; k < bufferSize - j; k++) + { + glBufferSubData(GL_ARRAY_BUFFER, k, j, NULL); + ASSERT_GL_NO_ERROR(); + } + } + } +} + +TEST_P(BufferDataTest, ZeroNonNULLData) +{ + glBindBuffer(GL_ARRAY_BUFFER, mBuffer); + EXPECT_GL_NO_ERROR(); + + char *zeroData = new char[0]; + glBufferData(GL_ARRAY_BUFFER, 0, zeroData, GL_STATIC_DRAW); + EXPECT_GL_NO_ERROR(); + + glBufferSubData(GL_ARRAY_BUFFER, 0, 0, zeroData); + EXPECT_GL_NO_ERROR(); + + delete [] zeroData; +} + +TEST_P(BufferDataTest, NULLResolvedData) +{ + glBindBuffer(GL_ARRAY_BUFFER, mBuffer); + glBufferData(GL_ARRAY_BUFFER, 128, NULL, GL_DYNAMIC_DRAW); + + glUseProgram(mProgram); + glVertexAttribPointer(mAttribLocation, 1, GL_FLOAT, GL_FALSE, 4, NULL); + glEnableVertexAttribArray(mAttribLocation); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + drawQuad(mProgram, "position", 0.5f); +} + +// Tests that a huge allocation returns GL_OUT_OF_MEMORY +// TODO(jmadill): Figure out how to test this reliably on the Chromium bots +TEST_P(BufferDataTest, DISABLED_HugeSetDataShouldNotCrash) +{ + glBindBuffer(GL_ARRAY_BUFFER, mBuffer); + EXPECT_GL_NO_ERROR(); + + GLsizei allocSize = std::numeric_limits<GLsizei>::max() >> 2; + + uint8_t *data = NULL; + while (data == NULL && allocSize >= 4) + { + data = new (std::nothrow) uint8_t[allocSize]; + + if (data == NULL) + { + allocSize >>= 1; + } + } + + ASSERT_NE(static_cast<uint8_t*>(NULL), data); + memset(data, 0, allocSize); + + float * fValue = reinterpret_cast<float*>(data); + for (unsigned int f = 0; f < 6; f++) + { + fValue[f] = 1.0f; + } + + glBufferData(GL_ARRAY_BUFFER, allocSize, data, GL_STATIC_DRAW); + + GLenum error = glGetError(); + if (error == GL_NO_ERROR) + { + // If we didn't fail because of an out of memory error, try drawing a quad + // using the large buffer + + // DISABLED because it takes a long time, but left for posterity + + //glUseProgram(mProgram); + //glVertexAttribPointer(mAttribLocation, 1, GL_FLOAT, GL_FALSE, 4, NULL); + //glEnableVertexAttribArray(mAttribLocation); + //glBindBuffer(GL_ARRAY_BUFFER, 0); + //drawQuad(mProgram, "position", 0.5f); + //swapBuffers(); + + //// Draw operations can also generate out-of-memory, which is in-spec + //error = glGetError(); + //if (error == GL_NO_ERROR) + //{ + // GLint viewportSize[4]; + // glGetIntegerv(GL_VIEWPORT, viewportSize); + + // GLint midPixelX = (viewportSize[0] + viewportSize[2]) / 2; + // GLint midPixelY = (viewportSize[1] + viewportSize[3]) / 2; + + // EXPECT_PIXEL_EQ(midPixelX, midPixelY, 255, 0, 0, 255); + //} + //else + //{ + // EXPECT_EQ(GL_OUT_OF_MEMORY, error); + //} + } + else + { + EXPECT_GLENUM_EQ(GL_OUT_OF_MEMORY, error); + } + + delete[] data; +} + +// Internally in D3D, we promote dynamic data to static after many draw loops. This code tests +// path. +TEST_P(BufferDataTest, RepeatedDrawWithDynamic) +{ + std::vector<GLfloat> data; + for (int i = 0; i < 16; ++i) + { + data.push_back(static_cast<GLfloat>(i)); + } + + glUseProgram(mProgram); + glBindBuffer(GL_ARRAY_BUFFER, mBuffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * data.size(), data.data(), GL_DYNAMIC_DRAW); + glVertexAttribPointer(mAttribLocation, 1, GL_FLOAT, GL_FALSE, 0, nullptr); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glEnableVertexAttribArray(mAttribLocation); + + for (int drawCount = 0; drawCount < 40; ++drawCount) + { + drawQuad(mProgram, "position", 0.5f); + } + + EXPECT_GL_NO_ERROR(); +} + +class IndexedBufferCopyTest : public ANGLETest +{ + protected: + IndexedBufferCopyTest() + { + setWindowWidth(16); + setWindowHeight(16); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + setConfigDepthBits(24); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + const char * vsSource = SHADER_SOURCE + ( + attribute vec3 in_attrib; + varying vec3 v_attrib; + void main() + { + v_attrib = in_attrib; + gl_Position = vec4(0.0, 0.0, 0.5, 1.0); + gl_PointSize = 100.0; + } + ); + + const char * fsSource = SHADER_SOURCE + ( + precision mediump float; + varying vec3 v_attrib; + void main() + { + gl_FragColor = vec4(v_attrib, 1); + } + ); + + glGenBuffers(2, mBuffers); + ASSERT_NE(mBuffers[0], 0U); + ASSERT_NE(mBuffers[1], 0U); + + glGenBuffers(1, &mElementBuffer); + ASSERT_NE(mElementBuffer, 0U); + + mProgram = CompileProgram(vsSource, fsSource); + ASSERT_NE(mProgram, 0U); + + mAttribLocation = glGetAttribLocation(mProgram, "in_attrib"); + ASSERT_NE(mAttribLocation, -1); + + glClearColor(0, 0, 0, 0); + glDisable(GL_DEPTH_TEST); + glClear(GL_COLOR_BUFFER_BIT); + + ASSERT_GL_NO_ERROR(); + } + + void TearDown() override + { + glDeleteBuffers(2, mBuffers); + glDeleteBuffers(1, &mElementBuffer); + glDeleteProgram(mProgram); + + ANGLETest::TearDown(); + } + + GLuint mBuffers[2]; + GLuint mElementBuffer; + GLuint mProgram; + GLint mAttribLocation; +}; + +// The following test covers an ANGLE bug where our index ranges +// weren't updated from CopyBufferSubData calls +// https://code.google.com/p/angleproject/issues/detail?id=709 +TEST_P(IndexedBufferCopyTest, IndexRangeBug) +{ + // TODO(geofflang): Figure out why this fails on AMD OpenGL (http://anglebug.com/1291) + if (IsAMD() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + std::cout << "Test disabled on AMD OpenGL." << std::endl; + return; + } + + unsigned char vertexData[] = { 255, 0, 0, 0, 0, 0 }; + unsigned int indexData[] = { 0, 1 }; + + glBindBuffer(GL_ARRAY_BUFFER, mBuffers[0]); + glBufferData(GL_ARRAY_BUFFER, sizeof(char) * 6, vertexData, GL_STATIC_DRAW); + + glUseProgram(mProgram); + glVertexAttribPointer(mAttribLocation, 3, GL_UNSIGNED_BYTE, GL_TRUE, 3, NULL); + glEnableVertexAttribArray(mAttribLocation); + + ASSERT_GL_NO_ERROR(); + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mElementBuffer); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int) * 1, indexData, GL_STATIC_DRAW); + + glUseProgram(mProgram); + + ASSERT_GL_NO_ERROR(); + + glDrawElements(GL_POINTS, 1, GL_UNSIGNED_INT, NULL); + + EXPECT_GL_NO_ERROR(); + EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255); + + glBindBuffer(GL_COPY_READ_BUFFER, mBuffers[1]); + glBufferData(GL_COPY_READ_BUFFER, 4, &indexData[1], GL_STATIC_DRAW); + + glBindBuffer(GL_COPY_WRITE_BUFFER, mElementBuffer); + + glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, sizeof(int)); + + ASSERT_GL_NO_ERROR(); + + glClear(GL_COLOR_BUFFER_BIT); + EXPECT_PIXEL_EQ(0, 0, 0, 0, 0, 0); + + unsigned char newData[] = { 0, 255, 0 }; + glBufferSubData(GL_ARRAY_BUFFER, 3, 3, newData); + + glDrawElements(GL_POINTS, 1, GL_UNSIGNED_INT, NULL); + + EXPECT_GL_NO_ERROR(); + EXPECT_PIXEL_EQ(0, 0, 0, 255, 0, 255); +} + +class BufferDataTestES3 : public BufferDataTest +{ +}; + +// The following test covers an ANGLE bug where the buffer storage +// is not resized by Buffer11::getLatestBufferStorage when needed. +// https://code.google.com/p/angleproject/issues/detail?id=897 +TEST_P(BufferDataTestES3, BufferResizing) +{ + glBindBuffer(GL_ARRAY_BUFFER, mBuffer); + ASSERT_GL_NO_ERROR(); + + // Allocate a buffer with one byte + uint8_t singleByte[] = { 0xaa }; + glBufferData(GL_ARRAY_BUFFER, 1, singleByte, GL_STATIC_DRAW); + + // Resize the buffer + // To trigger the bug, the buffer need to be big enough because some hardware copy buffers + // by chunks of pages instead of the minimum number of bytes neeeded. + const size_t numBytes = 4096*4; + glBufferData(GL_ARRAY_BUFFER, numBytes, NULL, GL_STATIC_DRAW); + + // Copy the original data to the buffer + uint8_t srcBytes[numBytes]; + for (size_t i = 0; i < numBytes; ++i) + { + srcBytes[i] = static_cast<uint8_t>(i); + } + + void *dest = glMapBufferRange(GL_ARRAY_BUFFER, 0, numBytes, GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT); + + ASSERT_GL_NO_ERROR(); + + memcpy(dest, srcBytes, numBytes); + glUnmapBuffer(GL_ARRAY_BUFFER); + + EXPECT_GL_NO_ERROR(); + + // Create a new buffer and copy the data to it + GLuint readBuffer; + glGenBuffers(1, &readBuffer); + glBindBuffer(GL_COPY_WRITE_BUFFER, readBuffer); + uint8_t zeros[numBytes]; + for (size_t i = 0; i < numBytes; ++i) + { + zeros[i] = 0; + } + glBufferData(GL_COPY_WRITE_BUFFER, numBytes, zeros, GL_STATIC_DRAW); + glCopyBufferSubData(GL_ARRAY_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, numBytes); + + ASSERT_GL_NO_ERROR(); + + // Read back the data and compare it to the original + uint8_t *data = reinterpret_cast<uint8_t*>(glMapBufferRange(GL_COPY_WRITE_BUFFER, 0, numBytes, GL_MAP_READ_BIT)); + + ASSERT_GL_NO_ERROR(); + + for (size_t i = 0; i < numBytes; ++i) + { + EXPECT_EQ(srcBytes[i], data[i]); + } + glUnmapBuffer(GL_COPY_WRITE_BUFFER); + + glDeleteBuffers(1, &readBuffer); + + EXPECT_GL_NO_ERROR(); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(BufferDataTest, ES2_D3D9(), ES2_D3D11(), ES2_OPENGL(), ES2_OPENGLES()); +ANGLE_INSTANTIATE_TEST(BufferDataTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); +ANGLE_INSTANTIATE_TEST(IndexedBufferCopyTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); + +#ifdef _WIN64 + +// Test a bug where an integer overflow bug could trigger a crash in D3D. +// The test uses 8 buffers with a size just under 0x2000000 to overflow max uint +// (with the internal D3D rounding to 16-byte values) and trigger the bug. +// Only handle this bug on 64-bit Windows for now. Harder to repro on 32-bit. +class BufferDataOverflowTest : public ANGLETest +{ + protected: + BufferDataOverflowTest() + { + } +}; + +// See description above. +TEST_P(BufferDataOverflowTest, VertexBufferIntegerOverflow) +{ + // These values are special, to trigger the rounding bug. + unsigned int numItems = 0x7FFFFFE; + constexpr GLsizei bufferCnt = 8; + + std::vector<GLBuffer> buffers(bufferCnt); + + std::stringstream vertexShaderStr; + + for (GLsizei bufferIndex = 0; bufferIndex < bufferCnt; ++bufferIndex) + { + vertexShaderStr << "attribute float attrib" << bufferIndex << ";\n"; + } + + vertexShaderStr << "attribute vec2 position;\n" + "varying float v_attrib;\n" + "void main() {\n" + " gl_Position = vec4(position, 0, 1);\n" + " v_attrib = 0.0;\n"; + + for (GLsizei bufferIndex = 0; bufferIndex < bufferCnt; ++bufferIndex) + { + vertexShaderStr << "v_attrib += attrib" << bufferIndex << ";\n"; + } + + vertexShaderStr << "}"; + + const std::string &fragmentShader = + "varying highp float v_attrib;\n" + "void main() {\n" + " gl_FragColor = vec4(v_attrib, 0, 0, 1);\n" + "}"; + + ANGLE_GL_PROGRAM(program, vertexShaderStr.str(), fragmentShader); + glUseProgram(program.get()); + + std::vector<GLfloat> data(numItems, 1.0f); + + for (GLsizei bufferIndex = 0; bufferIndex < bufferCnt; ++bufferIndex) + { + glBindBuffer(GL_ARRAY_BUFFER, buffers[bufferIndex].get()); + glBufferData(GL_ARRAY_BUFFER, numItems * sizeof(float), &data[0], GL_DYNAMIC_DRAW); + + std::stringstream attribNameStr; + attribNameStr << "attrib" << bufferIndex; + + GLint attribLocation = glGetAttribLocation(program.get(), attribNameStr.str().c_str()); + ASSERT_NE(-1, attribLocation); + + glVertexAttribPointer(attribLocation, 1, GL_FLOAT, GL_FALSE, 4, nullptr); + glEnableVertexAttribArray(attribLocation); + } + + GLint positionLocation = glGetAttribLocation(program.get(), "position"); + ASSERT_NE(-1, positionLocation); + glDisableVertexAttribArray(positionLocation); + glVertexAttrib2f(positionLocation, 1.0f, 1.0f); + + EXPECT_GL_NO_ERROR(); + glDrawArrays(GL_TRIANGLES, 0, numItems); + EXPECT_GL_ERROR(GL_OUT_OF_MEMORY); +} + +// Tests a security bug in our CopyBufferSubData validation (integer overflow). +TEST_P(BufferDataOverflowTest, CopySubDataValidation) +{ + GLBuffer readBuffer, writeBuffer; + + glBindBuffer(GL_COPY_READ_BUFFER, readBuffer.get()); + glBindBuffer(GL_COPY_WRITE_BUFFER, writeBuffer.get()); + + constexpr int bufSize = 100; + + glBufferData(GL_COPY_READ_BUFFER, bufSize, nullptr, GL_STATIC_DRAW); + glBufferData(GL_COPY_WRITE_BUFFER, bufSize, nullptr, GL_STATIC_DRAW); + + GLintptr big = std::numeric_limits<GLintptr>::max() - bufSize + 90; + + glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, big, 0, 50); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, big, 50); + EXPECT_GL_ERROR(GL_INVALID_VALUE); +} + +ANGLE_INSTANTIATE_TEST(BufferDataOverflowTest, ES3_D3D11()); + +#endif // _WIN64 diff --git a/gfx/angle/src/tests/gl_tests/BuiltinVariableTest.cpp b/gfx/angle/src/tests/gl_tests/BuiltinVariableTest.cpp new file mode 100755 index 000000000..cbb399dd6 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/BuiltinVariableTest.cpp @@ -0,0 +1,209 @@ +// +// Copyright 2016 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// BuiltinVariableTest: +// Tests the correctness of the builtin GLSL variables. +// + +#include "test_utils/ANGLETest.h" + +using namespace angle; + +class BuiltinVariableVertexIdTest : public ANGLETest +{ + protected: + BuiltinVariableVertexIdTest() + { + setWindowWidth(64); + setWindowHeight(64); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + setConfigDepthBits(24); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + const std::string vsSource = + "#version 300 es\n" + "precision highp float;\n" + "in vec4 position;\n" + "in int expectedID;" + "out vec4 color;\n" + "\n" + "void main()\n" + "{\n" + " gl_Position = position;\n" + " color = vec4(gl_VertexID != expectedID, gl_VertexID == expectedID, 0.0, 1.0);" + "}\n"; + + const std::string fsSource = + "#version 300 es\n" + "precision highp float;\n" + "in vec4 color;\n" + "out vec4 fragColor;\n" + "void main()\n" + "{\n" + " fragColor = color;\n" + "}\n"; + + mProgram = CompileProgram(vsSource, fsSource); + ASSERT_NE(0u, mProgram); + + mPositionLocation = glGetAttribLocation(mProgram, "position"); + ASSERT_NE(-1, mPositionLocation); + mExpectedIdLocation = glGetAttribLocation(mProgram, "expectedID"); + ASSERT_NE(-1, mExpectedIdLocation); + + static const float positions[] = + { + 0.5, 0.5, + -0.5, 0.5, + 0.5, -0.5, + -0.5, -0.5 + }; + glGenBuffers(1, &mPositionBuffer); + glBindBuffer(GL_ARRAY_BUFFER, mPositionBuffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW); + + ASSERT_GL_NO_ERROR(); + } + + void TearDown() override + { + glDeleteBuffers(1, &mPositionBuffer); + glDeleteBuffers(1, &mExpectedIdBuffer); + glDeleteBuffers(1, &mIndexBuffer); + glDeleteProgram(mProgram); + + ANGLETest::TearDown(); + } + + // Renders a primitive using the specified mode, each vertex color will + // be green if gl_VertexID is correct, red otherwise. + void runTest(GLuint drawMode, const std::vector<GLint> &indices, int count) + { + glClearColor(0.0, 0.0, 0.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT); + + glGenBuffers(1, &mIndexBuffer); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLint) * indices.size(), indices.data(), + GL_STATIC_DRAW); + + std::vector<GLint> expectedIds = makeRange(count); + + glGenBuffers(1, &mExpectedIdBuffer); + glBindBuffer(GL_ARRAY_BUFFER, mExpectedIdBuffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(GLint) * expectedIds.size(), expectedIds.data(), + GL_STATIC_DRAW); + + glBindBuffer(GL_ARRAY_BUFFER, mPositionBuffer); + glVertexAttribPointer(mPositionLocation, 2, GL_FLOAT, GL_FALSE, 0, 0); + glEnableVertexAttribArray(mPositionLocation); + + glBindBuffer(GL_ARRAY_BUFFER, mExpectedIdBuffer); + glVertexAttribIPointer(mExpectedIdLocation, 1, GL_INT, 0, 0); + glEnableVertexAttribArray(mExpectedIdLocation); + + glUseProgram(mProgram); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer); + glDrawElements(drawMode, count, GL_UNSIGNED_INT, 0); + + std::vector<GLColor> pixels(getWindowWidth() * getWindowHeight()); + glReadPixels(0, 0, getWindowWidth(), getWindowHeight(), GL_RGBA, GL_UNSIGNED_BYTE, + pixels.data()); + + ASSERT_GL_NO_ERROR(); + + const GLColor green(0, 255, 0, 255); + const GLColor black(0, 0, 0, 255); + + for (const auto &pixel : pixels) + { + EXPECT_TRUE(pixel == green || pixel == black); + } + } + + std::vector<GLint> makeRange(int n) const + { + std::vector<GLint> result; + for (int i = 0; i < n; i++) + { + result.push_back(i); + } + + return result; + } + + GLuint mPositionBuffer = 0; + GLuint mExpectedIdBuffer = 0; + GLuint mIndexBuffer = 0; + + GLuint mProgram = 0; + GLint mPositionLocation = -1; + GLint mExpectedIdLocation = -1; +}; + +// Test gl_VertexID when rendering points +TEST_P(BuiltinVariableVertexIdTest, Points) +{ + runTest(GL_POINTS, makeRange(4), 4); +} + +// Test gl_VertexID when rendering line strips +TEST_P(BuiltinVariableVertexIdTest, LineStrip) +{ + runTest(GL_LINE_STRIP, makeRange(4), 4); +} + +// Test gl_VertexID when rendering line loops +TEST_P(BuiltinVariableVertexIdTest, LineLoop) +{ + runTest(GL_LINE_LOOP, makeRange(4), 4); +} + +// Test gl_VertexID when rendering lines +TEST_P(BuiltinVariableVertexIdTest, Lines) +{ + runTest(GL_LINES, makeRange(4), 4); +} + +// Test gl_VertexID when rendering triangle strips +TEST_P(BuiltinVariableVertexIdTest, TriangleStrip) +{ + runTest(GL_TRIANGLE_STRIP, makeRange(4), 4); +} + +// Test gl_VertexID when rendering triangle fans +TEST_P(BuiltinVariableVertexIdTest, TriangleFan) +{ + std::vector<GLint> indices; + indices.push_back(0); + indices.push_back(1); + indices.push_back(3); + indices.push_back(2); + runTest(GL_TRIANGLE_FAN, indices, 4); +} + +// Test gl_VertexID when rendering triangles +TEST_P(BuiltinVariableVertexIdTest, Triangles) +{ + std::vector<GLint> indices; + indices.push_back(0); + indices.push_back(1); + indices.push_back(2); + indices.push_back(1); + indices.push_back(2); + indices.push_back(3); + runTest(GL_TRIANGLES, indices, 6); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these +// tests should be run against. +ANGLE_INSTANTIATE_TEST(BuiltinVariableVertexIdTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); diff --git a/gfx/angle/src/tests/gl_tests/ClearTest.cpp b/gfx/angle/src/tests/gl_tests/ClearTest.cpp new file mode 100755 index 000000000..87ce041e6 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/ClearTest.cpp @@ -0,0 +1,481 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "test_utils/ANGLETest.h" + +#include "random_utils.h" +#include "Vector.h" + +using namespace angle; + +namespace +{ + +Vector4 RandomVec4(int seed, float minValue, float maxValue) +{ + RNG rng(seed); + srand(seed); + return Vector4( + rng.randomFloatBetween(minValue, maxValue), rng.randomFloatBetween(minValue, maxValue), + rng.randomFloatBetween(minValue, maxValue), rng.randomFloatBetween(minValue, maxValue)); +} + +GLColor Vec4ToColor(const Vector4 &vec) +{ + GLColor color; + color.R = static_cast<uint8_t>(vec.x * 255.0f); + color.G = static_cast<uint8_t>(vec.y * 255.0f); + color.B = static_cast<uint8_t>(vec.z * 255.0f); + color.A = static_cast<uint8_t>(vec.w * 255.0f); + return color; +}; + +class ClearTestBase : public ANGLETest +{ + protected: + ClearTestBase() : mProgram(0) + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + setConfigDepthBits(24); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + mFBOs.resize(2, 0); + glGenFramebuffers(2, mFBOs.data()); + + ASSERT_GL_NO_ERROR(); + } + + void TearDown() override + { + glDeleteProgram(mProgram); + + if (!mFBOs.empty()) + { + glDeleteFramebuffers(static_cast<GLsizei>(mFBOs.size()), mFBOs.data()); + } + + if (!mTextures.empty()) + { + glDeleteTextures(static_cast<GLsizei>(mTextures.size()), mTextures.data()); + } + + ANGLETest::TearDown(); + } + + void setupDefaultProgram() + { + const std::string vertexShaderSource = SHADER_SOURCE + ( + precision highp float; + attribute vec4 position; + + void main() + { + gl_Position = position; + } + ); + + const std::string fragmentShaderSource = SHADER_SOURCE + ( + precision highp float; + + void main() + { + gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); + } + ); + + mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource); + ASSERT_NE(0u, mProgram); + } + + GLuint mProgram; + std::vector<GLuint> mFBOs; + std::vector<GLuint> mTextures; +}; + +class ClearTest : public ClearTestBase {}; +class ClearTestES3 : public ClearTestBase {}; + +// Test clearing the default framebuffer +TEST_P(ClearTest, DefaultFramebuffer) +{ + glClearColor(0.25f, 0.5f, 0.5f, 0.5f); + glClear(GL_COLOR_BUFFER_BIT); + EXPECT_PIXEL_NEAR(0, 0, 64, 128, 128, 128, 1.0); +} + +// Test clearing a RGBA8 Framebuffer +TEST_P(ClearTest, RGBA8Framebuffer) +{ + glBindFramebuffer(GL_FRAMEBUFFER, mFBOs[0]); + + GLuint texture; + glGenTextures(1, &texture); + + glBindTexture(GL_TEXTURE_2D, texture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWindowWidth(), getWindowHeight(), 0, GL_RGBA, + GL_UNSIGNED_BYTE, nullptr); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); + + glClearColor(0.5f, 0.5f, 0.5f, 0.5f); + glClear(GL_COLOR_BUFFER_BIT); + + EXPECT_PIXEL_NEAR(0, 0, 128, 128, 128, 128, 1.0); +} + +TEST_P(ClearTest, ClearIssue) +{ + // TODO(geofflang): Figure out why this is broken on Intel OpenGL + if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + std::cout << "Test skipped on Intel OpenGL." << std::endl; + return; + } + + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LEQUAL); + + glClearColor(0.0, 1.0, 0.0, 1.0); + glClearDepthf(0.0); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + EXPECT_GL_NO_ERROR(); + + glBindFramebuffer(GL_FRAMEBUFFER, mFBOs[0]); + + GLuint rbo; + glGenRenderbuffers(1, &rbo); + glBindRenderbuffer(GL_RENDERBUFFER, rbo); + glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB565, 16, 16); + + EXPECT_GL_NO_ERROR(); + + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo); + + EXPECT_GL_NO_ERROR(); + + glClearColor(1.0f, 0.0f, 0.0f, 1.0f); + glClearDepthf(1.0f); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + EXPECT_GL_NO_ERROR(); + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + setupDefaultProgram(); + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_EQ(0, 0, 0, 255, 0, 255); +} + +// Requires ES3 +// This tests a bug where in a masked clear when calling "ClearBuffer", we would +// mistakenly clear every channel (including the masked-out ones) +TEST_P(ClearTestES3, MaskedClearBufferBug) +{ + unsigned char pixelData[] = { 255, 255, 255, 255 }; + + glBindFramebuffer(GL_FRAMEBUFFER, mFBOs[0]); + + GLuint textures[2]; + glGenTextures(2, &textures[0]); + + glBindTexture(GL_TEXTURE_2D, textures[0]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelData); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[0], 0); + + glBindTexture(GL_TEXTURE_2D, textures[1]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelData); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, textures[1], 0); + + ASSERT_GL_NO_ERROR(); + EXPECT_PIXEL_EQ(0, 0, 255, 255, 255, 255); + + float clearValue[] = { 0, 0.5f, 0.5f, 1.0f }; + GLenum drawBuffers[] = { GL_NONE, GL_COLOR_ATTACHMENT1 }; + glDrawBuffers(2, drawBuffers); + glColorMask(GL_TRUE, GL_TRUE, GL_FALSE, GL_TRUE); + glClearBufferfv(GL_COLOR, 1, clearValue); + + ASSERT_GL_NO_ERROR(); + EXPECT_PIXEL_EQ(0, 0, 255, 255, 255, 255); + + glReadBuffer(GL_COLOR_ATTACHMENT1); + ASSERT_GL_NO_ERROR(); + + EXPECT_PIXEL_NEAR(0, 0, 0, 127, 255, 255, 1); + + glDeleteTextures(2, textures); +} + +TEST_P(ClearTestES3, BadFBOSerialBug) +{ + // First make a simple framebuffer, and clear it to green + glBindFramebuffer(GL_FRAMEBUFFER, mFBOs[0]); + + GLuint textures[2]; + glGenTextures(2, &textures[0]); + + glBindTexture(GL_TEXTURE_2D, textures[0]); + glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, getWindowWidth(), getWindowHeight()); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[0], 0); + + GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT0 }; + glDrawBuffers(1, drawBuffers); + + float clearValues1[] = { 0.0f, 1.0f, 0.0f, 1.0f }; + glClearBufferfv(GL_COLOR, 0, clearValues1); + + ASSERT_GL_NO_ERROR(); + EXPECT_PIXEL_EQ(0, 0, 0, 255, 0, 255); + + // Next make a second framebuffer, and draw it to red + // (Triggers bad applied render target serial) + GLuint fbo2; + glGenFramebuffers(1, &fbo2); + ASSERT_GL_NO_ERROR(); + + glBindFramebuffer(GL_FRAMEBUFFER, fbo2); + + glBindTexture(GL_TEXTURE_2D, textures[1]); + glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, getWindowWidth(), getWindowHeight()); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[1], 0); + + glDrawBuffers(1, drawBuffers); + + setupDefaultProgram(); + drawQuad(mProgram, "position", 0.5f); + + ASSERT_GL_NO_ERROR(); + EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255); + + // Check that the first framebuffer is still green. + glBindFramebuffer(GL_FRAMEBUFFER, mFBOs[0]); + EXPECT_PIXEL_EQ(0, 0, 0, 255, 0, 255); + + glDeleteTextures(2, textures); + glDeleteFramebuffers(1, &fbo2); +} + +// Test that SRGB framebuffers clear to the linearized clear color +TEST_P(ClearTestES3, SRGBClear) +{ + // TODO(jmadill): figure out why this fails + if (IsIntel() && GetParam() == ES3_OPENGL()) + { + std::cout << "Test skipped on Intel due to failures." << std::endl; + return; + } + + // First make a simple framebuffer, and clear it + glBindFramebuffer(GL_FRAMEBUFFER, mFBOs[0]); + + GLuint texture; + glGenTextures(1, &texture); + + glBindTexture(GL_TEXTURE_2D, texture); + glTexStorage2D(GL_TEXTURE_2D, 1, GL_SRGB8_ALPHA8, getWindowWidth(), getWindowHeight()); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); + + glClearColor(0.5f, 0.5f, 0.5f, 0.5f); + glClear(GL_COLOR_BUFFER_BIT); + + EXPECT_PIXEL_NEAR(0, 0, 188, 188, 188, 128, 1.0); +} + +// Test that framebuffers with mixed SRGB/Linear attachments clear to the correct color for each +// attachment +TEST_P(ClearTestES3, MixedSRGBClear) +{ + // TODO(cwallez) figure out why it is broken on Intel on Mac +#if defined(ANGLE_PLATFORM_APPLE) + if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + std::cout << "Test skipped on Intel on Mac." << std::endl; + return; + } +#endif + + // TODO(jmadill): figure out why this fails + if (IsIntel() && GetParam() == ES3_OPENGL()) + { + std::cout << "Test skipped on Intel due to failures." << std::endl; + return; + } + + glBindFramebuffer(GL_FRAMEBUFFER, mFBOs[0]); + + GLuint textures[2]; + glGenTextures(2, &textures[0]); + + glBindTexture(GL_TEXTURE_2D, textures[0]); + glTexStorage2D(GL_TEXTURE_2D, 1, GL_SRGB8_ALPHA8, getWindowWidth(), getWindowHeight()); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[0], 0); + + glBindTexture(GL_TEXTURE_2D, textures[1]); + glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, getWindowWidth(), getWindowHeight()); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, textures[1], 0); + + GLenum drawBuffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1}; + glDrawBuffers(2, drawBuffers); + + // Clear both textures + glClearColor(0.5f, 0.5f, 0.5f, 0.5f); + glClear(GL_COLOR_BUFFER_BIT); + + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, 0, 0); + + // Check value of texture0 + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[0], 0); + EXPECT_PIXEL_NEAR(0, 0, 188, 188, 188, 128, 1.0); + + // Check value of texture1 + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[1], 0); + EXPECT_PIXEL_NEAR(0, 0, 128, 128, 128, 128, 1.0); +} + +// This test covers a D3D11 bug where calling ClearRenderTargetView sometimes wouldn't sync +// before a draw call. The test draws small quads to a larger FBO (the default back buffer). +// Before each blit to the back buffer it clears the quad to a certain color using +// ClearBufferfv to give a solid color. The sync problem goes away if we insert a call to +// flush or finish after ClearBufferfv or each draw. +TEST_P(ClearTestES3, RepeatedClear) +{ + if (IsD3D11() && (IsNVIDIA() || IsIntel())) + { + std::cout << "Test skipped on Nvidia and Intel D3D11." << std::endl; + return; + } + + const std::string &vertexSource = + "#version 300 es\n" + "in highp vec2 position;\n" + "out highp vec2 v_coord;\n" + "void main(void)\n" + "{\n" + " gl_Position = vec4(position, 0, 1);\n" + " vec2 texCoord = (position * 0.5) + 0.5;\n" + " v_coord = texCoord;\n" + "}\n"; + + const std::string &fragmentSource = + "#version 300 es\n" + "in highp vec2 v_coord;\n" + "out highp vec4 color;\n" + "uniform sampler2D tex;\n" + "void main()\n" + "{\n" + " color = texture(tex, v_coord);\n" + "}\n"; + + mProgram = CompileProgram(vertexSource, fragmentSource); + ASSERT_NE(0u, mProgram); + + mTextures.resize(1, 0); + glGenTextures(1, mTextures.data()); + + GLenum format = GL_RGBA8; + const int numRowsCols = 3; + const int cellSize = 32; + const int fboSize = cellSize; + const int backFBOSize = cellSize * numRowsCols; + const float fmtValueMin = 0.0f; + const float fmtValueMax = 1.0f; + + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexStorage2D(GL_TEXTURE_2D, 1, format, fboSize, fboSize); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + ASSERT_GL_NO_ERROR(); + + glBindFramebuffer(GL_FRAMEBUFFER, mFBOs[0]); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0); + ASSERT_GL_NO_ERROR(); + + ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + // larger fbo bound -- clear to transparent black + glUseProgram(mProgram); + GLint uniLoc = glGetUniformLocation(mProgram, "tex"); + ASSERT_NE(-1, uniLoc); + glUniform1i(uniLoc, 0); + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + + GLint positionLocation = glGetAttribLocation(mProgram, "position"); + ASSERT_NE(-1, positionLocation); + + glUseProgram(mProgram); + + for (int cellY = 0; cellY < numRowsCols; cellY++) + { + for (int cellX = 0; cellX < numRowsCols; cellX++) + { + int seed = cellX + cellY * numRowsCols; + const Vector4 color = RandomVec4(seed, fmtValueMin, fmtValueMax); + + glBindFramebuffer(GL_FRAMEBUFFER, mFBOs[0]); + glClearBufferfv(GL_COLOR, 0, color.data()); + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + // Method 1: Set viewport and draw full-viewport quad + glViewport(cellX * cellSize, cellY * cellSize, cellSize, cellSize); + drawQuad(mProgram, "position", 0.5f); + + // Uncommenting the glFinish call seems to make the test pass. + // glFinish(); + } + } + + std::vector<GLColor> pixelData(backFBOSize * backFBOSize); + glReadPixels(0, 0, backFBOSize, backFBOSize, GL_RGBA, GL_UNSIGNED_BYTE, pixelData.data()); + + for (int cellY = 0; cellY < numRowsCols; cellY++) + { + for (int cellX = 0; cellX < numRowsCols; cellX++) + { + int seed = cellX + cellY * numRowsCols; + const Vector4 color = RandomVec4(seed, fmtValueMin, fmtValueMax); + GLColor expectedColor = Vec4ToColor(color); + + int testN = cellX * cellSize + cellY * backFBOSize * cellSize + backFBOSize + 1; + GLColor actualColor = pixelData[testN]; + EXPECT_NEAR(expectedColor.R, actualColor.R, 1); + EXPECT_NEAR(expectedColor.G, actualColor.G, 1); + EXPECT_NEAR(expectedColor.B, actualColor.B, 1); + EXPECT_NEAR(expectedColor.A, actualColor.A, 1); + } + } + + ASSERT_GL_NO_ERROR(); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(ClearTest, + ES2_D3D9(), + ES2_D3D11(), + ES3_D3D11(), + ES2_OPENGL(), + ES3_OPENGL(), + ES2_OPENGLES(), + ES3_OPENGLES()); +ANGLE_INSTANTIATE_TEST(ClearTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); + +} // anonymous namespace diff --git a/gfx/angle/src/tests/gl_tests/ColorMaskTest.cpp b/gfx/angle/src/tests/gl_tests/ColorMaskTest.cpp new file mode 100755 index 000000000..d2ad638aa --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/ColorMaskTest.cpp @@ -0,0 +1,110 @@ +// +// Copyright 2016 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +// ColorMaskTest.cpp: Test GLES functionality related to color masks, particularly an AMD D3D9 +// driver bug. + +#include "test_utils/ANGLETest.h" + +namespace angle +{ +class ColorMaskTest : public ANGLETest +{ + protected: + ColorMaskTest() : mProgram(0) + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + setConfigDepthBits(24); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + const std::string vsSource = + "precision highp float;\n" + "attribute vec4 position;\n" + "\n" + "void main()\n" + "{\n" + " gl_Position = position;\n" + "}\n"; + + const std::string fsSource = + "precision highp float;\n" + "uniform vec4 color;\n" + "\n" + "void main()\n" + "{\n" + " gl_FragColor = color;\n" + "}\n"; + + mProgram = CompileProgram(vsSource, fsSource); + ASSERT_NE(0u, mProgram) << "shader compilation failed."; + + mColorUniform = glGetUniformLocation(mProgram, "color"); + } + + void TearDown() override + { + glDeleteProgram(mProgram); + + ANGLETest::TearDown(); + } + + GLuint mProgram = 0; + GLint mColorUniform = -1; +}; + +// Some ATI cards have a bug where a draw with a zero color write mask can cause later draws to have +// incorrect results. Test to make sure this bug is not exposed. +TEST_P(ColorMaskTest, AMDZeroColorMaskBug) +{ + int x = getWindowWidth() / 2; + int y = getWindowHeight() / 2; + + // Clear to blue + glClearColor(0.0f, 0.0f, 1.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + EXPECT_PIXEL_EQ(x, y, 0, 0, 255, 255); + + // Draw a quad with all colors masked and blending disabled, should remain blue + glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); + glDisable(GL_BLEND); + glUseProgram(mProgram); + glUniform4f(mColorUniform, 1.0f, 0.0f, 0.0f, 0.0f); + EXPECT_GL_NO_ERROR(); + drawQuad(mProgram, "position", 0.5f); + EXPECT_PIXEL_EQ(x, y, 0, 0, 255, 255); + + // Re-enable the color mask, should be red (with blend disabled, the red should overwrite + // everything) + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + glUseProgram(mProgram); + glUniform4f(mColorUniform, 1.0f, 0.0f, 0.0f, 0.0f); + EXPECT_GL_NO_ERROR(); + drawQuad(mProgram, "position", 0.5f); + EXPECT_PIXEL_EQ(x, y, 255, 0, 0, 0); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these +// tests should be run against. D3D11 Feature Level 9_3 uses different D3D formats for vertex +// attribs compared to Feature Levels 10_0+, so we should test them separately. +ANGLE_INSTANTIATE_TEST(ColorMaskTest, + ES2_D3D9(), + ES2_D3D11(), + ES2_D3D11_FL9_3(), + ES2_OPENGL(), + ES3_OPENGL(), + ES2_OPENGLES(), + ES3_OPENGLES()); + +} // namespace angle diff --git a/gfx/angle/src/tests/gl_tests/ComputeShaderTest.cpp b/gfx/angle/src/tests/gl_tests/ComputeShaderTest.cpp new file mode 100755 index 000000000..61b1146c2 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/ComputeShaderTest.cpp @@ -0,0 +1,226 @@ +// +// Copyright 2016 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// ComputeShaderTest: +// Compute shader specific tests. + +#include "test_utils/ANGLETest.h" +#include "test_utils/gl_raii.h" +#include <vector> + +using namespace angle; + +namespace +{ + +class ComputeShaderTest : public ANGLETest +{ + protected: + ComputeShaderTest() {} +}; + +class ComputeShaderTestES3 : public ANGLETest +{ + protected: + ComputeShaderTestES3() {} +}; + +// link a simple compute program. It should be successful. +TEST_P(ComputeShaderTest, LinkComputeProgram) +{ + if (IsIntel() && IsLinux()) + { + std::cout << "Test skipped on Intel Linux due to failures." << std::endl; + return; + } + + const std::string csSource = + "#version 310 es\n" + "layout(local_size_x=1) in;\n" + "void main()\n" + "{\n" + "}\n"; + + ANGLE_GL_COMPUTE_PROGRAM(program, csSource); + + EXPECT_GL_NO_ERROR(); +} + +// link a simple compute program. There is no local size and linking should fail. +TEST_P(ComputeShaderTest, LinkComputeProgramNoLocalSizeLinkError) +{ + const std::string csSource = + "#version 310 es\n" + "void main()\n" + "{\n" + "}\n"; + + GLuint program = CompileComputeProgram(csSource, false); + EXPECT_EQ(0u, program); + + glDeleteProgram(program); + + EXPECT_GL_NO_ERROR(); +} + +// link a simple compute program. +// make sure that uniforms and uniform samplers get recorded +TEST_P(ComputeShaderTest, LinkComputeProgramWithUniforms) +{ + if (IsIntel() && IsLinux()) + { + std::cout << "Test skipped on Intel Linux due to failures." << std::endl; + return; + } + const std::string csSource = + "#version 310 es\n" + "precision mediump sampler2D;\n" + "layout(local_size_x=1) in;\n" + "uniform int myUniformInt;\n" + "uniform sampler2D myUniformSampler;\n" + "void main()\n" + "{\n" + "int q = myUniformInt;\n" + "texture(myUniformSampler, vec2(0.0));\n" + "}\n"; + + ANGLE_GL_COMPUTE_PROGRAM(program, csSource); + + GLint uniformLoc = glGetUniformLocation(program.get(), "myUniformInt"); + EXPECT_NE(-1, uniformLoc); + + uniformLoc = glGetUniformLocation(program.get(), "myUniformSampler"); + EXPECT_NE(-1, uniformLoc); + + EXPECT_GL_NO_ERROR(); +} + +// Attach both compute and non-compute shaders. A link time error should occur. +// OpenGL ES 3.10, 7.3 Program Objects +TEST_P(ComputeShaderTest, AttachMultipleShaders) +{ + if (IsIntel() && IsLinux()) + { + std::cout << "Test skipped on Intel Linux due to failures." << std::endl; + return; + } + const std::string csSource = + "#version 310 es\n" + "layout(local_size_x=1) in;\n" + "void main()\n" + "{\n" + "}\n"; + + const std::string vsSource = + "#version 310 es\n" + "void main()\n" + "{\n" + "}\n"; + + const std::string fsSource = + "#version 310 es\n" + "void main()\n" + "{\n" + "}\n"; + + GLuint program = glCreateProgram(); + + GLuint vs = CompileShader(GL_VERTEX_SHADER, vsSource); + GLuint fs = CompileShader(GL_FRAGMENT_SHADER, fsSource); + GLuint cs = CompileShader(GL_COMPUTE_SHADER, csSource); + + EXPECT_NE(0u, vs); + EXPECT_NE(0u, fs); + EXPECT_NE(0u, cs); + + glAttachShader(program, vs); + glDeleteShader(vs); + + glAttachShader(program, fs); + glDeleteShader(fs); + + glAttachShader(program, cs); + glDeleteShader(cs); + + glLinkProgram(program); + + GLint linkStatus; + glGetProgramiv(program, GL_LINK_STATUS, &linkStatus); + + EXPECT_EQ(0, linkStatus); + + EXPECT_GL_NO_ERROR(); +} + +// Attach a vertex, fragment and compute shader. +// Query for the number of attached shaders and check the count. +TEST_P(ComputeShaderTest, AttachmentCount) +{ + if (IsIntel() && IsLinux()) + { + std::cout << "Test skipped on Intel Linux due to failures." << std::endl; + return; + } + const std::string csSource = + "#version 310 es\n" + "layout(local_size_x=1) in;\n" + "void main()\n" + "{\n" + "}\n"; + + const std::string vsSource = + "#version 310 es\n" + "void main()\n" + "{\n" + "}\n"; + + const std::string fsSource = + "#version 310 es\n" + "void main()\n" + "{\n" + "}\n"; + + GLuint program = glCreateProgram(); + + GLuint vs = CompileShader(GL_VERTEX_SHADER, vsSource); + GLuint fs = CompileShader(GL_FRAGMENT_SHADER, fsSource); + GLuint cs = CompileShader(GL_COMPUTE_SHADER, csSource); + + EXPECT_NE(0u, vs); + EXPECT_NE(0u, fs); + EXPECT_NE(0u, cs); + + glAttachShader(program, vs); + glDeleteShader(vs); + + glAttachShader(program, fs); + glDeleteShader(fs); + + glAttachShader(program, cs); + glDeleteShader(cs); + + GLint numAttachedShaders; + glGetProgramiv(program, GL_ATTACHED_SHADERS, &numAttachedShaders); + + EXPECT_EQ(3, numAttachedShaders); + + glDeleteProgram(program); + + EXPECT_GL_NO_ERROR(); +} + +// Check that it is not possible to create a compute shader when the context does not support ES +// 3.10 +TEST_P(ComputeShaderTestES3, NotSupported) +{ + GLuint computeShaderHandle = glCreateShader(GL_COMPUTE_SHADER); + EXPECT_EQ(0u, computeShaderHandle); + EXPECT_GL_ERROR(GL_INVALID_ENUM); +} + +ANGLE_INSTANTIATE_TEST(ComputeShaderTest, ES31_OPENGL(), ES31_OPENGLES()); +ANGLE_INSTANTIATE_TEST(ComputeShaderTestES3, ES3_OPENGL(), ES3_OPENGLES()); + +} // namespace diff --git a/gfx/angle/src/tests/gl_tests/CopyCompressedTextureTest.cpp b/gfx/angle/src/tests/gl_tests/CopyCompressedTextureTest.cpp new file mode 100644 index 000000000..4d4151949 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/CopyCompressedTextureTest.cpp @@ -0,0 +1,369 @@ +// +// Copyright 2016 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +// CopyCompressedTextureTest.cpp: Tests of the GL_CHROMIUM_copy_compressed_texture extension + +#include "test_utils/ANGLETest.h" + +namespace angle +{ + +class CopyCompressedTextureTest : public ANGLETest +{ + protected: + CopyCompressedTextureTest() + { + setWindowWidth(256); + setWindowHeight(256); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + glGenTextures(2, mTextures); + + mProgram = CompileProgram( + "attribute vec2 a_position;\n" + "varying vec2 v_texcoord;\n" + "void main()\n" + "{\n" + " gl_Position = vec4(a_position, 0.0, 1.0);\n" + " v_texcoord = (a_position + 1.0) * 0.5;\n" + "}\n", + "precision mediump float;\n" + "uniform sampler2D u_texture;\n" + "varying vec2 v_texcoord;\n" + "void main()\n" + "{\n" + " gl_FragColor = texture2D(u_texture, v_texcoord);\n" + "}\n"); + ASSERT_NE(0u, mProgram); + + if (extensionEnabled("GL_CHROMIUM_copy_compressed_texture")) + { + glCompressedCopyTextureCHROMIUM = + reinterpret_cast<PFNGLCOMPRESSEDCOPYTEXTURECHROMIUMPROC>( + eglGetProcAddress("glCompressedCopyTextureCHROMIUM")); + } + } + + void TearDown() override + { + glDeleteTextures(2, mTextures); + glDeleteProgram(mProgram); + + ANGLETest::TearDown(); + } + + bool checkExtensions() const + { + if (!extensionEnabled("GL_CHROMIUM_copy_compressed_texture")) + { + std::cout + << "Test skipped because GL_CHROMIUM_copy_compressed_texture is not available." + << std::endl; + return false; + } + + EXPECT_NE(nullptr, glCompressedCopyTextureCHROMIUM); + if (glCompressedCopyTextureCHROMIUM == nullptr) + { + return false; + } + + return true; + } + + GLuint mProgram = 0; + GLuint mTextures[2] = {0, 0}; + + PFNGLCOMPRESSEDCOPYTEXTURECHROMIUMPROC glCompressedCopyTextureCHROMIUM = nullptr; +}; + +namespace +{ + +const GLColor &CompressedImageColor = GLColor::red; + +// Single compressed ATC block of source pixels all set to: +// CompressedImageColor. +const uint8_t CompressedImageATC[8] = {0x0, 0x7c, 0x0, 0xf8, 0x55, 0x55, 0x55, 0x55}; + +// Single compressed ATCIA block of source pixels all set to: +// CompressedImageColor. +const uint8_t CompressedImageATCIA[16] = {0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7c, 0x0, 0xf8, 0x55, 0x55, 0x55, 0x55}; + +// Single compressed DXT1 block of source pixels all set to: +// CompressedImageColor. +const uint8_t CompressedImageDXT1[8] = {0x00, 0xf8, 0x00, 0xf8, 0xaa, 0xaa, 0xaa, 0xaa}; + +// Single compressed DXT5 block of source pixels all set to: +// CompressedImageColor. +const uint8_t CompressedImageDXT5[16] = {0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf8, 0x0, 0xf8, 0xaa, 0xaa, 0xaa, 0xaa}; + +// Single compressed DXT1 block of source pixels all set to: +// CompressedImageColor. +const uint8_t CompressedImageETC1[8] = {0x0, 0x0, 0xf8, 0x2, 0xff, 0xff, 0x0, 0x0}; + +} // anonymous namespace + +// Test to ensure that the basic functionality of the extension works. +TEST_P(CopyCompressedTextureTest, Basic) +{ + if (!checkExtensions()) + { + return; + } + + if (!extensionEnabled("GL_EXT_texture_compression_dxt1")) + { + std::cout << "Test skipped because GL_EXT_texture_compression_dxt1 is not available." + << std::endl; + return; + } + + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 4, 4, 0, + sizeof(CompressedImageDXT1), CompressedImageDXT1); + ASSERT_GL_NO_ERROR(); + + glBindTexture(GL_TEXTURE_2D, mTextures[1]); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glCompressedCopyTextureCHROMIUM(mTextures[0], mTextures[1]); + ASSERT_GL_NO_ERROR(); + + // Load texture. + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTextures[1]); + GLint textureLoc = glGetUniformLocation(mProgram, "u_texture"); + glUseProgram(mProgram); + glUniform1i(textureLoc, 0); + + // Draw. + drawQuad(mProgram, "a_position", 0.5f); + + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, CompressedImageColor); + ASSERT_GL_NO_ERROR(); +} + +// Test validation of compressed formats +TEST_P(CopyCompressedTextureTest, InternalFormat) +{ + if (!checkExtensions()) + { + return; + } + + struct Data + { + GLint format; + const uint8_t *data; + GLsizei dataSize; + + Data() : Data(GL_NONE, nullptr, 0) {} + Data(GLint format, const uint8_t *data, GLsizei dataSize) + : format(format), data(data), dataSize(dataSize) + { + } + }; + std::vector<Data> supportedFormats; + + if (extensionEnabled("GL_AMD_compressed_ATC_texture")) + { + supportedFormats.push_back( + Data(GL_ATC_RGB_AMD, CompressedImageATC, sizeof(CompressedImageATC))); + supportedFormats.push_back(Data(GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD, CompressedImageATCIA, + sizeof(CompressedImageATCIA))); + } + if (extensionEnabled("GL_EXT_texture_compression_dxt1")) + { + supportedFormats.push_back(Data(GL_COMPRESSED_RGB_S3TC_DXT1_EXT, CompressedImageDXT1, + sizeof(CompressedImageDXT1))); + } + if (extensionEnabled("GL_ANGLE_texture_compression_dxt5")) + { + supportedFormats.push_back(Data(GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, CompressedImageDXT5, + sizeof(CompressedImageDXT5))); + } + if (extensionEnabled("GL_OES_compressed_ETC1_RGB8_texture")) + { + supportedFormats.push_back( + Data(GL_ETC1_RGB8_OES, CompressedImageETC1, sizeof(CompressedImageETC1))); + } + + for (const auto &supportedFormat : supportedFormats) + { + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glCompressedTexImage2D(GL_TEXTURE_2D, 0, supportedFormat.format, 4, 4, 0, + supportedFormat.dataSize, supportedFormat.data); + ASSERT_GL_NO_ERROR(); + + glBindTexture(GL_TEXTURE_2D, mTextures[1]); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glCompressedCopyTextureCHROMIUM(mTextures[0], mTextures[1]); + ASSERT_GL_NO_ERROR(); + } +} + +// Test that uncompressed textures generate errors when copying +TEST_P(CopyCompressedTextureTest, InternalFormatNotSupported) +{ + if (!checkExtensions()) + { + return; + } + + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::red); + ASSERT_GL_NO_ERROR(); + + glBindTexture(GL_TEXTURE_2D, mTextures[1]); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + ASSERT_GL_NO_ERROR(); + + // Check that the GL_RGBA format reports an error. + glCompressedCopyTextureCHROMIUM(mTextures[0], mTextures[1]); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); +} + +// Test validation of texture IDs +TEST_P(CopyCompressedTextureTest, InvalidTextureIds) +{ + if (!checkExtensions()) + { + return; + } + + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 4, 4, 0, + sizeof(CompressedImageDXT1), CompressedImageDXT1); + ASSERT_GL_NO_ERROR(); + + glBindTexture(GL_TEXTURE_2D, mTextures[1]); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + ASSERT_GL_NO_ERROR(); + + glCompressedCopyTextureCHROMIUM(mTextures[0], 99993); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + glCompressedCopyTextureCHROMIUM(99994, mTextures[1]); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + glCompressedCopyTextureCHROMIUM(99995, 99996); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + glCompressedCopyTextureCHROMIUM(mTextures[0], mTextures[1]); + EXPECT_GL_NO_ERROR(); +} + +// Test that only 2D textures are valid +TEST_P(CopyCompressedTextureTest, BindingPoints) +{ + if (!checkExtensions()) + { + return; + } + + glBindTexture(GL_TEXTURE_CUBE_MAP, mTextures[0]); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z; + face++) + { + glCompressedTexImage2D(face, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 4, 4, 0, + sizeof(CompressedImageDXT1), CompressedImageDXT1); + } + ASSERT_GL_NO_ERROR(); + + glBindTexture(GL_TEXTURE_CUBE_MAP, mTextures[1]); + glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + ASSERT_GL_NO_ERROR(); + + glCompressedCopyTextureCHROMIUM(mTextures[0], mTextures[1]); + EXPECT_GL_ERROR(GL_INVALID_VALUE); +} + +// Test the destination texture cannot be immutable +TEST_P(CopyCompressedTextureTest, Immutable) +{ + if (!checkExtensions() || getClientMajorVersion() < 3) + { + return; + } + + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 4, 4, 0, + sizeof(CompressedImageDXT1), CompressedImageDXT1); + ASSERT_GL_NO_ERROR(); + + glBindTexture(GL_TEXTURE_2D, mTextures[1]); + glTexStorage2D(GL_TEXTURE_2D, 1, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 4, 4); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + ASSERT_GL_NO_ERROR(); + + glCompressedCopyTextureCHROMIUM(mTextures[0], mTextures[1]); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these +// tests should be run against. +ANGLE_INSTANTIATE_TEST(CopyCompressedTextureTest, + ES2_D3D9(), + ES2_D3D11(), + ES3_D3D11(), + ES2_OPENGL(), + ES3_OPENGL(), + ES2_OPENGLES(), + ES3_OPENGLES()); + +} // namespace angle diff --git a/gfx/angle/src/tests/gl_tests/CopyTexImageTest.cpp b/gfx/angle/src/tests/gl_tests/CopyTexImageTest.cpp new file mode 100755 index 000000000..b3b74261b --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/CopyTexImageTest.cpp @@ -0,0 +1,343 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "test_utils/ANGLETest.h" + +namespace angle +{ + +class CopyTexImageTest : public ANGLETest +{ + protected: + CopyTexImageTest() + { + setWindowWidth(16); + setWindowHeight(16); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + GLuint createFramebuffer(GLenum format, GLenum type, GLfloat color[4]) const + { + GLuint fbo; + glGenFramebuffers(1, &fbo); + glBindFramebuffer(GL_FRAMEBUFFER, fbo); + + GLuint texture = createTexture(format, type); + glBindTexture(GL_TEXTURE_2D, texture); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); + + glClearColor(color[0], color[1], color[2], color[3]); + glClear(GL_COLOR_BUFFER_BIT); + + return fbo; + } + + GLuint createTexture(GLenum format, GLenum type) const + { + GLuint tex; + glGenTextures(1, &tex); + glBindTexture(GL_TEXTURE_2D, tex); + glTexImage2D(GL_TEXTURE_2D, 0, format, 16, 16, 0, format, type, nullptr); + + // Disable mipmapping + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + return tex; + } + + GLuint createTextureFromCopyTexImage(GLuint fbo, GLenum format) const + { + GLuint tex; + glGenTextures(1, &tex); + glBindTexture(GL_TEXTURE_2D, tex); + + glBindFramebuffer(GL_FRAMEBUFFER, fbo); + glCopyTexImage2D(GL_TEXTURE_2D, 0, format, 0, 0, 16, 16, 0); + + // Disable mipmapping + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + return tex; + } + + void copyTextureWithCopyTexSubImage(GLuint fbo, + GLuint texture, + GLint xoffset, + GLint yoffset, + GLint x, + GLint y, + GLsizei w, + GLsizei h) const + { + glBindTexture(GL_TEXTURE_2D, texture); + glBindFramebuffer(GL_FRAMEBUFFER, fbo); + glCopyTexSubImage2D(GL_TEXTURE_2D, 0, xoffset, yoffset, x, y, w, h); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + const std::string vsSource = + "precision highp float;\n" + "attribute vec4 position;\n" + "varying vec2 texcoord;\n" + "\n" + "void main()\n" + "{\n" + " gl_Position = position;\n" + " texcoord = (position.xy * 0.5) + 0.5;\n" + " texcoord.y = 1.0 - texcoord.y;\n" + "}\n"; + + const std::string textureFSSource = + "precision highp float;\n" + "uniform sampler2D tex;\n" + "varying vec2 texcoord;\n" + "\n" + "void main()\n" + "{\n" + " gl_FragColor = texture2D(tex, texcoord);\n" + "}\n"; + + mTextureProgram = CompileProgram(vsSource, textureFSSource); + if (mTextureProgram == 0) + { + FAIL() << "shader compilation failed."; + } + + mTextureUniformLocation = glGetUniformLocation(mTextureProgram, "tex"); + + ASSERT_GL_NO_ERROR(); + } + + void TearDown() override + { + glDeleteProgram(mTextureProgram); + + ANGLETest::TearDown(); + } + + void verifyResults(GLuint texture, GLubyte data[4], GLint x, GLint y) + { + glViewport(0, 0, 16, 16); + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + // Draw a quad with the target texture + glUseProgram(mTextureProgram); + glBindTexture(GL_TEXTURE_2D, texture); + glUniform1i(mTextureUniformLocation, 0); + + drawQuad(mTextureProgram, "position", 0.5f); + + // Expect that the rendered quad has the same color as the source texture + EXPECT_PIXEL_NEAR(x, y, data[0], data[1], data[2], data[3], 1.0); + } + + GLuint mTextureProgram; + GLint mTextureUniformLocation; +}; + +TEST_P(CopyTexImageTest, RGBAToL) +{ + GLfloat color[] = { + 0.25f, 1.0f, 0.75f, 0.5f, + }; + + GLuint fbo = createFramebuffer(GL_RGBA, GL_UNSIGNED_BYTE, color); + GLuint tex = createTextureFromCopyTexImage(fbo, GL_LUMINANCE); + + GLubyte expected[] = { + 64, 64, 64, 255, + }; + verifyResults(tex, expected, 0, 0); +} + +TEST_P(CopyTexImageTest, RGBToL) +{ + // TODO (geofflang): Figure out why CopyTex[Sub]Image doesn't work with + // RGB->L on older Intel chips + if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + std::cout << "Test skipped on Intel OpenGL." << std::endl; + return; + } + + GLfloat color[] = { + 0.25f, 1.0f, 0.75f, 0.5f, + }; + + GLuint fbo = createFramebuffer(GL_RGB, GL_UNSIGNED_BYTE, color); + GLuint tex = createTextureFromCopyTexImage(fbo, GL_LUMINANCE); + + GLubyte expected[] = { + 64, 64, 64, 255, + }; + verifyResults(tex, expected, 0, 0); +} + +TEST_P(CopyTexImageTest, RGBAToLA) +{ + GLfloat color[] = { + 0.25f, 1.0f, 0.75f, 0.5f, + }; + + GLuint fbo = createFramebuffer(GL_RGBA, GL_UNSIGNED_BYTE, color); + GLuint tex = createTextureFromCopyTexImage(fbo, GL_LUMINANCE_ALPHA); + + GLubyte expected[] = { + 64, 64, 64, 127, + }; + verifyResults(tex, expected, 0, 0); +} + +TEST_P(CopyTexImageTest, RGBAToA) +{ + GLfloat color[] = { + 0.25f, 1.0f, 0.75f, 0.5f, + }; + + GLuint fbo = createFramebuffer(GL_RGBA, GL_UNSIGNED_BYTE, color); + GLuint tex = createTextureFromCopyTexImage(fbo, GL_ALPHA); + + GLubyte expected[] = { + 0, 0, 0, 127, + }; + verifyResults(tex, expected, 0, 0); +} + +TEST_P(CopyTexImageTest, SubImageRGBAToL) +{ + GLfloat color0[] = { + 0.25f, 1.0f, 0.75f, 0.5f, + }; + GLuint fbo0 = createFramebuffer(GL_RGBA, GL_UNSIGNED_BYTE, color0); + GLuint tex = createTextureFromCopyTexImage(fbo0, GL_LUMINANCE); + + GLfloat color1[] = { + 0.5f, 0.25f, 1.0f, 0.75f, + }; + GLuint fbo1 = createFramebuffer(GL_RGBA, GL_UNSIGNED_BYTE, color1); + copyTextureWithCopyTexSubImage(fbo1, tex, 2, 4, 5, 6, 8, 8); + + GLubyte expected0[] = { + 64, 64, 64, 255, + }; + verifyResults(tex, expected0, 0, 0); + + GLubyte expected1[] = { + 127, 127, 127, 255, + }; + verifyResults(tex, expected1, 7, 7); +} + +TEST_P(CopyTexImageTest, SubImageRGBAToLA) +{ + GLfloat color0[] = { + 0.25f, 1.0f, 0.75f, 0.5f, + }; + GLuint fbo0 = createFramebuffer(GL_RGBA, GL_UNSIGNED_BYTE, color0); + GLuint tex = createTextureFromCopyTexImage(fbo0, GL_LUMINANCE_ALPHA); + + GLfloat color1[] = { + 0.5f, 0.25f, 1.0f, 0.75f, + }; + GLuint fbo1 = createFramebuffer(GL_RGBA, GL_UNSIGNED_BYTE, color1); + copyTextureWithCopyTexSubImage(fbo1, tex, 2, 4, 5, 6, 8, 8); + + GLubyte expected0[] = { + 64, 64, 64, 127, + }; + verifyResults(tex, expected0, 0, 0); + + GLubyte expected1[] = { + 127, 127, 127, 192, + }; + verifyResults(tex, expected1, 7, 7); +} + +TEST_P(CopyTexImageTest, SubImageRGBToL) +{ + // TODO (geofflang): Figure out why CopyTex[Sub]Image doesn't work with + // RGB->L on older Intel chips + if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + std::cout << "Test skipped on Intel OpenGL." << std::endl; + return; + } + + GLfloat color0[] = { + 0.25f, 1.0f, 0.75f, 0.5f, + }; + GLuint fbo0 = createFramebuffer(GL_RGB, GL_UNSIGNED_BYTE, color0); + GLuint tex = createTextureFromCopyTexImage(fbo0, GL_LUMINANCE); + + GLfloat color1[] = { + 0.5f, 0.25f, 1.0f, 0.75f, + }; + GLuint fbo1 = createFramebuffer(GL_RGB, GL_UNSIGNED_BYTE, color1); + copyTextureWithCopyTexSubImage(fbo1, tex, 2, 4, 5, 6, 8, 8); + + GLubyte expected0[] = { + 64, 64, 64, 255, + }; + verifyResults(tex, expected0, 0, 0); + + GLubyte expected1[] = { + 127, 127, 127, 255, + }; + verifyResults(tex, expected1, 7, 7); +} + +// specialization of CopyTexImageTest is added so that some tests can be explicitly run with an ES3 +// context +class CopyTexImageTestES3 : public CopyTexImageTest +{ +}; + +// The test verifies that glCopyTexSubImage2D generates a GL_INVALID_OPERATION error +// when the read buffer is GL_NONE. +// Reference: GLES 3.0.4, Section 3.8.5 Alternate Texture Image Specification Commands +TEST_P(CopyTexImageTestES3, ReadBufferIsNone) +{ + GLfloat color[] = { + 0.25f, 1.0f, 0.75f, 0.5f, + }; + + GLuint fbo = createFramebuffer(GL_RGBA, GL_UNSIGNED_BYTE, color); + GLuint tex = createTextureFromCopyTexImage(fbo, GL_RGBA); + + glBindFramebuffer(GL_FRAMEBUFFER, fbo); + glBindTexture(GL_TEXTURE_2D, tex); + + glReadBuffer(GL_NONE); + + EXPECT_GL_NO_ERROR(); + glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 4, 4); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + glDeleteFramebuffers(1, &fbo); + glDeleteTextures(1, &tex); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these +// tests should be run against. +ANGLE_INSTANTIATE_TEST(CopyTexImageTest, + ES2_D3D9(), + ES2_D3D11(EGL_EXPERIMENTAL_PRESENT_PATH_COPY_ANGLE), + ES2_D3D11(EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE), + ES2_OPENGL(), + ES2_OPENGL(3, 3), + ES2_OPENGLES()); + +ANGLE_INSTANTIATE_TEST(CopyTexImageTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); +} diff --git a/gfx/angle/src/tests/gl_tests/CopyTextureTest.cpp b/gfx/angle/src/tests/gl_tests/CopyTextureTest.cpp new file mode 100755 index 000000000..553861e7d --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/CopyTextureTest.cpp @@ -0,0 +1,566 @@ +// +// Copyright 2016 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +// CopyTextureTest.cpp: Tests of the GL_CHROMIUM_copy_texture extension + +#include "test_utils/ANGLETest.h" + +namespace angle +{ + +class CopyTextureTest : public ANGLETest +{ + protected: + CopyTextureTest() + { + setWindowWidth(256); + setWindowHeight(256); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + glGenTextures(2, mTextures); + glBindTexture(GL_TEXTURE_2D, mTextures[1]); + + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + + glGenFramebuffers(1, &mFramebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[1], + 0); + + if (extensionEnabled("GL_CHROMIUM_copy_texture")) + { + glCopyTextureCHROMIUM = reinterpret_cast<PFNGLCOPYTEXTURECHROMIUMPROC>( + eglGetProcAddress("glCopyTextureCHROMIUM")); + glCopySubTextureCHROMIUM = reinterpret_cast<PFNGLCOPYSUBTEXTURECHROMIUMPROC>( + eglGetProcAddress("glCopySubTextureCHROMIUM")); + } + } + + void TearDown() override + { + glDeleteTextures(2, mTextures); + glDeleteFramebuffers(1, &mFramebuffer); + + ANGLETest::TearDown(); + } + + bool checkExtensions() const + { + if (!extensionEnabled("GL_CHROMIUM_copy_texture")) + { + std::cout << "Test skipped because GL_CHROMIUM_copy_texture is not available." + << std::endl; + return false; + } + + EXPECT_NE(nullptr, glCopyTextureCHROMIUM); + EXPECT_NE(nullptr, glCopySubTextureCHROMIUM); + return true; + } + + GLuint mTextures[2] = { + 0, 0, + }; + GLuint mFramebuffer = 0; + + PFNGLCOPYTEXTURECHROMIUMPROC glCopyTextureCHROMIUM = nullptr; + PFNGLCOPYSUBTEXTURECHROMIUMPROC glCopySubTextureCHROMIUM = nullptr; +}; + +// Test to ensure that the basic functionality of the extension works. +TEST_P(CopyTextureTest, BasicCopyTexture) +{ + if (!checkExtensions()) + { + return; + } + + GLColor pixels = GLColor::red; + + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &pixels); + + glCopyTextureCHROMIUM(mTextures[0], mTextures[1], GL_RGBA, GL_UNSIGNED_BYTE, false, false, + false); + + EXPECT_GL_NO_ERROR(); + + EXPECT_PIXEL_COLOR_EQ(0, 0, pixels); +} + +// Test to ensure that the basic functionality of the extension works. +TEST_P(CopyTextureTest, BasicCopySubTexture) +{ + if (!checkExtensions()) + { + return; + } + + GLColor pixels = GLColor::red; + + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &pixels); + + glBindTexture(GL_TEXTURE_2D, mTextures[1]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + + glCopySubTextureCHROMIUM(mTextures[0], mTextures[1], 0, 0, 0, 0, 1, 1, false, false, false); + + EXPECT_GL_NO_ERROR(); + + // Check that FB is complete. + EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + EXPECT_PIXEL_COLOR_EQ(0, 0, pixels); + + EXPECT_GL_NO_ERROR(); +} + +// Test that CopyTexture cannot redefine an immutable texture and CopySubTexture can copy data to +// immutable textures +TEST_P(CopyTextureTest, ImmutableTexture) +{ + if (!checkExtensions()) + { + return; + } + + if (getClientMajorVersion() < 3 && + (!extensionEnabled("GL_EXT_texture_storage") || !extensionEnabled("GL_OES_rgb8_rgba8"))) + { + std::cout + << "Test skipped due to missing ES3 or GL_EXT_texture_storage or GL_OES_rgb8_rgba8" + << std::endl; + return; + } + + GLColor pixels = GLColor::red; + + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, 1, 1); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &pixels); + + glBindTexture(GL_TEXTURE_2D, mTextures[1]); + glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, 1, 1); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[1], 0); + EXPECT_GL_NO_ERROR(); + + // Should generate an error when the texture is redefined + glCopyTextureCHROMIUM(mTextures[0], mTextures[1], GL_RGBA, GL_UNSIGNED_BYTE, false, false, + false); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + // Should succeed when using CopySubTexture + glCopySubTextureCHROMIUM(mTextures[0], mTextures[1], 0, 0, 0, 0, 1, 1, false, false, false); + EXPECT_GL_NO_ERROR(); + + // Check that FB is complete. + EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + EXPECT_PIXEL_COLOR_EQ(0, 0, pixels); + + EXPECT_GL_NO_ERROR(); +} + +// Test validation of internal formats in CopyTexture and CopySubTexture +TEST_P(CopyTextureTest, InternalFormat) +{ + if (!checkExtensions()) + { + return; + } + + std::vector<GLint> sourceFormats; + sourceFormats.push_back(GL_ALPHA); + sourceFormats.push_back(GL_RGB); + sourceFormats.push_back(GL_RGBA); + sourceFormats.push_back(GL_LUMINANCE); + sourceFormats.push_back(GL_LUMINANCE_ALPHA); + + std::vector<GLint> destFormats; + destFormats.push_back(GL_RGB); + destFormats.push_back(GL_RGBA); + + if (extensionEnabled("GL_EXT_texture_format_BGRA8888")) + { + sourceFormats.push_back(GL_BGRA_EXT); + destFormats.push_back(GL_BGRA_EXT); + } + + // Test with glCopyTexture + for (GLint sourceFormat : sourceFormats) + { + for (GLint destFormat : destFormats) + { + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexImage2D(GL_TEXTURE_2D, 0, sourceFormat, 1, 1, 0, sourceFormat, GL_UNSIGNED_BYTE, + nullptr); + EXPECT_GL_NO_ERROR(); + + glCopyTextureCHROMIUM(mTextures[0], mTextures[1], destFormat, GL_UNSIGNED_BYTE, false, + false, false); + + EXPECT_GL_NO_ERROR(); + } + } + + // Test with glCopySubTexture + for (GLint sourceFormat : sourceFormats) + { + for (GLint destFormat : destFormats) + { + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexImage2D(GL_TEXTURE_2D, 0, sourceFormat, 1, 1, 0, sourceFormat, GL_UNSIGNED_BYTE, + nullptr); + EXPECT_GL_NO_ERROR(); + + glBindTexture(GL_TEXTURE_2D, mTextures[1]); + glTexImage2D(GL_TEXTURE_2D, 0, destFormat, 1, 1, 0, destFormat, GL_UNSIGNED_BYTE, + nullptr); + EXPECT_GL_NO_ERROR(); + + glCopySubTextureCHROMIUM(mTextures[0], mTextures[1], 0, 0, 0, 0, 1, 1, false, false, + false); + + EXPECT_GL_NO_ERROR(); + } + } +} + +// Check that invalid internal formats return errors. +TEST_P(CopyTextureTest, InternalFormatNotSupported) +{ + if (!checkExtensions()) + { + return; + } + + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + EXPECT_GL_NO_ERROR(); + + std::vector<GLint> unsupportedDestFormats; + unsupportedDestFormats.push_back(GL_ALPHA); + unsupportedDestFormats.push_back(GL_LUMINANCE); + unsupportedDestFormats.push_back(GL_LUMINANCE_ALPHA); + + if (!extensionEnabled("GL_EXT_texture_format_BGRA8888")) + { + unsupportedDestFormats.push_back(GL_BGRA_EXT); + } + + // Check unsupported format reports an error. + for (GLint unsupportedDestFormat : unsupportedDestFormats) + { + glCopyTextureCHROMIUM(mTextures[0], mTextures[1], unsupportedDestFormat, GL_UNSIGNED_BYTE, + false, false, false); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + } + + for (GLint unsupportedDestFormat : unsupportedDestFormats) + { + glBindTexture(GL_TEXTURE_2D, mTextures[1]); + glTexImage2D(GL_TEXTURE_2D, 0, unsupportedDestFormat, 1, 1, 0, unsupportedDestFormat, + GL_UNSIGNED_BYTE, nullptr); + glCopySubTextureCHROMIUM(mTextures[0], mTextures[1], 0, 0, 0, 0, 1, 1, false, false, false); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + } +} + +// Test to ensure that the destination texture is redefined if the properties are different. +TEST_P(CopyTextureTest, RedefineDestinationTexture) +{ + if (!checkExtensions()) + { + return; + } + + GLColor pixels[4] = {GLColor::red, GLColor::red, GLColor::red, GLColor::red}; + + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); + + glBindTexture(GL_TEXTURE_2D, mTextures[1]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, 1, 1, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixels); + EXPECT_GL_NO_ERROR(); + + // GL_INVALID_OPERATION due to "intrinsic format" != "internal format". + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + // GL_INVALID_VALUE due to bad dimensions. + glTexSubImage2D(GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixels); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + // If the dest texture has different properties, glCopyTextureCHROMIUM() + // redefines them. + glCopyTextureCHROMIUM(mTextures[0], mTextures[1], GL_RGBA, GL_UNSIGNED_BYTE, false, false, + false); + EXPECT_GL_NO_ERROR(); + + // glTexSubImage2D() succeeds because mTextures[1] is redefined into 2x2 + // dimension and GL_RGBA format. + glBindTexture(GL_TEXTURE_2D, mTextures[1]); + glTexSubImage2D(GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels); + EXPECT_GL_NO_ERROR(); + + // Check that FB is complete. + EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + EXPECT_PIXEL_COLOR_EQ(1, 1, pixels[3]); + EXPECT_GL_NO_ERROR(); +} + +// Test that invalid dimensions in CopySubTexture are validated +TEST_P(CopyTextureTest, CopySubTextureDimension) +{ + if (!checkExtensions()) + { + return; + } + + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + + glBindTexture(GL_TEXTURE_2D, mTextures[1]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + + glCopySubTextureCHROMIUM(mTextures[0], mTextures[1], 1, 1, 0, 0, 1, 1, false, false, false); + EXPECT_GL_NO_ERROR(); + + // xoffset < 0 + glCopySubTextureCHROMIUM(mTextures[0], mTextures[1], -1, 1, 0, 0, 1, 1, false, false, false); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + // x < 0 + glCopySubTextureCHROMIUM(mTextures[0], mTextures[1], 1, 1, -1, 0, 1, 1, false, false, false); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + // xoffset + width > dest_width + glCopySubTextureCHROMIUM(mTextures[0], mTextures[1], 2, 2, 0, 0, 2, 2, false, false, false); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + // x + width > source_width + glCopySubTextureCHROMIUM(mTextures[0], mTextures[1], 0, 0, 1, 1, 2, 2, false, false, false); + EXPECT_GL_ERROR(GL_INVALID_VALUE); +} + +// Test that invalid IDs in CopyTexture are validated +TEST_P(CopyTextureTest, CopyTextureInvalidTextureIds) +{ + if (!checkExtensions()) + { + return; + } + + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + + glBindTexture(GL_TEXTURE_2D, mTextures[1]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + + glCopyTextureCHROMIUM(mTextures[0], 99993, GL_RGBA, GL_UNSIGNED_BYTE, false, false, false); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + glCopyTextureCHROMIUM(99994, mTextures[1], GL_RGBA, GL_UNSIGNED_BYTE, false, false, false); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + glCopyTextureCHROMIUM(99995, 99996, GL_RGBA, GL_UNSIGNED_BYTE, false, false, false); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + glCopyTextureCHROMIUM(mTextures[0], mTextures[1], GL_RGBA, GL_UNSIGNED_BYTE, false, false, + false); + EXPECT_GL_NO_ERROR(); +} + +// Test that invalid IDs in CopySubTexture are validated +TEST_P(CopyTextureTest, CopySubTextureInvalidTextureIds) +{ + if (!checkExtensions()) + { + return; + } + + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + + glBindTexture(GL_TEXTURE_2D, mTextures[1]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + + glCopySubTextureCHROMIUM(mTextures[0], 99993, 1, 1, 0, 0, 1, 1, false, false, false); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + glCopySubTextureCHROMIUM(99994, mTextures[1], 1, 1, 0, 0, 1, 1, false, false, false); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + glCopySubTextureCHROMIUM(99995, 99996, 1, 1, 0, 0, 1, 1, false, false, false); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + glCopySubTextureCHROMIUM(mTextures[0], mTextures[1], 1, 1, 0, 0, 1, 1, false, false, false); + EXPECT_GL_NO_ERROR(); +} + +// Test that using an offset in CopySubTexture works correctly +TEST_P(CopyTextureTest, CopySubTextureOffset) +{ + if (!checkExtensions()) + { + return; + } + + GLColor rgbaPixels[4 * 4] = {GLColor::red, GLColor::green, GLColor::blue, GLColor::black}; + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels); + + GLColor transparentPixels[4 * 4] = {GLColor::transparentBlack, GLColor::transparentBlack, + GLColor::transparentBlack, GLColor::transparentBlack}; + glBindTexture(GL_TEXTURE_2D, mTextures[1]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, transparentPixels); + + glCopySubTextureCHROMIUM(mTextures[0], mTextures[1], 1, 1, 0, 0, 1, 1, false, false, false); + EXPECT_GL_NO_ERROR(); + glCopySubTextureCHROMIUM(mTextures[0], mTextures[1], 1, 0, 1, 0, 1, 1, false, false, false); + EXPECT_GL_NO_ERROR(); + glCopySubTextureCHROMIUM(mTextures[0], mTextures[1], 0, 1, 0, 1, 1, 1, false, false, false); + EXPECT_GL_NO_ERROR(); + + // Check that FB is complete. + EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::transparentBlack); + EXPECT_PIXEL_COLOR_EQ(1, 1, GLColor::red); + EXPECT_PIXEL_COLOR_EQ(1, 0, GLColor::green); + EXPECT_PIXEL_COLOR_EQ(0, 1, GLColor::blue); + EXPECT_GL_NO_ERROR(); +} + +// Test that flipping the Y component works correctly +TEST_P(CopyTextureTest, FlipY) +{ + if (!checkExtensions()) + { + return; + } + + GLColor rgbaPixels[4] = {GLColor(255u, 255u, 255u, 255u), GLColor(127u, 127u, 127u, 127u), + GLColor(63u, 63u, 63u, 127u), GLColor(255u, 255u, 255u, 0u)}; + + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels); + + glCopyTextureCHROMIUM(mTextures[0], mTextures[1], GL_RGBA, GL_UNSIGNED_BYTE, GL_TRUE, GL_FALSE, + GL_FALSE); + EXPECT_GL_NO_ERROR(); + + // Check that FB is complete. + EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + EXPECT_PIXEL_COLOR_EQ(0, 0, rgbaPixels[2]); + EXPECT_PIXEL_COLOR_EQ(1, 0, rgbaPixels[3]); + EXPECT_PIXEL_COLOR_EQ(0, 1, rgbaPixels[0]); + EXPECT_PIXEL_COLOR_EQ(1, 1, rgbaPixels[1]); + EXPECT_GL_NO_ERROR(); +} + +// Test that premultipying the alpha on copy works correctly +TEST_P(CopyTextureTest, PremultiplyAlpha) +{ + if (!checkExtensions()) + { + return; + } + + GLColor rgbaPixels[4] = {GLColor(255u, 255u, 255u, 255u), GLColor(255u, 255u, 255u, 127u), + GLColor(127u, 127u, 127u, 127u), GLColor(255u, 255u, 255u, 0u)}; + + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels); + + glCopyTextureCHROMIUM(mTextures[0], mTextures[1], GL_RGBA, GL_UNSIGNED_BYTE, GL_FALSE, GL_TRUE, + GL_FALSE); + EXPECT_GL_NO_ERROR(); + + // Check that FB is complete. + EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(255, 255, 255, 255), 1.0); + EXPECT_PIXEL_COLOR_NEAR(1, 0, GLColor(127, 127, 127, 127), 1.0); + EXPECT_PIXEL_COLOR_NEAR(0, 1, GLColor(63, 63, 63, 127), 1.0); + EXPECT_PIXEL_COLOR_NEAR(1, 1, GLColor(0, 0, 0, 0), 1.0); + EXPECT_GL_NO_ERROR(); +} + +// Test that unmultipying the alpha on copy works correctly +TEST_P(CopyTextureTest, UnmultiplyAlpha) +{ + if (!checkExtensions()) + { + return; + } + + GLColor rgbaPixels[4] = {GLColor(255u, 255u, 255u, 255u), GLColor(127u, 127u, 127u, 127u), + GLColor(63u, 63u, 63u, 127u), GLColor(255u, 255u, 255u, 0u)}; + + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels); + + glCopyTextureCHROMIUM(mTextures[0], mTextures[1], GL_RGBA, GL_UNSIGNED_BYTE, GL_FALSE, GL_FALSE, + GL_TRUE); + EXPECT_GL_NO_ERROR(); + + // Check that FB is complete. + EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(255, 255, 255, 255), 1.0); + EXPECT_PIXEL_COLOR_NEAR(1, 0, GLColor(255, 255, 255, 127), 1.0); + EXPECT_PIXEL_COLOR_NEAR(0, 1, GLColor(127, 127, 127, 127), 1.0); + EXPECT_PIXEL_COLOR_NEAR(1, 1, GLColor(255, 255, 255, 0), 1.0); + EXPECT_GL_NO_ERROR(); +} + +// Test that unmultipying and premultiplying the alpha is the same as doing neither +TEST_P(CopyTextureTest, UnmultiplyAndPremultplyAlpha) +{ + if (!checkExtensions()) + { + return; + } + + GLColor rgbaPixels[4] = {GLColor(255u, 255u, 255u, 255u), GLColor(127u, 127u, 127u, 127u), + GLColor(63u, 63u, 63u, 127u), GLColor(255u, 255u, 255u, 0u)}; + + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels); + + glCopyTextureCHROMIUM(mTextures[0], mTextures[1], GL_RGBA, GL_UNSIGNED_BYTE, GL_FALSE, GL_TRUE, + GL_TRUE); + EXPECT_GL_NO_ERROR(); + + // Check that FB is complete. + EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(255, 255, 255, 255), 1.0); + EXPECT_PIXEL_COLOR_NEAR(1, 0, GLColor(127, 127, 127, 127), 1.0); + EXPECT_PIXEL_COLOR_NEAR(0, 1, GLColor(63, 63, 63, 127), 1.0); + EXPECT_PIXEL_COLOR_NEAR(1, 1, GLColor(255, 255, 255, 0), 1.0); + EXPECT_GL_NO_ERROR(); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these +// tests should be run against. +ANGLE_INSTANTIATE_TEST(CopyTextureTest, ES2_D3D9(), ES2_D3D11(), ES2_OPENGL(), ES2_OPENGLES()); + +} // namespace angle diff --git a/gfx/angle/src/tests/gl_tests/CubeMapTextureTest.cpp b/gfx/angle/src/tests/gl_tests/CubeMapTextureTest.cpp new file mode 100755 index 000000000..10fce15b0 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/CubeMapTextureTest.cpp @@ -0,0 +1,138 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "test_utils/ANGLETest.h" + +using namespace angle; + +class CubeMapTextureTest : public ANGLETest +{ + protected: + CubeMapTextureTest() + { + setWindowWidth(256); + setWindowHeight(256); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + virtual void SetUp() + { + ANGLETest::SetUp(); + + const std::string vsSource = SHADER_SOURCE + ( + attribute highp vec4 position; + void main(void) + { + gl_Position = position; + } + ); + + const std::string fsSource = SHADER_SOURCE + ( + uniform highp vec4 color; + void main(void) + { + gl_FragColor = color; + } + ); + + mProgram = CompileProgram(vsSource, fsSource); + if (mProgram == 0) + { + FAIL() << "shader compilation failed."; + } + + mColorLocation = glGetUniformLocation(mProgram, "color"); + + glUseProgram(mProgram); + + glClearColor(0, 0, 0, 0); + glClearDepthf(0.0); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glEnable(GL_BLEND); + glDisable(GL_DEPTH_TEST); + + ASSERT_GL_NO_ERROR(); + } + + virtual void TearDown() + { + glDeleteProgram(mProgram); + + ANGLETest::TearDown(); + } + + GLuint mProgram; + GLint mColorLocation; +}; + +// Verify that rendering to the faces of a cube map consecutively will correctly render to each face. +TEST_P(CubeMapTextureTest, RenderToFacesConsecutively) +{ + const GLfloat faceColors[] = + { + 1.0f, 0.0f, 0.0f, 1.0f, + 0.0f, 1.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 1.0f, 1.0f, + 1.0f, 1.0f, 0.0f, 1.0f, + 1.0f, 0.0f, 1.0f, 1.0f, + 0.0f, 1.0f, 1.0f, 1.0f, + }; + + GLuint tex = 0; + glGenTextures(1, &tex); + glBindTexture(GL_TEXTURE_CUBE_MAP, tex); + glTexStorage2DEXT(GL_TEXTURE_CUBE_MAP, 1, GL_RGBA8_OES, 1, 1); + EXPECT_GL_NO_ERROR(); + + GLuint fbo = 0; + glGenFramebuffers(1, &fbo); + glBindFramebuffer(GL_FRAMEBUFFER, fbo); + EXPECT_GL_NO_ERROR(); + + for (GLenum face = 0; face < 6; face++) + { + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, tex, 0); + EXPECT_GL_NO_ERROR(); + + glUseProgram(mProgram); + + const GLfloat *faceColor = faceColors + (face * 4); + glUniform4f(mColorLocation, faceColor[0], faceColor[1], faceColor[2], faceColor[3]); + + drawQuad(mProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + } + + for (GLenum face = 0; face < 6; face++) + { + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, tex, 0); + EXPECT_GL_NO_ERROR(); + + const GLfloat *faceColor = faceColors + (face * 4); + EXPECT_PIXEL_EQ(0, 0, faceColor[0] * 255, faceColor[1] * 255, faceColor[2] * 255, faceColor[3] * 255); + EXPECT_GL_NO_ERROR(); + } + + glDeleteFramebuffers(1, &fbo); + glDeleteTextures(1, &tex); + + EXPECT_GL_NO_ERROR(); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(CubeMapTextureTest, + ES2_D3D11(), + ES2_D3D11_FL9_3(), + ES2_OPENGL(), + ES3_OPENGL(), + ES2_OPENGLES(), + ES3_OPENGLES()); diff --git a/gfx/angle/src/tests/gl_tests/D3D11EmulatedIndexedBufferTest.cpp b/gfx/angle/src/tests/gl_tests/D3D11EmulatedIndexedBufferTest.cpp new file mode 100755 index 000000000..c26cf0e08 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/D3D11EmulatedIndexedBufferTest.cpp @@ -0,0 +1,195 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// D3D11EmulatedIndexedBufferTest: +// Tests to validate our D3D11 support for emulating an indexed +// vertex buffer. +// + +#include "libANGLE/angletypes.h" +#include "libANGLE/Context.h" +#include "libANGLE/renderer/d3d/d3d11/Buffer11.h" +#include "libANGLE/renderer/d3d/d3d11/Context11.h" +#include "libANGLE/renderer/d3d/d3d11/Renderer11.h" +#include "libANGLE/renderer/d3d/IndexDataManager.h" +#include "test_utils/ANGLETest.h" +#include "test_utils/angle_test_instantiate.h" + +using namespace angle; + +namespace +{ + +class D3D11EmulatedIndexedBufferTest : public ANGLETest +{ + protected: + + void SetUp() override + { + ANGLETest::SetUp(); + ASSERT_EQ(EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, GetParam().getRenderer()); + + gl::Context *context = reinterpret_cast<gl::Context *>(getEGLWindow()->getContext()); + rx::Context11 *context11 = rx::GetImplAs<rx::Context11>(context); + mRenderer = context11->getRenderer(); + + mSourceBuffer = new rx::Buffer11(mBufferState, mRenderer); + GLfloat testData[] = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; + gl::Error error = + mSourceBuffer->setData(GL_ARRAY_BUFFER, testData, sizeof(testData), GL_STATIC_DRAW); + ASSERT_FALSE(error.isError()); + + mTranslatedAttribute.baseOffset = 0; + mTranslatedAttribute.usesFirstVertexOffset = false; + mTranslatedAttribute.stride = sizeof(GLfloat); + + GLubyte indices[] = {0, 0, 3, 4, 2, 1, 1}; + + for (size_t i = 0; i < ArraySize(indices); i++) + { + mExpectedExpandedData.push_back(testData[indices[i]]); + mubyteIndices.push_back(indices[i]); + muintIndices.push_back(indices[i]); + mushortIndices.push_back(indices[i]); + } + } + + void TearDown() override + { + SafeDelete(mSourceBuffer); + ANGLETest::TearDown(); + } + + void createMappableCompareBufferFromEmulatedBuffer(ID3D11Buffer *sourceBuffer, GLuint size, ID3D11Buffer **mappableBuffer) + { + *mappableBuffer = nullptr; + + D3D11_BUFFER_DESC bufferDesc; + bufferDesc.ByteWidth = size; + bufferDesc.MiscFlags = 0; + bufferDesc.StructureByteStride = 0; + bufferDesc.Usage = D3D11_USAGE_STAGING; + bufferDesc.BindFlags = 0; + bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE; + + HRESULT hr = mRenderer->getDevice()->CreateBuffer(&bufferDesc, nullptr, mappableBuffer); + ASSERT_TRUE(SUCCEEDED(hr)); + + D3D11_BOX srcBox; + srcBox.left = 0; + srcBox.right = size; + srcBox.top = 0; + srcBox.bottom = 1; + srcBox.front = 0; + srcBox.back = 1; + + mRenderer->getDeviceContext()->CopySubresourceRegion(*mappableBuffer, 0, 0, 0, 0, sourceBuffer, 0, &srcBox); + } + + void compareContents(ID3D11Buffer *actual) + { + ID3D11Buffer *compareBuffer = nullptr; + createMappableCompareBufferFromEmulatedBuffer( + actual, sizeof(GLfloat) * static_cast<GLuint>(mExpectedExpandedData.size()), + &compareBuffer); + + D3D11_MAPPED_SUBRESOURCE mappedResource; + HRESULT hr = mRenderer->getDeviceContext()->Map(compareBuffer, 0, D3D11_MAP_READ, 0, &mappedResource); + ASSERT_TRUE(SUCCEEDED(hr)); + + GLfloat* compareData = static_cast<GLfloat*>(mappedResource.pData); + for (size_t i = 0; i < mExpectedExpandedData.size(); i++) + { + EXPECT_EQ(mExpectedExpandedData[i], compareData[i]); + } + + mRenderer->getDeviceContext()->Unmap(compareBuffer, 0); + SafeRelease(compareBuffer); + } + + void emulateAndCompare(rx::SourceIndexData *srcData) + { + auto bufferOrError = + mSourceBuffer->getEmulatedIndexedBuffer(srcData, mTranslatedAttribute, 0); + ASSERT_FALSE(bufferOrError.isError()); + ID3D11Buffer *emulatedBuffer = bufferOrError.getResult(); + ASSERT_TRUE(emulatedBuffer != nullptr); + compareContents(emulatedBuffer); + } + + protected: + rx::Buffer11 *mSourceBuffer; + rx::Renderer11 *mRenderer; + rx::TranslatedAttribute mTranslatedAttribute; + std::vector<GLfloat> mExpectedExpandedData; + std::vector<GLubyte> mubyteIndices; + std::vector<GLuint> muintIndices; + std::vector<GLushort> mushortIndices; + gl::BufferState mBufferState; +}; + +// This tests that a GL_UNSIGNED_BYTE indices list can be successfully expanded +// into a valid emulated indexed buffer. +TEST_P(D3D11EmulatedIndexedBufferTest, TestNativeToExpandedUsingGLubyteIndices) +{ + rx::SourceIndexData srcData = {nullptr, mubyteIndices.data(), + static_cast<unsigned int>(mubyteIndices.size()), + GL_UNSIGNED_BYTE, false}; + emulateAndCompare(&srcData); +} + +// This tests that a GL_UNSIGNED_SHORT indices list can be successfully expanded +// into a valid emulated indexed buffer. +TEST_P(D3D11EmulatedIndexedBufferTest, TestNativeToExpandedUsingGLushortIndices) +{ + rx::SourceIndexData srcData = {nullptr, mushortIndices.data(), + static_cast<unsigned int>(mushortIndices.size()), + GL_UNSIGNED_SHORT, false}; + emulateAndCompare(&srcData); +} + +// This tests that a GL_UNSIGNED_INT indices list can be successfully expanded +// into a valid emulated indexed buffer. +TEST_P(D3D11EmulatedIndexedBufferTest, TestNativeToExpandedUsingGLuintIndices) +{ + rx::SourceIndexData srcData = {nullptr, muintIndices.data(), + static_cast<unsigned int>(muintIndices.size()), GL_UNSIGNED_INT, + false}; + emulateAndCompare(&srcData); +} + +// This tests verifies that a Buffer11 contents remain unchanged after calling getEmulatedIndexedBuffer +TEST_P(D3D11EmulatedIndexedBufferTest, TestSourceBufferRemainsUntouchedAfterExpandOperation) +{ + // Copy the original source buffer before any expand calls have been made + gl::BufferState cleanSourceState; + rx::Buffer11 *cleanSourceBuffer = new rx::Buffer11(cleanSourceState, mRenderer); + cleanSourceBuffer->copySubData(mSourceBuffer, 0, 0, mSourceBuffer->getSize()); + + // Do a basic exanded and compare test. + rx::SourceIndexData srcData = {nullptr, muintIndices.data(), + static_cast<unsigned int>(muintIndices.size()), GL_UNSIGNED_INT, + false}; + emulateAndCompare(&srcData); + + const uint8_t *sourceBufferMem = nullptr; + const uint8_t *cleanBufferMem = nullptr; + + gl::Error error = mSourceBuffer->getData(&sourceBufferMem); + ASSERT_FALSE(error.isError()); + + error = cleanSourceBuffer->getData(&cleanBufferMem); + ASSERT_FALSE(error.isError()); + + int result = memcmp(sourceBufferMem, cleanBufferMem, cleanSourceBuffer->getSize()); + ASSERT_EQ(result, 0); + + SafeDelete(cleanSourceBuffer); +} + +ANGLE_INSTANTIATE_TEST(D3D11EmulatedIndexedBufferTest, + ES2_D3D11()); + +} // anonymous namespace diff --git a/gfx/angle/src/tests/gl_tests/D3D11FormatTablesTest.cpp b/gfx/angle/src/tests/gl_tests/D3D11FormatTablesTest.cpp new file mode 100755 index 000000000..e407d1190 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/D3D11FormatTablesTest.cpp @@ -0,0 +1,153 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// D3D11FormatTablesTest: +// Tests to validate our D3D11 support tables match hardware support. +// + +#include "libANGLE/angletypes.h" +#include "libANGLE/Context.h" +#include "libANGLE/formatutils.h" +#include "libANGLE/renderer/d3d/d3d11/Context11.h" +#include "libANGLE/renderer/d3d/d3d11/dxgi_support_table.h" +#include "libANGLE/renderer/d3d/d3d11/formatutils11.h" +#include "libANGLE/renderer/d3d/d3d11/Renderer11.h" +#include "libANGLE/renderer/d3d/d3d11/texture_format_table.h" +#include "test_utils/angle_test_instantiate.h" +#include "test_utils/ANGLETest.h" + +using namespace angle; + +namespace +{ + +class D3D11FormatTablesTest : public ANGLETest +{ + +}; + +// This test enumerates all GL formats - for each, it queries the D3D support for +// using it as a texture, a render target, and sampling from it in the shader. It +// checks this against our speed-optimized baked tables, and validates they would +// give the same result. +// TODO(jmadill): Find out why in 9_3, some format queries return an error. +// The error seems to appear for formats that are not supported on 9_3. +TEST_P(D3D11FormatTablesTest, TestFormatSupport) +{ + ASSERT_EQ(EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, GetParam().getRenderer()); + + // Hack the angle! + gl::Context *context = reinterpret_cast<gl::Context *>(getEGLWindow()->getContext()); + rx::Context11 *context11 = rx::GetImplAs<rx::Context11>(context); + rx::Renderer11 *renderer = context11->getRenderer(); + const auto &textureCaps = renderer->getNativeTextureCaps(); + + ID3D11Device *device = renderer->getDevice(); + + const gl::FormatSet &allFormats = gl::GetAllSizedInternalFormats(); + for (GLenum internalFormat : allFormats) + { + const rx::d3d11::Format &formatInfo = + rx::d3d11::Format::Get(internalFormat, renderer->getRenderer11DeviceCaps()); + const auto &textureInfo = textureCaps.get(internalFormat); + + // Bits for texturing + const gl::InternalFormat &internalFormatInfo = gl::GetInternalFormatInfo(internalFormat); + + UINT texSupportMask = D3D11_FORMAT_SUPPORT_TEXTURE2D; + if (internalFormatInfo.depthBits == 0 && internalFormatInfo.stencilBits == 0) + { + texSupportMask |= D3D11_FORMAT_SUPPORT_TEXTURECUBE; + if (GetParam().majorVersion > 2) + { + texSupportMask |= D3D11_FORMAT_SUPPORT_TEXTURE3D; + } + } + + UINT texSupport = 0; + bool texSuccess = SUCCEEDED(device->CheckFormatSupport(formatInfo.texFormat, &texSupport)); + bool textureable = texSuccess && ((texSupport & texSupportMask) == texSupportMask); + EXPECT_EQ(textureable, textureInfo.texturable); + + // Bits for mipmap auto-gen. + bool expectedMipGen = texSuccess && ((texSupport & D3D11_FORMAT_SUPPORT_MIP_AUTOGEN) != 0); + auto featureLevel = renderer->getRenderer11DeviceCaps().featureLevel; + const auto &dxgiSupport = rx::d3d11::GetDXGISupport(formatInfo.texFormat, featureLevel); + bool actualMipGen = + ((dxgiSupport.alwaysSupportedFlags & D3D11_FORMAT_SUPPORT_MIP_AUTOGEN) != 0); + EXPECT_EQ(0u, dxgiSupport.optionallySupportedFlags & D3D11_FORMAT_SUPPORT_MIP_AUTOGEN); + EXPECT_EQ(expectedMipGen, actualMipGen); + + // Bits for filtering + UINT filterSupport = 0; + bool filterSuccess = + SUCCEEDED(device->CheckFormatSupport(formatInfo.srvFormat, &filterSupport)); + bool filterable = filterSuccess && ((filterSupport & D3D11_FORMAT_SUPPORT_SHADER_SAMPLE) != 0); + EXPECT_EQ(filterable, textureInfo.filterable); + + // Bits for renderable + bool renderable = false; + UINT renderSupport = 0u; + DXGI_FORMAT renderFormat = DXGI_FORMAT_UNKNOWN; + if (internalFormatInfo.depthBits > 0 || internalFormatInfo.stencilBits > 0) + { + renderFormat = formatInfo.dsvFormat; + bool depthSuccess = + SUCCEEDED(device->CheckFormatSupport(formatInfo.dsvFormat, &renderSupport)); + renderable = + depthSuccess && ((renderSupport & D3D11_FORMAT_SUPPORT_DEPTH_STENCIL) != 0); + if (renderable) + { + EXPECT_NE(DXGI_FORMAT_UNKNOWN, formatInfo.dsvFormat); + } + } + else + { + renderFormat = formatInfo.rtvFormat; + bool rtSuccess = + SUCCEEDED(device->CheckFormatSupport(formatInfo.rtvFormat, &renderSupport)); + renderable = rtSuccess && ((renderSupport & D3D11_FORMAT_SUPPORT_RENDER_TARGET) != 0); + if (renderable) + { + EXPECT_NE(DXGI_FORMAT_UNKNOWN, formatInfo.rtvFormat); + } + } + EXPECT_EQ(renderable, textureInfo.renderable); + if (!textureInfo.sampleCounts.empty()) + { + EXPECT_TRUE(renderable); + } + + // Multisample counts + if (renderable) + { + if ((renderSupport & D3D11_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET) != 0) + { + EXPECT_TRUE(!textureInfo.sampleCounts.empty()); + for (unsigned int sampleCount = 1; + sampleCount <= D3D11_MAX_MULTISAMPLE_SAMPLE_COUNT; sampleCount *= 2) + { + UINT qualityCount = 0; + bool sampleSuccess = SUCCEEDED(device->CheckMultisampleQualityLevels( + renderFormat, sampleCount, &qualityCount)); + GLuint expectedCount = (!sampleSuccess || qualityCount == 0) ? 0 : 1; + EXPECT_EQ(expectedCount, textureInfo.sampleCounts.count(sampleCount)); + } + } + else + { + EXPECT_TRUE(textureInfo.sampleCounts.empty()); + } + } + } +} + +ANGLE_INSTANTIATE_TEST(D3D11FormatTablesTest, + ES2_D3D11_FL9_3(), + ES2_D3D11_FL10_0(), + ES2_D3D11_FL10_1(), + ES2_D3D11_FL11_0()); + +} // anonymous namespace diff --git a/gfx/angle/src/tests/gl_tests/D3D11InputLayoutCacheTest.cpp b/gfx/angle/src/tests/gl_tests/D3D11InputLayoutCacheTest.cpp new file mode 100755 index 000000000..7f182d2b1 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/D3D11InputLayoutCacheTest.cpp @@ -0,0 +1,126 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// D3D11InputLayoutCacheTest: +// Stress to to reproduce a bug where we weren't fluing the case correctly. +// + +#include <sstream> + +#include "libANGLE/Context.h" +#include "libANGLE/renderer/d3d/d3d11/Context11.h" +#include "libANGLE/renderer/d3d/d3d11/Renderer11.h" +#include "test_utils/ANGLETest.h" +#include "test_utils/angle_test_instantiate.h" + +using namespace angle; + +namespace +{ + +class D3D11InputLayoutCacheTest : public ANGLETest +{ + protected: + D3D11InputLayoutCacheTest() + { + setWindowWidth(64); + setWindowHeight(64); + setConfigRedBits(8); + setConfigAlphaBits(8); + } + + GLuint makeProgramWithAttribCount(unsigned int attribCount) + { + std::stringstream strstr; + + strstr << "attribute vec2 position;" << std::endl; + for (unsigned int attribIndex = 0; attribIndex < attribCount; ++attribIndex) + { + strstr << "attribute float a" << attribIndex << ";" << std::endl; + } + strstr << "varying float v;" << std::endl + << "void main() {" << std::endl + << " v = 0.0;" << std::endl; + for (unsigned int attribIndex = 0; attribIndex < attribCount; ++attribIndex) + { + strstr << " v += a" << attribIndex << ";" << std::endl; + } + strstr << " gl_Position = vec4(position, 0.0, 1.0);" << std::endl + << "}" << std::endl; + + const std::string basicFragmentShader = + "varying highp float v;\n" + "void main() {" + " gl_FragColor = vec4(v / 255.0, 0.0, 0.0, 1.0);\n" + "}\n"; + + return CompileProgram(strstr.str(), basicFragmentShader); + } +}; + +// Stress the cache by setting a small cache size and drawing with a bunch of shaders +// with different input signatures. +TEST_P(D3D11InputLayoutCacheTest, StressTest) +{ + // Hack the ANGLE! + gl::Context *context = reinterpret_cast<gl::Context *>(getEGLWindow()->getContext()); + rx::Context11 *context11 = rx::GetImplAs<rx::Context11>(context); + rx::Renderer11 *renderer11 = context11->getRenderer(); + rx::InputLayoutCache *inputLayoutCache = renderer11->getInputLayoutCache(); + + // Clamp the cache size to something tiny + inputLayoutCache->setCacheSize(4); + + GLint maxAttribs = 0; + context->getIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxAttribs); + + // Reserve one attrib for position + unsigned int maxInputs = static_cast<unsigned int>(maxAttribs) - 2; + + std::vector<GLuint> programs; + for (unsigned int attribCount = 0; attribCount <= maxInputs; ++attribCount) + { + GLuint program = makeProgramWithAttribCount(attribCount); + ASSERT_NE(0u, program); + programs.push_back(program); + } + + // Iteratively do a simple drop operation, trying every attribute count from 0..MAX_ATTRIBS. + // This should thrash the cache. + for (unsigned int iterationCount = 0; iterationCount < 10; ++iterationCount) + { + ASSERT_GL_NO_ERROR(); + + for (unsigned int attribCount = 0; attribCount <= maxInputs; ++attribCount) + { + GLuint program = programs[attribCount]; + glUseProgram(program); + + for (unsigned int attribIndex = 0; attribIndex < attribCount; ++attribIndex) + { + std::stringstream attribNameStr; + attribNameStr << "a" << attribIndex; + std::string attribName = attribNameStr.str(); + + GLint location = glGetAttribLocation(program, attribName.c_str()); + ASSERT_NE(-1, location); + glVertexAttrib1f(location, 1.0f); + glDisableVertexAttribArray(location); + } + + drawQuad(program, "position", 0.5f); + EXPECT_PIXEL_EQ(0, 0, attribCount, 0, 0, 255u); + } + } + + for (GLuint program : programs) + { + glDeleteProgram(program); + } +} + +ANGLE_INSTANTIATE_TEST(D3D11InputLayoutCacheTest, ES2_D3D11()); + +} // anonymous namespace diff --git a/gfx/angle/src/tests/gl_tests/D3DImageFormatConversionTest.cpp b/gfx/angle/src/tests/gl_tests/D3DImageFormatConversionTest.cpp new file mode 100755 index 000000000..d6319d3f7 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/D3DImageFormatConversionTest.cpp @@ -0,0 +1,207 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// D3DImageFormatConversionTest: +// Basic tests to validate code relating to D3D Image format conversions. + +#include "test_utils/ANGLETest.h" + +#include "image_util/imageformats.h" + +using namespace angle; + +namespace +{ + +class D3DImageFormatConversionTest : public ANGLETest +{ + protected: + D3DImageFormatConversionTest() + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + const std::string vertexShaderSource = SHADER_SOURCE + ( + precision highp float; + attribute vec4 position; + varying vec2 texcoord; + + void main() + { + gl_Position = vec4(position.xy, 0.0, 1.0); + texcoord = (position.xy * 0.5) + 0.5; + } + ); + + const std::string fragmentShaderSource2D = SHADER_SOURCE + ( + precision highp float; + uniform sampler2D tex; + varying vec2 texcoord; + + void main() + { + gl_FragColor = texture2D(tex, texcoord); + } + ); + + m2DProgram = CompileProgram(vertexShaderSource, fragmentShaderSource2D); + mTexture2DUniformLocation = glGetUniformLocation(m2DProgram, "tex"); + } + + void TearDown() override + { + glDeleteProgram(m2DProgram); + + ANGLETest::TearDown(); + } + + // Uses ColorStructType::writeColor to populate initial data for a texture, pass it to glTexImage2D, then render with it. + // The resulting colors should match the colors passed into ::writeColor. + template <typename ColorStructType> + void runTest(GLenum tex2DFormat, GLenum tex2DType) + { + gl::ColorF srcColorF[4]; + ColorStructType pixels[4]; + + GLuint tex = 0; + GLuint fbo = 0; + glGenTextures(1, &tex); + glGenFramebuffers(1, &fbo); + EXPECT_GL_NO_ERROR(); + + srcColorF[0].red = 1.0f; srcColorF[0].green = 0.0f; srcColorF[0].blue = 0.0f; srcColorF[0].alpha = 1.0f; // Red + srcColorF[1].red = 0.0f; srcColorF[1].green = 1.0f; srcColorF[1].blue = 0.0f; srcColorF[1].alpha = 1.0f; // Green + srcColorF[2].red = 0.0f; srcColorF[2].green = 0.0f; srcColorF[2].blue = 1.0f; srcColorF[2].alpha = 1.0f; // Blue + srcColorF[3].red = 1.0f; srcColorF[3].green = 1.0f; srcColorF[3].blue = 0.0f; srcColorF[3].alpha = 1.0f; // Red + Green (Yellow) + + // Convert the ColorF into the pixels that will be fed to glTexImage2D + for (unsigned int i = 0; i < 4; i++) + { + ColorStructType::writeColor(&(pixels[i]), &(srcColorF[i])); + } + + // Generate the texture + glBindTexture(GL_TEXTURE_2D, tex); + glTexImage2D(GL_TEXTURE_2D, 0, tex2DFormat, 2, 2, 0, tex2DFormat, tex2DType, pixels); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + EXPECT_GL_NO_ERROR(); + + // Draw a quad using the texture + glClearColor(0, 0, 0, 0); + glClear(GL_COLOR_BUFFER_BIT); + glUseProgram(m2DProgram); + glUniform1i(mTexture2DUniformLocation, 0); + drawQuad(m2DProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + + // Check that the pixel colors match srcColorF + EXPECT_PIXEL_EQ( 0, 0, 255, 0, 0, 255); + EXPECT_PIXEL_EQ(getWindowHeight() - 1, 0, 0, 255, 0, 255); + EXPECT_PIXEL_EQ( 0, getWindowWidth() - 1, 0, 0, 255, 255); + EXPECT_PIXEL_EQ(getWindowHeight() - 1, getWindowWidth() - 1, 255, 255, 0, 255); + swapBuffers(); + + glDeleteFramebuffers(1, &fbo); + glDeleteTextures(1, &tex); + } + + GLuint m2DProgram; + GLint mTexture2DUniformLocation; +}; + +// Validation test for rx::R4G4B4A4's writeColor functions +TEST_P(D3DImageFormatConversionTest, WriteColorFunctionR4G4B4A4) +{ + // These tests fail on certain Intel machines running an un-updated version of Win7 + // The tests pass after installing the latest updates from Windows Update. + // TODO: reenable these tests once the bots have been updated + if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE) + { + std::cout << "Test skipped on Intel D3D11." << std::endl; + return; + } + + runTest<R4G4B4A4>(GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4); +} + +// Validation test for rx::R5G5B5A1's writeColor functions +TEST_P(D3DImageFormatConversionTest, WriteColorFunctionR5G5B5A1) +{ + // These tests fail on certain Intel machines running an un-updated version of Win7 + // The tests pass after installing the latest updates from Windows Update. + // TODO: reenable these tests once the bots have been updated + if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE) + { + std::cout << "Test skipped on Intel D3D11." << std::endl; + return; + } + + runTest<R5G5B5A1>(GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1); +} + +// Validation test for rx::R5G6B5's writeColor functions +TEST_P(D3DImageFormatConversionTest, WriteColorFunctionR5G6B5) +{ + // These tests fail on certain Intel machines running an un-updated version of Win7 + // The tests pass after installing the latest updates from Windows Update. + // TODO: reenable these tests once the bots have been updated + if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE) + { + std::cout << "Test skipped on Intel D3D11." << std::endl; + return; + } + + runTest<R5G6B5>(GL_RGB, GL_UNSIGNED_SHORT_5_6_5); +} + +// Validation test for rx::R8G8B8A8's writeColor functions +TEST_P(D3DImageFormatConversionTest, WriteColorFunctionR8G8B8A8) +{ + // These tests fail on certain Intel machines running an un-updated version of Win7 + // The tests pass after installing the latest updates from Windows Update. + // TODO: reenable these tests once the bots have been updated + if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE) + { + std::cout << "Test skipped on Intel D3D11." << std::endl; + return; + } + + runTest<R8G8B8A8>(GL_RGBA, GL_UNSIGNED_BYTE); +} + +// Validation test for rx::R8G8B8's writeColor functions +TEST_P(D3DImageFormatConversionTest, WriteColorFunctionR8G8B8) +{ + // These tests fail on certain Intel machines running an un-updated version of Win7 + // The tests pass after installing the latest updates from Windows Update. + // TODO: reenable these tests once the bots have been updated + if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE) + { + std::cout << "Test skipped on Intel D3D11." << std::endl; + return; + } + + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + runTest<R8G8B8>(GL_RGB, GL_UNSIGNED_BYTE); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +// Even though this test is only run on Windows (since it includes imageformats.h from the D3D renderer), we can still run the test +// against OpenGL. This is valuable, since it provides extra validation using a renderer that doesn't use imageformats.h itself. +ANGLE_INSTANTIATE_TEST(D3DImageFormatConversionTest, ES2_D3D9(), ES2_D3D11(), ES2_D3D11_FL9_3(), ES2_OPENGL()); + +} // namespace diff --git a/gfx/angle/src/tests/gl_tests/D3DTextureTest.cpp b/gfx/angle/src/tests/gl_tests/D3DTextureTest.cpp new file mode 100644 index 000000000..028b24a81 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/D3DTextureTest.cpp @@ -0,0 +1,326 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// D3DTextureTest: +// Tests of the EGL_ANGLE_d3d_texture_client_buffer extension + +#include "test_utils/ANGLETest.h" + +#include <d3d11.h> +#include <windows.h> + +#include "com_utils.h" + +namespace angle +{ + +class D3DTextureTest : public ANGLETest +{ + protected: + D3DTextureTest() + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + // clang-format off + const std::string vsSource = SHADER_SOURCE + ( + precision highp float; + attribute vec4 position; + varying vec2 texcoord; + + void main() + { + gl_Position = position; + texcoord = (position.xy * 0.5) + 0.5; + texcoord.y = 1.0 - texcoord.y; + } + ); + + const std::string textureFSSource = SHADER_SOURCE + ( + precision highp float; + uniform sampler2D tex; + varying vec2 texcoord; + + void main() + { + gl_FragColor = texture2D(tex, texcoord); + } + ); + // clang-format on + + mTextureProgram = CompileProgram(vsSource, textureFSSource); + ASSERT_NE(0u, mTextureProgram) << "shader compilation failed."; + + mTextureUniformLocation = glGetUniformLocation(mTextureProgram, "tex"); + ASSERT_NE(-1, mTextureUniformLocation); + + mD3D11Module = LoadLibrary(TEXT("d3d11.dll")); + ASSERT_NE(nullptr, mD3D11Module); + + PFN_D3D11_CREATE_DEVICE createDeviceFunc = reinterpret_cast<PFN_D3D11_CREATE_DEVICE>( + GetProcAddress(mD3D11Module, "D3D11CreateDevice")); + + EGLWindow *window = getEGLWindow(); + EGLDisplay display = window->getDisplay(); + if (eglDisplayExtensionEnabled(display, "EGL_EXT_device_query")) + { + PFNEGLQUERYDISPLAYATTRIBEXTPROC eglQueryDisplayAttribEXT = + reinterpret_cast<PFNEGLQUERYDISPLAYATTRIBEXTPROC>( + eglGetProcAddress("eglQueryDisplayAttribEXT")); + PFNEGLQUERYDEVICEATTRIBEXTPROC eglQueryDeviceAttribEXT = + reinterpret_cast<PFNEGLQUERYDEVICEATTRIBEXTPROC>( + eglGetProcAddress("eglQueryDeviceAttribEXT")); + + EGLDeviceEXT device = 0; + { + EGLAttrib result = 0; + EXPECT_EGL_TRUE(eglQueryDisplayAttribEXT(display, EGL_DEVICE_EXT, &result)); + device = reinterpret_cast<EGLDeviceEXT>(result); + } + + if (eglDeviceExtensionEnabled(device, "EGL_ANGLE_device_d3d")) + { + EGLAttrib result = 0; + if (eglQueryDeviceAttribEXT(device, EGL_D3D11_DEVICE_ANGLE, &result)) + { + mD3D11Device = reinterpret_cast<ID3D11Device *>(result); + mD3D11Device->AddRef(); + } + else if (eglQueryDeviceAttribEXT(device, EGL_D3D9_DEVICE_ANGLE, &result)) + { + mD3D9Device = reinterpret_cast<IDirect3DDevice9 *>(result); + mD3D9Device->AddRef(); + } + } + } + else + { + ASSERT_TRUE( + SUCCEEDED(createDeviceFunc(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, 0, nullptr, + 0, D3D11_SDK_VERSION, &mD3D11Device, nullptr, nullptr))); + } + } + + void TearDown() override + { + glDeleteProgram(mTextureProgram); + + if (mD3D11Device) + { + mD3D11Device->Release(); + mD3D11Device = nullptr; + } + + FreeLibrary(mD3D11Module); + mD3D11Module = nullptr; + + if (mD3D9Device) + { + mD3D9Device->Release(); + mD3D9Device = nullptr; + } + + ANGLETest::TearDown(); + } + + EGLSurface createPBuffer(size_t width, + size_t height, + EGLint eglTextureFormat, + EGLint eglTextureTarget) + { + EGLWindow *window = getEGLWindow(); + EGLDisplay display = window->getDisplay(); + EGLConfig config = window->getConfig(); + + EGLint attribs[] = { + EGL_TEXTURE_FORMAT, eglTextureFormat, EGL_TEXTURE_TARGET, + eglTextureTarget, EGL_NONE, EGL_NONE, + }; + + if (mD3D11Device) + { + ID3D11Texture2D *texture = nullptr; + CD3D11_TEXTURE2D_DESC desc(DXGI_FORMAT_R8G8B8A8_UNORM, static_cast<UINT>(width), + static_cast<UINT>(height), 1, 1, + D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET); + EXPECT_TRUE(SUCCEEDED(mD3D11Device->CreateTexture2D(&desc, nullptr, &texture))); + + EGLSurface pbuffer = eglCreatePbufferFromClientBuffer(display, EGL_D3D_TEXTURE_ANGLE, + texture, config, attribs); + + texture->Release(); + + return pbuffer; + } + else if (mD3D9Device) + { + IDirect3DTexture9 *texture = nullptr; + EXPECT_TRUE(SUCCEEDED(mD3D9Device->CreateTexture( + static_cast<UINT>(width), static_cast<UINT>(height), 1, D3DUSAGE_RENDERTARGET, + D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &texture, nullptr))); + + EGLSurface pbuffer = eglCreatePbufferFromClientBuffer(display, EGL_D3D_TEXTURE_ANGLE, + texture, config, attribs); + + texture->Release(); + + return pbuffer; + } + else + { + return EGL_NO_SURFACE; + } + } + + bool valid() const + { + EGLWindow *window = getEGLWindow(); + EGLDisplay display = window->getDisplay(); + if (!eglDisplayExtensionEnabled(display, "EGL_ANGLE_d3d_texture_client_buffer")) + { + std::cout << "Test skipped due to missing EGL_ANGLE_d3d_texture_client_buffer" + << std::endl; + return false; + } + + if (!mD3D11Device && !mD3D9Device) + { + std::cout << "Test skipped due to no D3D devices being available." << std::endl; + return false; + } + + if (IsWindows() && IsAMD() && IsOpenGL()) + { + std::cout << "Test skipped on Windows AMD OpenGL." << std::endl; + return false; + } + + if (IsWindows() && IsIntel() && IsOpenGL()) + { + std::cout << "Test skipped on Windows Intel OpenGL." << std::endl; + return false; + } + return true; + } + + GLuint mTextureProgram; + GLint mTextureUniformLocation; + + HMODULE mD3D11Module = nullptr; + ID3D11Device *mD3D11Device = nullptr; + + IDirect3DDevice9 *mD3D9Device = nullptr; +}; + +// Test creating a pbuffer from a d3d surface and clearing it +TEST_P(D3DTextureTest, Clear) +{ + if (!valid()) + { + return; + } + + EGLWindow *window = getEGLWindow(); + EGLDisplay display = window->getDisplay(); + + const size_t bufferSize = 32; + + EGLSurface pbuffer = createPBuffer(bufferSize, bufferSize, EGL_NO_TEXTURE, EGL_NO_TEXTURE); + ASSERT_EGL_SUCCESS(); + ASSERT_NE(pbuffer, EGL_NO_SURFACE); + + // Apply the Pbuffer and clear it to purple and verify + eglMakeCurrent(display, pbuffer, pbuffer, window->getContext()); + ASSERT_EGL_SUCCESS(); + + glViewport(0, 0, static_cast<GLsizei>(bufferSize), static_cast<GLsizei>(bufferSize)); + glClearColor(1.0f, 0.0f, 1.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + ASSERT_GL_NO_ERROR(); + EXPECT_PIXEL_EQ(static_cast<GLint>(bufferSize) / 2, static_cast<GLint>(bufferSize) / 2, 255, 0, + 255, 255); + + eglDestroySurface(display, pbuffer); +} + +// Test creating a pbuffer from a d3d surface and binding it to a texture +TEST_P(D3DTextureTest, BindTexImage) +{ + if (!valid()) + { + return; + } + + EGLWindow *window = getEGLWindow(); + + const size_t bufferSize = 32; + + EGLSurface pbuffer = createPBuffer(bufferSize, bufferSize, EGL_TEXTURE_RGBA, EGL_TEXTURE_2D); + ASSERT_EGL_SUCCESS(); + ASSERT_NE(pbuffer, EGL_NO_SURFACE); + + // Apply the Pbuffer and clear it to purple + eglMakeCurrent(window->getDisplay(), pbuffer, pbuffer, window->getContext()); + ASSERT_EGL_SUCCESS(); + + glViewport(0, 0, static_cast<GLsizei>(bufferSize), static_cast<GLsizei>(bufferSize)); + glClearColor(1.0f, 0.0f, 1.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + ASSERT_GL_NO_ERROR(); + + EXPECT_PIXEL_EQ(static_cast<GLint>(bufferSize) / 2, static_cast<GLint>(bufferSize) / 2, 255, 0, + 255, 255); + + // Apply the window surface + eglMakeCurrent(window->getDisplay(), window->getSurface(), window->getSurface(), + window->getContext()); + + // Create a texture and bind the Pbuffer to it + GLuint texture = 0; + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_2D, texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + EXPECT_GL_NO_ERROR(); + + eglBindTexImage(window->getDisplay(), pbuffer, EGL_BACK_BUFFER); + glViewport(0, 0, getWindowWidth(), getWindowHeight()); + ASSERT_EGL_SUCCESS(); + + // Draw a quad and verify that it is purple + glUseProgram(mTextureProgram); + glUniform1i(mTextureUniformLocation, 0); + + drawQuad(mTextureProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + + // Unbind the texture + eglReleaseTexImage(window->getDisplay(), pbuffer, EGL_BACK_BUFFER); + ASSERT_EGL_SUCCESS(); + + // Verify that purple was drawn + EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 255, 0, 255, 255); + + glDeleteTextures(1, &texture); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these +// tests should be run against. +ANGLE_INSTANTIATE_TEST(D3DTextureTest, ES2_D3D9(), ES2_D3D11(), ES2_OPENGL()); + +} // namespace diff --git a/gfx/angle/src/tests/gl_tests/DXT1CompressedTextureTest.cpp b/gfx/angle/src/tests/gl_tests/DXT1CompressedTextureTest.cpp new file mode 100755 index 000000000..34b6b9ec3 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/DXT1CompressedTextureTest.cpp @@ -0,0 +1,326 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "test_utils/ANGLETest.h" + +#include "media/pixel.inl" + +using namespace angle; + +class DXT1CompressedTextureTest : public ANGLETest +{ + protected: + DXT1CompressedTextureTest() + { + setWindowWidth(512); + setWindowHeight(512); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + virtual void SetUp() + { + ANGLETest::SetUp(); + + const std::string vsSource = SHADER_SOURCE + ( + precision highp float; + attribute vec4 position; + varying vec2 texcoord; + + void main() + { + gl_Position = position; + texcoord = (position.xy * 0.5) + 0.5; + texcoord.y = 1.0 - texcoord.y; + } + ); + + const std::string textureFSSource = SHADER_SOURCE + ( + precision highp float; + uniform sampler2D tex; + varying vec2 texcoord; + + void main() + { + gl_FragColor = texture2D(tex, texcoord); + } + ); + + mTextureProgram = CompileProgram(vsSource, textureFSSource); + if (mTextureProgram == 0) + { + FAIL() << "shader compilation failed."; + } + + mTextureUniformLocation = glGetUniformLocation(mTextureProgram, "tex"); + + ASSERT_GL_NO_ERROR(); + } + + virtual void TearDown() + { + glDeleteProgram(mTextureProgram); + + ANGLETest::TearDown(); + } + + GLuint mTextureProgram; + GLint mTextureUniformLocation; +}; + +TEST_P(DXT1CompressedTextureTest, CompressedTexImage) +{ + if (!extensionEnabled("GL_EXT_texture_compression_dxt1")) + { + std::cout << "Test skipped because GL_EXT_texture_compression_dxt1 is not available." << std::endl; + return; + } + + GLuint texture; + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_2D, texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width, pixel_0_height, 0, pixel_0_size, pixel_0_data); + glCompressedTexImage2D(GL_TEXTURE_2D, 1, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_1_width, pixel_1_height, 0, pixel_1_size, pixel_1_data); + glCompressedTexImage2D(GL_TEXTURE_2D, 2, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_2_width, pixel_2_height, 0, pixel_2_size, pixel_2_data); + glCompressedTexImage2D(GL_TEXTURE_2D, 3, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_3_width, pixel_3_height, 0, pixel_3_size, pixel_3_data); + glCompressedTexImage2D(GL_TEXTURE_2D, 4, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_4_width, pixel_4_height, 0, pixel_4_size, pixel_4_data); + glCompressedTexImage2D(GL_TEXTURE_2D, 5, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_5_width, pixel_5_height, 0, pixel_5_size, pixel_5_data); + glCompressedTexImage2D(GL_TEXTURE_2D, 6, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_6_width, pixel_6_height, 0, pixel_6_size, pixel_6_data); + glCompressedTexImage2D(GL_TEXTURE_2D, 7, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_7_width, pixel_7_height, 0, pixel_7_size, pixel_7_data); + glCompressedTexImage2D(GL_TEXTURE_2D, 8, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_8_width, pixel_8_height, 0, pixel_8_size, pixel_8_data); + glCompressedTexImage2D(GL_TEXTURE_2D, 9, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_9_width, pixel_9_height, 0, pixel_9_size, pixel_9_data); + + EXPECT_GL_NO_ERROR(); + + glUseProgram(mTextureProgram); + glUniform1i(mTextureUniformLocation, 0); + + drawQuad(mTextureProgram, "position", 0.5f); + + EXPECT_GL_NO_ERROR(); + + glDeleteTextures(1, &texture); + + EXPECT_GL_NO_ERROR(); +} + +TEST_P(DXT1CompressedTextureTest, CompressedTexStorage) +{ + if (!extensionEnabled("GL_EXT_texture_compression_dxt1")) + { + std::cout << "Test skipped due to missing GL_EXT_texture_compression_dxt1" << std::endl; + return; + } + + if (getClientMajorVersion() < 3 && + (!extensionEnabled("GL_EXT_texture_storage") || !extensionEnabled("GL_OES_rgb8_rgba8"))) + { + std::cout << "Test skipped due to missing ES3 or GL_EXT_texture_storage or GL_OES_rgb8_rgba8" << std::endl; + return; + } + + GLuint texture; + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_2D, texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + if (getClientMajorVersion() < 3) + { + glTexStorage2DEXT(GL_TEXTURE_2D, pixel_levels, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width, pixel_0_height); + } + else + { + glTexStorage2D(GL_TEXTURE_2D, pixel_levels, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width, pixel_0_height); + } + EXPECT_GL_NO_ERROR(); + + glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, pixel_0_width, pixel_0_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_size, pixel_0_data); + glCompressedTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, pixel_1_width, pixel_1_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_1_size, pixel_1_data); + glCompressedTexSubImage2D(GL_TEXTURE_2D, 2, 0, 0, pixel_2_width, pixel_2_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_2_size, pixel_2_data); + glCompressedTexSubImage2D(GL_TEXTURE_2D, 3, 0, 0, pixel_3_width, pixel_3_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_3_size, pixel_3_data); + glCompressedTexSubImage2D(GL_TEXTURE_2D, 4, 0, 0, pixel_4_width, pixel_4_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_4_size, pixel_4_data); + glCompressedTexSubImage2D(GL_TEXTURE_2D, 5, 0, 0, pixel_5_width, pixel_5_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_5_size, pixel_5_data); + glCompressedTexSubImage2D(GL_TEXTURE_2D, 6, 0, 0, pixel_6_width, pixel_6_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_6_size, pixel_6_data); + glCompressedTexSubImage2D(GL_TEXTURE_2D, 7, 0, 0, pixel_7_width, pixel_7_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_7_size, pixel_7_data); + glCompressedTexSubImage2D(GL_TEXTURE_2D, 8, 0, 0, pixel_8_width, pixel_8_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_8_size, pixel_8_data); + glCompressedTexSubImage2D(GL_TEXTURE_2D, 9, 0, 0, pixel_9_width, pixel_9_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_9_size, pixel_9_data); + + EXPECT_GL_NO_ERROR(); + + glUseProgram(mTextureProgram); + glUniform1i(mTextureUniformLocation, 0); + + drawQuad(mTextureProgram, "position", 0.5f); + + EXPECT_GL_NO_ERROR(); + + glDeleteTextures(1, &texture); + + EXPECT_GL_NO_ERROR(); +} + +class DXT1CompressedTextureTestES3 : public DXT1CompressedTextureTest { }; + +class DXT1CompressedTextureTestD3D11 : public DXT1CompressedTextureTest { }; + +TEST_P(DXT1CompressedTextureTestES3, PBOCompressedTexImage) +{ + if (!extensionEnabled("GL_EXT_texture_compression_dxt1")) + { + std::cout << "Test skipped because GL_EXT_texture_compression_dxt1 is not available." + << std::endl; + return; + } + + GLuint texture; + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_2D, texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + GLuint buffer; + glGenBuffers(1, &buffer); + glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer); + glBufferData(GL_PIXEL_UNPACK_BUFFER, pixel_0_size, NULL, GL_STREAM_DRAW); + EXPECT_GL_NO_ERROR(); + + glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_0_size, pixel_0_data); + glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width, pixel_0_height, 0, pixel_0_size, NULL); + glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_1_size, pixel_1_data); + glCompressedTexImage2D(GL_TEXTURE_2D, 1, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_1_width, pixel_1_height, 0, pixel_1_size, NULL); + glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_2_size, pixel_2_data); + glCompressedTexImage2D(GL_TEXTURE_2D, 2, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_2_width, pixel_2_height, 0, pixel_2_size, NULL); + glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_3_size, pixel_3_data); + glCompressedTexImage2D(GL_TEXTURE_2D, 3, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_3_width, pixel_3_height, 0, pixel_3_size, NULL); + glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_4_size, pixel_4_data); + glCompressedTexImage2D(GL_TEXTURE_2D, 4, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_4_width, pixel_4_height, 0, pixel_4_size, NULL); + glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_5_size, pixel_5_data); + glCompressedTexImage2D(GL_TEXTURE_2D, 5, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_5_width, pixel_5_height, 0, pixel_5_size, NULL); + glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_6_size, pixel_6_data); + glCompressedTexImage2D(GL_TEXTURE_2D, 6, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_6_width, pixel_6_height, 0, pixel_6_size, NULL); + glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_7_size, pixel_7_data); + glCompressedTexImage2D(GL_TEXTURE_2D, 7, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_7_width, pixel_7_height, 0, pixel_7_size, NULL); + glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_8_size, pixel_8_data); + glCompressedTexImage2D(GL_TEXTURE_2D, 8, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_8_width, pixel_8_height, 0, pixel_8_size, NULL); + glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_9_size, pixel_9_data); + glCompressedTexImage2D(GL_TEXTURE_2D, 9, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_9_width, pixel_9_height, 0, pixel_9_size, NULL); + + EXPECT_GL_NO_ERROR(); + + glUseProgram(mTextureProgram); + glUniform1i(mTextureUniformLocation, 0); + + drawQuad(mTextureProgram, "position", 0.5f); + + EXPECT_GL_NO_ERROR(); + + glDeleteTextures(1, &buffer); + glDeleteTextures(1, &texture); + + EXPECT_GL_NO_ERROR(); +} + + +TEST_P(DXT1CompressedTextureTestD3D11, PBOCompressedTexStorage) +{ + if (getClientMajorVersion() < 3 && !extensionEnabled("GL_EXT_texture_compression_dxt1")) + { + return; + } + + if (getClientMajorVersion() < 3 && + (!extensionEnabled("GL_EXT_texture_storage") || !extensionEnabled("GL_OES_rgb8_rgba8"))) + { + return; + } + + GLuint texture; + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_2D, texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + if (getClientMajorVersion() < 3) + { + glTexStorage2DEXT(GL_TEXTURE_2D, pixel_levels, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width, pixel_0_height); + } + else + { + glTexStorage2D(GL_TEXTURE_2D, pixel_levels, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width, pixel_0_height); + } + EXPECT_GL_NO_ERROR(); + + GLuint buffer; + glGenBuffers(1, &buffer); + glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer); + glBufferData(GL_PIXEL_UNPACK_BUFFER, pixel_0_size, NULL, GL_STREAM_DRAW); + EXPECT_GL_NO_ERROR(); + + glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_0_size, pixel_0_data); + glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, pixel_0_width, pixel_0_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_size, NULL); + glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_1_size, pixel_1_data); + glCompressedTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, pixel_1_width, pixel_1_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_1_size, NULL); + glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_2_size, pixel_2_data); + glCompressedTexSubImage2D(GL_TEXTURE_2D, 2, 0, 0, pixel_2_width, pixel_2_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_2_size, NULL); + glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_3_size, pixel_3_data); + glCompressedTexSubImage2D(GL_TEXTURE_2D, 3, 0, 0, pixel_3_width, pixel_3_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_3_size, NULL); + glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_4_size, pixel_4_data); + glCompressedTexSubImage2D(GL_TEXTURE_2D, 4, 0, 0, pixel_4_width, pixel_4_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_4_size, NULL); + glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_5_size, pixel_5_data); + glCompressedTexSubImage2D(GL_TEXTURE_2D, 5, 0, 0, pixel_5_width, pixel_5_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_5_size, NULL); + glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_6_size, pixel_6_data); + glCompressedTexSubImage2D(GL_TEXTURE_2D, 6, 0, 0, pixel_6_width, pixel_6_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_6_size, NULL); + glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_7_size, pixel_7_data); + glCompressedTexSubImage2D(GL_TEXTURE_2D, 7, 0, 0, pixel_7_width, pixel_7_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_7_size, NULL); + glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_8_size, pixel_8_data); + glCompressedTexSubImage2D(GL_TEXTURE_2D, 8, 0, 0, pixel_8_width, pixel_8_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_8_size, NULL); + glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_9_size, pixel_9_data); + glCompressedTexSubImage2D(GL_TEXTURE_2D, 9, 0, 0, pixel_9_width, pixel_9_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_9_size, NULL); + + EXPECT_GL_NO_ERROR(); + + glUseProgram(mTextureProgram); + glUniform1i(mTextureUniformLocation, 0); + + drawQuad(mTextureProgram, "position", 0.5f); + + EXPECT_GL_NO_ERROR(); + + glDeleteTextures(1, &texture); + + EXPECT_GL_NO_ERROR(); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(DXT1CompressedTextureTest, + ES2_D3D9(), + ES2_D3D11(), + ES2_D3D11_FL9_3(), + ES2_OPENGL(), + ES3_OPENGL(), + ES2_OPENGLES(), + ES3_OPENGLES()); + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(DXT1CompressedTextureTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); + +ANGLE_INSTANTIATE_TEST(DXT1CompressedTextureTestD3D11, ES2_D3D11(), ES3_D3D11(), ES2_D3D11_FL9_3()); diff --git a/gfx/angle/src/tests/gl_tests/DebugMarkerTest.cpp b/gfx/angle/src/tests/gl_tests/DebugMarkerTest.cpp new file mode 100755 index 000000000..6bd4a4322 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/DebugMarkerTest.cpp @@ -0,0 +1,71 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// DebugMarkerTest: +// Basic tests to ensure EXT_debug_marker entry points work. + +#include "test_utils/ANGLETest.h" + +using namespace angle; + +namespace +{ + +class DebugMarkerTest : public ANGLETest +{ + protected: + DebugMarkerTest() + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } +}; + +// Simple test to ensure the various EXT_debug_marker entry points don't crash. +// The debug markers can be validated by capturing this test under PIX/Graphics Diagnostics. +TEST_P(DebugMarkerTest, BasicValidation) +{ + if (!extensionEnabled("GL_EXT_debug_marker")) + { + std::cout << "Test skipped due to missing GL_EXT_debug_marker" << std::endl; + return; + } + + std::string eventMarkerCaption = "Test event marker caption"; + std::string groupMarkerCaption = "Test group marker caption"; + + glPushGroupMarkerEXT(static_cast<GLsizei>(groupMarkerCaption.length()), + groupMarkerCaption.c_str()); + + // Do some basic operations between calls to extension entry points + glClearColor(1.0f, 1.0f, 1.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + glInsertEventMarkerEXT(static_cast<GLsizei>(eventMarkerCaption.length()), + eventMarkerCaption.c_str()); + glClearColor(1.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + glPushGroupMarkerEXT(0, NULL); + glClearColor(0.0f, 1.0f, 0.0f, 0.0f); + glClear(GL_COLOR_BUFFER_BIT); + + glPopGroupMarkerEXT(); + glClearColor(0.0f, 0.0f, 1.0f, 0.0f); + glClear(GL_COLOR_BUFFER_BIT); + + glPopGroupMarkerEXT(); + + ASSERT_GL_NO_ERROR(); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(DebugMarkerTest, ES2_D3D9(), ES2_D3D11(), ES2_OPENGL(), ES2_OPENGLES()); + +} // namespace diff --git a/gfx/angle/src/tests/gl_tests/DebugTest.cpp b/gfx/angle/src/tests/gl_tests/DebugTest.cpp new file mode 100755 index 000000000..fc79c5f64 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/DebugTest.cpp @@ -0,0 +1,451 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +// DebugTest.cpp : Tests of the GL_KHR_debug extension + +#include "test_utils/ANGLETest.h" + +namespace angle +{ + +class DebugTest : public ANGLETest +{ + protected: + DebugTest() : mDebugExtensionAvailable(false) + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + setConfigDepthBits(24); + setDebugEnabled(true); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + mDebugExtensionAvailable = extensionEnabled("GL_KHR_debug"); + if (mDebugExtensionAvailable) + { + glEnable(GL_DEBUG_OUTPUT); + } + } + + bool mDebugExtensionAvailable; +}; + +struct Message +{ + GLenum source; + GLenum type; + GLuint id; + GLenum severity; + std::string message; + const void *userParam; +}; + +static void GL_APIENTRY Callback(GLenum source, + GLenum type, + GLuint id, + GLenum severity, + GLsizei length, + const GLchar *message, + const void *userParam) +{ + Message m{source, type, id, severity, std::string(message, length), userParam}; + std::vector<Message> *messages = + static_cast<std::vector<Message> *>(const_cast<void *>(userParam)); + messages->push_back(m); +} + +// Test that all ANGLE back-ends have GL_KHR_debug enabled +TEST_P(DebugTest, Enabled) +{ + ASSERT_TRUE(mDebugExtensionAvailable); +} + +// Test that when debug output is disabled, no message are outputted +TEST_P(DebugTest, DisabledOutput) +{ + if (!mDebugExtensionAvailable) + { + std::cout << "Test skipped because GL_KHR_debug is not available." << std::endl; + return; + } + + glDisable(GL_DEBUG_OUTPUT); + + glDebugMessageInsertKHR(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_OTHER, 1, + GL_DEBUG_SEVERITY_NOTIFICATION, -1, "discarded"); + + GLint numMessages = 0; + glGetIntegerv(GL_DEBUG_LOGGED_MESSAGES, &numMessages); + ASSERT_EQ(0, numMessages); + + std::vector<Message> messages; + glDebugMessageCallbackKHR(Callback, &messages); + glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); + + ASSERT_EQ(0u, messages.size()); +} + +// Test a basic flow of inserting a message and reading it back +TEST_P(DebugTest, InsertMessage) +{ + if (!mDebugExtensionAvailable) + { + std::cout << "Test skipped because GL_KHR_debug is not available." << std::endl; + return; + } + + const GLenum source = GL_DEBUG_SOURCE_APPLICATION; + const GLenum type = GL_DEBUG_TYPE_OTHER; + const GLuint id = 1; + const GLenum severity = GL_DEBUG_SEVERITY_NOTIFICATION; + const std::string message = "Message"; + + glDebugMessageInsertKHR(source, type, id, severity, -1, message.c_str()); + + GLint numMessages = 0; + glGetIntegerv(GL_DEBUG_LOGGED_MESSAGES, &numMessages); + ASSERT_EQ(1, numMessages); + + GLint messageLength = 0; + glGetIntegerv(GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH, &messageLength); + EXPECT_EQ(static_cast<GLint>(message.length()), messageLength); + + GLenum sourceBuf = 0; + GLenum typeBuf = 0; + GLenum idBuf = 0; + GLenum severityBuf = 0; + GLsizei lengthBuf = 0; + std::vector<char> messageBuf(messageLength + 1); + GLuint ret = + glGetDebugMessageLogKHR(1, static_cast<GLsizei>(messageBuf.size()), &sourceBuf, &typeBuf, + &idBuf, &severityBuf, &lengthBuf, messageBuf.data()); + EXPECT_EQ(1u, ret); + EXPECT_EQ(source, sourceBuf); + EXPECT_EQ(type, typeBuf); + EXPECT_EQ(id, idBuf); + EXPECT_EQ(severity, severityBuf); + EXPECT_EQ(lengthBuf, messageLength); + EXPECT_STREQ(message.c_str(), messageBuf.data()); + + glGetIntegerv(GL_DEBUG_LOGGED_MESSAGES, &numMessages); + EXPECT_EQ(0, numMessages); + + ASSERT_GL_NO_ERROR(); +} + +// Test inserting multiple messages +TEST_P(DebugTest, InsertMessageMultiple) +{ + if (!mDebugExtensionAvailable) + { + std::cout << "Test skipped because GL_KHR_debug is not available." << std::endl; + return; + } + + const GLenum source = GL_DEBUG_SOURCE_APPLICATION; + const GLenum type = GL_DEBUG_TYPE_OTHER; + const GLuint startID = 1; + const GLenum severity = GL_DEBUG_SEVERITY_NOTIFICATION; + const char messageRepeatChar = 'm'; + const size_t messageCount = 32; + + for (size_t i = 0; i < messageCount; i++) + { + std::string message(i + 1, messageRepeatChar); + glDebugMessageInsertKHR(source, type, startID + static_cast<GLuint>(i), severity, -1, + message.c_str()); + } + + GLint numMessages = 0; + glGetIntegerv(GL_DEBUG_LOGGED_MESSAGES, &numMessages); + ASSERT_EQ(static_cast<GLint>(messageCount), numMessages); + + for (size_t i = 0; i < messageCount; i++) + { + glGetIntegerv(GL_DEBUG_LOGGED_MESSAGES, &numMessages); + EXPECT_EQ(static_cast<GLint>(messageCount - i), numMessages); + + std::string expectedMessage(i + 1, messageRepeatChar); + + GLint messageLength = 0; + glGetIntegerv(GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH, &messageLength); + EXPECT_EQ(static_cast<GLint>(expectedMessage.length()), messageLength); + + GLenum sourceBuf = 0; + GLenum typeBuf = 0; + GLenum idBuf = 0; + GLenum severityBuf = 0; + GLsizei lengthBuf = 0; + std::vector<char> messageBuf(messageLength + 1); + GLuint ret = + glGetDebugMessageLogKHR(1, static_cast<GLsizei>(messageBuf.size()), &sourceBuf, + &typeBuf, &idBuf, &severityBuf, &lengthBuf, messageBuf.data()); + EXPECT_EQ(1u, ret); + EXPECT_EQ(source, sourceBuf); + EXPECT_EQ(type, typeBuf); + EXPECT_EQ(startID + i, idBuf); + EXPECT_EQ(severity, severityBuf); + EXPECT_EQ(lengthBuf, messageLength); + EXPECT_STREQ(expectedMessage.c_str(), messageBuf.data()); + } + + glGetIntegerv(GL_DEBUG_LOGGED_MESSAGES, &numMessages); + EXPECT_EQ(0, numMessages); + + ASSERT_GL_NO_ERROR(); +} + +// Test using a debug callback +TEST_P(DebugTest, DebugCallback) +{ + if (!mDebugExtensionAvailable) + { + std::cout << "Test skipped because GL_KHR_debug is not available." << std::endl; + return; + } + + std::vector<Message> messages; + + glDebugMessageCallbackKHR(Callback, &messages); + glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); + + const GLenum source = GL_DEBUG_SOURCE_APPLICATION; + const GLenum type = GL_DEBUG_TYPE_OTHER; + const GLuint id = 1; + const GLenum severity = GL_DEBUG_SEVERITY_NOTIFICATION; + const std::string message = "Message"; + + glDebugMessageInsertKHR(source, type, id, severity, -1, message.c_str()); + + GLint numMessages = 0; + glGetIntegerv(GL_DEBUG_LOGGED_MESSAGES, &numMessages); + EXPECT_EQ(0, numMessages); + + ASSERT_EQ(1u, messages.size()); + + const Message &m = messages.front(); + EXPECT_EQ(source, m.source); + EXPECT_EQ(type, m.type); + EXPECT_EQ(id, m.id); + EXPECT_EQ(severity, m.severity); + EXPECT_EQ(message, m.message); + + ASSERT_GL_NO_ERROR(); +} + +// Test the glGetPointervKHR entry point +TEST_P(DebugTest, GetPointer) +{ + if (!mDebugExtensionAvailable) + { + std::cout << "Test skipped because GL_KHR_debug is not available." << std::endl; + return; + } + + std::vector<Message> messages; + + glDebugMessageCallbackKHR(Callback, &messages); + + void *callback = nullptr; + glGetPointervKHR(GL_DEBUG_CALLBACK_FUNCTION, &callback); + EXPECT_EQ(reinterpret_cast<void *>(Callback), callback); + + void *userData = nullptr; + glGetPointervKHR(GL_DEBUG_CALLBACK_USER_PARAM, &userData); + EXPECT_EQ(static_cast<void *>(&messages), userData); +} + +// Test usage of message control. Example taken from GL_KHR_debug spec. +TEST_P(DebugTest, MessageControl1) +{ + if (!mDebugExtensionAvailable) + { + std::cout << "Test skipped because GL_KHR_debug is not available." << std::endl; + return; + } + + std::vector<Message> messages; + + glDebugMessageCallbackKHR(Callback, &messages); + glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); + + // Setup of the default active debug group: Filter everything in + glDebugMessageControlKHR(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, NULL, GL_TRUE); + + // Generate a debug marker debug output message + glDebugMessageInsertKHR(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, 100, + GL_DEBUG_SEVERITY_NOTIFICATION, -1, "Message 1"); + + // Push debug group 1 + glPushDebugGroupKHR(GL_DEBUG_SOURCE_APPLICATION, 1, -1, "Message 2"); + + // Setup of the debug group 1: Filter everything out + glDebugMessageControlKHR(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, NULL, GL_FALSE); + + // This message won't appear in the debug output log of + glDebugMessageInsertKHR(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, 100, + GL_DEBUG_SEVERITY_NOTIFICATION, -1, "Message 3"); + + // Pop debug group 1, restore the volume control of the default debug group. + glPopDebugGroupKHR(); + + // Generate a debug marker debug output message + glDebugMessageInsertKHR(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, 100, + GL_DEBUG_SEVERITY_NOTIFICATION, -1, "Message 5"); + + // Expected debug output from the GL implementation + // Message 1 + // Message 2 + // Message 2 + // Message 5 + EXPECT_EQ(4u, messages.size()); + EXPECT_STREQ(messages[0].message.c_str(), "Message 1"); + EXPECT_STREQ(messages[1].message.c_str(), "Message 2"); + EXPECT_STREQ(messages[2].message.c_str(), "Message 2"); + EXPECT_STREQ(messages[3].message.c_str(), "Message 5"); + + ASSERT_GL_NO_ERROR(); +} + +// Test usage of message control. Example taken from GL_KHR_debug spec. +TEST_P(DebugTest, MessageControl2) +{ + if (!mDebugExtensionAvailable) + { + std::cout << "Test skipped because GL_KHR_debug is not available." << std::endl; + return; + } + + std::vector<Message> messages; + + glDebugMessageCallbackKHR(Callback, &messages); + glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); + + // Setup the control of de debug output for the default debug group + glDebugMessageControlKHR(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, NULL, GL_FALSE); + glDebugMessageControlKHR(GL_DEBUG_SOURCE_THIRD_PARTY, GL_DONT_CARE, GL_DONT_CARE, 0, NULL, + GL_FALSE); + std::vector<GLuint> ids0 = {1234, 2345, 3456, 4567}; + glDebugMessageControlKHR(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_OTHER, GL_DONT_CARE, + static_cast<GLuint>(ids0.size()), ids0.data(), GL_FALSE); + glDebugMessageControlKHR(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_PORTABILITY, GL_DONT_CARE, + static_cast<GLuint>(ids0.size()), ids0.data(), GL_FALSE); + + // Push debug group 1 + // Inherit of the default debug group debug output volume control + // Filtered out by glDebugMessageControl + glPushDebugGroupKHR(GL_DEBUG_SOURCE_APPLICATION, 1, -1, "Message 1"); + + // In this section of the code, we are interested in performances. + glDebugMessageControlKHR(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_PERFORMANCE, GL_DONT_CARE, + 0, NULL, GL_TRUE); + // But we already identify that some messages are not really useful for us. + std::vector<GLuint> ids1 = {5678, 6789}; + glDebugMessageControlKHR(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_OTHER, GL_DONT_CARE, + static_cast<GLuint>(ids1.size()), ids1.data(), GL_FALSE); + + glDebugMessageInsertKHR(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_PERFORMANCE, 1357, + GL_DEBUG_SEVERITY_MEDIUM, -1, "Message 2"); + glDebugMessageInsertKHR(GL_DEBUG_SOURCE_THIRD_PARTY, // We still filter out these messages. + GL_DEBUG_TYPE_OTHER, 3579, GL_DEBUG_SEVERITY_MEDIUM, -1, "Message 3"); + + glPopDebugGroupKHR(); + + // Expected debug output from the GL implementation + // Message 2 + EXPECT_EQ(1u, messages.size()); + EXPECT_STREQ(messages[0].message.c_str(), "Message 2"); + + ASSERT_GL_NO_ERROR(); +} + +// Test basic usage of setting and getting labels +TEST_P(DebugTest, ObjectLabels) +{ + if (!mDebugExtensionAvailable) + { + std::cout << "Test skipped because GL_KHR_debug is not available." << std::endl; + return; + } + + GLuint renderbuffer = 0; + glGenRenderbuffers(1, &renderbuffer); + glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer); + + const std::string &label = "renderbuffer"; + glObjectLabelKHR(GL_RENDERBUFFER, renderbuffer, -1, label.c_str()); + + std::vector<char> labelBuf(label.length() + 1); + GLsizei labelLengthBuf = 0; + glGetObjectLabelKHR(GL_RENDERBUFFER, renderbuffer, static_cast<GLsizei>(labelBuf.size()), + &labelLengthBuf, labelBuf.data()); + + EXPECT_EQ(static_cast<GLsizei>(label.length()), labelLengthBuf); + EXPECT_STREQ(label.c_str(), labelBuf.data()); + + ASSERT_GL_NO_ERROR(); + + glDeleteRenderbuffers(1, &renderbuffer); + + glObjectLabelKHR(GL_RENDERBUFFER, renderbuffer, -1, label.c_str()); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + glGetObjectLabelKHR(GL_RENDERBUFFER, renderbuffer, static_cast<GLsizei>(labelBuf.size()), + &labelLengthBuf, labelBuf.data()); + EXPECT_GL_ERROR(GL_INVALID_VALUE); +} + +// Test basic usage of setting and getting labels +TEST_P(DebugTest, ObjectPtrLabels) +{ + if (!mDebugExtensionAvailable || getClientMajorVersion() < 3) + { + std::cout << "Test skipped because GL_KHR_debug or ES3 is not available." << std::endl; + return; + } + + GLsync sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); + + const std::string &label = "sync"; + glObjectPtrLabelKHR(sync, -1, label.c_str()); + + std::vector<char> labelBuf(label.length() + 1); + GLsizei labelLengthBuf = 0; + glGetObjectPtrLabelKHR(sync, static_cast<GLsizei>(labelBuf.size()), &labelLengthBuf, + labelBuf.data()); + + EXPECT_EQ(static_cast<GLsizei>(label.length()), labelLengthBuf); + EXPECT_STREQ(label.c_str(), labelBuf.data()); + + ASSERT_GL_NO_ERROR(); + + glDeleteSync(sync); + + glObjectPtrLabelKHR(sync, -1, label.c_str()); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + glGetObjectPtrLabelKHR(sync, static_cast<GLsizei>(labelBuf.size()), &labelLengthBuf, + labelBuf.data()); + EXPECT_GL_ERROR(GL_INVALID_VALUE); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these +// tests should be run against. +ANGLE_INSTANTIATE_TEST(DebugTest, + ES2_D3D9(), + ES2_D3D11(), + ES3_D3D11(), + ES2_OPENGL(), + ES3_OPENGL()); + +} // namespace angle diff --git a/gfx/angle/src/tests/gl_tests/DepthStencilFormatsTest.cpp b/gfx/angle/src/tests/gl_tests/DepthStencilFormatsTest.cpp new file mode 100755 index 000000000..f62a16578 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/DepthStencilFormatsTest.cpp @@ -0,0 +1,192 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "test_utils/ANGLETest.h" + +using namespace angle; + +class DepthStencilFormatsTestBase : public ANGLETest +{ + protected: + DepthStencilFormatsTestBase() + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + bool checkTexImageFormatSupport(GLenum format, GLenum type) + { + EXPECT_GL_NO_ERROR(); + + GLuint tex = 0; + glGenTextures(1, &tex); + glBindTexture(GL_TEXTURE_2D, tex); + glTexImage2D(GL_TEXTURE_2D, 0, format, 1, 1, 0, format, type, NULL); + glDeleteTextures(1, &tex); + + return (glGetError() == GL_NO_ERROR); + } + + bool checkTexStorageFormatSupport(GLenum internalFormat) + { + EXPECT_GL_NO_ERROR(); + + GLuint tex = 0; + glGenTextures(1, &tex); + glBindTexture(GL_TEXTURE_2D, tex); + glTexStorage2DEXT(GL_TEXTURE_2D, 1, internalFormat, 1, 1); + glDeleteTextures(1, &tex); + + return (glGetError() == GL_NO_ERROR); + } + + bool checkRenderbufferFormatSupport(GLenum internalFormat) + { + EXPECT_GL_NO_ERROR(); + + GLuint rb = 0; + glGenRenderbuffers(1, &rb); + glBindRenderbuffer(GL_RENDERBUFFER, rb); + glRenderbufferStorage(GL_RENDERBUFFER, internalFormat, 1, 1); + glDeleteRenderbuffers(1, &rb); + + return (glGetError() == GL_NO_ERROR); + } + + virtual void SetUp() + { + ANGLETest::SetUp(); + + const std::string vertexShaderSource = SHADER_SOURCE + ( + precision highp float; + attribute vec4 position; + varying vec2 texcoord; + + void main() + { + gl_Position = position; + texcoord = (position.xy * 0.5) + 0.5; + } + ); + + const std::string fragmentShaderSource = SHADER_SOURCE + ( + precision highp float; + uniform sampler2D tex; + varying vec2 texcoord; + + void main() + { + gl_FragColor = texture2D(tex, texcoord); + } + ); + + mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource); + if (mProgram == 0) + { + FAIL() << "shader compilation failed."; + } + + mTextureUniformLocation = glGetUniformLocation(mProgram, "tex"); + EXPECT_NE(-1, mTextureUniformLocation); + + glGenTextures(1, &mTexture); + ASSERT_GL_NO_ERROR(); + } + + virtual void TearDown() + { + glDeleteProgram(mProgram); + glDeleteTextures(1, &mTexture); + + ANGLETest::TearDown(); + } + + GLuint mProgram; + GLuint mTexture; + GLint mTextureUniformLocation; +}; + +class DepthStencilFormatsTest : public DepthStencilFormatsTestBase +{}; + +class DepthStencilFormatsTestES3 : public DepthStencilFormatsTestBase +{}; + +TEST_P(DepthStencilFormatsTest, DepthTexture) +{ + bool shouldHaveTextureSupport = extensionEnabled("GL_ANGLE_depth_texture"); + EXPECT_EQ(shouldHaveTextureSupport, checkTexImageFormatSupport(GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT)); + EXPECT_EQ(shouldHaveTextureSupport, checkTexImageFormatSupport(GL_DEPTH_COMPONENT, GL_UNSIGNED_INT)); + + if (extensionEnabled("GL_EXT_texture_storage")) + { + EXPECT_EQ(shouldHaveTextureSupport, checkTexStorageFormatSupport(GL_DEPTH_COMPONENT16)); + EXPECT_EQ(shouldHaveTextureSupport, checkTexStorageFormatSupport(GL_DEPTH_COMPONENT32_OES)); + } +} + +TEST_P(DepthStencilFormatsTest, PackedDepthStencil) +{ + // Expected to fail in D3D9 if GL_OES_packed_depth_stencil is not present. + // Expected to fail in D3D11 if GL_OES_packed_depth_stencil or GL_ANGLE_depth_texture is not present. + + bool shouldHaveRenderbufferSupport = extensionEnabled("GL_OES_packed_depth_stencil"); + EXPECT_EQ(shouldHaveRenderbufferSupport, checkRenderbufferFormatSupport(GL_DEPTH24_STENCIL8_OES)); + + bool shouldHaveTextureSupport = extensionEnabled("GL_OES_packed_depth_stencil") && + extensionEnabled("GL_ANGLE_depth_texture"); + EXPECT_EQ(shouldHaveTextureSupport, checkTexImageFormatSupport(GL_DEPTH_STENCIL_OES, GL_UNSIGNED_INT_24_8_OES)); + + if (extensionEnabled("GL_EXT_texture_storage")) + { + EXPECT_EQ(shouldHaveTextureSupport, checkTexStorageFormatSupport(GL_DEPTH24_STENCIL8_OES)); + } +} + +TEST_P(DepthStencilFormatsTestES3, DrawWithDepthStencil) +{ + GLushort data[16]; + for (unsigned int i = 0; i < 16; i++) + { + data[i] = std::numeric_limits<GLushort>::max(); + } + glBindTexture(GL_TEXTURE_2D, mTexture); + glTexStorage2D(GL_TEXTURE_2D, 1, GL_DEPTH_COMPONENT16, 4, 4); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, data); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + glUseProgram(mProgram); + glUniform1i(mTextureUniformLocation, 0); + + glClear(GL_COLOR_BUFFER_BIT); + drawQuad(mProgram, "position", 0.5f); + + ASSERT_GL_NO_ERROR(); + + GLubyte pixel[4]; + glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &pixel); + + // Only require the red and alpha channels have the correct values, the depth texture extensions + // leave the green and blue channels undefined + ASSERT_NEAR(255, pixel[0], 2.0); + ASSERT_EQ(255, pixel[3]); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(DepthStencilFormatsTest, + ES2_D3D9(), + ES2_D3D11(), + ES2_OPENGL(), + ES2_OPENGLES()); +ANGLE_INSTANTIATE_TEST(DepthStencilFormatsTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); diff --git a/gfx/angle/src/tests/gl_tests/DifferentStencilMasksTest.cpp b/gfx/angle/src/tests/gl_tests/DifferentStencilMasksTest.cpp new file mode 100755 index 000000000..7e1cd8a19 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/DifferentStencilMasksTest.cpp @@ -0,0 +1,178 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// DifferentStencilMasksTest: +// Tests the equality between stencilWriteMask and stencilBackWriteMask. +// + +#include "test_utils/ANGLETest.h" + +using namespace angle; + +namespace +{ +class DifferentStencilMasksTest : public ANGLETest +{ + protected: + DifferentStencilMasksTest() : mProgram(0) + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + setConfigDepthBits(24); + setConfigStencilBits(8); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + const std::string vertexShaderSource = SHADER_SOURCE + ( + precision highp float; + attribute vec4 position; + + void main() + { + gl_Position = position; + } + ); + + const std::string fragmentShaderSource = SHADER_SOURCE + ( + precision highp float; + + void main() + { + gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0); + } + ); + + mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource); + ASSERT_NE(0u, mProgram); + + glEnable(GL_STENCIL_TEST); + ASSERT_GL_NO_ERROR(); + } + + void TearDown() override + { + glDisable(GL_STENCIL_TEST); + if (mProgram != 0) + glDeleteProgram(mProgram); + + ANGLETest::TearDown(); + } + + GLuint mProgram; +}; + +// Tests that effectively same front and back masks are legal. +TEST_P(DifferentStencilMasksTest, DrawWithSameEffectiveMask) +{ + // 0x00ff and 0x01ff are effectively 0x00ff by being masked by the current stencil bits, 8. + glStencilMaskSeparate(GL_FRONT, 0x00ff); + glStencilMaskSeparate(GL_BACK, 0x01ff); + + glUseProgram(mProgram); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_GL_NO_ERROR(); +} + +// Tests that effectively different front and back masks are illegal. +TEST_P(DifferentStencilMasksTest, DrawWithDifferentMask) +{ + glStencilMaskSeparate(GL_FRONT, 0x0001); + glStencilMaskSeparate(GL_BACK, 0x0002); + + glUseProgram(mProgram); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_GL_ERROR(GL_INVALID_OPERATION); +} + +class DifferentStencilMasksWithoutStencilBufferTest : public ANGLETest +{ + protected: + DifferentStencilMasksWithoutStencilBufferTest() : mProgram(0) + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + setConfigDepthBits(0); + setConfigStencilBits(0); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + const std::string vertexShaderSource = SHADER_SOURCE + ( + precision highp float; + attribute vec4 position; + + void main() + { + gl_Position = position; + } + ); + + const std::string fragmentShaderSource = SHADER_SOURCE + ( + precision highp float; + + void main() + { + gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0); + } + ); + + mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource); + ASSERT_NE(0u, mProgram); + + glEnable(GL_STENCIL_TEST); + ASSERT_GL_NO_ERROR(); + } + + void TearDown() override + { + glDisable(GL_STENCIL_TEST); + if (mProgram != 0) + glDeleteProgram(mProgram); + + ANGLETest::TearDown(); + } + + GLuint mProgram; +}; + +// Tests that effectively different front and back masks, without stencil bits, are legal. +TEST_P(DifferentStencilMasksWithoutStencilBufferTest, DrawWithDifferentMask) +{ + glStencilMaskSeparate(GL_FRONT, 0x0001); + glStencilMaskSeparate(GL_BACK, 0x0002); + + glUseProgram(mProgram); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_GL_NO_ERROR(); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these +// tests should be run against. +ANGLE_INSTANTIATE_TEST(DifferentStencilMasksTest, ES2_D3D9(), ES2_D3D11(), ES3_D3D11(), ES2_OPENGL(), ES3_OPENGL()); +ANGLE_INSTANTIATE_TEST(DifferentStencilMasksWithoutStencilBufferTest, ES2_D3D9(), ES2_D3D11(), ES3_D3D11(), ES2_OPENGL(), ES3_OPENGL()); +} // anonymous namespace diff --git a/gfx/angle/src/tests/gl_tests/DiscardFramebufferEXTTest.cpp b/gfx/angle/src/tests/gl_tests/DiscardFramebufferEXTTest.cpp new file mode 100755 index 000000000..1e09ed120 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/DiscardFramebufferEXTTest.cpp @@ -0,0 +1,143 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "test_utils/ANGLETest.h" + +using namespace angle; + +class DiscardFramebufferEXTTest : public ANGLETest +{ +protected: + DiscardFramebufferEXTTest() + { + setWindowWidth(256); + setWindowHeight(256); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + setConfigDepthBits(24); + setConfigStencilBits(8); + } +}; + +TEST_P(DiscardFramebufferEXTTest, ExtensionEnabled) +{ + EGLPlatformParameters platform = GetParam().eglParameters; + + if (platform.renderer == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE) + { + EXPECT_TRUE(extensionEnabled("EXT_discard_framebuffer")); + } + else + { + // Other platforms don't currently implement this extension + EXPECT_FALSE(extensionEnabled("EXT_discard_framebuffer")); + } +} + +TEST_P(DiscardFramebufferEXTTest, DefaultFramebuffer) +{ + if (!extensionEnabled("EXT_discard_framebuffer")) + { + std::cout << "Test skipped because EXT_discard_framebuffer is not available." << std::endl; + return; + } + + // These should succeed on the default framebuffer + const GLenum discards1[] = { GL_COLOR_EXT }; + glDiscardFramebufferEXT(GL_FRAMEBUFFER, 1, discards1); + EXPECT_GL_NO_ERROR(); + + const GLenum discards2[] = { GL_DEPTH_EXT }; + glDiscardFramebufferEXT(GL_FRAMEBUFFER, 1, discards2); + EXPECT_GL_NO_ERROR(); + + const GLenum discards3[] = { GL_STENCIL_EXT }; + glDiscardFramebufferEXT(GL_FRAMEBUFFER, 1, discards3); + EXPECT_GL_NO_ERROR(); + + const GLenum discards4[] = { GL_STENCIL_EXT, GL_COLOR_EXT, GL_DEPTH_EXT }; + glDiscardFramebufferEXT(GL_FRAMEBUFFER, 3, discards4); + EXPECT_GL_NO_ERROR(); + + // These should fail on the default framebuffer + const GLenum discards5[] = { GL_COLOR_ATTACHMENT0 }; + glDiscardFramebufferEXT(GL_FRAMEBUFFER, 1, discards5); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + const GLenum discards6[] = { GL_DEPTH_ATTACHMENT }; + glDiscardFramebufferEXT(GL_FRAMEBUFFER, 1, discards6); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + const GLenum discards7[] = { GL_STENCIL_ATTACHMENT }; + glDiscardFramebufferEXT(GL_FRAMEBUFFER, 1, discards7); + EXPECT_GL_ERROR(GL_INVALID_ENUM); +} + +TEST_P(DiscardFramebufferEXTTest, NonDefaultFramebuffer) +{ + if (!extensionEnabled("EXT_discard_framebuffer")) + { + std::cout << "Test skipped because EXT_discard_framebuffer is not available." << std::endl; + return; + } + + GLuint tex2D; + GLuint framebuffer; + + // Create a basic off-screen framebuffer + // Don't create a depth/stencil texture, to ensure that also works correctly + glGenTextures(1, &tex2D); + glGenFramebuffers(1, &framebuffer); + glBindTexture(GL_TEXTURE_2D, tex2D); + glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, getWindowWidth(), getWindowHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex2D, 0); + ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + // These should fail on the non-default framebuffer + const GLenum discards1[] = { GL_COLOR_EXT }; + glDiscardFramebufferEXT(GL_FRAMEBUFFER, 1, discards1); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + const GLenum discards2[] = { GL_DEPTH_EXT }; + glDiscardFramebufferEXT(GL_FRAMEBUFFER, 1, discards2); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + const GLenum discards3[] = { GL_STENCIL_EXT }; + glDiscardFramebufferEXT(GL_FRAMEBUFFER, 1, discards3); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + const GLenum discards4[] = { GL_STENCIL_EXT, GL_COLOR_EXT, GL_DEPTH_EXT }; + glDiscardFramebufferEXT(GL_FRAMEBUFFER, 3, discards4); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + // These should succeed on the non-default framebuffer + const GLenum discards5[] = { GL_COLOR_ATTACHMENT0 }; + glDiscardFramebufferEXT(GL_FRAMEBUFFER, 1, discards5); + EXPECT_GL_NO_ERROR(); + + const GLenum discards6[] = { GL_DEPTH_ATTACHMENT }; + glDiscardFramebufferEXT(GL_FRAMEBUFFER, 1, discards6); + EXPECT_GL_NO_ERROR(); + + const GLenum discards7[] = { GL_STENCIL_ATTACHMENT }; + glDiscardFramebufferEXT(GL_FRAMEBUFFER, 1, discards7); + EXPECT_GL_NO_ERROR(); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(DiscardFramebufferEXTTest, + ES2_D3D9(), + ES2_D3D11(), + ES2_D3D11_FL9_3(), + ES2_OPENGL(), + ES3_OPENGL(), + ES2_OPENGLES(), + ES3_OPENGLES()); diff --git a/gfx/angle/src/tests/gl_tests/DrawBuffersTest.cpp b/gfx/angle/src/tests/gl_tests/DrawBuffersTest.cpp new file mode 100755 index 000000000..daf09e93c --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/DrawBuffersTest.cpp @@ -0,0 +1,517 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "test_utils/ANGLETest.h" +#include "test_utils/gl_raii.h" + +using namespace angle; + +class DrawBuffersTest : public ANGLETest +{ + protected: + DrawBuffersTest() + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + setConfigDepthBits(24); + mMaxDrawBuffers = 0; + } + + virtual void SetUp() + { + ANGLETest::SetUp(); + + // This test seems to fail on an nVidia machine when the window is hidden + SetWindowVisible(true); + + glGenFramebuffers(1, &mFBO); + glBindFramebuffer(GL_FRAMEBUFFER, mFBO); + + glGenTextures(4, mTextures); + + for (size_t texIndex = 0; texIndex < ArraySize(mTextures); texIndex++) + { + glBindTexture(GL_TEXTURE_2D, mTextures[texIndex]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWindowWidth(), getWindowHeight(), 0, GL_RGBA, + GL_UNSIGNED_BYTE, nullptr); + } + + GLfloat data[] = + { + -1.0f, 1.0f, + -1.0f, -2.0f, + 2.0f, 1.0f + }; + + glGenBuffers(1, &mBuffer); + glBindBuffer(GL_ARRAY_BUFFER, mBuffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 6, data, GL_STATIC_DRAW); + + glGetIntegerv(GL_MAX_DRAW_BUFFERS, &mMaxDrawBuffers); + + ASSERT_GL_NO_ERROR(); + } + + virtual void TearDown() + { + glDeleteFramebuffers(1, &mFBO); + glDeleteTextures(4, mTextures); + glDeleteBuffers(1, &mBuffer); + + ANGLETest::TearDown(); + } + + void setupMRTProgramESSL3(bool bufferEnabled[8], GLuint *programOut) + { + const std::string vertexShaderSource = + "#version 300 es\n" + "in vec4 position;\n" + "void main() {\n" + " gl_Position = position;\n" + "}\n"; + + std::stringstream strstr; + + strstr << "#version 300 es\n" + "precision highp float;\n"; + + for (unsigned int index = 0; index < 8; index++) + { + if (bufferEnabled[index]) + { + strstr << "layout(location = " << index << ") " + "out vec4 value" << index << ";\n"; + } + } + + strstr << "void main()\n" + "{\n"; + + for (unsigned int index = 0; index < 8; index++) + { + if (bufferEnabled[index]) + { + unsigned int r = (index + 1) & 1; + unsigned int g = (index + 1) & 2; + unsigned int b = (index + 1) & 4; + + strstr << " value" << index << " = vec4(" + << r << ".0, " << g << ".0, " + << b << ".0, 1.0);\n"; + } + } + + strstr << "}\n"; + + *programOut = CompileProgram(vertexShaderSource, strstr.str()); + if (*programOut == 0) + { + FAIL() << "shader compilation failed."; + } + + glUseProgram(*programOut); + + GLint location = glGetAttribLocation(*programOut, "position"); + ASSERT_NE(location, -1); + glBindBuffer(GL_ARRAY_BUFFER, mBuffer); + glVertexAttribPointer(location, 2, GL_FLOAT, GL_FALSE, 8, NULL); + glEnableVertexAttribArray(location); + } + + void setupMRTProgramESSL1(bool bufferEnabled[8], GLuint *programOut) + { + const std::string vertexShaderSource = + "attribute vec4 position;\n" + "void main() {\n" + " gl_Position = position;\n" + "}\n"; + + std::stringstream strstr; + + strstr << "#extension GL_EXT_draw_buffers : enable\n" + "precision highp float;\n" + "void main()\n" + "{\n"; + + for (unsigned int index = 0; index < 8; index++) + { + if (bufferEnabled[index]) + { + unsigned int r = (index + 1) & 1; + unsigned int g = (index + 1) & 2; + unsigned int b = (index + 1) & 4; + + strstr << " gl_FragData[" << index << "] = vec4(" + << r << ".0, " << g << ".0, " + << b << ".0, 1.0);\n"; + } + } + + strstr << "}\n"; + + *programOut = CompileProgram(vertexShaderSource, strstr.str()); + if (*programOut == 0) + { + FAIL() << "shader compilation failed."; + } + + glUseProgram(*programOut); + + GLint location = glGetAttribLocation(*programOut, "position"); + ASSERT_NE(location, -1); + glBindBuffer(GL_ARRAY_BUFFER, mBuffer); + glVertexAttribPointer(location, 2, GL_FLOAT, GL_FALSE, 8, NULL); + glEnableVertexAttribArray(location); + } + + void setupMRTProgram(bool bufferEnabled[8], GLuint *programOut) + { + if (getClientMajorVersion() == 3) + { + setupMRTProgramESSL3(bufferEnabled, programOut); + } + else + { + ASSERT_EQ(getClientMajorVersion(), 2); + setupMRTProgramESSL1(bufferEnabled, programOut); + } + } + + static GLColor getColorForIndex(unsigned int index) + { + GLubyte r = (((index + 1) & 1) > 0) ? 255 : 0; + GLubyte g = (((index + 1) & 2) > 0) ? 255 : 0; + GLubyte b = (((index + 1) & 4) > 0) ? 255 : 0; + return GLColor(r, g, b, 255u); + } + + void verifyAttachment2D(unsigned int index, GLuint textureName, GLenum target, GLint level) + { + for (GLint colorAttachment = 0; colorAttachment < mMaxDrawBuffers; colorAttachment++) + { + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + colorAttachment, GL_TEXTURE_2D, 0, 0); + } + + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, target, textureName, level); + + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, getColorForIndex(index)); + } + + void verifyAttachmentLayer(unsigned int index, GLuint texture, GLint level, GLint layer) + { + for (GLint colorAttachment = 0; colorAttachment < mMaxDrawBuffers; colorAttachment++) + { + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + colorAttachment, + GL_TEXTURE_2D, 0, 0); + } + + glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture, level, layer); + + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, getColorForIndex(index)); + } + + GLuint mFBO; + GLuint mTextures[4]; + GLuint mBuffer; + GLint mMaxDrawBuffers; +}; + +// Verify that GL_MAX_DRAW_BUFFERS returns the expected values for D3D11 +TEST_P(DrawBuffersTest, VerifyD3DLimits) +{ + EGLPlatformParameters platform = GetParam().eglParameters; + if (platform.renderer == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE) + { + if (platform.majorVersion == 9 && platform.minorVersion == 3) + { + // D3D11 Feature Level 9_3 supports 4 draw buffers + ASSERT_EQ(mMaxDrawBuffers, 4); + } + else + { + // D3D11 Feature Level 10_0+ supports 8 draw buffers + ASSERT_EQ(mMaxDrawBuffers, 8); + } + } + else + { + std::cout << "Test skipped for non-D3D11 renderers." << std::endl; + return; + } +} + +TEST_P(DrawBuffersTest, Gaps) +{ + if (getClientMajorVersion() < 3 && !extensionEnabled("GL_EXT_draw_buffers")) + { + std::cout << "Test skipped because ES3 or GL_EXT_draw_buffers is not available." + << std::endl; + return; + } + + if (IsWindows() && IsAMD() && IsDesktopOpenGL()) + { + // TODO(ynovikov): Investigate the failure (http://anglebug.com/1535) + std::cout << "Test disabled on Windows AMD OpenGL." << std::endl; + return; + } + + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, mTextures[0], 0); + + bool flags[8] = { false, true }; + + GLuint program; + setupMRTProgram(flags, &program); + + const GLenum bufs[] = + { + GL_NONE, + GL_COLOR_ATTACHMENT1 + }; + glUseProgram(program); + glDrawBuffersEXT(2, bufs); + glDrawArrays(GL_TRIANGLES, 0, 3); + + verifyAttachment2D(1, mTextures[0], GL_TEXTURE_2D, 0); + + glDeleteProgram(program); +} + +TEST_P(DrawBuffersTest, FirstAndLast) +{ + if (getClientMajorVersion() < 3 && !extensionEnabled("GL_EXT_draw_buffers")) + { + std::cout << "Test skipped because ES3 or GL_EXT_draw_buffers is not available." + << std::endl; + return; + } + + if (IsWindows() && IsAMD() && IsDesktopOpenGL()) + { + // TODO(ynovikov): Investigate the failure (https://anglebug.com/1533) + std::cout << "Test disabled on Windows AMD OpenGL." << std::endl; + return; + } + + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0); + + glBindTexture(GL_TEXTURE_2D, mTextures[1]); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT3, GL_TEXTURE_2D, mTextures[1], 0); + + bool flags[8] = { true, false, false, true }; + + GLuint program; + setupMRTProgram(flags, &program); + + const GLenum bufs[] = + { + GL_COLOR_ATTACHMENT0, + GL_NONE, + GL_NONE, + GL_COLOR_ATTACHMENT3 + }; + + glUseProgram(program); + glDrawBuffersEXT(4, bufs); + glDrawArrays(GL_TRIANGLES, 0, 3); + + verifyAttachment2D(0, mTextures[0], GL_TEXTURE_2D, 0); + verifyAttachment2D(3, mTextures[1], GL_TEXTURE_2D, 0); + + EXPECT_GL_NO_ERROR(); + + glDeleteProgram(program); +} + +TEST_P(DrawBuffersTest, FirstHalfNULL) +{ + if (getClientMajorVersion() < 3 && !extensionEnabled("GL_EXT_draw_buffers")) + { + std::cout << "Test skipped because ES3 or GL_EXT_draw_buffers is not available." + << std::endl; + return; + } + + if (IsWindows() && IsAMD() && IsDesktopOpenGL()) + { + // TODO(ynovikov): Investigate the failure (https://anglebug.com/1533) + std::cout << "Test disabled on Windows AMD OpenGL." << std::endl; + return; + } + + bool flags[8] = { false }; + GLenum bufs[8] = { GL_NONE }; + + GLuint halfMaxDrawBuffers = static_cast<GLuint>(mMaxDrawBuffers) / 2; + + for (GLuint texIndex = 0; texIndex < halfMaxDrawBuffers; texIndex++) + { + glBindTexture(GL_TEXTURE_2D, mTextures[texIndex]); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + halfMaxDrawBuffers + texIndex, GL_TEXTURE_2D, mTextures[texIndex], 0); + flags[texIndex + halfMaxDrawBuffers] = true; + bufs[texIndex + halfMaxDrawBuffers] = GL_COLOR_ATTACHMENT0 + halfMaxDrawBuffers + texIndex; + } + + GLuint program; + setupMRTProgram(flags, &program); + + glUseProgram(program); + glDrawBuffersEXT(mMaxDrawBuffers, bufs); + glDrawArrays(GL_TRIANGLES, 0, 3); + + for (GLuint texIndex = 0; texIndex < halfMaxDrawBuffers; texIndex++) + { + verifyAttachment2D(texIndex + halfMaxDrawBuffers, mTextures[texIndex], GL_TEXTURE_2D, 0); + } + + EXPECT_GL_NO_ERROR(); + + glDeleteProgram(program); +} + +TEST_P(DrawBuffersTest, UnwrittenOutputVariablesShouldNotCrash) +{ + if (getClientMajorVersion() < 3 && !extensionEnabled("GL_EXT_draw_buffers")) + { + std::cout << "Test skipped because ES3 or GL_EXT_draw_buffers is not available." + << std::endl; + return; + } + + // Bind two render targets but use a shader which writes only to the first one. + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0); + + glBindTexture(GL_TEXTURE_2D, mTextures[1]); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, mTextures[1], 0); + + bool flags[8] = { true, false }; + + GLuint program; + setupMRTProgram(flags, &program); + + const GLenum bufs[] = + { + GL_COLOR_ATTACHMENT0, + GL_COLOR_ATTACHMENT1, + GL_NONE, + GL_NONE, + }; + + glUseProgram(program); + glDrawBuffersEXT(4, bufs); + + // This call should not crash when we dynamically generate the HLSL code. + glDrawArrays(GL_TRIANGLES, 0, 3); + + verifyAttachment2D(0, mTextures[0], GL_TEXTURE_2D, 0); + + EXPECT_GL_NO_ERROR(); + + glDeleteProgram(program); +} + +// Test that binding multiple layers of a 3D texture works correctly +TEST_P(DrawBuffersTest, 3DTextures) +{ + if (getClientMajorVersion() < 3) + { + std::cout << "Test skipped because ES3 is not available." << std::endl; + return; + } + + GLTexture texture; + glBindTexture(GL_TEXTURE_3D, texture.get()); + glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, getWindowWidth(), getWindowHeight(), getWindowWidth(), + 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + + glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture.get(), 0, 0); + glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, texture.get(), 0, 1); + glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, texture.get(), 0, 2); + glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT3, texture.get(), 0, 3); + + bool flags[8] = {true, true, true, true, false}; + + GLuint program; + setupMRTProgram(flags, &program); + + const GLenum bufs[] = { + GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3, + }; + + glUseProgram(program); + glDrawBuffersEXT(4, bufs); + + glDrawArrays(GL_TRIANGLES, 0, 3); + + verifyAttachmentLayer(0, texture.get(), 0, 0); + verifyAttachmentLayer(1, texture.get(), 0, 1); + verifyAttachmentLayer(2, texture.get(), 0, 2); + verifyAttachmentLayer(3, texture.get(), 0, 3); + + EXPECT_GL_NO_ERROR(); + + glDeleteProgram(program); +} + +// Test that binding multiple layers of a 2D array texture works correctly +TEST_P(DrawBuffersTest, 2DArrayTextures) +{ + if (getClientMajorVersion() < 3) + { + std::cout << "Test skipped because ES3 is not available." << std::endl; + return; + } + + GLTexture texture; + glBindTexture(GL_TEXTURE_2D_ARRAY, texture.get()); + glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, getWindowWidth(), getWindowHeight(), + getWindowWidth(), 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + + glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture.get(), 0, 0); + glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, texture.get(), 0, 1); + glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, texture.get(), 0, 2); + glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT3, texture.get(), 0, 3); + + bool flags[8] = {true, true, true, true, false}; + + GLuint program; + setupMRTProgram(flags, &program); + + const GLenum bufs[] = { + GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3, + }; + + glUseProgram(program); + glDrawBuffersEXT(4, bufs); + + glDrawArrays(GL_TRIANGLES, 0, 3); + + verifyAttachmentLayer(0, texture.get(), 0, 0); + verifyAttachmentLayer(1, texture.get(), 0, 1); + verifyAttachmentLayer(2, texture.get(), 0, 2); + verifyAttachmentLayer(3, texture.get(), 0, 3); + + EXPECT_GL_NO_ERROR(); + + glDeleteProgram(program); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(DrawBuffersTest, + ES2_D3D11(), + ES3_D3D11(), + ES2_D3D11_FL9_3(), + ES2_OPENGL(), + ES3_OPENGL(), + ES2_OPENGLES(), + ES3_OPENGLES()); diff --git a/gfx/angle/src/tests/gl_tests/DrawElementsTest.cpp b/gfx/angle/src/tests/gl_tests/DrawElementsTest.cpp new file mode 100755 index 000000000..91f3c1e9a --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/DrawElementsTest.cpp @@ -0,0 +1,226 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// DrawElementsTest: +// Tests for indexed draws. +// + +#include "test_utils/ANGLETest.h" + +using namespace angle; + +namespace +{ + +class DrawElementsTest : public ANGLETest +{ + protected: + DrawElementsTest() : mProgram(0u) + { + setWindowWidth(64); + setWindowHeight(64); + setConfigRedBits(8); + setConfigGreenBits(8); + } + + ~DrawElementsTest() + { + for (GLuint indexBuffer : mIndexBuffers) + { + if (indexBuffer != 0) + { + glDeleteBuffers(1, &indexBuffer); + } + } + + for (GLuint vertexArray : mVertexArrays) + { + if (vertexArray != 0) + { + glDeleteVertexArrays(1, &vertexArray); + } + } + + for (GLuint vertexBuffer : mVertexBuffers) + { + if (vertexBuffer != 0) + { + glDeleteBuffers(1, &vertexBuffer); + } + } + + if (mProgram != 0u) + { + glDeleteProgram(mProgram); + } + } + + std::vector<GLuint> mIndexBuffers; + std::vector<GLuint> mVertexArrays; + std::vector<GLuint> mVertexBuffers; + GLuint mProgram; +}; + +// Test a state desync that can occur when using a streaming index buffer in GL in concert with +// deleting the applied index buffer. +TEST_P(DrawElementsTest, DeletingAfterStreamingIndexes) +{ + // Init program + const std::string &vertexShader = + "attribute vec2 position;\n" + "attribute vec2 testFlag;\n" + "varying vec2 v_data;\n" + "void main() {\n" + " gl_Position = vec4(position, 0, 1);\n" + " v_data = testFlag;\n" + "}"; + + const std::string &fragmentShader = + "varying highp vec2 v_data;\n" + "void main() {\n" + " gl_FragColor = vec4(v_data, 0, 1);\n" + "}"; + + mProgram = CompileProgram(vertexShader, fragmentShader); + ASSERT_NE(0u, mProgram); + glUseProgram(mProgram); + + GLint positionLocation = glGetAttribLocation(mProgram, "position"); + ASSERT_NE(-1, positionLocation); + + GLint testFlagLocation = glGetAttribLocation(mProgram, "testFlag"); + ASSERT_NE(-1, testFlagLocation); + + mIndexBuffers.resize(3u); + glGenBuffers(3, &mIndexBuffers[0]); + + mVertexArrays.resize(2); + glGenVertexArrays(2, &mVertexArrays[0]); + + mVertexBuffers.resize(2); + glGenBuffers(2, &mVertexBuffers[0]); + + std::vector<GLuint> indexData[2]; + indexData[0].push_back(0); + indexData[0].push_back(1); + indexData[0].push_back(2); + indexData[0].push_back(2); + indexData[0].push_back(3); + indexData[0].push_back(0); + + indexData[1] = indexData[0]; + for (GLuint &item : indexData[1]) + { + item += 4u; + } + + std::vector<GLfloat> positionData; + // quad verts + positionData.push_back(-1.0f); + positionData.push_back(1.0f); + positionData.push_back(-1.0f); + positionData.push_back(-1.0f); + positionData.push_back(1.0f); + positionData.push_back(-1.0f); + positionData.push_back(1.0f); + positionData.push_back(1.0f); + + // Repeat position data + positionData.push_back(-1.0f); + positionData.push_back(1.0f); + positionData.push_back(-1.0f); + positionData.push_back(-1.0f); + positionData.push_back(1.0f); + positionData.push_back(-1.0f); + positionData.push_back(1.0f); + positionData.push_back(1.0f); + + std::vector<GLfloat> testFlagData; + // red + testFlagData.push_back(1.0f); + testFlagData.push_back(0.0f); + testFlagData.push_back(1.0f); + testFlagData.push_back(0.0f); + testFlagData.push_back(1.0f); + testFlagData.push_back(0.0f); + testFlagData.push_back(1.0f); + testFlagData.push_back(0.0f); + + // green + testFlagData.push_back(0.0f); + testFlagData.push_back(1.0f); + testFlagData.push_back(0.0f); + testFlagData.push_back(1.0f); + testFlagData.push_back(0.0f); + testFlagData.push_back(1.0f); + testFlagData.push_back(0.0f); + testFlagData.push_back(1.0f); + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffers[0]); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * indexData[0].size(), &indexData[0][0], + GL_STATIC_DRAW); + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffers[2]); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * indexData[0].size(), &indexData[0][0], + GL_STATIC_DRAW); + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffers[1]); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * indexData[1].size(), &indexData[1][0], + GL_STATIC_DRAW); + + // Initialize first vertex array with second index buffer + glBindVertexArray(mVertexArrays[0]); + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffers[1]); + glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffers[0]); + glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * positionData.size(), &positionData[0], + GL_STATIC_DRAW); + glVertexAttribPointer(positionLocation, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 2, nullptr); + glEnableVertexAttribArray(positionLocation); + + glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffers[1]); + glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * testFlagData.size(), &testFlagData[0], + GL_STATIC_DRAW); + glVertexAttribPointer(testFlagLocation, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 2, nullptr); + glEnableVertexAttribArray(testFlagLocation); + + // Initialize second vertex array with first index buffer + glBindVertexArray(mVertexArrays[1]); + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffers[0]); + + glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffers[0]); + glVertexAttribPointer(positionLocation, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 2, nullptr); + glEnableVertexAttribArray(positionLocation); + + glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffers[1]); + glVertexAttribPointer(testFlagLocation, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 2, nullptr); + glEnableVertexAttribArray(testFlagLocation); + + ASSERT_GL_NO_ERROR(); + + glBindVertexArray(mVertexArrays[0]); + glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr); + EXPECT_PIXEL_EQ(0, 0, 0, 255, 0, 255); + + glBindVertexArray(mVertexArrays[1]); + glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr); + EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255); + + glBindVertexArray(mVertexArrays[0]); + glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr); + EXPECT_PIXEL_EQ(0, 0, 0, 255, 0, 255); + + // Trigger the bug here. + glDeleteBuffers(1, &mIndexBuffers[2]); + + glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr); + EXPECT_PIXEL_EQ(0, 0, 0, 255, 0, 255); + + ASSERT_GL_NO_ERROR(); +} + +ANGLE_INSTANTIATE_TEST(DrawElementsTest, ES3_OPENGL(), ES3_OPENGLES()); +} diff --git a/gfx/angle/src/tests/gl_tests/ETCTextureTest.cpp b/gfx/angle/src/tests/gl_tests/ETCTextureTest.cpp new file mode 100755 index 000000000..24fdd2263 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/ETCTextureTest.cpp @@ -0,0 +1,85 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// ETCTextureTest: +// Tests for ETC lossy decode formats. +// + +#include "test_utils/ANGLETest.h" + +using namespace angle; + +namespace +{ + +class ETCTextureTest : public ANGLETest +{ + protected: + ETCTextureTest() : mTexture(0u) + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + glGenTextures(1, &mTexture); + ASSERT_GL_NO_ERROR(); + } + + void TearDown() override + { + glDeleteTextures(1, &mTexture); + + ANGLETest::TearDown(); + } + + GLuint mTexture; +}; + +// Tests a texture with ETC1 lossy decode format +TEST_P(ETCTextureTest, ETC1Validation) +{ + bool supported = extensionEnabled("GL_ANGLE_lossy_etc_decode"); + + glBindTexture(GL_TEXTURE_2D, mTexture); + + GLubyte pixel[8] = { 0x0, 0x0, 0xf8, 0x2, 0x43, 0xff, 0x4, 0x12 }; + glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_ETC1_RGB8_LOSSY_DECODE_ANGLE, 4, 4, 0, + sizeof(pixel), pixel); + if (supported) + { + EXPECT_GL_NO_ERROR(); + + glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_ETC1_RGB8_LOSSY_DECODE_ANGLE, + sizeof(pixel), pixel); + EXPECT_GL_NO_ERROR(); + + + glCompressedTexImage2D(GL_TEXTURE_2D, 1, GL_ETC1_RGB8_LOSSY_DECODE_ANGLE, 2, 2, 0, + sizeof(pixel), pixel); + glCompressedTexImage2D(GL_TEXTURE_2D, 2, GL_ETC1_RGB8_LOSSY_DECODE_ANGLE, 1, 1, 0, + sizeof(pixel), pixel); + } + else + { + EXPECT_GL_ERROR(GL_INVALID_ENUM); + } +} + +ANGLE_INSTANTIATE_TEST(ETCTextureTest, + ES2_D3D9(), + ES2_D3D11(), + ES2_D3D11_FL9_3(), + ES3_D3D11(), + ES2_OPENGL(), + ES3_OPENGL()); +} // anonymous namespace diff --git a/gfx/angle/src/tests/gl_tests/FenceSyncTests.cpp b/gfx/angle/src/tests/gl_tests/FenceSyncTests.cpp new file mode 100755 index 000000000..1568509f6 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/FenceSyncTests.cpp @@ -0,0 +1,282 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "test_utils/ANGLETest.h" + +using namespace angle; + +class FenceNVTest : public ANGLETest +{ + protected: + FenceNVTest() + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + setConfigDepthBits(24); + } +}; + +class FenceSyncTest : public ANGLETest +{ + protected: + FenceSyncTest() + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + setConfigDepthBits(24); + } +}; + +// FenceNV objects should respond false to glIsFenceNV until they've been set +TEST_P(FenceNVTest, IsFence) +{ + if (!extensionEnabled("GL_NV_fence")) + { + std::cout << "Test skipped due to missing GL_NV_fence extension." << std::endl; + return; + } + + GLuint fence = 0; + glGenFencesNV(1, &fence); + EXPECT_GL_NO_ERROR(); + + EXPECT_EQ(GL_FALSE, glIsFenceNV(fence)); + EXPECT_GL_NO_ERROR(); + + glSetFenceNV(fence, GL_ALL_COMPLETED_NV); + EXPECT_GL_NO_ERROR(); + + EXPECT_EQ(GL_TRUE, glIsFenceNV(fence)); + EXPECT_GL_NO_ERROR(); +} + +// Test error cases for all FenceNV functions +TEST_P(FenceNVTest, Errors) +{ + if (!extensionEnabled("GL_NV_fence")) + { + std::cout << "Test skipped due to missing GL_NV_fence extension." << std::endl; + return; + } + + // glTestFenceNV should still return TRUE for an invalid fence and generate an INVALID_OPERATION + EXPECT_EQ(GL_TRUE, glTestFenceNV(10)); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + GLuint fence = 20; + + // glGenFencesNV should generate INVALID_VALUE for a negative n and not write anything to the fences pointer + glGenFencesNV(-1, &fence); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + EXPECT_EQ(20u, fence); + + // Generate a real fence + glGenFencesNV(1, &fence); + EXPECT_GL_NO_ERROR(); + + // glTestFenceNV should still return TRUE for a fence that is not started and generate an INVALID_OPERATION + EXPECT_EQ(GL_TRUE, glTestFenceNV(fence)); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + // glGetFenceivNV should generate an INVALID_OPERATION for an invalid or unstarted fence and not modify the params + GLint result = 30; + glGetFenceivNV(10, GL_FENCE_STATUS_NV, &result); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + EXPECT_EQ(30, result); + + glGetFenceivNV(fence, GL_FENCE_STATUS_NV, &result); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + EXPECT_EQ(30, result); + + // glSetFenceNV should generate an error for any condition that is not ALL_COMPLETED_NV + glSetFenceNV(fence, 0); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + // glSetFenceNV should generate INVALID_OPERATION for an invalid fence + glSetFenceNV(10, GL_ALL_COMPLETED_NV); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); +} + +// Test that basic usage works and doesn't generate errors or crash +TEST_P(FenceNVTest, BasicOperations) +{ + if (!extensionEnabled("GL_NV_fence")) + { + std::cout << "Test skipped due to missing GL_NV_fence extension." << std::endl; + return; + } + + glClearColor(1.0f, 0.0f, 1.0f, 1.0f); + + GLuint fences[20] = { 0 }; + glGenFencesNV(static_cast<GLsizei>(ArraySize(fences)), fences); + EXPECT_GL_NO_ERROR(); + + for (GLuint fence : fences) + { + glSetFenceNV(fence, GL_ALL_COMPLETED_NV); + + glClear(GL_COLOR_BUFFER_BIT); + } + + glFinish(); + + for (GLuint fence : fences) + { + GLint status = 0; + glGetFenceivNV(fence, GL_FENCE_STATUS_NV, &status); + EXPECT_GL_NO_ERROR(); + + // Fence should be complete now that Finish has been called + EXPECT_EQ(GL_TRUE, status); + } + + EXPECT_PIXEL_EQ(0, 0, 255, 0, 255, 255); +} + +// FenceSync objects should respond true to IsSync after they are created with glFenceSync +TEST_P(FenceSyncTest, IsSync) +{ + GLsync sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); + EXPECT_GL_NO_ERROR(); + + EXPECT_EQ(GL_TRUE, glIsSync(sync)); + EXPECT_EQ(GL_FALSE, glIsSync(reinterpret_cast<GLsync>(40))); +} + +// Test error cases for all FenceSync function +TEST_P(FenceSyncTest, Errors) +{ + GLsync sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); + + // DeleteSync generates INVALID_VALUE when the sync is not valid + glDeleteSync(reinterpret_cast<GLsync>(20)); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + // glFenceSync generates GL_INVALID_ENUM if the condition is not GL_SYNC_GPU_COMMANDS_COMPLETE + EXPECT_EQ(0, glFenceSync(0, 0)); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + // glFenceSync generates GL_INVALID_ENUM if the flags is not 0 + EXPECT_EQ(0, glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 10)); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + // glClientWaitSync generates GL_INVALID_VALUE and returns GL_WAIT_FAILED if flags contains more than just GL_SYNC_FLUSH_COMMANDS_BIT + EXPECT_GLENUM_EQ(GL_WAIT_FAILED, glClientWaitSync(sync, GL_SYNC_FLUSH_COMMANDS_BIT | 0x2, 0)); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + // glClientWaitSync generates GL_INVALID_VALUE and returns GL_WAIT_FAILED if the sync object is not valid + EXPECT_GLENUM_EQ(GL_WAIT_FAILED, glClientWaitSync(reinterpret_cast<GLsync>(30), GL_SYNC_FLUSH_COMMANDS_BIT, 0)); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + // glWaitSync generates GL_INVALID_VALUE if flags is non-zero + glWaitSync(sync, 1, GL_TIMEOUT_IGNORED); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + // glWaitSync generates GL_INVALID_VALUE if GLuint64 is not GL_TIMEOUT_IGNORED + glWaitSync(sync, 0, 0); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + // glWaitSync generates GL_INVALID_VALUE if the sync object is not valid + glWaitSync(reinterpret_cast<GLsync>(30), 0, GL_TIMEOUT_IGNORED); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + // glGetSynciv generates GL_INVALID_VALUE if bufSize is less than zero, results should be untouched + GLsizei length = 20; + GLint value = 30; + glGetSynciv(sync, GL_OBJECT_TYPE, -1, &length, &value); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + EXPECT_EQ(20, length); + EXPECT_EQ(30, value); + + // glGetSynciv generates GL_INVALID_VALUE if the sync object tis not valid, results should be untouched + glGetSynciv(reinterpret_cast<GLsync>(30), GL_OBJECT_TYPE, 1, &length, &value); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + EXPECT_EQ(20, length); + EXPECT_EQ(30, value); +} + +// Test usage of glGetSynciv +TEST_P(FenceSyncTest, BasicQueries) +{ + GLsizei length = 0; + GLint value = 0; + GLsync sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); + + glGetSynciv(sync, GL_SYNC_CONDITION, 1, &length, &value); + EXPECT_GL_NO_ERROR(); + EXPECT_EQ(GL_SYNC_GPU_COMMANDS_COMPLETE, value); + + glGetSynciv(sync, GL_OBJECT_TYPE, 1, &length, &value); + EXPECT_GL_NO_ERROR(); + EXPECT_EQ(GL_SYNC_FENCE, value); + + glGetSynciv(sync, GL_SYNC_FLAGS, 1, &length, &value); + EXPECT_GL_NO_ERROR(); + EXPECT_EQ(0, value); +} + +// Test that basic usage works and doesn't generate errors or crash +TEST_P(FenceSyncTest, BasicOperations) +{ + // TODO(geofflang): Figure out why this is broken on Intel OpenGL + if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + std::cout << "Test skipped on Intel OpenGL." << std::endl; + return; + } + + glClearColor(1.0f, 0.0f, 1.0f, 1.0f); + + GLsync sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); + + glClear(GL_COLOR_BUFFER_BIT); + glWaitSync(sync, 0, GL_TIMEOUT_IGNORED); + EXPECT_GL_NO_ERROR(); + + GLsizei length = 0; + GLint value = 0; + unsigned int loopCount = 0; + + glFlush(); + + // Use 'loopCount' to make sure the test doesn't get stuck in an infinite loop + while (value != GL_SIGNALED && loopCount <= 1000000) + { + loopCount++; + + glGetSynciv(sync, GL_SYNC_STATUS, 1, &length, &value); + ASSERT_GL_NO_ERROR(); + } + + ASSERT_GLENUM_EQ(GL_SIGNALED, value); + + for (size_t i = 0; i < 20; i++) + { + glClear(GL_COLOR_BUFFER_BIT); + glClientWaitSync(sync, GL_SYNC_FLUSH_COMMANDS_BIT, GL_TIMEOUT_IGNORED); + EXPECT_GL_NO_ERROR(); + } +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(FenceNVTest, + ES2_D3D9(), + ES2_D3D11(), + ES3_D3D11(), + ES2_OPENGL(), + ES3_OPENGL(), + ES2_OPENGLES(), + ES3_OPENGLES()); +ANGLE_INSTANTIATE_TEST(FenceSyncTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); diff --git a/gfx/angle/src/tests/gl_tests/FramebufferMixedSamplesTest.cpp b/gfx/angle/src/tests/gl_tests/FramebufferMixedSamplesTest.cpp new file mode 100755 index 000000000..5baf9303a --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/FramebufferMixedSamplesTest.cpp @@ -0,0 +1,291 @@ +// +// Copyright 2016 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// CHROMIUMFramebufferMixedSamplesTest +// Test CHROMIUM subset of NV_framebuffer_mixed_samples. +// This extension allows rendering to a framebuffer that has different +// sample counts for different render buffers (stencil, depth, color) + +#include "test_utils/ANGLETest.h" +#include "shader_utils.h" + +using namespace angle; + +namespace +{ + +const GLuint kWidth = 100; +const GLuint kHeight = 100; + +class CHROMIUMFramebufferMixedSamplesTest : public ANGLETest +{ + protected: + enum SetupFBOType + { + MixedSampleFBO, // 1 color sample, N stencil samples. + SingleSampleFBO, // 1 color sample, 1 stencil sample. + }; + + bool isApplicable() const + { + return extensionEnabled("GL_CHROMIUM_framebuffer_mixed_samples") && + extensionEnabled("GL_OES_rgb8_rgba8"); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + // clang-format off + static const char* kVertexShaderSource = + "attribute mediump vec4 position;\n" + "void main() {\n" + " gl_Position = position;\n" + "}\n"; + + static const char* kFragmentShaderSource = + "uniform mediump vec4 color;\n" + "void main() {\n" + " gl_FragColor = color;\n" + "}\n"; + + // clang-format on + mProgram = CompileProgram(kVertexShaderSource, kFragmentShaderSource); + + GLuint position_loc = glGetAttribLocation(mProgram, "position"); + mColorLoc = glGetUniformLocation(mProgram, "color"); + + glGenBuffers(1, &mVBO); + glBindBuffer(GL_ARRAY_BUFFER, mVBO); + + static float vertices[] = { + 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, + -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, + }; + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + glEnableVertexAttribArray(position_loc); + glVertexAttribPointer(position_loc, 2, GL_FLOAT, GL_FALSE, 0, 0); + + ASSERT_GL_NO_ERROR(); + } + + void TearDown() override + { + glDeleteBuffers(1, &mVBO); + glDeleteProgram(mProgram); + + ASSERT_GL_NO_ERROR(); + + ANGLETest::TearDown(); + } + + void prepareForDraw(SetupFBOType fbo_type) + { + glActiveTexture(GL_TEXTURE0); + glGenTextures(1, &mTexture); + glBindTexture(GL_TEXTURE_2D, mTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, + NULL); + glBindTexture(GL_TEXTURE_2D, 0); + + glGenRenderbuffers(1, &mStencilRB); + glBindRenderbuffer(GL_RENDERBUFFER, mStencilRB); + + if (fbo_type == MixedSampleFBO) + { + // Create a sample buffer. + GLsizei num_samples = 8, max_samples = 0; + glGetIntegerv(GL_MAX_SAMPLES, &max_samples); + num_samples = std::min(num_samples, max_samples); + glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER, num_samples, GL_STENCIL_INDEX8, + kWidth, kHeight); + GLint param = 0; + glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_SAMPLES, ¶m); + EXPECT_GT(param, 1); + } + else + { + glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, kWidth, kHeight); + } + glBindRenderbuffer(GL_RENDERBUFFER, 0); + + glGenFramebuffers(1, &mSampleFBO); + glBindFramebuffer(GL_FRAMEBUFFER, mSampleFBO); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTexture, 0); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, + mStencilRB); + EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE), + glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + glUseProgram(mProgram); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glViewport(0, 0, kWidth, kHeight); + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + glClearStencil(1); + glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + glEnable(GL_STENCIL_TEST); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glStencilMask(0xffffffff); + glStencilFunc(GL_EQUAL, 1, 0xffffffff); + glStencilOp(GL_KEEP, GL_KEEP, GL_ZERO); + + ASSERT_GL_NO_ERROR(); + } + + void cleanup() + { + glBindFramebuffer(GL_FRAMEBUFFER, 0); + glDeleteFramebuffers(1, &mSampleFBO); + glDeleteTextures(1, &mTexture); + glDeleteRenderbuffers(1, &mStencilRB); + + ASSERT_GL_NO_ERROR(); + } + + GLuint mSampleFBO; + GLuint mStencilRB; + GLuint mTexture; + + GLuint mProgram; + GLuint mVBO; + GLint mColorLoc; +}; + +} // + +TEST_P(CHROMIUMFramebufferMixedSamplesTest, StateSettingTest) +{ + if (!isApplicable()) + { + return; + } + + GLint value = -1; + glGetIntegerv(GL_COVERAGE_MODULATION_CHROMIUM, &value); + EXPECT_EQ(GL_NONE, value); + GLenum kValues[] = {GL_NONE, GL_RGB, GL_RGBA, GL_ALPHA}; + for (auto expect : kValues) + { + glCoverageModulationCHROMIUM(expect); + value = -1; + glGetIntegerv(GL_COVERAGE_MODULATION_CHROMIUM, &value); + EXPECT_EQ(expect, static_cast<GLenum>(value)); + EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); + } + + glCoverageModulationCHROMIUM(GL_BYTE); + EXPECT_EQ(static_cast<GLenum>(GL_INVALID_ENUM), glGetError()); + value = -1; + glGetIntegerv(GL_COVERAGE_MODULATION_CHROMIUM, &value); + EXPECT_EQ(static_cast<GLenum>(GL_ALPHA), static_cast<GLenum>(value)); + EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); +} + +// The test pattern is as follows: +// A green triangle (bottom left, top right, top left). +// A blue triangle (top left, bottom right, bottom left). +// The triangles will overlap but overlap only contains green pixels, +// due to each draw erasing its area from stencil. +// The blue triangle will fill only the area (bottom left, center, +// bottom right). + +// The test tests that CoverageModulation call works. +// The fractional pixels of both triangles end up being modulated +// by the coverage of the fragment. Test that drawing with and without +// CoverageModulation causes the result to be different. +TEST_P(CHROMIUMFramebufferMixedSamplesTest, CoverageModulation) +{ + if (!isApplicable()) + { + return; + } + static const float kBlue[] = {0.0f, 0.0f, 1.0f, 1.0f}; + static const float kGreen[] = {0.0f, 1.0f, 0.0f, 1.0f}; + std::unique_ptr<uint8_t[]> results[3]; + const GLint kResultSize = kWidth * kHeight * 4; + + for (int pass = 0; pass < 3; ++pass) + { + prepareForDraw(MixedSampleFBO); + if (pass == 1) + { + glCoverageModulationCHROMIUM(GL_RGBA); + } + glUniform4fv(mColorLoc, 1, kGreen); + glDrawArrays(GL_TRIANGLES, 0, 3); + + glUniform4fv(mColorLoc, 1, kBlue); + glDrawArrays(GL_TRIANGLES, 3, 3); + if (pass == 1) + { + glCoverageModulationCHROMIUM(GL_NONE); + } + results[pass].reset(new uint8_t[kResultSize]); + memset(results[pass].get(), 123u, kResultSize); + glReadPixels(0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, results[pass].get()); + + cleanup(); + } + + EXPECT_NE(0, memcmp(results[0].get(), results[1].get(), kResultSize)); + // Verify that rendering is deterministic, so that the pass above does not + // come from non-deterministic rendering. + EXPECT_EQ(0, memcmp(results[0].get(), results[2].get(), kResultSize)); +} + +// The test tests that the stencil buffer can be multisampled, even though the +// color buffer is single-sampled. Draws the same pattern with single-sample +// stencil buffer and with multisample stencil buffer. The images should differ. +TEST_P(CHROMIUMFramebufferMixedSamplesTest, MultisampleStencilEffective) +{ + if (!isApplicable()) + { + return; + } + + static const float kBlue[] = {0.0f, 0.0f, 1.0f, 1.0f}; + static const float kGreen[] = {0.0f, 1.0f, 0.0f, 1.0f}; + + std::unique_ptr<uint8_t[]> results[3]; + const GLint kResultSize = kWidth * kHeight * 4; + + for (int pass = 0; pass < 3; ++pass) + { + if (pass == 1) + { + prepareForDraw(MixedSampleFBO); + } + else + { + prepareForDraw(SingleSampleFBO); + } + glUniform4fv(mColorLoc, 1, kGreen); + glDrawArrays(GL_TRIANGLES, 0, 3); + + glUniform4fv(mColorLoc, 1, kBlue); + glDrawArrays(GL_TRIANGLES, 3, 3); + + results[pass].reset(new uint8_t[kResultSize]); + memset(results[pass].get(), 12u, kResultSize); + glReadPixels(0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, results[pass].get()); + + cleanup(); + } + + EXPECT_NE(0, memcmp(results[0].get(), results[1].get(), kResultSize)); + // Verify that rendering is deterministic, so that the pass above does not + // come from non-deterministic rendering. + EXPECT_EQ(0, memcmp(results[0].get(), results[2].get(), kResultSize)); +} + +ANGLE_INSTANTIATE_TEST(CHROMIUMFramebufferMixedSamplesTest, + ES2_OPENGL(), + ES2_OPENGLES(), + ES3_OPENGL()); diff --git a/gfx/angle/src/tests/gl_tests/FramebufferRenderMipmapTest.cpp b/gfx/angle/src/tests/gl_tests/FramebufferRenderMipmapTest.cpp new file mode 100755 index 000000000..471bf5018 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/FramebufferRenderMipmapTest.cpp @@ -0,0 +1,204 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "test_utils/ANGLETest.h" + +using namespace angle; + +class FramebufferRenderMipmapTest : public ANGLETest +{ + protected: + FramebufferRenderMipmapTest() + { + setWindowWidth(256); + setWindowHeight(256); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + virtual void SetUp() + { + ANGLETest::SetUp(); + + const std::string vsSource = SHADER_SOURCE + ( + attribute highp vec4 position; + void main(void) + { + gl_Position = position; + } + ); + + const std::string fsSource = SHADER_SOURCE + ( + uniform highp vec4 color; + void main(void) + { + gl_FragColor = color; + } + ); + + mProgram = CompileProgram(vsSource, fsSource); + if (mProgram == 0) + { + FAIL() << "shader compilation failed."; + } + + mColorLocation = glGetUniformLocation(mProgram, "color"); + + glUseProgram(mProgram); + + glClearColor(0, 0, 0, 0); + glClearDepthf(0.0); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glEnable(GL_BLEND); + glDisable(GL_DEPTH_TEST); + + ASSERT_GL_NO_ERROR(); + } + + virtual void TearDown() + { + glDeleteProgram(mProgram); + + ANGLETest::TearDown(); + } + + GLuint mProgram; + GLint mColorLocation; +}; + +// Validate that if we are in ES3 or GL_OES_fbo_render_mipmap exists, there are no validation errors +// when using a non-zero level in glFramebufferTexture2D. +TEST_P(FramebufferRenderMipmapTest, Validation) +{ + bool renderToMipmapSupported = + extensionEnabled("GL_OES_fbo_render_mipmap") || getClientMajorVersion() > 2; + + GLuint tex = 0; + glGenTextures(1, &tex); + glBindTexture(GL_TEXTURE_2D, tex); + + const GLint levels = 5; + for (GLint i = 0; i < levels; i++) + { + GLsizei size = 1 << ((levels - 1) - i); + glTexImage2D(GL_TEXTURE_2D, i, GL_RGBA, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + } + + EXPECT_GL_NO_ERROR(); + + GLuint fbo = 0; + glGenFramebuffers(1, &fbo); + glBindFramebuffer(GL_FRAMEBUFFER, fbo); + EXPECT_GL_NO_ERROR(); + + for (GLint i = 0; i < levels; i++) + { + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, i); + + if (i > 0 && !renderToMipmapSupported) + { + EXPECT_GL_ERROR(GL_INVALID_VALUE); + } + else + { + EXPECT_GL_NO_ERROR(); + EXPECT_EQ(glCheckFramebufferStatus(GL_FRAMEBUFFER), GLenum(GL_FRAMEBUFFER_COMPLETE)); + } + } + + glDeleteFramebuffers(1, &fbo); + glDeleteTextures(1, &tex); +} + +// Render to various levels of a texture and check that they have the correct color data via ReadPixels +TEST_P(FramebufferRenderMipmapTest, RenderToMipmap) +{ + // TODO(geofflang): Figure out why this is broken on Intel OpenGL + if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + std::cout << "Test skipped on Intel OpenGL." << std::endl; + return; + } + + bool renderToMipmapSupported = + extensionEnabled("GL_OES_fbo_render_mipmap") || getClientMajorVersion() > 2; + if (!renderToMipmapSupported) + { + std::cout << "Test skipped because GL_OES_fbo_render_mipmap or ES3 is not available." << std::endl; + return; + } + + const GLfloat levelColors[] = + { + 1.0f, 0.0f, 0.0f, 1.0f, + 0.0f, 1.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 1.0f, 1.0f, + 1.0f, 1.0f, 0.0f, 1.0f, + 1.0f, 0.0f, 1.0f, 1.0f, + 0.0f, 1.0f, 1.0f, 1.0f, + }; + const GLint testLevels = static_cast<GLint>(ArraySize(levelColors) / 4); + + GLuint tex = 0; + glGenTextures(1, &tex); + glBindTexture(GL_TEXTURE_2D, tex); + + for (GLint i = 0; i < testLevels; i++) + { + GLsizei size = 1 << ((testLevels - 1) - i); + glTexImage2D(GL_TEXTURE_2D, i, GL_RGBA, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + } + + EXPECT_GL_NO_ERROR(); + + GLuint fbo = 0; + glGenFramebuffers(1, &fbo); + glBindFramebuffer(GL_FRAMEBUFFER, fbo); + EXPECT_GL_NO_ERROR(); + + // Render to the levels of the texture with different colors + for (GLint i = 0; i < testLevels; i++) + { + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, i); + EXPECT_GL_NO_ERROR(); + + glUseProgram(mProgram); + glUniform4fv(mColorLocation, 1, levelColors + (i * 4)); + + drawQuad(mProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + } + + // Test that the levels of the texture are correct + for (GLint i = 0; i < testLevels; i++) + { + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, i); + EXPECT_GL_NO_ERROR(); + + const GLfloat *color = levelColors + (i * 4); + EXPECT_PIXEL_EQ(0, 0, color[0] * 255, color[1] * 255, color[2] * 255, color[3] * 255); + } + + glDeleteFramebuffers(1, &fbo); + glDeleteTextures(1, &tex); + + EXPECT_GL_NO_ERROR(); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(FramebufferRenderMipmapTest, + ES2_D3D9(), + ES2_D3D11(), + ES3_D3D11(), + ES2_OPENGL(), + ES3_OPENGL(), + ES2_OPENGLES(), + ES3_OPENGLES()); diff --git a/gfx/angle/src/tests/gl_tests/FramebufferTest.cpp b/gfx/angle/src/tests/gl_tests/FramebufferTest.cpp new file mode 100755 index 000000000..430ca8400 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/FramebufferTest.cpp @@ -0,0 +1,379 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// Framebuffer tests: +// Various tests related for Frambuffers. +// + +#include "test_utils/ANGLETest.h" + +using namespace angle; + +class FramebufferFormatsTest : public ANGLETest +{ + protected: + FramebufferFormatsTest() : mFramebuffer(0), mTexture(0), mRenderbuffer(0), mProgram(0) + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + void checkBitCount(GLuint fbo, GLenum channel, GLint minBits) + { + glBindFramebuffer(GL_FRAMEBUFFER, fbo); + + GLint bits = 0; + glGetIntegerv(channel, &bits); + + if (minBits == 0) + { + EXPECT_EQ(minBits, bits); + } + else + { + EXPECT_GE(bits, minBits); + } + } + + void testBitCounts(GLuint fbo, + GLint minRedBits, + GLint minGreenBits, + GLint minBlueBits, + GLint minAlphaBits, + GLint minDepthBits, + GLint minStencilBits) + { + checkBitCount(fbo, GL_RED_BITS, minRedBits); + checkBitCount(fbo, GL_GREEN_BITS, minGreenBits); + checkBitCount(fbo, GL_BLUE_BITS, minBlueBits); + checkBitCount(fbo, GL_ALPHA_BITS, minAlphaBits); + checkBitCount(fbo, GL_DEPTH_BITS, minDepthBits); + checkBitCount(fbo, GL_STENCIL_BITS, minStencilBits); + } + + void testTextureFormat(GLenum internalFormat, + GLint minRedBits, + GLint minGreenBits, + GLint minBlueBits, + GLint minAlphaBits) + { + glGenTextures(1, &mTexture); + glBindTexture(GL_TEXTURE_2D, mTexture); + glTexStorage2DEXT(GL_TEXTURE_2D, 1, internalFormat, 1, 1); + + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTexture, 0); + + testBitCounts(mFramebuffer, minRedBits, minGreenBits, minBlueBits, minAlphaBits, 0, 0); + } + + void testRenderbufferMultisampleFormat(int minESVersion, + GLenum attachmentType, + GLenum internalFormat) + { + // TODO(geofflang): Figure out why this is broken on Intel OpenGL + if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + std::cout << "Test skipped on Intel OpenGL." << std::endl; + return; + } + + int clientVersion = getClientMajorVersion(); + if (clientVersion < minESVersion) + { + return; + } + + // Check that multisample is supported with at least two samples (minimum required is 1) + bool supports2Samples = false; + + if (clientVersion == 2) + { + if (extensionEnabled("ANGLE_framebuffer_multisample")) + { + int maxSamples; + glGetIntegerv(GL_MAX_SAMPLES_ANGLE, &maxSamples); + supports2Samples = maxSamples >= 2; + } + } + else + { + assert(clientVersion >= 3); + int maxSamples; + glGetIntegerv(GL_MAX_SAMPLES, &maxSamples); + supports2Samples = maxSamples >= 2; + } + + if (!supports2Samples) + { + return; + } + + glGenRenderbuffers(1, &mRenderbuffer); + glBindRenderbuffer(GL_RENDERBUFFER, mRenderbuffer); + + EXPECT_GL_NO_ERROR(); + glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER, 2, internalFormat, 128, 128); + EXPECT_GL_NO_ERROR(); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, attachmentType, GL_RENDERBUFFER, mRenderbuffer); + EXPECT_GL_NO_ERROR(); + } + + void testZeroHeightRenderbuffer() + { + glGenRenderbuffers(1, &mRenderbuffer); + glBindRenderbuffer(GL_RENDERBUFFER, mRenderbuffer); + glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 1, 0); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, + mRenderbuffer); + EXPECT_GL_NO_ERROR(); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + glGenFramebuffers(1, &mFramebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer); + } + + void TearDown() override + { + ANGLETest::TearDown(); + + if (mTexture != 0) + { + glDeleteTextures(1, &mTexture); + mTexture = 0; + } + + if (mRenderbuffer != 0) + { + glDeleteRenderbuffers(1, &mRenderbuffer); + mRenderbuffer = 0; + } + + if (mFramebuffer != 0) + { + glDeleteFramebuffers(1, &mFramebuffer); + mFramebuffer = 0; + } + + if (mProgram != 0) + { + glDeleteProgram(mProgram); + mProgram = 0; + } + } + + GLuint mFramebuffer; + GLuint mTexture; + GLuint mRenderbuffer; + GLuint mProgram; +}; + +TEST_P(FramebufferFormatsTest, RGBA4) +{ + testTextureFormat(GL_RGBA4, 4, 4, 4, 4); +} + +TEST_P(FramebufferFormatsTest, RGB565) +{ + testTextureFormat(GL_RGB565, 5, 6, 5, 0); +} + +TEST_P(FramebufferFormatsTest, RGB8) +{ + if (getClientMajorVersion() < 3 && !extensionEnabled("GL_OES_rgb8_rgba8")) + { + std::cout << "Test skipped due to missing ES3 or GL_OES_rgb8_rgba8." << std::endl; + return; + } + + testTextureFormat(GL_RGB8_OES, 8, 8, 8, 0); +} + +TEST_P(FramebufferFormatsTest, BGRA8) +{ + if (!extensionEnabled("GL_EXT_texture_format_BGRA8888")) + { + std::cout << "Test skipped due to missing GL_EXT_texture_format_BGRA8888." << std::endl; + return; + } + + testTextureFormat(GL_BGRA8_EXT, 8, 8, 8, 8); +} + +TEST_P(FramebufferFormatsTest, RGBA8) +{ + if (getClientMajorVersion() < 3 && !extensionEnabled("GL_OES_rgb8_rgba8")) + { + std::cout << "Test skipped due to missing ES3 or GL_OES_rgb8_rgba8." << std::endl; + return; + } + + testTextureFormat(GL_RGBA8_OES, 8, 8, 8, 8); +} + +TEST_P(FramebufferFormatsTest, RenderbufferMultisample_DEPTH16) +{ + testRenderbufferMultisampleFormat(2, GL_DEPTH_ATTACHMENT, GL_DEPTH_COMPONENT16); +} + +TEST_P(FramebufferFormatsTest, RenderbufferMultisample_DEPTH24) +{ + testRenderbufferMultisampleFormat(3, GL_DEPTH_ATTACHMENT, GL_DEPTH_COMPONENT24); +} + +TEST_P(FramebufferFormatsTest, RenderbufferMultisample_DEPTH32F) +{ + if (getClientMajorVersion() < 3) + { + std::cout << "Test skipped due to missing ES3." << std::endl; + return; + } + + testRenderbufferMultisampleFormat(3, GL_DEPTH_ATTACHMENT, GL_DEPTH_COMPONENT32F); +} + +TEST_P(FramebufferFormatsTest, RenderbufferMultisample_DEPTH24_STENCIL8) +{ + testRenderbufferMultisampleFormat(3, GL_DEPTH_STENCIL_ATTACHMENT, GL_DEPTH24_STENCIL8); +} + +TEST_P(FramebufferFormatsTest, RenderbufferMultisample_DEPTH32F_STENCIL8) +{ + if (getClientMajorVersion() < 3) + { + std::cout << "Test skipped due to missing ES3." << std::endl; + return; + } + + testRenderbufferMultisampleFormat(3, GL_DEPTH_STENCIL_ATTACHMENT, GL_DEPTH32F_STENCIL8); +} + +TEST_P(FramebufferFormatsTest, RenderbufferMultisample_STENCIL_INDEX8) +{ + // TODO(geofflang): Figure out how to support GLSTENCIL_INDEX8 on desktop GL + if (GetParam().getRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + std::cout << "Test skipped on Desktop OpenGL." << std::endl; + return; + } + + testRenderbufferMultisampleFormat(2, GL_STENCIL_ATTACHMENT, GL_STENCIL_INDEX8); +} + +// Test that binding an incomplete cube map is rejected by ANGLE. +TEST_P(FramebufferFormatsTest, IncompleteCubeMap) +{ + // First make a complete CubeMap. + glGenTextures(1, &mTexture); + glBindTexture(GL_TEXTURE_CUBE_MAP, mTexture); + glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, + nullptr); + glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, + nullptr); + glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, + nullptr); + glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, + nullptr); + glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, + nullptr); + glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, + nullptr); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X, + mTexture, 0); + + // Verify the framebuffer is complete. + ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + // Make the CubeMap cube-incomplete. + glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, + nullptr); + + // Verify the framebuffer is incomplete. + ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT, + glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + // Verify drawing with the incomplete framebuffer produces a GL error + const std::string &vs = "attribute vec4 position; void main() { gl_Position = position; }"; + const std::string &ps = "void main() { gl_FragColor = vec4(1, 0, 0, 1); }"; + mProgram = CompileProgram(vs, ps); + ASSERT_NE(0u, mProgram); + drawQuad(mProgram, "position", 0.5f); + ASSERT_GL_ERROR(GL_INVALID_FRAMEBUFFER_OPERATION); +} + +// Test that a renderbuffer with zero height but nonzero width is handled without crashes/asserts. +TEST_P(FramebufferFormatsTest, ZeroHeightRenderbuffer) +{ + if (getClientMajorVersion() < 3) + { + std::cout << "Test skipped due to missing ES3" << std::endl; + return; + } + + testZeroHeightRenderbuffer(); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these +// tests should be run against. +ANGLE_INSTANTIATE_TEST(FramebufferFormatsTest, + ES2_D3D9(), + ES2_D3D11(), + ES3_D3D11(), + ES2_OPENGL(), + ES3_OPENGL(), + ES2_OPENGLES(), + ES3_OPENGLES()); + +class FramebufferInvalidateTest : public ANGLETest +{ + protected: + FramebufferInvalidateTest() : mFramebuffer(0), mRenderbuffer(0) {} + + void SetUp() override + { + ANGLETest::SetUp(); + + glGenFramebuffers(1, &mFramebuffer); + glGenRenderbuffers(1, &mRenderbuffer); + } + + void TearDown() override + { + glDeleteFramebuffers(1, &mFramebuffer); + glDeleteRenderbuffers(1, &mRenderbuffer); + ANGLETest::TearDown(); + } + + GLuint mFramebuffer; + GLuint mRenderbuffer; +}; + +// Covers invalidating an incomplete framebuffer. This should be a no-op, but should not error. +TEST_P(FramebufferInvalidateTest, Incomplete) +{ + glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer); + glBindRenderbuffer(GL_RENDERBUFFER, mRenderbuffer); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, mRenderbuffer); + EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT, + glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + std::vector<GLenum> attachments; + attachments.push_back(GL_COLOR_ATTACHMENT0); + + glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, attachments.data()); + EXPECT_GL_NO_ERROR(); +} + +ANGLE_INSTANTIATE_TEST(FramebufferInvalidateTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); diff --git a/gfx/angle/src/tests/gl_tests/GLSLTest.cpp b/gfx/angle/src/tests/gl_tests/GLSLTest.cpp new file mode 100755 index 000000000..00000612d --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/GLSLTest.cpp @@ -0,0 +1,2443 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "test_utils/ANGLETest.h" + +#include "libANGLE/Context.h" +#include "libANGLE/Program.h" +#include "test_utils/gl_raii.h" + +using namespace angle; + +namespace +{ + +class GLSLTest : public ANGLETest +{ + protected: + GLSLTest() + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + virtual void SetUp() + { + ANGLETest::SetUp(); + + mSimpleVSSource = SHADER_SOURCE + ( + attribute vec4 inputAttribute; + void main() + { + gl_Position = inputAttribute; + } + ); + } + + std::string GenerateVaryingType(GLint vectorSize) + { + char varyingType[10]; + + if (vectorSize == 1) + { + sprintf(varyingType, "float"); + } + else + { + sprintf(varyingType, "vec%d", vectorSize); + } + + return std::string(varyingType); + } + + std::string GenerateVectorVaryingDeclaration(GLint vectorSize, GLint arraySize, GLint id) + { + char buff[100]; + + if (arraySize == 1) + { + sprintf(buff, "varying %s v%d;\n", GenerateVaryingType(vectorSize).c_str(), id); + } + else + { + sprintf(buff, "varying %s v%d[%d];\n", GenerateVaryingType(vectorSize).c_str(), id, arraySize); + } + + return std::string(buff); + } + + std::string GenerateVectorVaryingSettingCode(GLint vectorSize, GLint arraySize, GLint id) + { + std::string returnString; + char buff[100]; + + if (arraySize == 1) + { + sprintf(buff, "\t v%d = %s(1.0);\n", id, GenerateVaryingType(vectorSize).c_str()); + returnString += buff; + } + else + { + for (int i = 0; i < arraySize; i++) + { + sprintf(buff, "\t v%d[%d] = %s(1.0);\n", id, i, GenerateVaryingType(vectorSize).c_str()); + returnString += buff; + } + } + + return returnString; + } + + std::string GenerateVectorVaryingUseCode(GLint arraySize, GLint id) + { + if (arraySize == 1) + { + char buff[100]; + sprintf(buff, "v%d + ", id); + return std::string(buff); + } + else + { + std::string returnString; + for (int i = 0; i < arraySize; i++) + { + char buff[100]; + sprintf(buff, "v%d[%d] + ", id, i); + returnString += buff; + } + return returnString; + } + } + + void GenerateGLSLWithVaryings(GLint floatCount, GLint floatArrayCount, GLint vec2Count, GLint vec2ArrayCount, GLint vec3Count, GLint vec3ArrayCount, + GLint vec4Count, GLint vec4ArrayCount, bool useFragCoord, bool usePointCoord, bool usePointSize, + std::string* fragmentShader, std::string* vertexShader) + { + // Generate a string declaring the varyings, to share between the fragment shader and the vertex shader. + std::string varyingDeclaration; + + unsigned int varyingCount = 0; + + for (GLint i = 0; i < floatCount; i++) + { + varyingDeclaration += GenerateVectorVaryingDeclaration(1, 1, varyingCount); + varyingCount += 1; + } + + for (GLint i = 0; i < floatArrayCount; i++) + { + varyingDeclaration += GenerateVectorVaryingDeclaration(1, 2, varyingCount); + varyingCount += 1; + } + + for (GLint i = 0; i < vec2Count; i++) + { + varyingDeclaration += GenerateVectorVaryingDeclaration(2, 1, varyingCount); + varyingCount += 1; + } + + for (GLint i = 0; i < vec2ArrayCount; i++) + { + varyingDeclaration += GenerateVectorVaryingDeclaration(2, 2, varyingCount); + varyingCount += 1; + } + + for (GLint i = 0; i < vec3Count; i++) + { + varyingDeclaration += GenerateVectorVaryingDeclaration(3, 1, varyingCount); + varyingCount += 1; + } + + for (GLint i = 0; i < vec3ArrayCount; i++) + { + varyingDeclaration += GenerateVectorVaryingDeclaration(3, 2, varyingCount); + varyingCount += 1; + } + + for (GLint i = 0; i < vec4Count; i++) + { + varyingDeclaration += GenerateVectorVaryingDeclaration(4, 1, varyingCount); + varyingCount += 1; + } + + for (GLint i = 0; i < vec4ArrayCount; i++) + { + varyingDeclaration += GenerateVectorVaryingDeclaration(4, 2, varyingCount); + varyingCount += 1; + } + + // Generate the vertex shader + vertexShader->clear(); + vertexShader->append(varyingDeclaration); + vertexShader->append("\nvoid main()\n{\n"); + + unsigned int currentVSVarying = 0; + + for (GLint i = 0; i < floatCount; i++) + { + vertexShader->append(GenerateVectorVaryingSettingCode(1, 1, currentVSVarying)); + currentVSVarying += 1; + } + + for (GLint i = 0; i < floatArrayCount; i++) + { + vertexShader->append(GenerateVectorVaryingSettingCode(1, 2, currentVSVarying)); + currentVSVarying += 1; + } + + for (GLint i = 0; i < vec2Count; i++) + { + vertexShader->append(GenerateVectorVaryingSettingCode(2, 1, currentVSVarying)); + currentVSVarying += 1; + } + + for (GLint i = 0; i < vec2ArrayCount; i++) + { + vertexShader->append(GenerateVectorVaryingSettingCode(2, 2, currentVSVarying)); + currentVSVarying += 1; + } + + for (GLint i = 0; i < vec3Count; i++) + { + vertexShader->append(GenerateVectorVaryingSettingCode(3, 1, currentVSVarying)); + currentVSVarying += 1; + } + + for (GLint i = 0; i < vec3ArrayCount; i++) + { + vertexShader->append(GenerateVectorVaryingSettingCode(3, 2, currentVSVarying)); + currentVSVarying += 1; + } + + for (GLint i = 0; i < vec4Count; i++) + { + vertexShader->append(GenerateVectorVaryingSettingCode(4, 1, currentVSVarying)); + currentVSVarying += 1; + } + + for (GLint i = 0; i < vec4ArrayCount; i++) + { + vertexShader->append(GenerateVectorVaryingSettingCode(4, 2, currentVSVarying)); + currentVSVarying += 1; + } + + if (usePointSize) + { + vertexShader->append("gl_PointSize = 1.0;\n"); + } + + vertexShader->append("}\n"); + + // Generate the fragment shader + fragmentShader->clear(); + fragmentShader->append("precision highp float;\n"); + fragmentShader->append(varyingDeclaration); + fragmentShader->append("\nvoid main() \n{ \n\tvec4 retColor = vec4(0,0,0,0);\n"); + + unsigned int currentFSVarying = 0; + + // Make use of the float varyings + fragmentShader->append("\tretColor += vec4("); + + for (GLint i = 0; i < floatCount; i++) + { + fragmentShader->append(GenerateVectorVaryingUseCode(1, currentFSVarying)); + currentFSVarying += 1; + } + + for (GLint i = 0; i < floatArrayCount; i++) + { + fragmentShader->append(GenerateVectorVaryingUseCode(2, currentFSVarying)); + currentFSVarying += 1; + } + + fragmentShader->append("0.0, 0.0, 0.0, 0.0);\n"); + + // Make use of the vec2 varyings + fragmentShader->append("\tretColor += vec4("); + + for (GLint i = 0; i < vec2Count; i++) + { + fragmentShader->append(GenerateVectorVaryingUseCode(1, currentFSVarying)); + currentFSVarying += 1; + } + + for (GLint i = 0; i < vec2ArrayCount; i++) + { + fragmentShader->append(GenerateVectorVaryingUseCode(2, currentFSVarying)); + currentFSVarying += 1; + } + + fragmentShader->append("vec2(0.0, 0.0), 0.0, 0.0);\n"); + + // Make use of the vec3 varyings + fragmentShader->append("\tretColor += vec4("); + + for (GLint i = 0; i < vec3Count; i++) + { + fragmentShader->append(GenerateVectorVaryingUseCode(1, currentFSVarying)); + currentFSVarying += 1; + } + + for (GLint i = 0; i < vec3ArrayCount; i++) + { + fragmentShader->append(GenerateVectorVaryingUseCode(2, currentFSVarying)); + currentFSVarying += 1; + } + + fragmentShader->append("vec3(0.0, 0.0, 0.0), 0.0);\n"); + + // Make use of the vec4 varyings + fragmentShader->append("\tretColor += "); + + for (GLint i = 0; i < vec4Count; i++) + { + fragmentShader->append(GenerateVectorVaryingUseCode(1, currentFSVarying)); + currentFSVarying += 1; + } + + for (GLint i = 0; i < vec4ArrayCount; i++) + { + fragmentShader->append(GenerateVectorVaryingUseCode(2, currentFSVarying)); + currentFSVarying += 1; + } + + fragmentShader->append("vec4(0.0, 0.0, 0.0, 0.0);\n"); + + // Set gl_FragColor, and use special variables if requested + fragmentShader->append("\tgl_FragColor = retColor"); + + if (useFragCoord) + { + fragmentShader->append(" + gl_FragCoord"); + } + + if (usePointCoord) + { + fragmentShader->append(" + vec4(gl_PointCoord, 0.0, 0.0)"); + } + + fragmentShader->append(";\n}"); + } + + void VaryingTestBase(GLint floatCount, GLint floatArrayCount, GLint vec2Count, GLint vec2ArrayCount, GLint vec3Count, GLint vec3ArrayCount, + GLint vec4Count, GLint vec4ArrayCount, bool useFragCoord, bool usePointCoord, bool usePointSize, bool expectSuccess) + { + std::string fragmentShaderSource; + std::string vertexShaderSource; + + GenerateGLSLWithVaryings(floatCount, floatArrayCount, vec2Count, vec2ArrayCount, vec3Count, vec3ArrayCount, + vec4Count, vec4ArrayCount, useFragCoord, usePointCoord, usePointSize, + &fragmentShaderSource, &vertexShaderSource); + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + + if (expectSuccess) + { + EXPECT_NE(0u, program); + } + else + { + EXPECT_EQ(0u, program); + } + } + + void CompileGLSLWithUniformsAndSamplers(GLint vertexUniformCount, + GLint fragmentUniformCount, + GLint vertexSamplersCount, + GLint fragmentSamplersCount, + bool expectSuccess) + { + std::stringstream vertexShader; + std::stringstream fragmentShader; + + // Generate the vertex shader + vertexShader << "precision mediump float;\n"; + + for (int i = 0; i < vertexUniformCount; i++) + { + vertexShader << "uniform vec4 v" << i << ";\n"; + } + + for (int i = 0; i < vertexSamplersCount; i++) + { + vertexShader << "uniform sampler2D s" << i << ";\n"; + } + + vertexShader << "void main()\n{\n"; + + for (int i = 0; i < vertexUniformCount; i++) + { + vertexShader << " gl_Position += v" << i << ";\n"; + } + + for (int i = 0; i < vertexSamplersCount; i++) + { + vertexShader << " gl_Position += texture2D(s" << i << ", vec2(0.0, 0.0));\n"; + } + + if (vertexUniformCount == 0 && vertexSamplersCount == 0) + { + vertexShader << " gl_Position = vec4(0.0);\n"; + } + + vertexShader << "}\n"; + + // Generate the fragment shader + fragmentShader << "precision mediump float;\n"; + + for (int i = 0; i < fragmentUniformCount; i++) + { + fragmentShader << "uniform vec4 v" << i << ";\n"; + } + + for (int i = 0; i < fragmentSamplersCount; i++) + { + fragmentShader << "uniform sampler2D s" << i << ";\n"; + } + + fragmentShader << "void main()\n{\n"; + + for (int i = 0; i < fragmentUniformCount; i++) + { + fragmentShader << " gl_FragColor += v" << i << ";\n"; + } + + for (int i = 0; i < fragmentSamplersCount; i++) + { + fragmentShader << " gl_FragColor += texture2D(s" << i << ", vec2(0.0, 0.0));\n"; + } + + if (fragmentUniformCount == 0 && fragmentSamplersCount == 0) + { + fragmentShader << " gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);\n"; + } + + fragmentShader << "}\n"; + + GLuint program = CompileProgram(vertexShader.str(), fragmentShader.str()); + + if (expectSuccess) + { + EXPECT_NE(0u, program); + } + else + { + EXPECT_EQ(0u, program); + } + } + + std::string mSimpleVSSource; +}; + +class GLSLTest_ES3 : public GLSLTest +{ + void SetUp() override + { + ANGLETest::SetUp(); + + mSimpleVSSource = + "#version 300 es\n" + "in vec4 inputAttribute;" + "void main()" + "{" + " gl_Position = inputAttribute;" + "}"; + } +}; + +TEST_P(GLSLTest, NamelessScopedStructs) +{ + const std::string fragmentShaderSource = SHADER_SOURCE + ( + precision mediump float; + + void main() + { + struct + { + float q; + } b; + + gl_FragColor = vec4(1, 0, 0, 1); + gl_FragColor.a += b.q; + } + ); + + GLuint program = CompileProgram(mSimpleVSSource, fragmentShaderSource); + EXPECT_NE(0u, program); +} + +TEST_P(GLSLTest, ScopedStructsOrderBug) +{ + // TODO(geofflang): Find out why this doesn't compile on Apple OpenGL drivers + // (http://anglebug.com/1292) + // TODO(geofflang): Find out why this doesn't compile on AMD OpenGL drivers + // (http://anglebug.com/1291) + if (IsDesktopOpenGL() && (IsOSX() || !IsNVIDIA())) + { + std::cout << "Test disabled on this OpenGL configuration." << std::endl; + return; + } + + const std::string fragmentShaderSource = SHADER_SOURCE + ( + precision mediump float; + + struct T + { + float f; + }; + + void main() + { + T a; + + struct T + { + float q; + }; + + T b; + + gl_FragColor = vec4(1, 0, 0, 1); + gl_FragColor.a += a.f; + gl_FragColor.a += b.q; + } + ); + + GLuint program = CompileProgram(mSimpleVSSource, fragmentShaderSource); + EXPECT_NE(0u, program); +} + +TEST_P(GLSLTest, ScopedStructsBug) +{ + const std::string fragmentShaderSource = SHADER_SOURCE + ( + precision mediump float; + + struct T_0 + { + float f; + }; + + void main() + { + gl_FragColor = vec4(1, 0, 0, 1); + + struct T + { + vec2 v; + }; + + T_0 a; + T b; + + gl_FragColor.a += a.f; + gl_FragColor.a += b.v.x; + } + ); + + GLuint program = CompileProgram(mSimpleVSSource, fragmentShaderSource); + EXPECT_NE(0u, program); +} + +TEST_P(GLSLTest, DxPositionBug) +{ + const std::string &vertexShaderSource = SHADER_SOURCE + ( + attribute vec4 inputAttribute; + varying float dx_Position; + void main() + { + gl_Position = vec4(inputAttribute); + dx_Position = 0.0; + } + ); + + const std::string &fragmentShaderSource = SHADER_SOURCE + ( + precision mediump float; + + varying float dx_Position; + + void main() + { + gl_FragColor = vec4(dx_Position, 0, 0, 1); + } + ); + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + EXPECT_NE(0u, program); +} + +TEST_P(GLSLTest, ElseIfRewriting) +{ + const std::string &vertexShaderSource = + "attribute vec4 a_position;\n" + "varying float v;\n" + "void main() {\n" + " gl_Position = a_position;\n" + " v = 1.0;\n" + " if (a_position.x <= 0.5) {\n" + " v = 0.0;\n" + " } else if (a_position.x >= 0.5) {\n" + " v = 2.0;\n" + " }\n" + "}\n"; + + const std::string &fragmentShaderSource = + "precision highp float;\n" + "varying float v;\n" + "void main() {\n" + " vec4 color = vec4(1.0, 0.0, 0.0, 1.0);\n" + " if (v >= 1.0) color = vec4(0.0, 1.0, 0.0, 1.0);\n" + " if (v >= 2.0) color = vec4(0.0, 0.0, 1.0, 1.0);\n" + " gl_FragColor = color;\n" + "}\n"; + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + ASSERT_NE(0u, program); + + drawQuad(program, "a_position", 0.5f); + + EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255); + EXPECT_PIXEL_EQ(getWindowWidth()-1, 0, 0, 255, 0, 255); +} + +TEST_P(GLSLTest, TwoElseIfRewriting) +{ + const std::string &vertexShaderSource = + "attribute vec4 a_position;\n" + "varying float v;\n" + "void main() {\n" + " gl_Position = a_position;\n" + " if (a_position.x == 0.0) {\n" + " v = 1.0;\n" + " } else if (a_position.x > 0.5) {\n" + " v = 0.0;\n" + " } else if (a_position.x > 0.75) {\n" + " v = 0.5;\n" + " }\n" + "}\n"; + + const std::string &fragmentShaderSource = + "precision highp float;\n" + "varying float v;\n" + "void main() {\n" + " gl_FragColor = vec4(v, 0.0, 0.0, 1.0);\n" + "}\n"; + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + EXPECT_NE(0u, program); +} + +TEST_P(GLSLTest, FrontFacingAndVarying) +{ + EGLPlatformParameters platform = GetParam().eglParameters; + + const std::string vertexShaderSource = SHADER_SOURCE + ( + attribute vec4 a_position; + varying float v_varying; + void main() + { + v_varying = a_position.x; + gl_Position = a_position; + } + ); + + const std::string fragmentShaderSource = SHADER_SOURCE + ( + precision mediump float; + varying float v_varying; + void main() + { + vec4 c; + + if (gl_FrontFacing) + { + c = vec4(v_varying, 0, 0, 1.0); + } + else + { + c = vec4(0, v_varying, 0, 1.0); + } + gl_FragColor = c; + } + ); + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + + // Compilation should fail on D3D11 feature level 9_3, since gl_FrontFacing isn't supported. + if (platform.renderer == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE) + { + if (platform.majorVersion == 9 && platform.minorVersion == 3) + { + EXPECT_EQ(0u, program); + return; + } + } + + // Otherwise, compilation should succeed + EXPECT_NE(0u, program); +} + +// Verify that linking shaders declaring different shading language versions fails. +TEST_P(GLSLTest_ES3, VersionMismatch) +{ + const std::string fragmentShaderSource100 = + "precision mediump float;\n" + "varying float v_varying;\n" + "void main() { gl_FragColor = vec4(v_varying, 0, 0, 1.0); }\n"; + + const std::string vertexShaderSource100 = + "attribute vec4 a_position;\n" + "varying float v_varying;\n" + "void main() { v_varying = a_position.x; gl_Position = a_position; }\n"; + + const std::string fragmentShaderSource300 = + "#version 300 es\n" + "precision mediump float;\n" + "in float v_varying;\n" + "out vec4 my_FragColor;\n" + "void main() { my_FragColor = vec4(v_varying, 0, 0, 1.0); }\n"; + + const std::string vertexShaderSource300 = + "#version 300 es\n" + "in vec4 a_position;\n" + "out float v_varying;\n" + "void main() { v_varying = a_position.x; gl_Position = a_position; }\n"; + + GLuint program = CompileProgram(vertexShaderSource300, fragmentShaderSource100); + EXPECT_EQ(0u, program); + + program = CompileProgram(vertexShaderSource100, fragmentShaderSource300); + EXPECT_EQ(0u, program); +} + +// Verify that declaring varying as invariant only in vertex shader fails in ESSL 1.00. +TEST_P(GLSLTest, InvariantVaryingOut) +{ + const std::string fragmentShaderSource = + "precision mediump float;\n" + "varying float v_varying;\n" + "void main() { gl_FragColor = vec4(v_varying, 0, 0, 1.0); }\n"; + + const std::string vertexShaderSource = + "attribute vec4 a_position;\n" + "invariant varying float v_varying;\n" + "void main() { v_varying = a_position.x; gl_Position = a_position; }\n"; + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + EXPECT_EQ(0u, program); +} + +// Verify that declaring varying as invariant only in vertex shader succeeds in ESSL 3.00. +TEST_P(GLSLTest_ES3, InvariantVaryingOut) +{ + // TODO: ESSL 3.00 -> GLSL 1.20 translation should add "invariant" in fragment shader + // for varyings which are invariant in vertex shader (http://anglebug.com/1293) + if (IsDesktopOpenGL()) + { + std::cout << "Test disabled on OpenGL." << std::endl; + return; + } + + const std::string fragmentShaderSource = + "#version 300 es\n" + "precision mediump float;\n" + "in float v_varying;\n" + "out vec4 my_FragColor;\n" + "void main() { my_FragColor = vec4(v_varying, 0, 0, 1.0); }\n"; + + const std::string vertexShaderSource = + "#version 300 es\n" + "in vec4 a_position;\n" + "invariant out float v_varying;\n" + "void main() { v_varying = a_position.x; gl_Position = a_position; }\n"; + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + EXPECT_NE(0u, program); +} + +// Verify that declaring varying as invariant only in fragment shader fails in ESSL 1.00. +TEST_P(GLSLTest, InvariantVaryingIn) +{ + const std::string fragmentShaderSource = + "precision mediump float;\n" + "invariant varying float v_varying;\n" + "void main() { gl_FragColor = vec4(v_varying, 0, 0, 1.0); }\n"; + + const std::string vertexShaderSource = + "attribute vec4 a_position;\n" + "varying float v_varying;\n" + "void main() { v_varying = a_position.x; gl_Position = a_position; }\n"; + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + EXPECT_EQ(0u, program); +} + +// Verify that declaring varying as invariant only in fragment shader fails in ESSL 3.00. +TEST_P(GLSLTest_ES3, InvariantVaryingIn) +{ + const std::string fragmentShaderSource = + "#version 300 es\n" + "precision mediump float;\n" + "invariant in float v_varying;\n" + "out vec4 my_FragColor;\n" + "void main() { my_FragColor = vec4(v_varying, 0, 0, 1.0); }\n"; + + const std::string vertexShaderSource = + "#version 300 es\n" + "in vec4 a_position;\n" + "out float v_varying;\n" + "void main() { v_varying = a_position.x; gl_Position = a_position; }\n"; + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + EXPECT_EQ(0u, program); +} + +// Verify that declaring varying as invariant in both shaders succeeds in ESSL 1.00. +TEST_P(GLSLTest, InvariantVaryingBoth) +{ + const std::string fragmentShaderSource = + "precision mediump float;\n" + "invariant varying float v_varying;\n" + "void main() { gl_FragColor = vec4(v_varying, 0, 0, 1.0); }\n"; + + const std::string vertexShaderSource = + "attribute vec4 a_position;\n" + "invariant varying float v_varying;\n" + "void main() { v_varying = a_position.x; gl_Position = a_position; }\n"; + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + EXPECT_NE(0u, program); +} + +// Verify that declaring varying as invariant in both shaders fails in ESSL 3.00. +TEST_P(GLSLTest_ES3, InvariantVaryingBoth) +{ + const std::string fragmentShaderSource = + "#version 300 es\n" + "precision mediump float;\n" + "invariant in float v_varying;\n" + "out vec4 my_FragColor;\n" + "void main() { my_FragColor = vec4(v_varying, 0, 0, 1.0); }\n"; + + const std::string vertexShaderSource = + "#version 300 es\n" + "in vec4 a_position;\n" + "invariant out float v_varying;\n" + "void main() { v_varying = a_position.x; gl_Position = a_position; }\n"; + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + EXPECT_EQ(0u, program); +} + +// Verify that declaring gl_Position as invariant succeeds in ESSL 1.00. +TEST_P(GLSLTest, InvariantGLPosition) +{ + const std::string fragmentShaderSource = + "precision mediump float;\n" + "varying float v_varying;\n" + "void main() { gl_FragColor = vec4(v_varying, 0, 0, 1.0); }\n"; + + const std::string vertexShaderSource = + "attribute vec4 a_position;\n" + "invariant gl_Position;\n" + "varying float v_varying;\n" + "void main() { v_varying = a_position.x; gl_Position = a_position; }\n"; + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + EXPECT_NE(0u, program); +} + +// Verify that declaring gl_Position as invariant succeeds in ESSL 3.00. +TEST_P(GLSLTest_ES3, InvariantGLPosition) +{ + const std::string fragmentShaderSource = + "#version 300 es\n" + "precision mediump float;\n" + "in float v_varying;\n" + "out vec4 my_FragColor;\n" + "void main() { my_FragColor = vec4(v_varying, 0, 0, 1.0); }\n"; + + const std::string vertexShaderSource = + "#version 300 es\n" + "in vec4 a_position;\n" + "invariant gl_Position;\n" + "out float v_varying;\n" + "void main() { v_varying = a_position.x; gl_Position = a_position; }\n"; + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + EXPECT_NE(0u, program); +} + +// Verify that using invariant(all) in both shaders succeeds in ESSL 1.00. +TEST_P(GLSLTest, InvariantAllBoth) +{ + // TODO: ESSL 1.00 -> GLSL 1.20 translation should add "invariant" in fragment shader + // for varyings which are invariant in vertex shader individually, + // and remove invariant(all) from fragment shader (http://anglebug.com/1293) + if (IsDesktopOpenGL()) + { + std::cout << "Test disabled on OpenGL." << std::endl; + return; + } + + const std::string fragmentShaderSource = + "#pragma STDGL invariant(all)\n" + "precision mediump float;\n" + "varying float v_varying;\n" + "void main() { gl_FragColor = vec4(v_varying, 0, 0, 1.0); }\n"; + + const std::string vertexShaderSource = + "#pragma STDGL invariant(all)\n" + "attribute vec4 a_position;\n" + "varying float v_varying;\n" + "void main() { v_varying = a_position.x; gl_Position = a_position; }\n"; + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + EXPECT_NE(0u, program); +} + +// Verify that functions without return statements still compile +TEST_P(GLSLTest, MissingReturnFloat) +{ + const std::string vertexShaderSource = + "varying float v_varying;\n" + "float f() { if (v_varying > 0.0) return 1.0; }\n" + "void main() { gl_Position = vec4(f(), 0, 0, 1); }\n"; + + const std::string fragmentShaderSource = + "precision mediump float;\n" + "void main() { gl_FragColor = vec4(0, 0, 0, 1); }\n"; + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + EXPECT_NE(0u, program); +} + +// Verify that functions without return statements still compile +TEST_P(GLSLTest, MissingReturnVec2) +{ + const std::string vertexShaderSource = + "varying float v_varying;\n" + "vec2 f() { if (v_varying > 0.0) return vec2(1.0, 1.0); }\n" + "void main() { gl_Position = vec4(f().x, 0, 0, 1); }\n"; + + const std::string fragmentShaderSource = + "precision mediump float;\n" + "void main() { gl_FragColor = vec4(0, 0, 0, 1); }\n"; + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + EXPECT_NE(0u, program); +} + +// Verify that functions without return statements still compile +TEST_P(GLSLTest, MissingReturnVec3) +{ + const std::string vertexShaderSource = + "varying float v_varying;\n" + "vec3 f() { if (v_varying > 0.0) return vec3(1.0, 1.0, 1.0); }\n" + "void main() { gl_Position = vec4(f().x, 0, 0, 1); }\n"; + + const std::string fragmentShaderSource = + "precision mediump float;\n" + "void main() { gl_FragColor = vec4(0, 0, 0, 1); }\n"; + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + EXPECT_NE(0u, program); +} + +// Verify that functions without return statements still compile +TEST_P(GLSLTest, MissingReturnVec4) +{ + const std::string vertexShaderSource = + "varying float v_varying;\n" + "vec4 f() { if (v_varying > 0.0) return vec4(1.0, 1.0, 1.0, 1.0); }\n" + "void main() { gl_Position = vec4(f().x, 0, 0, 1); }\n"; + + const std::string fragmentShaderSource = + "precision mediump float;\n" + "void main() { gl_FragColor = vec4(0, 0, 0, 1); }\n"; + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + EXPECT_NE(0u, program); +} + +// Verify that functions without return statements still compile +TEST_P(GLSLTest, MissingReturnIVec4) +{ + const std::string vertexShaderSource = + "varying float v_varying;\n" + "ivec4 f() { if (v_varying > 0.0) return ivec4(1, 1, 1, 1); }\n" + "void main() { gl_Position = vec4(f().x, 0, 0, 1); }\n"; + + const std::string fragmentShaderSource = + "precision mediump float;\n" + "void main() { gl_FragColor = vec4(0, 0, 0, 1); }\n"; + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + EXPECT_NE(0u, program); +} + +// Verify that functions without return statements still compile +TEST_P(GLSLTest, MissingReturnMat4) +{ + const std::string vertexShaderSource = + "varying float v_varying;\n" + "mat4 f() { if (v_varying > 0.0) return mat4(1.0); }\n" + "void main() { gl_Position = vec4(f()[0][0], 0, 0, 1); }\n"; + + const std::string fragmentShaderSource = + "precision mediump float;\n" + "void main() { gl_FragColor = vec4(0, 0, 0, 1); }\n"; + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + EXPECT_NE(0u, program); +} + +// Verify that functions without return statements still compile +TEST_P(GLSLTest, MissingReturnStruct) +{ + const std::string vertexShaderSource = + "varying float v_varying;\n" + "struct s { float a; int b; vec2 c; };\n" + "s f() { if (v_varying > 0.0) return s(1.0, 1, vec2(1.0, 1.0)); }\n" + "void main() { gl_Position = vec4(f().a, 0, 0, 1); }\n"; + + const std::string fragmentShaderSource = + "precision mediump float;\n" + "void main() { gl_FragColor = vec4(0, 0, 0, 1); }\n"; + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + EXPECT_NE(0u, program); +} + +// Verify that functions without return statements still compile +TEST_P(GLSLTest_ES3, MissingReturnArray) +{ + const std::string vertexShaderSource = + "#version 300 es\n" + "in float v_varying;\n" + "vec2[2] f() { if (v_varying > 0.0) { return vec2[2](vec2(1.0, 1.0), vec2(1.0, 1.0)); } }\n" + "void main() { gl_Position = vec4(f()[0].x, 0, 0, 1); }\n"; + + const std::string fragmentShaderSource = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main() { my_FragColor = vec4(0, 0, 0, 1); }\n"; + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + EXPECT_NE(0u, program); +} + +// Verify that functions without return statements still compile +TEST_P(GLSLTest_ES3, MissingReturnArrayOfStructs) +{ + const std::string vertexShaderSource = + "#version 300 es\n" + "in float v_varying;\n" + "struct s { float a; int b; vec2 c; };\n" + "s[2] f() { if (v_varying > 0.0) { return s[2](s(1.0, 1, vec2(1.0, 1.0)), s(1.0, 1, " + "vec2(1.0, 1.0))); } }\n" + "void main() { gl_Position = vec4(f()[0].a, 0, 0, 1); }\n"; + + const std::string fragmentShaderSource = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main() { my_FragColor = vec4(0, 0, 0, 1); }\n"; + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + EXPECT_NE(0u, program); +} + +// Verify that functions without return statements still compile +TEST_P(GLSLTest_ES3, MissingReturnStructOfArrays) +{ + // TODO(cwallez) remove the suppression once NVIDIA removes the restriction for + // GLSL >= 300. It was defined only in GLSL 2.0, section 6.1. + if (IsNVIDIA() && IsOpenGLES()) + { + std::cout << "Test skipped on NVIDIA OpenGL ES because it disallows returning " + "structure of arrays" + << std::endl; + return; + } + + const std::string vertexShaderSource = + "#version 300 es\n" + "in float v_varying;\n" + "struct s { float a[2]; int b[2]; vec2 c[2]; };\n" + "s f() { if (v_varying > 0.0) { return s(float[2](1.0, 1.0), int[2](1, 1)," + "vec2[2](vec2(1.0, 1.0), vec2(1.0, 1.0))); } }\n" + "void main() { gl_Position = vec4(f().a[0], 0, 0, 1); }\n"; + + const std::string fragmentShaderSource = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "void main() { my_FragColor = vec4(0, 0, 0, 1); }\n"; + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + EXPECT_NE(0u, program); +} + +// Verify that using invariant(all) in both shaders fails in ESSL 3.00. +TEST_P(GLSLTest_ES3, InvariantAllBoth) +{ + const std::string fragmentShaderSource = + "#version 300 es\n" + "#pragma STDGL invariant(all)\n" + "precision mediump float;\n" + "in float v_varying;\n" + "out vec4 my_FragColor;\n" + "void main() { my_FragColor = vec4(v_varying, 0, 0, 1.0); }\n"; + + const std::string vertexShaderSource = + "#version 300 es\n" + "#pragma STDGL invariant(all)\n" + "in vec4 a_position;\n" + "out float v_varying;\n" + "void main() { v_varying = a_position.x; gl_Position = a_position; }\n"; + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + EXPECT_EQ(0u, program); +} + +// Verify that using invariant(all) only in fragment shader fails in ESSL 1.00. +TEST_P(GLSLTest, InvariantAllIn) +{ + const std::string fragmentShaderSource = + "#pragma STDGL invariant(all)\n" + "precision mediump float;\n" + "varying float v_varying;\n" + "void main() { gl_FragColor = vec4(v_varying, 0, 0, 1.0); }\n"; + + const std::string vertexShaderSource = + "attribute vec4 a_position;\n" + "varying float v_varying;\n" + "void main() { v_varying = a_position.x; gl_Position = a_position; }\n"; + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + EXPECT_EQ(0u, program); +} + +// Verify that using invariant(all) only in fragment shader fails in ESSL 3.00. +TEST_P(GLSLTest_ES3, InvariantAllIn) +{ + const std::string fragmentShaderSource = + "#version 300 es\n" + "#pragma STDGL invariant(all)\n" + "precision mediump float;\n" + "in float v_varying;\n" + "out vec4 my_FragColor;\n" + "void main() { my_FragColor = vec4(v_varying, 0, 0, 1.0); }\n"; + + const std::string vertexShaderSource = + "#version 300 es\n" + "in vec4 a_position;\n" + "out float v_varying;\n" + "void main() { v_varying = a_position.x; gl_Position = a_position; }\n"; + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + EXPECT_EQ(0u, program); +} + +// Verify that using invariant(all) only in vertex shader fails in ESSL 1.00. +TEST_P(GLSLTest, InvariantAllOut) +{ + const std::string fragmentShaderSource = + "precision mediump float;\n" + "varying float v_varying;\n" + "void main() { gl_FragColor = vec4(v_varying, 0, 0, 1.0); }\n"; + + const std::string vertexShaderSource = + "#pragma STDGL invariant(all)\n" + "attribute vec4 a_position;\n" + "varying float v_varying;\n" + "void main() { v_varying = a_position.x; gl_Position = a_position; }\n"; + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + EXPECT_EQ(0u, program); +} + +// Verify that using invariant(all) only in vertex shader succeeds in ESSL 3.00. +TEST_P(GLSLTest_ES3, InvariantAllOut) +{ + // TODO: ESSL 3.00 -> GLSL 1.20 translation should add "invariant" in fragment shader + // for varyings which are invariant in vertex shader, + // because of invariant(all) being used in vertex shader (http://anglebug.com/1293) + if (IsDesktopOpenGL()) + { + std::cout << "Test disabled on OpenGL." << std::endl; + return; + } + + const std::string fragmentShaderSource = + "#version 300 es\n" + "precision mediump float;\n" + "in float v_varying;\n" + "out vec4 my_FragColor;\n" + "void main() { my_FragColor = vec4(v_varying, 0, 0, 1.0); }\n"; + + const std::string vertexShaderSource = + "#version 300 es\n" + "#pragma STDGL invariant(all)\n" + "in vec4 a_position;\n" + "out float v_varying;\n" + "void main() { v_varying = a_position.x; gl_Position = a_position; }\n"; + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + EXPECT_NE(0u, program); +} + +TEST_P(GLSLTest, MaxVaryingVec4) +{ +#if defined(__APPLE__) + // TODO(geofflang): Find out why this doesn't compile on Apple AND OpenGL drivers + // (http://anglebug.com/1291) + if (IsAMD() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + std::cout << "Test disabled on Apple AMD OpenGL." << std::endl; + return; + } +#endif + + GLint maxVaryings = 0; + glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings); + + VaryingTestBase(0, 0, 0, 0, 0, 0, maxVaryings, 0, false, false, false, true); +} + +TEST_P(GLSLTest, MaxMinusTwoVaryingVec4PlusTwoSpecialVariables) +{ + GLint maxVaryings = 0; + glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings); + + // Generate shader code that uses gl_FragCoord and gl_PointCoord, two special fragment shader variables. + VaryingTestBase(0, 0, 0, 0, 0, 0, maxVaryings - 2, 0, true, true, false, true); +} + +TEST_P(GLSLTest, MaxMinusTwoVaryingVec4PlusThreeSpecialVariables) +{ + // TODO(geofflang): Figure out why this fails on OpenGL AMD (http://anglebug.com/1291) + if (IsAMD() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + std::cout << "Test disabled on OpenGL." << std::endl; + return; + } + + GLint maxVaryings = 0; + glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings); + + // Generate shader code that uses gl_FragCoord, gl_PointCoord and gl_PointSize. + VaryingTestBase(0, 0, 0, 0, 0, 0, maxVaryings - 2, 0, true, true, true, true); +} + +// Disabled because drivers are allowed to successfully compile shaders that have more than the +// maximum number of varyings. (http://anglebug.com/1296) +TEST_P(GLSLTest, DISABLED_MaxVaryingVec4PlusFragCoord) +{ + GLint maxVaryings = 0; + glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings); + + // Generate shader code that uses gl_FragCoord, a special fragment shader variables. + // This test should fail, since we are really using (maxVaryings + 1) varyings. + VaryingTestBase(0, 0, 0, 0, 0, 0, maxVaryings, 0, true, false, false, false); +} + +// Disabled because drivers are allowed to successfully compile shaders that have more than the +// maximum number of varyings. (http://anglebug.com/1296) +TEST_P(GLSLTest, DISABLED_MaxVaryingVec4PlusPointCoord) +{ + GLint maxVaryings = 0; + glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings); + + // Generate shader code that uses gl_FragCoord, a special fragment shader variables. + // This test should fail, since we are really using (maxVaryings + 1) varyings. + VaryingTestBase(0, 0, 0, 0, 0, 0, maxVaryings, 0, false, true, false, false); +} + +TEST_P(GLSLTest, MaxVaryingVec3) +{ + GLint maxVaryings = 0; + glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings); + + VaryingTestBase(0, 0, 0, 0, maxVaryings, 0, 0, 0, false, false, false, true); +} + +TEST_P(GLSLTest, MaxVaryingVec3Array) +{ + GLint maxVaryings = 0; + glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings); + + VaryingTestBase(0, 0, 0, 0, 0, maxVaryings / 2, 0, 0, false, false, false, true); +} + +// Disabled because of a failure in D3D9 +TEST_P(GLSLTest, MaxVaryingVec3AndOneFloat) +{ + if (IsD3D9()) + { + std::cout << "Test disabled on D3D9." << std::endl; + return; + } + + GLint maxVaryings = 0; + glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings); + + VaryingTestBase(1, 0, 0, 0, maxVaryings, 0, 0, 0, false, false, false, true); +} + +// Disabled because of a failure in D3D9 +TEST_P(GLSLTest, MaxVaryingVec3ArrayAndOneFloatArray) +{ + if (IsD3D9()) + { + std::cout << "Test disabled on D3D9." << std::endl; + return; + } + + GLint maxVaryings = 0; + glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings); + + VaryingTestBase(0, 1, 0, 0, 0, maxVaryings / 2, 0, 0, false, false, false, true); +} + +// Disabled because of a failure in D3D9 +TEST_P(GLSLTest, TwiceMaxVaryingVec2) +{ + if (IsD3D9()) + { + std::cout << "Test disabled on D3D9." << std::endl; + return; + } + + if (getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE) + { + // TODO(geofflang): Figure out why this fails on NVIDIA's GLES driver + std::cout << "Test disabled on OpenGL ES." << std::endl; + return; + } + +#if defined(__APPLE__) + // TODO(geofflang): Find out why this doesn't compile on Apple AND OpenGL drivers + // (http://anglebug.com/1291) + if (IsAMD() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + std::cout << "Test disabled on Apple AMD OpenGL." << std::endl; + return; + } +#endif + + GLint maxVaryings = 0; + glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings); + + VaryingTestBase(0, 0, 2 * maxVaryings, 0, 0, 0, 0, 0, false, false, false, true); +} + +// Disabled because of a failure in D3D9 +TEST_P(GLSLTest, MaxVaryingVec2Arrays) +{ + if (IsD3DSM3()) + { + std::cout << "Test disabled on SM3." << std::endl; + return; + } + + if (getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE) + { + // TODO(geofflang): Figure out why this fails on NVIDIA's GLES driver + std::cout << "Test disabled on OpenGL ES." << std::endl; + return; + } + +#if defined(__APPLE__) + // TODO(geofflang): Find out why this doesn't compile on Apple AND OpenGL drivers + // (http://anglebug.com/1291) + if (IsAMD() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + std::cout << "Test disabled on Apple AMD OpenGL." << std::endl; + return; + } +#endif + + GLint maxVaryings = 0; + glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings); + + VaryingTestBase(0, 0, 0, maxVaryings, 0, 0, 0, 0, false, false, false, true); +} + +// Disabled because drivers are allowed to successfully compile shaders that have more than the +// maximum number of varyings. (http://anglebug.com/1296) +TEST_P(GLSLTest, DISABLED_MaxPlusOneVaryingVec3) +{ + GLint maxVaryings = 0; + glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings); + + VaryingTestBase(0, 0, 0, 0, maxVaryings + 1, 0, 0, 0, false, false, false, false); +} + +// Disabled because drivers are allowed to successfully compile shaders that have more than the +// maximum number of varyings. (http://anglebug.com/1296) +TEST_P(GLSLTest, DISABLED_MaxPlusOneVaryingVec3Array) +{ + GLint maxVaryings = 0; + glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings); + + VaryingTestBase(0, 0, 0, 0, 0, maxVaryings / 2 + 1, 0, 0, false, false, false, false); +} + +// Disabled because drivers are allowed to successfully compile shaders that have more than the +// maximum number of varyings. (http://anglebug.com/1296) +TEST_P(GLSLTest, DISABLED_MaxVaryingVec3AndOneVec2) +{ + GLint maxVaryings = 0; + glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings); + + VaryingTestBase(0, 0, 1, 0, maxVaryings, 0, 0, 0, false, false, false, false); +} + +// Disabled because drivers are allowed to successfully compile shaders that have more than the +// maximum number of varyings. (http://anglebug.com/1296) +TEST_P(GLSLTest, DISABLED_MaxPlusOneVaryingVec2) +{ + GLint maxVaryings = 0; + glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings); + + VaryingTestBase(0, 0, 2 * maxVaryings + 1, 0, 0, 0, 0, 0, false, false, false, false); +} + +// Disabled because drivers are allowed to successfully compile shaders that have more than the +// maximum number of varyings. (http://anglebug.com/1296) +TEST_P(GLSLTest, DISABLED_MaxVaryingVec3ArrayAndMaxPlusOneFloatArray) +{ + GLint maxVaryings = 0; + glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings); + + VaryingTestBase(0, maxVaryings / 2 + 1, 0, 0, 0, 0, 0, maxVaryings / 2, false, false, false, false); +} + +// Verify shader source with a fixed length that is less than the null-terminated length will compile. +TEST_P(GLSLTest, FixedShaderLength) +{ + GLuint shader = glCreateShader(GL_FRAGMENT_SHADER); + + const std::string appendGarbage = "abcasdfasdfasdfasdfasdf"; + const std::string source = "void main() { gl_FragColor = vec4(0, 0, 0, 0); }" + appendGarbage; + const char *sourceArray[1] = { source.c_str() }; + GLint lengths[1] = { static_cast<GLint>(source.length() - appendGarbage.length()) }; + glShaderSource(shader, static_cast<GLsizei>(ArraySize(sourceArray)), sourceArray, lengths); + glCompileShader(shader); + + GLint compileResult; + glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult); + EXPECT_NE(compileResult, 0); +} + +// Verify that a negative shader source length is treated as a null-terminated length. +TEST_P(GLSLTest, NegativeShaderLength) +{ + GLuint shader = glCreateShader(GL_FRAGMENT_SHADER); + + const char *sourceArray[1] = { "void main() { gl_FragColor = vec4(0, 0, 0, 0); }" }; + GLint lengths[1] = { -10 }; + glShaderSource(shader, static_cast<GLsizei>(ArraySize(sourceArray)), sourceArray, lengths); + glCompileShader(shader); + + GLint compileResult; + glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult); + EXPECT_NE(compileResult, 0); +} + +// Check that having an invalid char after the "." doesn't cause an assert. +TEST_P(GLSLTest, InvalidFieldFirstChar) +{ + GLuint shader = glCreateShader(GL_VERTEX_SHADER); + const char *source = "void main() {vec4 x; x.}"; + glShaderSource(shader, 1, &source, 0); + glCompileShader(shader); + + GLint compileResult; + glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult); + EXPECT_EQ(0, compileResult); +} + +// Verify that a length array with mixed positive and negative values compiles. +TEST_P(GLSLTest, MixedShaderLengths) +{ + GLuint shader = glCreateShader(GL_FRAGMENT_SHADER); + + const char *sourceArray[] = + { + "void main()", + "{", + " gl_FragColor = vec4(0, 0, 0, 0);", + "}", + }; + GLint lengths[] = + { + -10, + 1, + static_cast<GLint>(strlen(sourceArray[2])), + -1, + }; + ASSERT_EQ(ArraySize(sourceArray), ArraySize(lengths)); + + glShaderSource(shader, static_cast<GLsizei>(ArraySize(sourceArray)), sourceArray, lengths); + glCompileShader(shader); + + GLint compileResult; + glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult); + EXPECT_NE(compileResult, 0); +} + +// Verify that zero-length shader source does not affect shader compilation. +TEST_P(GLSLTest, ZeroShaderLength) +{ + GLuint shader = glCreateShader(GL_FRAGMENT_SHADER); + + const char *sourceArray[] = + { + "adfasdf", + "34534", + "void main() { gl_FragColor = vec4(0, 0, 0, 0); }", + "", + "asdfasdfsdsdf", + }; + GLint lengths[] = + { + 0, + 0, + -1, + 0, + 0, + }; + ASSERT_EQ(ArraySize(sourceArray), ArraySize(lengths)); + + glShaderSource(shader, static_cast<GLsizei>(ArraySize(sourceArray)), sourceArray, lengths); + glCompileShader(shader); + + GLint compileResult; + glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult); + EXPECT_NE(compileResult, 0); +} + +// Tests that bad index expressions don't crash ANGLE's translator. +// https://code.google.com/p/angleproject/issues/detail?id=857 +TEST_P(GLSLTest, BadIndexBug) +{ + const std::string &fragmentShaderSourceVec = + "precision mediump float;\n" + "uniform vec4 uniformVec;\n" + "void main()\n" + "{\n" + " gl_FragColor = vec4(uniformVec[int()]);\n" + "}"; + + GLuint shader = CompileShader(GL_FRAGMENT_SHADER, fragmentShaderSourceVec); + EXPECT_EQ(0u, shader); + + if (shader != 0) + { + glDeleteShader(shader); + } + + const std::string &fragmentShaderSourceMat = + "precision mediump float;\n" + "uniform mat4 uniformMat;\n" + "void main()\n" + "{\n" + " gl_FragColor = vec4(uniformMat[int()]);\n" + "}"; + + shader = CompileShader(GL_FRAGMENT_SHADER, fragmentShaderSourceMat); + EXPECT_EQ(0u, shader); + + if (shader != 0) + { + glDeleteShader(shader); + } + + const std::string &fragmentShaderSourceArray = + "precision mediump float;\n" + "uniform vec4 uniformArray;\n" + "void main()\n" + "{\n" + " gl_FragColor = vec4(uniformArray[int()]);\n" + "}"; + + shader = CompileShader(GL_FRAGMENT_SHADER, fragmentShaderSourceArray); + EXPECT_EQ(0u, shader); + + if (shader != 0) + { + glDeleteShader(shader); + } +} + +// Test that structs defined in uniforms are translated correctly. +TEST_P(GLSLTest, StructSpecifiersUniforms) +{ + const std::string fragmentShaderSource = SHADER_SOURCE + ( + precision mediump float; + + uniform struct S { float field;} s; + + void main() + { + gl_FragColor = vec4(1, 0, 0, 1); + gl_FragColor.a += s.field; + } + ); + + GLuint program = CompileProgram(mSimpleVSSource, fragmentShaderSource); + EXPECT_NE(0u, program); +} + +// Test that gl_DepthRange is not stored as a uniform location. Since uniforms +// beginning with "gl_" are filtered out by our validation logic, we must +// bypass the validation to test the behaviour of the implementation. +// (note this test is still Impl-independent) +TEST_P(GLSLTest, DepthRangeUniforms) +{ + const std::string fragmentShaderSource = SHADER_SOURCE + ( + precision mediump float; + + void main() + { + gl_FragColor = vec4(gl_DepthRange.near, gl_DepthRange.far, gl_DepthRange.diff, 1); + } + ); + + GLuint program = CompileProgram(mSimpleVSSource, fragmentShaderSource); + EXPECT_NE(0u, program); + + // dive into the ANGLE internals, so we can bypass validation. + gl::Context *context = reinterpret_cast<gl::Context *>(getEGLWindow()->getContext()); + gl::Program *glProgram = context->getProgram(program); + GLint nearIndex = glProgram->getUniformLocation("gl_DepthRange.near"); + EXPECT_EQ(-1, nearIndex); + + // Test drawing does not throw an exception. + drawQuad(program, "inputAttribute", 0.5f); + + EXPECT_GL_NO_ERROR(); + + glDeleteProgram(program); +} + +std::string GenerateSmallPowShader(double base, double exponent) +{ + std::stringstream stream; + + stream.precision(8); + + double result = pow(base, exponent); + + stream << "precision highp float;\n" + << "float fun(float arg)\n" + << "{\n" + << " return pow(arg, " << std::fixed << exponent << ");\n" + << "}\n" + << "\n" + << "void main()\n" + << "{\n" + << " const float a = " << std::scientific << base << ";\n" + << " float b = fun(a);\n" + << " if (abs(" << result << " - b) < " << std::abs(result * 0.001) << ")\n" + << " {\n" + << " gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);\n" + << " }\n" + << " else\n" + << " {\n" + << " gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n" + << " }\n" + << "}\n"; + + return stream.str(); +} + +// Covers the WebGL test 'glsl/bugs/pow-of-small-constant-in-user-defined-function' +// See http://anglebug.com/851 +TEST_P(GLSLTest, PowOfSmallConstant) +{ + std::vector<double> bads; + for (int eps = -1; eps <= 1; ++eps) + { + for (int i = -4; i <= 5; ++i) + { + if (i >= -1 && i <= 1) + continue; + const double epsilon = 1.0e-8; + double bad = static_cast<double>(i) + static_cast<double>(eps) * epsilon; + bads.push_back(bad); + } + } + + for (double bad : bads) + { + const std::string &fragmentShaderSource = GenerateSmallPowShader(1.0e-6, bad); + + ANGLE_GL_PROGRAM(program, mSimpleVSSource, fragmentShaderSource); + + drawQuad(program.get(), "inputAttribute", 0.5f); + + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); + EXPECT_GL_NO_ERROR(); + } +} + +// Test that fragment shaders which contain non-constant loop indexers and compiled for FL9_3 and +// below +// fail with a specific error message. +// Additionally test that the same fragment shader compiles successfully with feature levels greater +// than FL9_3. +TEST_P(GLSLTest, LoopIndexingValidation) +{ + const std::string fragmentShaderSource = SHADER_SOURCE + ( + precision mediump float; + + uniform float loopMax; + + void main() + { + gl_FragColor = vec4(1, 0, 0, 1); + for (float l = 0.0; l < loopMax; l++) + { + if (loopMax > 3.0) + { + gl_FragColor.a += 0.1; + } + } + } + ); + + GLuint shader = glCreateShader(GL_FRAGMENT_SHADER); + + const char *sourceArray[1] = {fragmentShaderSource.c_str()}; + glShaderSource(shader, 1, sourceArray, nullptr); + glCompileShader(shader); + + GLint compileResult; + glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult); + + // If the test is configured to run limited to Feature Level 9_3, then it is + // assumed that shader compilation will fail with an expected error message containing + // "Loop index cannot be compared with non-constant expression" + if ((GetParam() == ES2_D3D11_FL9_3() || GetParam() == ES2_D3D9())) + { + if (compileResult != 0) + { + FAIL() << "Shader compilation succeeded, expected failure"; + } + else + { + GLint infoLogLength; + glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength); + + std::string infoLog; + infoLog.resize(infoLogLength); + glGetShaderInfoLog(shader, static_cast<GLsizei>(infoLog.size()), NULL, &infoLog[0]); + + if (infoLog.find("Loop index cannot be compared with non-constant expression") == + std::string::npos) + { + FAIL() << "Shader compilation failed with unexpected error message"; + } + } + } + else + { + EXPECT_NE(0, compileResult); + } + + if (shader != 0) + { + glDeleteShader(shader); + } +} + +// Tests that the maximum uniforms count returned from querying GL_MAX_VERTEX_UNIFORM_VECTORS +// can actually be used. +TEST_P(GLSLTest, VerifyMaxVertexUniformVectors) +{ + int maxUniforms = 10000; + glGetIntegerv(GL_MAX_VERTEX_UNIFORM_VECTORS, &maxUniforms); + EXPECT_GL_NO_ERROR(); + std::cout << "Validating GL_MAX_VERTEX_UNIFORM_VECTORS = " << maxUniforms << std::endl; + + CompileGLSLWithUniformsAndSamplers(maxUniforms, 0, 0, 0, true); +} + +// Tests that the maximum uniforms count returned from querying GL_MAX_VERTEX_UNIFORM_VECTORS +// can actually be used along with the maximum number of texture samplers. +TEST_P(GLSLTest, VerifyMaxVertexUniformVectorsWithSamplers) +{ + if (GetParam().eglParameters.renderer == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE || + GetParam().eglParameters.renderer == EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE) + { + std::cout << "Test disabled on OpenGL." << std::endl; + return; + } + + int maxUniforms = 10000; + glGetIntegerv(GL_MAX_VERTEX_UNIFORM_VECTORS, &maxUniforms); + EXPECT_GL_NO_ERROR(); + std::cout << "Validating GL_MAX_VERTEX_UNIFORM_VECTORS = " << maxUniforms << std::endl; + + int maxTextureImageUnits = 0; + glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &maxTextureImageUnits); + + CompileGLSLWithUniformsAndSamplers(maxUniforms, 0, maxTextureImageUnits, 0, true); +} + +// Tests that the maximum uniforms count + 1 from querying GL_MAX_VERTEX_UNIFORM_VECTORS +// fails shader compilation. +TEST_P(GLSLTest, VerifyMaxVertexUniformVectorsExceeded) +{ + int maxUniforms = 10000; + glGetIntegerv(GL_MAX_VERTEX_UNIFORM_VECTORS, &maxUniforms); + EXPECT_GL_NO_ERROR(); + std::cout << "Validating GL_MAX_VERTEX_UNIFORM_VECTORS + 1 = " << maxUniforms + 1 << std::endl; + + CompileGLSLWithUniformsAndSamplers(maxUniforms + 1, 0, 0, 0, false); +} + +// Tests that the maximum uniforms count returned from querying GL_MAX_FRAGMENT_UNIFORM_VECTORS +// can actually be used. +TEST_P(GLSLTest, VerifyMaxFragmentUniformVectors) +{ + int maxUniforms = 10000; + glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_VECTORS, &maxUniforms); + EXPECT_GL_NO_ERROR(); + std::cout << "Validating GL_MAX_FRAGMENT_UNIFORM_VECTORS = " << maxUniforms << std::endl; + + CompileGLSLWithUniformsAndSamplers(0, maxUniforms, 0, 0, true); +} + +// Tests that the maximum uniforms count returned from querying GL_MAX_FRAGMENT_UNIFORM_VECTORS +// can actually be used along with the maximum number of texture samplers. +TEST_P(GLSLTest, VerifyMaxFragmentUniformVectorsWithSamplers) +{ + if (GetParam().eglParameters.renderer == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE || + GetParam().eglParameters.renderer == EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE) + { + std::cout << "Test disabled on OpenGL." << std::endl; + return; + } + + int maxUniforms = 10000; + glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_VECTORS, &maxUniforms); + EXPECT_GL_NO_ERROR(); + + int maxTextureImageUnits = 0; + glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextureImageUnits); + + CompileGLSLWithUniformsAndSamplers(0, maxUniforms, 0, maxTextureImageUnits, true); +} + +// Tests that the maximum uniforms count + 1 from querying GL_MAX_FRAGMENT_UNIFORM_VECTORS +// fails shader compilation. +TEST_P(GLSLTest, VerifyMaxFragmentUniformVectorsExceeded) +{ + int maxUniforms = 10000; + glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_VECTORS, &maxUniforms); + EXPECT_GL_NO_ERROR(); + std::cout << "Validating GL_MAX_FRAGMENT_UNIFORM_VECTORS + 1 = " << maxUniforms + 1 + << std::endl; + + CompileGLSLWithUniformsAndSamplers(0, maxUniforms + 1, 0, 0, false); +} + +// Test that two constructors which have vec4 and mat2 parameters get disambiguated (issue in +// HLSL). +TEST_P(GLSLTest_ES3, AmbiguousConstructorCall2x2) +{ + const std::string fragmentShaderSource = + "#version 300 es\n" + "precision highp float;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " my_FragColor = vec4(0.0);\n" + "}"; + + const std::string vertexShaderSource = + "#version 300 es\n" + "precision highp float;\n" + "in vec4 a_vec;\n" + "in mat2 a_mat;\n" + "void main()\n" + "{\n" + " gl_Position = vec4(a_vec) + vec4(a_mat);\n" + "}"; + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + EXPECT_NE(0u, program); +} + +// Test that two constructors which have mat2x3 and mat3x2 parameters get disambiguated. +// This was suspected to be an issue in HLSL, but HLSL seems to be able to natively choose between +// the function signatures in this case. +TEST_P(GLSLTest_ES3, AmbiguousConstructorCall2x3) +{ + const std::string fragmentShaderSource = + "#version 300 es\n" + "precision highp float;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " my_FragColor = vec4(0.0);\n" + "}"; + + const std::string vertexShaderSource = + "#version 300 es\n" + "precision highp float;\n" + "in mat3x2 a_matA;\n" + "in mat2x3 a_matB;\n" + "void main()\n" + "{\n" + " gl_Position = vec4(a_matA) + vec4(a_matB);\n" + "}"; + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + EXPECT_NE(0u, program); +} + +// Test that two functions which have vec4 and mat2 parameters get disambiguated (issue in HLSL). +TEST_P(GLSLTest_ES3, AmbiguousFunctionCall2x2) +{ + const std::string fragmentShaderSource = + "#version 300 es\n" + "precision highp float;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " my_FragColor = vec4(0.0);\n" + "}"; + + const std::string vertexShaderSource = + "#version 300 es\n" + "precision highp float;\n" + "in vec4 a_vec;\n" + "in mat2 a_mat;\n" + "vec4 foo(vec4 a)\n" + "{\n" + " return a;\n" + "}\n" + "vec4 foo(mat2 a)\n" + "{\n" + " return vec4(a[0][0]);\n" + "}\n" + "void main()\n" + "{\n" + " gl_Position = foo(a_vec) + foo(a_mat);\n" + "}"; + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + EXPECT_NE(0u, program); +} + +// Test that an user-defined function with a large number of float4 parameters doesn't fail due to +// the function name being too long. +TEST_P(GLSLTest_ES3, LargeNumberOfFloat4Parameters) +{ + const std::string fragmentShaderSource = + "#version 300 es\n" + "precision highp float;\n" + "out vec4 my_FragColor;\n" + "void main()\n" + "{\n" + " my_FragColor = vec4(0.0);\n" + "}"; + + std::stringstream vertexShaderStream; + const unsigned int paramCount = 1024u; + + vertexShaderStream << "#version 300 es\n" + "precision highp float;\n" + "in vec4 a_vec;\n" + "vec4 lotsOfVec4Parameters("; + for (unsigned int i = 0; i < paramCount; ++i) + { + vertexShaderStream << "vec4 a" << i << ", "; + } + vertexShaderStream << "vec4 aLast)\n" + "{\n" + " return "; + for (unsigned int i = 0; i < paramCount; ++i) + { + vertexShaderStream << "a" << i << " + "; + } + vertexShaderStream << "aLast;\n" + "}\n" + "void main()\n" + "{\n" + " gl_Position = lotsOfVec4Parameters("; + for (unsigned int i = 0; i < paramCount; ++i) + { + vertexShaderStream << "a_vec, "; + } + vertexShaderStream << "a_vec);\n" + "}"; + + GLuint program = CompileProgram(vertexShaderStream.str(), fragmentShaderSource); + EXPECT_NE(0u, program); +} + +// This test was written specifically to stress DeferGlobalInitializers AST transformation. +// Test a shader where a global constant array is initialized with an expression containing array +// indexing. This initializer is tricky to constant fold, so if it's not constant folded it needs to +// be handled in a way that doesn't generate statements in the global scope in HLSL output. +// Also includes multiple array initializers in one declaration, where only the second one has +// array indexing. This makes sure that the qualifier for the declaration is set correctly if +// transformations are applied to the declaration also in the case of ESSL output. +TEST_P(GLSLTest_ES3, InitGlobalArrayWithArrayIndexing) +{ + // TODO(ynovikov): re-enable once root cause of http://anglebug.com/1428 is fixed + if (IsAndroid() && IsAdreno() && IsOpenGLES()) + { + std::cout << "Test skipped on Adreno OpenGLES on Android." << std::endl; + return; + } + + const std::string vertexShaderSource = + "#version 300 es\n" + "precision highp float;\n" + "in vec4 a_vec;\n" + "void main()\n" + "{\n" + " gl_Position = vec4(a_vec);\n" + "}"; + + const std::string fragmentShaderSource = + "#version 300 es\n" + "precision highp float;\n" + "out vec4 my_FragColor;\n" + "const highp float f[2] = float[2](0.1, 0.2);\n" + "const highp float[2] g = float[2](0.3, 0.4), h = float[2](0.5, f[1]);\n" + "void main()\n" + "{\n" + " my_FragColor = vec4(h[1]);\n" + "}"; + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + EXPECT_NE(0u, program); +} + +// Test that index-constant sampler array indexing is supported. +TEST_P(GLSLTest, IndexConstantSamplerArrayIndexing) +{ + if (IsD3D11_FL93()) { + std::cout << "Test skipped on D3D11 FL 9.3." << std::endl; + return; + } + + const std::string vertexShaderSource = + "attribute vec4 vPosition;\n" + "void main()\n" + "{\n" + " gl_Position = vPosition;\n" + "}"; + + const std::string fragmentShaderSource = + "precision mediump float;\n" + "uniform sampler2D uni[2];\n" + "\n" + "float zero(int x)\n" + "{\n" + " return float(x) - float(x);\n" + "}\n" + "\n" + "void main()\n" + "{\n" + " vec4 c = vec4(0,0,0,0);\n" + " for (int ii = 1; ii < 3; ++ii) {\n" + " if (c.x > 255.0) {\n" + " c.x = 255.0 + zero(ii);\n" + " break;\n" + " }\n" + // Index the sampler array with a predictable loop index (index-constant) as opposed to + // a true constant. This is valid in OpenGL ES but isn't in many Desktop OpenGL versions, + // without an extension. + " c += texture2D(uni[ii - 1], vec2(0.5, 0.5));\n" + " }\n" + " gl_FragColor = c;\n" + "}"; + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + EXPECT_NE(0u, program); +} + +// Test that the #pragma directive is supported and doesn't trigger a compilation failure on the +// native driver. The only pragma that gets passed to the OpenGL driver is "invariant" but we don't +// want to test its behavior, so don't use any varyings. +TEST_P(GLSLTest, PragmaDirective) +{ + const std::string vertexShaderSource = + "#pragma STDGL invariant(all)\n" + "void main()\n" + "{\n" + " gl_Position = vec4(1.0, 0.0, 0.0, 1.0);\n" + "}\n"; + + const std::string fragmentShaderSource = + "precision mediump float;\n" + "void main()\n" + "{\n" + " gl_FragColor = vec4(1.0);\n" + "}\n"; + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + EXPECT_NE(0u, program); +} + +// Sequence operator evaluates operands from left to right (ESSL 3.00 section 5.9). +// The function call that returns the array needs to be evaluated after ++j for the expression to +// return the correct value (true). +TEST_P(GLSLTest_ES3, SequenceOperatorEvaluationOrderArray) +{ + const std::string &fragmentShaderSource = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor; \n" + "int[2] func(int param) {\n" + " return int[2](param, param);\n" + "}\n" + "void main() {\n" + " int a[2]; \n" + " for (int i = 0; i < 2; ++i) {\n" + " a[i] = 1;\n" + " }\n" + " int j = 0; \n" + " bool result = ((++j), (a == func(j)));\n" + " my_FragColor = vec4(0.0, (result ? 1.0 : 0.0), 0.0, 1.0);\n" + "}\n"; + + GLuint program = CompileProgram(mSimpleVSSource, fragmentShaderSource); + ASSERT_NE(0u, program); + + drawQuad(program, "inputAttribute", 0.5f); + + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); +} + +// Sequence operator evaluates operands from left to right (ESSL 3.00 section 5.9). +// The short-circuiting expression needs to be evaluated after ++j for the expression to return the +// correct value (true). +TEST_P(GLSLTest_ES3, SequenceOperatorEvaluationOrderShortCircuit) +{ + const std::string &fragmentShaderSource = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor; \n" + "void main() {\n" + " int j = 0; \n" + " bool result = ((++j), (j == 1 ? true : (++j == 3)));\n" + " my_FragColor = vec4(0.0, ((result && j == 1) ? 1.0 : 0.0), 0.0, 1.0);\n" + "}\n"; + + GLuint program = CompileProgram(mSimpleVSSource, fragmentShaderSource); + ASSERT_NE(0u, program); + + drawQuad(program, "inputAttribute", 0.5f); + + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); +} + +// Sequence operator evaluates operands from left to right (ESSL 3.00 section 5.9). +// Indexing the vector needs to be evaluated after func() for the right result. +TEST_P(GLSLTest_ES3, SequenceOperatorEvaluationOrderDynamicVectorIndexingInLValue) +{ + const std::string &fragmentShaderSource = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 my_FragColor;\n" + "uniform int u_zero;\n" + "int sideEffectCount = 0;\n" + "float func() {\n" + " ++sideEffectCount;\n" + " return -1.0;\n" + "}\n" + "void main() {\n" + " vec4 v = vec4(0.0, 2.0, 4.0, 6.0); \n" + " float f = (func(), (++v[u_zero + sideEffectCount]));\n" + " bool green = abs(f - 3.0) < 0.01 && abs(v[1] - 3.0) < 0.01 && sideEffectCount == 1;\n" + " my_FragColor = vec4(0.0, (green ? 1.0 : 0.0), 0.0, 1.0);\n" + "}\n"; + + GLuint program = CompileProgram(mSimpleVSSource, fragmentShaderSource); + ASSERT_NE(0u, program); + + drawQuad(program, "inputAttribute", 0.5f); + + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); +} + +// Test that using gl_PointCoord with GL_TRIANGLES doesn't produce a link error. +// From WebGL test conformance/rendering/point-specific-shader-variables.html +// See http://anglebug.com/1380 +TEST_P(GLSLTest, RenderTrisWithPointCoord) +{ + const std::string &vert = + "attribute vec2 aPosition;\n" + "void main()\n" + "{\n" + " gl_Position = vec4(aPosition, 0, 1);\n" + " gl_PointSize = 1.0;\n" + "}"; + const std::string &frag = + "void main()\n" + "{\n" + " gl_FragColor = vec4(gl_PointCoord.xy, 0, 1);\n" + " gl_FragColor = vec4(0, 1, 0, 1);\n" + "}"; + + ANGLE_GL_PROGRAM(prog, vert, frag); + drawQuad(prog.get(), "aPosition", 0.5f); + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); +} + +// Convers a bug with the integer pow statement workaround. +TEST_P(GLSLTest, NestedPowStatements) +{ + const std::string &vert = + "attribute vec2 position;\n" + "void main()\n" + "{\n" + " gl_Position = vec4(position, 0, 1);\n" + "}"; + const std::string &frag = + "precision mediump float;\n" + "float func(float v)\n" + "{\n" + " float f1 = pow(v, 2.0);\n" + " return pow(f1 + v, 2.0);\n" + "}\n" + "void main()\n" + "{\n" + " float v = func(2.0);\n" + " gl_FragColor = abs(v - 36.0) < 0.001 ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);\n" + "}"; + + ANGLE_GL_PROGRAM(prog, vert, frag); + drawQuad(prog.get(), "position", 0.5f); + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); +} + +// Convers a bug with the unary minus operator on signed integer workaround. +TEST_P(GLSLTest_ES3, UnaryMinusOperatorSignedInt) +{ + const std::string &vert = + "#version 300 es\n" + "in highp vec4 position;\n" + "out mediump vec4 v_color;\n" + "uniform int ui_one;\n" + "uniform int ui_two;\n" + "uniform int ui_three;\n" + "void main() {\n" + " int s[3];\n" + " s[0] = ui_one;\n" + " s[1] = -(-(-ui_two + 1) + 1);\n" // s[1] = -ui_two + " s[2] = ui_three;\n" + " int result = 0;\n" + " for (int i = 0; i < ui_three; i++) {\n" + " result += s[i];\n" + " }\n" + " v_color = (result == 2) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);\n" + " gl_Position = position;\n" + "}\n"; + const std::string &frag = + "#version 300 es\n" + "in mediump vec4 v_color;\n" + "layout(location=0) out mediump vec4 o_color;\n" + "void main() {\n" + " o_color = v_color;\n" + "}\n"; + + ANGLE_GL_PROGRAM(prog, vert, frag); + + gl::Context *context = reinterpret_cast<gl::Context *>(getEGLWindow()->getContext()); + gl::Program *glProgram = context->getProgram(prog.get()); + GLint oneIndex = glProgram->getUniformLocation("ui_one"); + ASSERT_NE(-1, oneIndex); + GLint twoIndex = glProgram->getUniformLocation("ui_two"); + ASSERT_NE(-1, twoIndex); + GLint threeIndex = glProgram->getUniformLocation("ui_three"); + ASSERT_NE(-1, threeIndex); + glUseProgram(prog.get()); + glUniform1i(oneIndex, 1); + glUniform1i(twoIndex, 2); + glUniform1i(threeIndex, 3); + + drawQuad(prog.get(), "position", 0.5f); + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); +} + +// Convers a bug with the unary minus operator on unsigned integer workaround. +TEST_P(GLSLTest_ES3, UnaryMinusOperatorUnsignedInt) +{ + const std::string &vert = + "#version 300 es\n" + "in highp vec4 position;\n" + "out mediump vec4 v_color;\n" + "uniform uint ui_one;\n" + "uniform uint ui_two;\n" + "uniform uint ui_three;\n" + "void main() {\n" + " uint s[3];\n" + " s[0] = ui_one;\n" + " s[1] = -(-(-ui_two + 1u) + 1u);\n" // s[1] = -ui_two + " s[2] = ui_three;\n" + " uint result = 0u;\n" + " for (uint i = 0u; i < ui_three; i++) {\n" + " result += s[i];\n" + " }\n" + " v_color = (result == 2u) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);\n" + " gl_Position = position;\n" + "}\n"; + const std::string &frag = + "#version 300 es\n" + "in mediump vec4 v_color;\n" + "layout(location=0) out mediump vec4 o_color;\n" + "void main() {\n" + " o_color = v_color;\n" + "}\n"; + + ANGLE_GL_PROGRAM(prog, vert, frag); + + gl::Context *context = reinterpret_cast<gl::Context *>(getEGLWindow()->getContext()); + gl::Program *glProgram = context->getProgram(prog.get()); + GLint oneIndex = glProgram->getUniformLocation("ui_one"); + ASSERT_NE(-1, oneIndex); + GLint twoIndex = glProgram->getUniformLocation("ui_two"); + ASSERT_NE(-1, twoIndex); + GLint threeIndex = glProgram->getUniformLocation("ui_three"); + ASSERT_NE(-1, threeIndex); + glUseProgram(prog.get()); + glUniform1ui(oneIndex, 1u); + glUniform1ui(twoIndex, 2u); + glUniform1ui(threeIndex, 3u); + + drawQuad(prog.get(), "position", 0.5f); + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); +} + +// Test a nested sequence operator with a ternary operator inside. The ternary operator is +// intended to be such that it gets converted to an if statement on the HLSL backend. +TEST_P(GLSLTest, NestedSequenceOperatorWithTernaryInside) +{ + const std::string &vert = + "attribute vec2 position;\n" + "void main()\n" + "{\n" + " gl_Position = vec4(position, 0, 1);\n" + "}"; + + // Note that the uniform keep_flop_positive doesn't need to be set - the test expects it to have + // its default value false. + const std::string &frag = + "precision mediump float;\n" + "uniform bool keep_flop_positive;\n" + "float flop;\n" + "void main() {\n" + " flop = -1.0,\n" + " (flop *= -1.0,\n" + " keep_flop_positive ? 0.0 : flop *= -1.0),\n" + " gl_FragColor = vec4(0, -flop, 0, 1);\n" + "}"; + + ANGLE_GL_PROGRAM(prog, vert, frag); + drawQuad(prog.get(), "position", 0.5f); + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); +} + +// Test that using a sampler2D and samplerExternalOES in the same shader works (anglebug.com/1534) +TEST_P(GLSLTest, ExternalAnd2DSampler) +{ + if (!extensionEnabled("GL_OES_EGL_image_external")) + { + std::cout << "Test skipped because GL_OES_EGL_image_external is not available." + << std::endl; + return; + } + + const std::string fragmentShader = + "precision mediump float;\n" + "uniform samplerExternalOES tex0;\n" + "uniform sampler2D tex1;\n" + "void main(void)\n" + "{\n" + " vec2 uv = vec2(0.0, 0.0);" + " gl_FragColor = texture2D(tex0, uv) + texture2D(tex1, uv);\n" + "}\n"; + + ANGLE_GL_PROGRAM(program, mSimpleVSSource, fragmentShader); +} + +// Test that using an invalid constant right-shift produces an error. +TEST_P(GLSLTest_ES3, FoldedInvalidRightShift) +{ + const std::string &fragmentShader = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 color;\n" + "void main(void)\n" + "{\n" + " int diff = -100 >> -100;\n" + " color = vec4(float(diff));\n" + "}\n"; + + GLuint program = CompileProgram(mSimpleVSSource, fragmentShader); + EXPECT_EQ(0u, program); + glDeleteProgram(program); +} + +// Test that using an invalid constant left-shift produces an error. +TEST_P(GLSLTest_ES3, FoldedInvalidLeftShift) +{ + const std::string &fragmentShader = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 color;\n" + "void main(void)\n" + "{\n" + " int diff = -100 << -100;\n" + " color = vec4(float(diff));\n" + "}\n"; + + GLuint program = CompileProgram(mSimpleVSSource, fragmentShader); + EXPECT_EQ(0u, program); + glDeleteProgram(program); +} + +} // anonymous namespace + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(GLSLTest, + ES2_D3D9(), + ES2_D3D11(), + ES2_D3D11_FL9_3(), + ES2_OPENGL(), + ES3_OPENGL(), + ES2_OPENGLES(), + ES3_OPENGLES()); + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(GLSLTest_ES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); diff --git a/gfx/angle/src/tests/gl_tests/ImageTest.cpp b/gfx/angle/src/tests/gl_tests/ImageTest.cpp new file mode 100755 index 000000000..cb88c489d --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/ImageTest.cpp @@ -0,0 +1,1973 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// ImageTest: +// Tests the correctness of eglImage. +// + +#include "test_utils/ANGLETest.h" + +namespace angle +{ +class ImageTest : public ANGLETest +{ + protected: + ImageTest() + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + setConfigDepthBits(24); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + const std::string vsSource = + "precision highp float;\n" + "attribute vec4 position;\n" + "varying vec2 texcoord;\n" + "\n" + "void main()\n" + "{\n" + " gl_Position = position;\n" + " texcoord = (position.xy * 0.5) + 0.5;\n" + " texcoord.y = 1.0 - texcoord.y;\n" + "}\n"; + const std::string vsESSL3Source = + "#version 300 es\n" + "precision highp float;\n" + "in vec4 position;\n" + "out vec2 texcoord;\n" + "\n" + "void main()\n" + "{\n" + " gl_Position = position;\n" + " texcoord = (position.xy * 0.5) + 0.5;\n" + " texcoord.y = 1.0 - texcoord.y;\n" + "}\n"; + + const std::string textureFSSource = + "precision highp float;\n" + "uniform sampler2D tex;\n" + "varying vec2 texcoord;\n" + "\n" + "void main()\n" + "{\n" + " gl_FragColor = texture2D(tex, texcoord);\n" + "}\n"; + const std::string textureExternalFSSource = + "#extension GL_OES_EGL_image_external : require\n" + "precision highp float;\n" + "uniform samplerExternalOES tex;\n" + "varying vec2 texcoord;\n" + "\n" + "void main()\n" + "{\n" + " gl_FragColor = texture2D(tex, texcoord);\n" + "}\n"; + const std::string textureExternalESSL3FSSource = + "#version 300 es\n" + "#extension GL_OES_EGL_image_external_essl3 : require\n" + "precision highp float;\n" + "uniform samplerExternalOES tex;\n" + "in vec2 texcoord;\n" + "out vec4 color;" + "\n" + "void main()\n" + "{\n" + " color = texture(tex, texcoord);\n" + "}\n"; + + mTextureProgram = CompileProgram(vsSource, textureFSSource); + if (mTextureProgram == 0) + { + FAIL() << "shader compilation failed."; + } + + mTextureUniformLocation = glGetUniformLocation(mTextureProgram, "tex"); + + if (extensionEnabled("GL_OES_EGL_image_external")) + { + mTextureExternalProgram = CompileProgram(vsSource, textureExternalFSSource); + ASSERT_NE(0u, mTextureExternalProgram) << "shader compilation failed."; + + mTextureExternalUniformLocation = glGetUniformLocation(mTextureExternalProgram, "tex"); + } + + if (extensionEnabled("GL_OES_EGL_image_external_essl3")) + { + mTextureExternalESSL3Program = + CompileProgram(vsESSL3Source, textureExternalESSL3FSSource); + ASSERT_NE(0u, mTextureExternalESSL3Program) << "shader compilation failed."; + + mTextureExternalESSL3UniformLocation = + glGetUniformLocation(mTextureExternalESSL3Program, "tex"); + } + + eglCreateImageKHR = + reinterpret_cast<PFNEGLCREATEIMAGEKHRPROC>(eglGetProcAddress("eglCreateImageKHR")); + eglDestroyImageKHR = + reinterpret_cast<PFNEGLDESTROYIMAGEKHRPROC>(eglGetProcAddress("eglDestroyImageKHR")); + + ASSERT_GL_NO_ERROR(); + } + + void TearDown() override + { + glDeleteProgram(mTextureProgram); + glDeleteProgram(mTextureExternalProgram); + glDeleteProgram(mTextureExternalESSL3Program); + + ANGLETest::TearDown(); + } + + void createEGLImage2DTextureSource(size_t width, + size_t height, + GLenum format, + GLenum type, + void *data, + GLuint *outSourceTexture, + EGLImageKHR *outSourceImage) + { + // Create a source 2D texture + GLuint source; + glGenTextures(1, &source); + glBindTexture(GL_TEXTURE_2D, source); + + glTexImage2D(GL_TEXTURE_2D, 0, format, static_cast<GLsizei>(width), + static_cast<GLsizei>(height), 0, format, type, data); + + // Disable mipmapping + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + ASSERT_GL_NO_ERROR(); + + // Create an image from the source texture + EGLWindow *window = getEGLWindow(); + EGLImageKHR image = + eglCreateImageKHR(window->getDisplay(), window->getContext(), EGL_GL_TEXTURE_2D_KHR, + reinterpretHelper<EGLClientBuffer>(source), nullptr); + + ASSERT_EGL_SUCCESS(); + + *outSourceTexture = source; + *outSourceImage = image; + } + + void createEGLImageCubemapTextureSource(size_t width, + size_t height, + GLenum format, + GLenum type, + uint8_t *data, + size_t dataStride, + EGLenum imageTarget, + GLuint *outSourceTexture, + EGLImageKHR *outSourceImage) + { + // Create a source cube map texture + GLuint source; + glGenTextures(1, &source); + glBindTexture(GL_TEXTURE_CUBE_MAP, source); + + for (GLenum faceIdx = 0; faceIdx < 6; faceIdx++) + { + glTexImage2D(faceIdx + GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, format, + static_cast<GLsizei>(width), static_cast<GLsizei>(height), 0, format, type, + data + (faceIdx * dataStride)); + } + + // Disable mipmapping + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + ASSERT_GL_NO_ERROR(); + + // Create an image from the source texture + EGLWindow *window = getEGLWindow(); + EGLImageKHR image = + eglCreateImageKHR(window->getDisplay(), window->getContext(), imageTarget, + reinterpretHelper<EGLClientBuffer>(source), nullptr); + + ASSERT_EGL_SUCCESS(); + + *outSourceTexture = source; + *outSourceImage = image; + } + + void createEGLImage3DTextureSource(size_t width, + size_t height, + size_t depth, + GLenum format, + GLenum type, + void *data, + size_t imageLayer, + GLuint *outSourceTexture, + EGLImageKHR *outSourceImage) + { + // Create a source 3D texture + GLuint source; + glGenTextures(1, &source); + glBindTexture(GL_TEXTURE_3D, source); + + glTexImage3D(GL_TEXTURE_3D, 0, format, static_cast<GLsizei>(width), + static_cast<GLsizei>(height), static_cast<GLsizei>(depth), 0, format, type, + data); + + // Disable mipmapping + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + ASSERT_GL_NO_ERROR(); + + // Create an image from the source texture + EGLWindow *window = getEGLWindow(); + + EGLint attribs[] = { + EGL_GL_TEXTURE_ZOFFSET_KHR, static_cast<EGLint>(imageLayer), EGL_NONE, + }; + EGLImageKHR image = + eglCreateImageKHR(window->getDisplay(), window->getContext(), EGL_GL_TEXTURE_3D_KHR, + reinterpretHelper<EGLClientBuffer>(source), attribs); + + ASSERT_EGL_SUCCESS(); + + *outSourceTexture = source; + *outSourceImage = image; + } + + void createEGLImageRenderbufferSource(size_t width, + size_t height, + GLenum internalFormat, + GLubyte data[4], + GLuint *outSourceRenderbuffer, + EGLImageKHR *outSourceImage) + { + // Create a source renderbuffer + GLuint source; + glGenRenderbuffers(1, &source); + glBindRenderbuffer(GL_RENDERBUFFER, source); + glRenderbufferStorage(GL_RENDERBUFFER, internalFormat, static_cast<GLsizei>(width), + static_cast<GLsizei>(height)); + + // Create a framebuffer and clear it to set the data + GLuint framebuffer; + glGenFramebuffers(1, &framebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, source); + + glClearColor(data[0] / 255.0f, data[1] / 255.0f, data[2] / 255.0f, data[3] / 255.0f); + glClear(GL_COLOR_BUFFER_BIT); + + glDeleteFramebuffers(1, &framebuffer); + + ASSERT_GL_NO_ERROR(); + + // Create an image from the source renderbuffer + EGLWindow *window = getEGLWindow(); + EGLImageKHR image = + eglCreateImageKHR(window->getDisplay(), window->getContext(), EGL_GL_RENDERBUFFER_KHR, + reinterpretHelper<EGLClientBuffer>(source), nullptr); + + ASSERT_EGL_SUCCESS(); + + *outSourceRenderbuffer = source; + *outSourceImage = image; + } + + void createEGLImageTargetTexture2D(EGLImageKHR image, GLuint *outTargetTexture) + { + // Create a target texture from the image + GLuint target; + glGenTextures(1, &target); + glBindTexture(GL_TEXTURE_2D, target); + glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image); + + // Disable mipmapping + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + ASSERT_GL_NO_ERROR(); + + *outTargetTexture = target; + } + + void createEGLImageTargetTextureExternal(EGLImageKHR image, GLuint *outTargetTexture) + { + // Create a target texture from the image + GLuint target; + glGenTextures(1, &target); + glBindTexture(GL_TEXTURE_EXTERNAL_OES, target); + glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, image); + + // Disable mipmapping + glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + ASSERT_GL_NO_ERROR(); + + *outTargetTexture = target; + } + + void createEGLImageTargetRenderbuffer(EGLImageKHR image, GLuint *outTargetRenderbuffer) + { + // Create a target texture from the image + GLuint target; + glGenRenderbuffers(1, &target); + glBindRenderbuffer(GL_RENDERBUFFER, target); + glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER, image); + + ASSERT_GL_NO_ERROR(); + + *outTargetRenderbuffer = target; + } + + void verifyResultsTexture(GLuint texture, + GLubyte data[4], + GLenum textureTarget, + GLuint program, + GLuint textureUniform) + { + // Draw a quad with the target texture + glUseProgram(program); + glBindTexture(textureTarget, texture); + glUniform1i(textureUniform, 0); + + drawQuad(program, "position", 0.5f); + + // Expect that the rendered quad has the same color as the source texture + EXPECT_PIXEL_EQ(0, 0, data[0], data[1], data[2], data[3]); + } + + void verifyResults2D(GLuint texture, GLubyte data[4]) + { + verifyResultsTexture(texture, data, GL_TEXTURE_2D, mTextureProgram, + mTextureUniformLocation); + } + + void verifyResultsExternal(GLuint texture, GLubyte data[4]) + { + verifyResultsTexture(texture, data, GL_TEXTURE_EXTERNAL_OES, mTextureExternalProgram, + mTextureExternalUniformLocation); + } + + void verifyResultsExternalESSL3(GLuint texture, GLubyte data[4]) + { + verifyResultsTexture(texture, data, GL_TEXTURE_EXTERNAL_OES, mTextureExternalESSL3Program, + mTextureExternalESSL3UniformLocation); + } + + void verifyResultsRenderbuffer(GLuint renderbuffer, GLubyte data[4]) + { + // Bind the renderbuffer to a framebuffer + GLuint framebuffer; + glGenFramebuffers(1, &framebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, + renderbuffer); + + // Expect that the rendered quad has the same color as the source texture + EXPECT_PIXEL_EQ(0, 0, data[0], data[1], data[2], data[3]); + + glDeleteFramebuffers(1, &framebuffer); + } + + template <typename destType, typename sourcetype> + destType reinterpretHelper(sourcetype source) + { + static_assert(sizeof(destType) == sizeof(size_t), + "destType should be the same size as a size_t"); + size_t sourceSizeT = static_cast<size_t>(source); + return reinterpret_cast<destType>(sourceSizeT); + } + + GLuint mTextureProgram; + GLint mTextureUniformLocation; + + GLuint mTextureExternalProgram = 0; + GLint mTextureExternalUniformLocation = -1; + + GLuint mTextureExternalESSL3Program = 0; + GLint mTextureExternalESSL3UniformLocation = -1; + + PFNEGLCREATEIMAGEKHRPROC eglCreateImageKHR; + PFNEGLDESTROYIMAGEKHRPROC eglDestroyImageKHR; +}; + +class ImageTestES3 : public ImageTest +{ +}; + +// Check validation from the EGL_KHR_image_base extension +TEST_P(ImageTest, ValidationImageBase) +{ + EGLWindow *window = getEGLWindow(); + if (!extensionEnabled("OES_EGL_image") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_image_base") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_gl_texture_2D_image")) + { + std::cout << "Test skipped because OES_EGL_image, EGL_KHR_image_base or " + "EGL_KHR_gl_texture_2D_image is not available." + << std::endl; + return; + } + + GLuint glTexture2D; + glGenTextures(1, &glTexture2D); + glBindTexture(GL_TEXTURE_2D, glTexture2D); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + + EGLDisplay display = window->getDisplay(); + EGLContext context = window->getContext(); + EGLConfig config = window->getConfig(); + EGLImageKHR image = EGL_NO_IMAGE_KHR; + EGLClientBuffer texture2D = reinterpretHelper<EGLClientBuffer>(glTexture2D); + + // Test validation of eglCreateImageKHR + + // If <dpy> is not the handle of a valid EGLDisplay object, the error EGL_BAD_DISPLAY is + // generated. + image = eglCreateImageKHR(reinterpretHelper<EGLDisplay>(0xBAADF00D), context, + EGL_GL_TEXTURE_2D_KHR, texture2D, nullptr); + EXPECT_EQ(image, EGL_NO_IMAGE_KHR); + EXPECT_EGL_ERROR(EGL_BAD_DISPLAY); + + // If <ctx> is neither the handle of a valid EGLContext object on <dpy> nor EGL_NO_CONTEXT, the + // error EGL_BAD_CONTEXT is generated. + image = eglCreateImageKHR(display, reinterpretHelper<EGLContext>(0xBAADF00D), + EGL_GL_TEXTURE_2D_KHR, texture2D, nullptr); + EXPECT_EQ(image, EGL_NO_IMAGE_KHR); + EXPECT_EGL_ERROR(EGL_BAD_CONTEXT); + + // Test EGL_NO_CONTEXT with a 2D texture target which does require a context. + image = eglCreateImageKHR(display, EGL_NO_CONTEXT, EGL_GL_TEXTURE_2D_KHR, texture2D, nullptr); + EXPECT_EQ(image, EGL_NO_IMAGE_KHR); + EXPECT_EGL_ERROR(EGL_BAD_CONTEXT); + + // If an attribute specified in <attrib_list> is not one of the attributes listed in Table bbb, + // the error EGL_BAD_PARAMETER is generated. + EGLint badAttributes[] = { + static_cast<EGLint>(0xDEADBEEF), 0, EGL_NONE, + }; + + image = eglCreateImageKHR(display, context, EGL_GL_TEXTURE_2D_KHR, texture2D, badAttributes); + EXPECT_EQ(image, EGL_NO_IMAGE_KHR); + EXPECT_EGL_ERROR(EGL_BAD_PARAMETER); + + // If the resource specified by <dpy>, <ctx>, <target>, <buffer> and <attrib_list> has an off - + // screen buffer bound to it(e.g., by a + // previous call to eglBindTexImage), the error EGL_BAD_ACCESS is generated. + EGLint surfaceType = 0; + eglGetConfigAttrib(display, config, EGL_SURFACE_TYPE, &surfaceType); + + EGLint bindToTextureRGBA = 0; + eglGetConfigAttrib(display, config, EGL_BIND_TO_TEXTURE_RGBA, &bindToTextureRGBA); + if ((surfaceType & EGL_PBUFFER_BIT) != 0 && bindToTextureRGBA == EGL_TRUE) + { + EGLint pbufferAttributes[] = { + EGL_WIDTH, 1, + EGL_HEIGHT, 1, + EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGBA, + EGL_TEXTURE_TARGET, EGL_TEXTURE_2D, + EGL_NONE, EGL_NONE, + }; + EGLSurface pbuffer = eglCreatePbufferSurface(display, config, pbufferAttributes); + ASSERT_NE(pbuffer, EGL_NO_SURFACE); + EXPECT_EGL_SUCCESS(); + + eglBindTexImage(display, pbuffer, EGL_BACK_BUFFER); + EXPECT_EGL_SUCCESS(); + + image = eglCreateImageKHR(display, context, EGL_GL_TEXTURE_2D_KHR, texture2D, nullptr); + EXPECT_EQ(image, EGL_NO_IMAGE_KHR); + EXPECT_EGL_ERROR(EGL_BAD_ACCESS); + + eglReleaseTexImage(display, pbuffer, EGL_BACK_BUFFER); + eglDestroySurface(display, pbuffer); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + EXPECT_EGL_SUCCESS(); + EXPECT_GL_NO_ERROR(); + } + + // If the resource specified by <dpy>, <ctx>, <target>, <buffer> and + // <attrib_list> is itself an EGLImage sibling, the error EGL_BAD_ACCESS is generated. + image = eglCreateImageKHR(display, context, EGL_GL_TEXTURE_2D_KHR, texture2D, nullptr); + EXPECT_NE(image, EGL_NO_IMAGE_KHR); + EXPECT_EGL_SUCCESS(); + + /* TODO(geofflang): Enable this validation when it passes. + EGLImageKHR image2 = eglCreateImageKHR(display, context, EGL_GL_TEXTURE_2D_KHR, + reinterpret_cast<EGLClientBuffer>(texture2D), nullptr); + EXPECT_EQ(image2, EGL_NO_IMAGE_KHR); + EXPECT_EGL_ERROR(EGL_BAD_ACCESS); + */ + + // Test validation of eglDestroyImageKHR + // Note: image is now a valid EGL image + EGLBoolean result = EGL_FALSE; + + // If <dpy> is not the handle of a valid EGLDisplay object, the error EGL_BAD_DISPLAY is + // generated. + result = eglDestroyImageKHR(reinterpretHelper<EGLDisplay>(0xBAADF00D), image); + EXPECT_EQ(result, static_cast<EGLBoolean>(EGL_FALSE)); + EXPECT_EGL_ERROR(EGL_BAD_DISPLAY); + + // If <image> is not a valid EGLImageKHR object created with respect to <dpy>, the error + // EGL_BAD_PARAMETER is generated. + result = eglDestroyImageKHR(display, reinterpretHelper<EGLImageKHR>(0xBAADF00D)); + EXPECT_EQ(result, static_cast<EGLBoolean>(EGL_FALSE)); + EXPECT_EGL_ERROR(EGL_BAD_PARAMETER); + + // Clean up and validate image is destroyed + result = eglDestroyImageKHR(display, image); + EXPECT_EQ(result, static_cast<EGLBoolean>(EGL_TRUE)); + EXPECT_EGL_SUCCESS(); + + glDeleteTextures(1, &glTexture2D); + EXPECT_GL_NO_ERROR(); +} + +// Check validation from the EGL_KHR_gl_texture_2D_image extension +TEST_P(ImageTest, ValidationImagePixmap) +{ + // This extension is not implemented anywhere yet. This makes sure that it is tested once it is + // added. + EGLWindow *window = getEGLWindow(); + EXPECT_FALSE(eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_image_pixmap")); +} + +// Check validation from the EGL_KHR_gl_texture_2D_image, EGL_KHR_gl_texture_cubemap_image, +// EGL_KHR_gl_texture_3D_image and EGL_KHR_gl_renderbuffer_image extensions +TEST_P(ImageTest, ValidationGLImage) +{ + EGLWindow *window = getEGLWindow(); + if (!extensionEnabled("OES_EGL_image") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_image_base")) + { + std::cout << "Test skipped because OES_EGL_image or EGL_KHR_image_base is not available." + << std::endl; + return; + } + + EGLDisplay display = window->getDisplay(); + EGLContext context = window->getContext(); + EGLImageKHR image = EGL_NO_IMAGE_KHR; + + if (eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_gl_texture_2D_image")) + { + // If <target> is EGL_GL_TEXTURE_2D_KHR, EGL_GL_TEXTURE_CUBE_MAP_*_KHR or + // EGL_GL_TEXTURE_3D_KHR and <buffer> is not the name of a texture object of type <target>, + // the error EGL_BAD_PARAMETER is generated. + GLuint textureCube; + glGenTextures(1, &textureCube); + glBindTexture(GL_TEXTURE_CUBE_MAP, textureCube); + for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z; + face++) + { + glTexImage2D(face, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + } + + image = eglCreateImageKHR(display, context, EGL_GL_TEXTURE_2D_KHR, + reinterpretHelper<EGLClientBuffer>(textureCube), nullptr); + EXPECT_EQ(image, EGL_NO_IMAGE_KHR); + EXPECT_EGL_ERROR(EGL_BAD_PARAMETER); + + // If EGL_GL_TEXTURE_LEVEL_KHR is 0, <target> is EGL_GL_TEXTURE_2D_KHR, + // EGL_GL_TEXTURE_CUBE_MAP_*_KHR or EGL_GL_TEXTURE_3D_KHR, <buffer> is the name of an + // incomplete GL texture object, and any mipmap levels other than mipmap level 0 are + // specified, the error EGL_BAD_PARAMETER is generated. + GLuint incompleteTexture; + glGenTextures(1, &incompleteTexture); + glBindTexture(GL_TEXTURE_2D, incompleteTexture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + + EGLint level0Attribute[] = { + EGL_GL_TEXTURE_LEVEL_KHR, 0, EGL_NONE, + }; + image = eglCreateImageKHR(display, context, EGL_GL_TEXTURE_2D_KHR, + reinterpretHelper<EGLClientBuffer>(incompleteTexture), + level0Attribute); + EXPECT_EQ(image, EGL_NO_IMAGE_KHR); + EXPECT_EGL_ERROR(EGL_BAD_PARAMETER); + + // If EGL_GL_TEXTURE_LEVEL_KHR is 0, <target> is EGL_GL_TEXTURE_2D_KHR or + // EGL_GL_TEXTURE_3D_KHR, <buffer> is not the name of a complete GL texture object, and + // mipmap level 0 is not specified, the error EGL_BAD_PARAMETER is generated. + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + image = eglCreateImageKHR(display, context, EGL_GL_TEXTURE_2D_KHR, + reinterpretHelper<EGLClientBuffer>(incompleteTexture), nullptr); + EXPECT_EQ(image, EGL_NO_IMAGE_KHR); + EXPECT_EGL_ERROR(EGL_BAD_PARAMETER); + + // If <target> is EGL_GL_TEXTURE_2D_KHR, EGL_GL_TEXTURE_CUBE_MAP_*_KHR, + // EGL_GL_RENDERBUFFER_KHR or EGL_GL_TEXTURE_3D_KHR and <buffer> refers to the default GL + // texture object(0) for the corresponding GL target, the error EGL_BAD_PARAMETER is + // generated. + image = eglCreateImageKHR(display, context, EGL_GL_TEXTURE_2D_KHR, 0, nullptr); + EXPECT_EQ(image, EGL_NO_IMAGE_KHR); + EXPECT_EGL_ERROR(EGL_BAD_PARAMETER); + + // If <target> is EGL_GL_TEXTURE_2D_KHR, EGL_GL_TEXTURE_CUBE_MAP_*_KHR, or + // EGL_GL_TEXTURE_3D_KHR, and the value specified in <attr_list> for + // EGL_GL_TEXTURE_LEVEL_KHR is not a valid mipmap level for the specified GL texture object + // <buffer>, the error EGL_BAD_MATCH is generated. + EGLint level2Attribute[] = { + EGL_GL_TEXTURE_LEVEL_KHR, 2, EGL_NONE, + }; + image = eglCreateImageKHR(display, context, EGL_GL_TEXTURE_2D_KHR, + reinterpretHelper<EGLClientBuffer>(incompleteTexture), + level2Attribute); + EXPECT_EQ(image, EGL_NO_IMAGE_KHR); + EXPECT_EGL_ERROR(EGL_BAD_PARAMETER); + } + else + { + GLuint texture2D; + glGenTextures(1, &texture2D); + glBindTexture(GL_TEXTURE_2D, texture2D); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + + // From EGL_KHR_image_base: + // If <target> is not one of the values in Table aaa, the error EGL_BAD_PARAMETER is + // generated. + image = eglCreateImageKHR(display, context, EGL_GL_TEXTURE_2D_KHR, + reinterpretHelper<EGLClientBuffer>(texture2D), nullptr); + EXPECT_EQ(image, EGL_NO_IMAGE_KHR); + EXPECT_EGL_ERROR(EGL_BAD_PARAMETER); + } + + if (eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_gl_texture_cubemap_image")) + { + // If EGL_GL_TEXTURE_LEVEL_KHR is 0, <target> is EGL_GL_TEXTURE_CUBE_MAP_*_KHR, <buffer> is + // not the name of a complete GL texture object, and one or more faces do not have mipmap + // level 0 specified, the error EGL_BAD_PARAMETER is generated. + GLuint incompleteTextureCube; + glGenTextures(1, &incompleteTextureCube); + glBindTexture(GL_TEXTURE_CUBE_MAP, incompleteTextureCube); + glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, + nullptr); + glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, + nullptr); + glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, + nullptr); + glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, + nullptr); + glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, + nullptr); + + EGLint level0Attribute[] = { + EGL_GL_TEXTURE_LEVEL_KHR, 0, EGL_NONE, + }; + image = eglCreateImageKHR(display, context, EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR, + reinterpretHelper<EGLClientBuffer>(incompleteTextureCube), + level0Attribute); + EXPECT_EQ(image, EGL_NO_IMAGE_KHR); + EXPECT_EGL_ERROR(EGL_BAD_PARAMETER); + } + else + { + GLuint textureCube; + glGenTextures(1, &textureCube); + glBindTexture(GL_TEXTURE_CUBE_MAP, textureCube); + for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z; + face++) + { + glTexImage2D(face, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + } + + // From EGL_KHR_image_base: + // If <target> is not one of the values in Table aaa, the error EGL_BAD_PARAMETER is + // generated. + image = eglCreateImageKHR(display, context, EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR, + reinterpretHelper<EGLClientBuffer>(textureCube), nullptr); + EXPECT_EQ(image, EGL_NO_IMAGE_KHR); + EXPECT_EGL_ERROR(EGL_BAD_PARAMETER); + } + + if (eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_gl_texture_3D_image") && + getClientMajorVersion() >= 3) + { + // If <target> is EGL_GL_TEXTURE_3D_KHR, and the value specified in <attr_list> for + // EGL_GL_TEXTURE_ZOFFSET_KHR exceeds the depth of the specified mipmap level - of - detail + // in <buffer>, the error EGL_BAD_PARAMETER is generated. + GLuint texture3D; + glGenTextures(1, &texture3D); + glBindTexture(GL_TEXTURE_3D, texture3D); + glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + + EGLint zOffset3Parameter[] = { + EGL_GL_TEXTURE_ZOFFSET_KHR, 3, EGL_NONE, + }; + image = eglCreateImageKHR(display, context, EGL_GL_TEXTURE_3D_KHR, + reinterpretHelper<EGLClientBuffer>(texture3D), zOffset3Parameter); + EXPECT_EQ(image, EGL_NO_IMAGE_KHR); + EXPECT_EGL_ERROR(EGL_BAD_PARAMETER); + + EGLint zOffsetNegative1Parameter[] = { + EGL_GL_TEXTURE_ZOFFSET_KHR, -1, EGL_NONE, + }; + image = eglCreateImageKHR(display, context, EGL_GL_TEXTURE_3D_KHR, + reinterpretHelper<EGLClientBuffer>(texture3D), + zOffsetNegative1Parameter); + EXPECT_EQ(image, EGL_NO_IMAGE_KHR); + EXPECT_EGL_ERROR(EGL_BAD_PARAMETER); + } + else + { + if (eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_gl_texture_2D_image")) + { + GLuint texture2D; + glGenTextures(1, &texture2D); + glBindTexture(GL_TEXTURE_2D, texture2D); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + + // Verify EGL_GL_TEXTURE_ZOFFSET_KHR is not a valid parameter + EGLint zOffset0Parameter[] = { + EGL_GL_TEXTURE_ZOFFSET_KHR, 0, EGL_NONE, + }; + + image = + eglCreateImageKHR(display, context, EGL_GL_TEXTURE_2D_KHR, + reinterpretHelper<EGLClientBuffer>(texture2D), zOffset0Parameter); + EXPECT_EQ(image, EGL_NO_IMAGE_KHR); + EXPECT_EGL_ERROR(EGL_BAD_PARAMETER); + } + + if (getClientMajorVersion() >= 3) + { + GLuint texture3D; + glGenTextures(1, &texture3D); + glBindTexture(GL_TEXTURE_3D, texture3D); + glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + + // From EGL_KHR_image_base: + // If <target> is not one of the values in Table aaa, the error EGL_BAD_PARAMETER is + // generated. + image = eglCreateImageKHR(display, context, EGL_GL_TEXTURE_3D_KHR, + reinterpretHelper<EGLClientBuffer>(texture3D), nullptr); + EXPECT_EQ(image, EGL_NO_IMAGE_KHR); + EXPECT_EGL_ERROR(EGL_BAD_PARAMETER); + } + } + + if (eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_gl_renderbuffer_image")) + { + // If <target> is EGL_GL_RENDERBUFFER_KHR and <buffer> is not the name of a renderbuffer + // object, or if <buffer> is the name of a multisampled renderbuffer object, the error + // EGL_BAD_PARAMETER is generated. + image = eglCreateImageKHR(display, context, EGL_GL_RENDERBUFFER_KHR, + reinterpret_cast<EGLClientBuffer>(0), nullptr); + EXPECT_EQ(image, EGL_NO_IMAGE_KHR); + EXPECT_EGL_ERROR(EGL_BAD_PARAMETER); + + if (extensionEnabled("GL_ANGLE_framebuffer_multisample")) + { + GLuint renderbuffer; + glGenRenderbuffers(1, &renderbuffer); + glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer); + glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER, 1, GL_RGBA8, 1, 1); + EXPECT_GL_NO_ERROR(); + + image = eglCreateImageKHR(display, context, EGL_GL_RENDERBUFFER_KHR, + reinterpret_cast<EGLClientBuffer>(0), nullptr); + EXPECT_EQ(image, EGL_NO_IMAGE_KHR); + EXPECT_EGL_ERROR(EGL_BAD_PARAMETER); + } + } + else + { + GLuint renderbuffer; + glGenRenderbuffers(1, &renderbuffer); + glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer); + glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, 1, 1); + + // From EGL_KHR_image_base: + // If <target> is not one of the values in Table aaa, the error EGL_BAD_PARAMETER is + // generated. + image = eglCreateImageKHR(display, context, EGL_GL_RENDERBUFFER_KHR, + reinterpretHelper<EGLClientBuffer>(renderbuffer), nullptr); + EXPECT_EQ(image, EGL_NO_IMAGE_KHR); + EXPECT_EGL_ERROR(EGL_BAD_PARAMETER); + } +} + +// Check validation from the GL_OES_EGL_image extension +TEST_P(ImageTest, ValidationGLEGLImage) +{ + EGLWindow *window = getEGLWindow(); + if (!extensionEnabled("OES_EGL_image") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_image_base") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_gl_texture_2D_image")) + { + std::cout << "Test skipped because OES_EGL_image, EGL_KHR_image_base or " + "EGL_KHR_gl_texture_2D_image is not available." + << std::endl; + return; + } + + GLubyte data[4] = {255, 0, 255, 255}; + + // Create the Image + GLuint source; + EGLImageKHR image; + createEGLImage2DTextureSource(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, data, &source, &image); + + // If <target> is not TEXTURE_2D, the error INVALID_ENUM is generated. + glEGLImageTargetTexture2DOES(GL_TEXTURE_CUBE_MAP_POSITIVE_X, image); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + // If <image> does not refer to a valid eglImageOES object, the error INVALID_VALUE is + // generated. + GLuint texture; + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_2D, texture); + glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, reinterpretHelper<GLeglImageOES>(0xBAADF00D)); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + // <target> must be RENDERBUFFER_OES, and <image> must be the handle of a valid EGLImage + // resource, cast into the type + // eglImageOES. + glEGLImageTargetRenderbufferStorageOES(GL_TEXTURE_2D, image); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + // If the GL is unable to create a renderbuffer using the specified eglImageOES, the error + // INVALID_OPERATION is generated.If <image> + // does not refer to a valid eglImageOES object, the error INVALID_VALUE is generated. + GLuint renderbuffer; + glGenRenderbuffers(1, &renderbuffer); + glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer); + glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER, + reinterpretHelper<GLeglImageOES>(0xBAADF00D)); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + // Clean up + glDeleteTextures(1, &source); + eglDestroyImageKHR(window->getDisplay(), image); + glDeleteTextures(1, &texture); + glDeleteRenderbuffers(1, &renderbuffer); +} + +// Check validation from the GL_OES_EGL_image_external extension +TEST_P(ImageTest, ValidationGLEGLImageExternal) +{ + if (!extensionEnabled("GL_OES_EGL_image_external")) + { + std::cout << "Test skipped because GL_OES_EGL_image_external is not available." + << std::endl; + return; + } + + GLuint texture; + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_EXTERNAL_OES, texture); + + // In the initial state of a TEXTURE_EXTERNAL_OES texture object, the value assigned to + // TEXTURE_MIN_FILTER and TEXTURE_MAG_FILTER is LINEAR, and the s and t wrap modes are both set + // to CLAMP_TO_EDGE + auto getTexParam = [](GLenum target, GLenum pname) + { + GLint value = 0; + glGetTexParameteriv(target, pname, &value); + EXPECT_GL_NO_ERROR(); + return value; + }; + EXPECT_GLENUM_EQ(GL_LINEAR, getTexParam(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER)); + EXPECT_GLENUM_EQ(GL_LINEAR, getTexParam(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER)); + EXPECT_GLENUM_EQ(GL_CLAMP_TO_EDGE, getTexParam(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S)); + EXPECT_GLENUM_EQ(GL_CLAMP_TO_EDGE, getTexParam(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T)); + + // "When <target> is TEXTURE_EXTERNAL_OES only NEAREST and LINEAR are accepted as + // TEXTURE_MIN_FILTER, only CLAMP_TO_EDGE is accepted as TEXTURE_WRAP_S and TEXTURE_WRAP_T, and + // only FALSE is accepted as GENERATE_MIPMAP. Attempting to set other values for + // TEXTURE_MIN_FILTER, TEXTURE_WRAP_S, TEXTURE_WRAP_T, or GENERATE_MIPMAP will result in an + // INVALID_ENUM error. + GLenum validMinFilters[]{ + GL_NEAREST, GL_LINEAR, + }; + for (auto minFilter : validMinFilters) + { + glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, minFilter); + EXPECT_GL_NO_ERROR(); + } + + GLenum invalidMinFilters[]{ + GL_NEAREST_MIPMAP_LINEAR, GL_NEAREST_MIPMAP_NEAREST, GL_LINEAR_MIPMAP_LINEAR, + GL_LINEAR_MIPMAP_NEAREST, + }; + for (auto minFilter : invalidMinFilters) + { + glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, minFilter); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + } + + GLenum validWrapModes[]{ + GL_CLAMP_TO_EDGE, + }; + for (auto minFilter : validWrapModes) + { + glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, minFilter); + EXPECT_GL_NO_ERROR(); + glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, minFilter); + EXPECT_GL_NO_ERROR(); + } + + GLenum invalidWrapModes[]{ + GL_REPEAT, GL_MIRRORED_REPEAT, + }; + for (auto minFilter : invalidWrapModes) + { + glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, minFilter); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, minFilter); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + } + + // When <target> is set to TEXTURE_EXTERNAL_OES, GenerateMipmap always fails and generates an + // INVALID_ENUM error. + glGenerateMipmap(GL_TEXTURE_EXTERNAL_OES); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + glDeleteTextures(1, &texture); +} + +// Check validation from the GL_OES_EGL_image_external_essl3 extension +TEST_P(ImageTest, ValidationGLEGLImageExternalESSL3) +{ + if (!extensionEnabled("GL_OES_EGL_image_external_essl3")) + { + std::cout << "Test skipped because GL_OES_EGL_image_external is not available." + << std::endl; + return; + } + + // Make sure this extension is not exposed without ES3. + ASSERT_GE(getClientMajorVersion(), 3); + + GLuint texture; + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_EXTERNAL_OES, texture); + + // It is an INVALID_OPERATION error to set the TEXTURE_BASE_LEVEL to a value other than zero. + glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_BASE_LEVEL, 1); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_BASE_LEVEL, 10); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_BASE_LEVEL, 0); + EXPECT_GL_NO_ERROR(); + + glDeleteTextures(1, &texture); +} + +TEST_P(ImageTest, Source2DTarget2D) +{ + EGLWindow *window = getEGLWindow(); + if (!extensionEnabled("OES_EGL_image") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_image_base") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_gl_texture_2D_image")) + { + std::cout << "Test skipped because OES_EGL_image, EGL_KHR_image_base or " + "EGL_KHR_gl_texture_2D_image is not available." + << std::endl; + return; + } + + GLubyte data[4] = {255, 0, 255, 255}; + + // Create the Image + GLuint source; + EGLImageKHR image; + createEGLImage2DTextureSource(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, data, &source, &image); + + // Create the target + GLuint target; + createEGLImageTargetTexture2D(image, &target); + + // Expect that the target texture has the same color as the source texture + verifyResults2D(target, data); + + // Clean up + glDeleteTextures(1, &source); + eglDestroyImageKHR(window->getDisplay(), image); + glDeleteTextures(1, &target); +} + +TEST_P(ImageTest, Source2DTargetRenderbuffer) +{ + EGLWindow *window = getEGLWindow(); + if (!extensionEnabled("OES_EGL_image") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_image_base") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_gl_texture_2D_image")) + { + std::cout << "Test skipped because OES_EGL_image, EGL_KHR_image_base or " + "EGL_KHR_gl_texture_2D_image is not available." + << std::endl; + return; + } + + GLubyte data[4] = {255, 0, 255, 255}; + + // Create the Image + GLuint source; + EGLImageKHR image; + createEGLImage2DTextureSource(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, data, &source, &image); + + // Create the target + GLuint target; + createEGLImageTargetRenderbuffer(image, &target); + + // Expect that the target renderbuffer has the same color as the source texture + verifyResultsRenderbuffer(target, data); + + // Clean up + glDeleteTextures(1, &source); + eglDestroyImageKHR(window->getDisplay(), image); + glDeleteRenderbuffers(1, &target); +} + +TEST_P(ImageTest, Source2DTargetExternal) +{ + EGLWindow *window = getEGLWindow(); + if (!extensionEnabled("OES_EGL_image") || !extensionEnabled("OES_EGL_image_external") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_image_base") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_gl_texture_2D_image")) + { + std::cout + << "Test skipped because OES_EGL_image, OES_EGL_image_external, EGL_KHR_image_base or " + "EGL_KHR_gl_texture_2D_image is not available." + << std::endl; + return; + } + + GLubyte data[4] = {255, 0, 255, 255}; + + // Create the Image + GLuint source; + EGLImageKHR image; + createEGLImage2DTextureSource(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, data, &source, &image); + + // Create the target + GLuint target; + createEGLImageTargetTextureExternal(image, &target); + + // Expect that the target renderbuffer has the same color as the source texture + verifyResultsExternal(target, data); + + // Clean up + glDeleteTextures(1, &source); + eglDestroyImageKHR(window->getDisplay(), image); + glDeleteRenderbuffers(1, &target); +} + +TEST_P(ImageTestES3, Source2DTargetExternalESSL3) +{ + EGLWindow *window = getEGLWindow(); + if (!extensionEnabled("OES_EGL_image") || !extensionEnabled("OES_EGL_image_external_essl3") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_image_base") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_gl_texture_2D_image")) + { + std::cout << "Test skipped because OES_EGL_image, OES_EGL_image_external_essl3, " + "EGL_KHR_image_base or " + "EGL_KHR_gl_texture_2D_image is not available." + << std::endl; + return; + } + + GLubyte data[4] = {255, 0, 255, 255}; + + // Create the Image + GLuint source; + EGLImageKHR image; + createEGLImage2DTextureSource(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, data, &source, &image); + + // Create the target + GLuint target; + createEGLImageTargetTextureExternal(image, &target); + + // Expect that the target renderbuffer has the same color as the source texture + verifyResultsExternalESSL3(target, data); + + // Clean up + glDeleteTextures(1, &source); + eglDestroyImageKHR(window->getDisplay(), image); + glDeleteRenderbuffers(1, &target); +} + +TEST_P(ImageTest, SourceCubeTarget2D) +{ + EGLWindow *window = getEGLWindow(); + if (!extensionEnabled("OES_EGL_image") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_image_base") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_gl_texture_cubemap_image")) + { + std::cout << "Test skipped because OES_EGL_image, EGL_KHR_image_base or " + "EGL_KHR_gl_texture_cubemap_image is not available." + << std::endl; + return; + } + + GLubyte data[24] = { + 255, 0, 255, 255, 255, 255, 255, 255, 255, 0, 0, 255, + 0, 0, 255, 255, 0, 255, 0, 255, 0, 0, 0, 255, + }; + + for (EGLenum faceIdx = 0; faceIdx < 6; faceIdx++) + { + // Create the Image + GLuint source; + EGLImageKHR image; + createEGLImageCubemapTextureSource( + 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, reinterpret_cast<uint8_t *>(data), sizeof(GLubyte) * 4, + EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR + faceIdx, &source, &image); + + // Create the target + GLuint target; + createEGLImageTargetTexture2D(image, &target); + + // Expect that the target texture has the same color as the source texture + verifyResults2D(target, &data[faceIdx * 4]); + + // Clean up + glDeleteTextures(1, &source); + eglDestroyImageKHR(window->getDisplay(), image); + glDeleteTextures(1, &target); + } +} + +TEST_P(ImageTest, SourceCubeTargetRenderbuffer) +{ + EGLWindow *window = getEGLWindow(); + if (!extensionEnabled("OES_EGL_image") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_image_base") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_gl_texture_cubemap_image")) + { + std::cout << "Test skipped because OES_EGL_image, EGL_KHR_image_base or " + "EGL_KHR_gl_texture_cubemap_image is not available." + << std::endl; + return; + } + + GLubyte data[24] = { + 255, 0, 255, 255, 255, 255, 255, 255, 255, 0, 0, 255, + 0, 0, 255, 255, 0, 255, 0, 255, 0, 0, 0, 255, + }; + + for (EGLenum faceIdx = 0; faceIdx < 6; faceIdx++) + { + // Create the Image + GLuint source; + EGLImageKHR image; + createEGLImageCubemapTextureSource( + 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, reinterpret_cast<uint8_t *>(data), sizeof(GLubyte) * 4, + EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR + faceIdx, &source, &image); + + // Create the target + GLuint target; + createEGLImageTargetRenderbuffer(image, &target); + + // Expect that the target texture has the same color as the source texture + verifyResultsRenderbuffer(target, &data[faceIdx * 4]); + + // Clean up + glDeleteTextures(1, &source); + eglDestroyImageKHR(window->getDisplay(), image); + glDeleteRenderbuffers(1, &target); + } +} + +// Test cubemap -> external texture EGL images. +TEST_P(ImageTest, SourceCubeTargetExternal) +{ + EGLWindow *window = getEGLWindow(); + if (!extensionEnabled("OES_EGL_image") || !extensionEnabled("OES_EGL_image_external") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_image_base") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_gl_texture_cubemap_image")) + { + std::cout + << "Test skipped because OES_EGL_image, OES_EGL_image_external, EGL_KHR_image_base or " + "EGL_KHR_gl_texture_cubemap_image is not available." + << std::endl; + return; + } + + GLubyte data[24] = { + 255, 0, 255, 255, 255, 255, 255, 255, 255, 0, 0, 255, + 0, 0, 255, 255, 0, 255, 0, 255, 0, 0, 0, 255, + }; + + for (EGLenum faceIdx = 0; faceIdx < 6; faceIdx++) + { + // Create the Image + GLuint source; + EGLImageKHR image; + createEGLImageCubemapTextureSource( + 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, reinterpret_cast<uint8_t *>(data), sizeof(GLubyte) * 4, + EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR + faceIdx, &source, &image); + + // Create the target + GLuint target; + createEGLImageTargetTextureExternal(image, &target); + + // Expect that the target texture has the same color as the source texture + verifyResultsExternal(target, &data[faceIdx * 4]); + + // Clean up + glDeleteTextures(1, &source); + eglDestroyImageKHR(window->getDisplay(), image); + glDeleteRenderbuffers(1, &target); + } +} + +// Test cubemap -> external texture EGL images using ESSL3 shaders. +TEST_P(ImageTestES3, SourceCubeTargetExternalESSL3) +{ + EGLWindow *window = getEGLWindow(); + if (!extensionEnabled("OES_EGL_image") || !extensionEnabled("OES_EGL_image_external_essl3") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_image_base") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_gl_texture_cubemap_image")) + { + std::cout << "Test skipped because OES_EGL_image, OES_EGL_image_external_essl3, " + "EGL_KHR_image_base or " + "EGL_KHR_gl_texture_cubemap_image is not available." + << std::endl; + return; + } + + GLubyte data[24] = { + 255, 0, 255, 255, 255, 255, 255, 255, 255, 0, 0, 255, + 0, 0, 255, 255, 0, 255, 0, 255, 0, 0, 0, 255, + }; + + for (EGLenum faceIdx = 0; faceIdx < 6; faceIdx++) + { + // Create the Image + GLuint source; + EGLImageKHR image; + createEGLImageCubemapTextureSource( + 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, reinterpret_cast<uint8_t *>(data), sizeof(GLubyte) * 4, + EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR + faceIdx, &source, &image); + + // Create the target + GLuint target; + createEGLImageTargetTextureExternal(image, &target); + + // Expect that the target texture has the same color as the source texture + verifyResultsExternalESSL3(target, &data[faceIdx * 4]); + + // Clean up + glDeleteTextures(1, &source); + eglDestroyImageKHR(window->getDisplay(), image); + glDeleteRenderbuffers(1, &target); + } +} + +TEST_P(ImageTest, Source3DTargetTexture) +{ + EGLWindow *window = getEGLWindow(); + if (!extensionEnabled("OES_EGL_image") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_image_base") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_gl_texture_3D_image")) + { + std::cout << "Test skipped because OES_EGL_image, EGL_KHR_image_base or " + "EGL_KHR_gl_texture_3D_image is not available." + << std::endl; + return; + } + + if (getClientMajorVersion() < 3 && !extensionEnabled("GL_OES_texture_3D")) + { + std::cout << "Test skipped because 3D textures are not available." << std::endl; + return; + } + + const size_t depth = 2; + GLubyte data[4 * depth] = { + 255, 0, 255, 255, 255, 255, 0, 255, + }; + + for (size_t layer = 0; layer < depth; layer++) + { + // Create the Image + GLuint source; + EGLImageKHR image; + createEGLImage3DTextureSource(1, 1, depth, GL_RGBA, GL_UNSIGNED_BYTE, data, layer, &source, + &image); + + // Create the target + GLuint target; + createEGLImageTargetTexture2D(image, &target); + + // Expect that the target renderbuffer has the same color as the source texture + verifyResults2D(target, &data[layer * 4]); + + // Clean up + glDeleteTextures(1, &source); + eglDestroyImageKHR(window->getDisplay(), image); + glDeleteTextures(1, &target); + } +} + +TEST_P(ImageTest, Source3DTargetRenderbuffer) +{ + EGLWindow *window = getEGLWindow(); + if (!extensionEnabled("OES_EGL_image") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_image_base") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_gl_texture_3D_image")) + { + std::cout << "Test skipped because OES_EGL_image, EGL_KHR_image_base or " + "EGL_KHR_gl_texture_3D_image is not available." + << std::endl; + return; + } + + if (getClientMajorVersion() < 3 && !extensionEnabled("GL_OES_texture_3D")) + { + std::cout << "Test skipped because 3D textures are not available." << std::endl; + return; + } + + const size_t depth = 2; + GLubyte data[4 * depth] = { + 255, 0, 255, 255, 255, 255, 0, 255, + }; + + for (size_t layer = 0; layer < depth; layer++) + { + // Create the Image + GLuint source; + EGLImageKHR image; + createEGLImage3DTextureSource(1, 1, depth, GL_RGBA, GL_UNSIGNED_BYTE, data, layer, &source, + &image); + + // Create the target + GLuint target; + createEGLImageTargetRenderbuffer(image, &target); + + // Expect that the target renderbuffer has the same color as the source texture + verifyResultsRenderbuffer(target, &data[layer * 4]); + + // Clean up + glDeleteTextures(1, &source); + eglDestroyImageKHR(window->getDisplay(), image); + glDeleteTextures(1, &target); + } +} + +// Test 3D -> external texture EGL images. +TEST_P(ImageTest, Source3DTargetExternal) +{ + EGLWindow *window = getEGLWindow(); + if (!extensionEnabled("OES_EGL_image") || !extensionEnabled("OES_EGL_image_external") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_image_base") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_gl_texture_3D_image")) + { + std::cout + << "Test skipped because OES_EGL_image, OES_EGL_image_external, EGL_KHR_image_base or " + "EGL_KHR_gl_texture_3D_image is not available." + << std::endl; + return; + } + + if (getClientMajorVersion() < 3 && !extensionEnabled("GL_OES_texture_3D")) + { + std::cout << "Test skipped because 3D textures are not available." << std::endl; + return; + } + + const size_t depth = 2; + GLubyte data[4 * depth] = { + 255, 0, 255, 255, 255, 255, 0, 255, + }; + + for (size_t layer = 0; layer < depth; layer++) + { + // Create the Image + GLuint source; + EGLImageKHR image; + createEGLImage3DTextureSource(1, 1, depth, GL_RGBA, GL_UNSIGNED_BYTE, data, layer, &source, + &image); + + // Create the target + GLuint target; + createEGLImageTargetTextureExternal(image, &target); + + // Expect that the target renderbuffer has the same color as the source texture + verifyResultsExternal(target, &data[layer * 4]); + + // Clean up + glDeleteTextures(1, &source); + eglDestroyImageKHR(window->getDisplay(), image); + glDeleteTextures(1, &target); + } +} + +// Test 3D -> external texture EGL images using ESSL3 shaders. +TEST_P(ImageTestES3, Source3DTargetExternalESSL3) +{ + EGLWindow *window = getEGLWindow(); + if (!extensionEnabled("OES_EGL_image") || !extensionEnabled("OES_EGL_image_external_essl3") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_image_base") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_gl_texture_3D_image")) + { + std::cout << "Test skipped because OES_EGL_image, OES_EGL_image_external_essl3, " + "EGL_KHR_image_base or " + "EGL_KHR_gl_texture_3D_image is not available." + << std::endl; + return; + } + + if (getClientMajorVersion() < 3 && !extensionEnabled("GL_OES_texture_3D")) + { + std::cout << "Test skipped because 3D textures are not available." << std::endl; + return; + } + + const size_t depth = 2; + GLubyte data[4 * depth] = { + 255, 0, 255, 255, 255, 255, 0, 255, + }; + + for (size_t layer = 0; layer < depth; layer++) + { + // Create the Image + GLuint source; + EGLImageKHR image; + createEGLImage3DTextureSource(1, 1, depth, GL_RGBA, GL_UNSIGNED_BYTE, data, layer, &source, + &image); + + // Create the target + GLuint target; + createEGLImageTargetTextureExternal(image, &target); + + // Expect that the target renderbuffer has the same color as the source texture + verifyResultsExternalESSL3(target, &data[layer * 4]); + + // Clean up + glDeleteTextures(1, &source); + eglDestroyImageKHR(window->getDisplay(), image); + glDeleteTextures(1, &target); + } +} + +TEST_P(ImageTest, SourceRenderbufferTargetTexture) +{ + EGLWindow *window = getEGLWindow(); + if (!extensionEnabled("OES_EGL_image") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_image_base") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_gl_renderbuffer_image")) + { + std::cout << "Test skipped because OES_EGL_image, EGL_KHR_image_base or " + "EGL_KHR_gl_renderbuffer_image is not available." + << std::endl; + return; + } + + GLubyte data[4] = {255, 0, 255, 255}; + + // Create the Image + GLuint source; + EGLImageKHR image; + createEGLImageRenderbufferSource(1, 1, GL_RGBA8_OES, data, &source, &image); + + // Create the target + GLuint target; + createEGLImageTargetTexture2D(image, &target); + + // Expect that the target texture has the same color as the source texture + verifyResults2D(target, data); + + // Clean up + glDeleteRenderbuffers(1, &source); + eglDestroyImageKHR(window->getDisplay(), image); + glDeleteTextures(1, &target); +} + +// Test renderbuffer -> external texture EGL images. +TEST_P(ImageTest, SourceRenderbufferTargetTextureExternal) +{ + EGLWindow *window = getEGLWindow(); + if (!extensionEnabled("OES_EGL_image") || !extensionEnabled("OES_EGL_image_external") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_image_base") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_gl_renderbuffer_image")) + { + std::cout + << "Test skipped because OES_EGL_image, OES_EGL_image_external, EGL_KHR_image_base or " + "EGL_KHR_gl_renderbuffer_image is not available." + << std::endl; + return; + } + + GLubyte data[4] = {255, 0, 255, 255}; + + // Create the Image + GLuint source; + EGLImageKHR image; + createEGLImageRenderbufferSource(1, 1, GL_RGBA8_OES, data, &source, &image); + + // Create the target + GLuint target; + createEGLImageTargetTextureExternal(image, &target); + + // Expect that the target texture has the same color as the source texture + verifyResultsExternal(target, data); + + // Clean up + glDeleteRenderbuffers(1, &source); + eglDestroyImageKHR(window->getDisplay(), image); + glDeleteTextures(1, &target); +} + +// Test renderbuffer -> external texture EGL images using ESSL3 shaders. +TEST_P(ImageTestES3, SourceRenderbufferTargetTextureExternalESSL3) +{ + EGLWindow *window = getEGLWindow(); + if (!extensionEnabled("OES_EGL_image") || !extensionEnabled("OES_EGL_image_external_essl3") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_image_base") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_gl_renderbuffer_image")) + { + std::cout + << "Test skipped because OES_EGL_image, OES_EGL_image_external, EGL_KHR_image_base or " + "EGL_KHR_gl_renderbuffer_image is not available." + << std::endl; + return; + } + + GLubyte data[4] = {255, 0, 255, 255}; + + // Create the Image + GLuint source; + EGLImageKHR image; + createEGLImageRenderbufferSource(1, 1, GL_RGBA8_OES, data, &source, &image); + + // Create the target + GLuint target; + createEGLImageTargetTextureExternal(image, &target); + + // Expect that the target texture has the same color as the source texture + verifyResultsExternalESSL3(target, data); + + // Clean up + glDeleteRenderbuffers(1, &source); + eglDestroyImageKHR(window->getDisplay(), image); + glDeleteTextures(1, &target); +} + +TEST_P(ImageTest, SourceRenderbufferTargetRenderbuffer) +{ + EGLWindow *window = getEGLWindow(); + if (!extensionEnabled("OES_EGL_image") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_image_base") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_gl_renderbuffer_image")) + { + std::cout << "Test skipped because OES_EGL_image, EGL_KHR_image_base or " + "EGL_KHR_gl_renderbuffer_image is not available." + << std::endl; + return; + } + + GLubyte data[4] = {255, 0, 255, 255}; + + // Create the Image + GLuint source; + EGLImageKHR image; + createEGLImageRenderbufferSource(1, 1, GL_RGBA8_OES, data, &source, &image); + + // Create the target + GLuint target; + createEGLImageTargetRenderbuffer(image, &target); + + // Expect that the target renderbuffer has the same color as the source texture + verifyResultsRenderbuffer(target, data); + + // Clean up + glDeleteRenderbuffers(1, &source); + eglDestroyImageKHR(window->getDisplay(), image); + glDeleteRenderbuffers(1, &target); +} + +// Delete the source texture and EGL image. The image targets should still have the same data +// because +// they hold refs to the image. +TEST_P(ImageTest, Deletion) +{ + EGLWindow *window = getEGLWindow(); + if (!extensionEnabled("OES_EGL_image") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_image_base") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_gl_texture_2D_image")) + { + std::cout << "Test skipped because OES_EGL_image, EGL_KHR_image_base or " + "EGL_KHR_gl_texture_2D_image is not available." + << std::endl; + return; + } + + GLubyte originalData[4] = {255, 0, 255, 255}; + GLubyte updateData[4] = {0, 255, 0, 255}; + + // Create the Image + GLuint source; + EGLImageKHR image; + createEGLImage2DTextureSource(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, originalData, &source, &image); + + // Create multiple targets + GLuint targetTexture; + createEGLImageTargetTexture2D(image, &targetTexture); + + GLuint targetRenderbuffer; + createEGLImageTargetRenderbuffer(image, &targetRenderbuffer); + + // Delete the source texture + glDeleteTextures(1, &source); + source = 0; + + // Expect that both the targets have the original data + verifyResults2D(targetTexture, originalData); + verifyResultsRenderbuffer(targetRenderbuffer, originalData); + + // Update the data of the target + glBindTexture(GL_TEXTURE_2D, targetTexture); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, updateData); + + // Expect that both targets have the updated data + verifyResults2D(targetTexture, updateData); + verifyResultsRenderbuffer(targetRenderbuffer, updateData); + + // Delete the EGL image + eglDestroyImageKHR(window->getDisplay(), image); + image = EGL_NO_IMAGE_KHR; + + // Update the data of the target back to the original data + glBindTexture(GL_TEXTURE_2D, targetTexture); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, originalData); + + // Expect that both targets have the original data again + verifyResults2D(targetTexture, originalData); + verifyResultsRenderbuffer(targetRenderbuffer, originalData); + + // Clean up + glDeleteTextures(1, &targetTexture); + glDeleteRenderbuffers(1, &targetRenderbuffer); +} + +TEST_P(ImageTest, MipLevels) +{ + EGLWindow *window = getEGLWindow(); + if (!extensionEnabled("OES_EGL_image") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_image_base") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_gl_texture_2D_image")) + { + std::cout << "Test skipped because OES_EGL_image, EGL_KHR_image_base or " + "EGL_KHR_gl_texture_2D_image is not available." + << std::endl; + return; + } + + const size_t mipLevels = 3; + const size_t textureSize = 4; + std::vector<GLuint> mip0Data(textureSize * textureSize, 0xFFFF0000); + std::vector<GLuint> mip1Data(mip0Data.size() << 1, 0xFF00FF00); + std::vector<GLuint> mip2Data(mip0Data.size() << 2, 0xFF0000FF); + GLubyte *data[mipLevels] = { + reinterpret_cast<GLubyte *>(&mip0Data[0]), reinterpret_cast<GLubyte *>(&mip1Data[0]), + reinterpret_cast<GLubyte *>(&mip2Data[0]), + }; + + GLuint source; + glGenTextures(1, &source); + glBindTexture(GL_TEXTURE_2D, source); + + for (size_t level = 0; level < mipLevels; level++) + { + glTexImage2D(GL_TEXTURE_2D, static_cast<GLint>(level), GL_RGBA, textureSize >> level, + textureSize >> level, 0, GL_RGBA, GL_UNSIGNED_BYTE, data[level]); + } + + ASSERT_GL_NO_ERROR(); + + for (size_t level = 0; level < mipLevels; level++) + { + // Create the Image + EGLint attribs[] = { + EGL_GL_TEXTURE_LEVEL_KHR, static_cast<EGLint>(level), EGL_NONE, + }; + EGLImageKHR image = + eglCreateImageKHR(window->getDisplay(), window->getContext(), EGL_GL_TEXTURE_2D_KHR, + reinterpretHelper<EGLClientBuffer>(source), attribs); + ASSERT_EGL_SUCCESS(); + + // Create a texture and renderbuffer target + GLuint textureTarget; + createEGLImageTargetTexture2D(image, &textureTarget); + + // Disable mipmapping + glBindTexture(GL_TEXTURE_2D, textureTarget); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + GLuint renderbufferTarget; + createEGLImageTargetRenderbuffer(image, &renderbufferTarget); + + // Expect that the targets have the same color as the source texture + verifyResults2D(textureTarget, data[level]); + verifyResultsRenderbuffer(renderbufferTarget, data[level]); + + // Clean up + eglDestroyImageKHR(window->getDisplay(), image); + glDeleteTextures(1, &textureTarget); + glDeleteRenderbuffers(1, &renderbufferTarget); + } + + // Clean up + glDeleteTextures(1, &source); +} + +// Respecify the source texture, orphaning it. The target texture should not have updated data. +TEST_P(ImageTest, Respecification) +{ + EGLWindow *window = getEGLWindow(); + if (!extensionEnabled("OES_EGL_image") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_image_base") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_gl_texture_2D_image")) + { + std::cout << "Test skipped because OES_EGL_image, EGL_KHR_image_base or " + "EGL_KHR_gl_texture_2D_image is not available." + << std::endl; + return; + } + + GLubyte originalData[4] = {255, 0, 255, 255}; + GLubyte updateData[4] = {0, 255, 0, 255}; + + // Create the Image + GLuint source; + EGLImageKHR image; + createEGLImage2DTextureSource(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, originalData, &source, &image); + + // Create the target + GLuint target; + createEGLImageTargetTexture2D(image, &target); + + // Respecify source + glBindTexture(GL_TEXTURE_2D, source); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, updateData); + + // Expect that the target texture has the original data + verifyResults2D(target, originalData); + + // Expect that the source texture has the updated data + verifyResults2D(source, updateData); + + // Clean up + glDeleteTextures(1, &source); + eglDestroyImageKHR(window->getDisplay(), image); + glDeleteTextures(1, &target); +} + +// First render to a target texture, then respecify the source texture, orphaning it. +// The target texture's FBO should be notified of the target texture's orphaning. +TEST_P(ImageTest, RespecificationWithFBO) +{ + EGLWindow *window = getEGLWindow(); + if (!extensionEnabled("OES_EGL_image") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_image_base") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_gl_texture_2D_image")) + { + std::cout << "Test skipped because OES_EGL_image, EGL_KHR_image_base or " + "EGL_KHR_gl_texture_2D_image is not available." + << std::endl; + return; + } + + // Simple shader + const std::string &vertexSource = + "attribute vec2 position;\n" + "void main()\n" + "{\n" + " gl_Position = vec4(position, 0, 1);\n" + "}"; + const std::string &fragmentSource = + "void main()\n" + "{\n" + " gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0);\n" + "}"; + GLuint program = CompileProgram(vertexSource, fragmentSource); + ASSERT_NE(0u, program); + + GLubyte originalData[4] = {255, 0, 255, 255}; + GLubyte updateData[4] = {0, 255, 0, 255}; + + // Create the Image + GLuint source; + EGLImageKHR image; + createEGLImage2DTextureSource(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, originalData, &source, &image); + + // Create the target + GLuint target; + createEGLImageTargetTexture2D(image, &target); + + // Render to the target texture + GLuint fbo; + glGenFramebuffers(1, &fbo); + glBindFramebuffer(GL_FRAMEBUFFER, fbo); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, target, 0); + drawQuad(program, "position", 0.5f); + EXPECT_PIXEL_EQ(0, 0, 0, 0, 255, 255); + + // Respecify source with same parameters. This should not change the texture storage in D3D11. + glBindTexture(GL_TEXTURE_2D, source); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, updateData); + + // Expect that the source texture has the updated data + verifyResults2D(source, updateData); + + // Render to the target texture again and verify it gets the rendered pixels. + drawQuad(program, "position", 0.5f); + EXPECT_PIXEL_EQ(0, 0, 0, 0, 255, 255); + + // Clean up + glDeleteTextures(1, &source); + eglDestroyImageKHR(window->getDisplay(), image); + glDeleteTextures(1, &target); + glDeleteProgram(program); + glDeleteFramebuffers(1, &fbo); +} + +// Test that respecifying a level of the target texture orphans it and keeps a copy of the EGLimage +// data +TEST_P(ImageTest, RespecificationOfOtherLevel) +{ + EGLWindow *window = getEGLWindow(); + if (!extensionEnabled("OES_EGL_image") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_image_base") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_gl_texture_2D_image")) + { + std::cout << "Test skipped because OES_EGL_image, EGL_KHR_image_base or " + "EGL_KHR_gl_texture_2D_image is not available." + << std::endl; + return; + } + + GLubyte originalData[2 * 2 * 4] = { + 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, + }; + + GLubyte updateData[2 * 2 * 4] = { + 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, + }; + + // Create the Image + GLuint source; + EGLImageKHR image; + createEGLImage2DTextureSource(2, 2, GL_RGBA, GL_UNSIGNED_BYTE, originalData, &source, &image); + + // Create the target + GLuint target; + createEGLImageTargetTexture2D(image, &target); + + // Expect that the target and source textures have the original data + verifyResults2D(source, originalData); + verifyResults2D(target, originalData); + + // Add a new mipLevel to the target, orphaning it + glBindTexture(GL_TEXTURE_2D, target); + glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, originalData); + EXPECT_GL_NO_ERROR(); + + // Expect that the target and source textures still have the original data + verifyResults2D(source, originalData); + verifyResults2D(target, originalData); + + // Update the source's data + glBindTexture(GL_TEXTURE_2D, source); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, updateData); + + // Expect that the target still has the original data and source has the updated data + verifyResults2D(source, updateData); + verifyResults2D(target, originalData); + + // Clean up + glDeleteTextures(1, &source); + eglDestroyImageKHR(window->getDisplay(), image); + glDeleteTextures(1, &target); +} + +// Update the data of the source and target textures. All image siblings should have the new data. +TEST_P(ImageTest, UpdatedData) +{ + EGLWindow *window = getEGLWindow(); + if (!extensionEnabled("OES_EGL_image") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_image_base") || + !eglDisplayExtensionEnabled(window->getDisplay(), "EGL_KHR_gl_texture_2D_image")) + { + std::cout << "Test skipped because OES_EGL_image, EGL_KHR_image_base or " + "EGL_KHR_gl_texture_2D_image is not available." + << std::endl; + return; + } + + GLubyte originalData[4] = {255, 0, 255, 255}; + GLubyte updateData[4] = {0, 255, 0, 255}; + + // Create the Image + GLuint source; + EGLImageKHR image; + createEGLImage2DTextureSource(1, 1, GL_RGBA, GL_UNSIGNED_BYTE, originalData, &source, &image); + + // Create multiple targets + GLuint targetTexture; + createEGLImageTargetTexture2D(image, &targetTexture); + + GLuint targetRenderbuffer; + createEGLImageTargetRenderbuffer(image, &targetRenderbuffer); + + // Expect that both the source and targets have the original data + verifyResults2D(source, originalData); + verifyResults2D(targetTexture, originalData); + verifyResultsRenderbuffer(targetRenderbuffer, originalData); + + // Update the data of the source + glBindTexture(GL_TEXTURE_2D, source); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, updateData); + + // Expect that both the source and targets have the updated data + verifyResults2D(source, updateData); + verifyResults2D(targetTexture, updateData); + verifyResultsRenderbuffer(targetRenderbuffer, updateData); + + // Update the data of the target back to the original data + glBindTexture(GL_TEXTURE_2D, targetTexture); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, originalData); + + // Expect that both the source and targets have the original data again + verifyResults2D(source, originalData); + verifyResults2D(targetTexture, originalData); + verifyResultsRenderbuffer(targetRenderbuffer, originalData); + + // Clean up + glDeleteTextures(1, &source); + eglDestroyImageKHR(window->getDisplay(), image); + glDeleteTextures(1, &targetTexture); + glDeleteRenderbuffers(1, &targetRenderbuffer); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these +// tests should be run against. +ANGLE_INSTANTIATE_TEST(ImageTest, + ES2_D3D9(), + ES2_D3D11(), + ES3_D3D11(), + ES2_OPENGL(), + ES3_OPENGL(), + ES2_OPENGLES(), + ES3_OPENGLES()); +ANGLE_INSTANTIATE_TEST(ImageTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); +} diff --git a/gfx/angle/src/tests/gl_tests/IncompleteTextureTest.cpp b/gfx/angle/src/tests/gl_tests/IncompleteTextureTest.cpp new file mode 100755 index 000000000..d7a113915 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/IncompleteTextureTest.cpp @@ -0,0 +1,170 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "test_utils/ANGLETest.h" + +#include <vector> + +using namespace angle; + +class IncompleteTextureTest : public ANGLETest +{ + protected: + IncompleteTextureTest() + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + virtual void SetUp() + { + ANGLETest::SetUp(); + + const std::string vertexShaderSource = SHADER_SOURCE + ( + precision highp float; + attribute vec4 position; + varying vec2 texcoord; + + void main() + { + gl_Position = position; + texcoord = (position.xy * 0.5) + 0.5; + } + ); + + const std::string fragmentShaderSource = SHADER_SOURCE + ( + precision highp float; + uniform sampler2D tex; + varying vec2 texcoord; + + void main() + { + gl_FragColor = texture2D(tex, texcoord); + } + ); + + mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource); + if (mProgram == 0) + { + FAIL() << "shader compilation failed."; + } + + mTextureUniformLocation = glGetUniformLocation(mProgram, "tex"); + } + + virtual void TearDown() + { + glDeleteProgram(mProgram); + + ANGLETest::TearDown(); + } + + void fillTextureData(std::vector<GLubyte> &buffer, GLubyte r, GLubyte g, GLubyte b, GLubyte a) + { + size_t count = buffer.size() / 4; + for (size_t i = 0; i < count; i++) + { + buffer[i * 4 + 0] = r; + buffer[i * 4 + 1] = g; + buffer[i * 4 + 2] = b; + buffer[i * 4 + 3] = a; + } + } + + GLuint mProgram; + GLint mTextureUniformLocation; +}; + +TEST_P(IncompleteTextureTest, IncompleteTexture2D) +{ + GLuint tex; + glGenTextures(1, &tex); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, tex); + + glUseProgram(mProgram); + glUniform1i(mTextureUniformLocation, 0); + + const GLsizei textureWidth = 2; + const GLsizei textureHeight = 2; + std::vector<GLubyte> textureData(textureWidth * textureHeight * 4); + fillTextureData(textureData, 255, 0, 0, 255); + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, textureWidth, textureHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, &textureData[0]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + + drawQuad(mProgram, "position", 0.5f); + EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + + drawQuad(mProgram, "position", 0.5f); + EXPECT_PIXEL_EQ(0, 0, 0, 0, 0, 255); + + glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, textureWidth >> 1, textureHeight >> 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &textureData[0]); + + drawQuad(mProgram, "position", 0.5f); + EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255); + + glDeleteTextures(1, &tex); +} + +TEST_P(IncompleteTextureTest, UpdateTexture) +{ + GLuint tex; + glGenTextures(1, &tex); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, tex); + + glUseProgram(mProgram); + glUniform1i(mTextureUniformLocation, 0); + + const GLsizei redTextureWidth = 64; + const GLsizei redTextureHeight = 64; + std::vector<GLubyte> redTextureData(redTextureWidth * redTextureHeight * 4); + fillTextureData(redTextureData, 255, 0, 0, 255); + for (size_t i = 0; i < 7; i++) + { + glTexImage2D(GL_TEXTURE_2D, static_cast<GLint>(i), GL_RGBA, redTextureWidth >> i, + redTextureHeight >> i, 0, GL_RGBA, GL_UNSIGNED_BYTE, &redTextureData[0]); + } + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + drawQuad(mProgram, "position", 0.5f); + EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255); + + const GLsizei greenTextureWidth = 32; + const GLsizei greenTextureHeight = 32; + std::vector<GLubyte> greenTextureData(greenTextureWidth * greenTextureHeight * 4); + fillTextureData(greenTextureData, 0, 255, 0, 255); + + for (size_t i = 0; i < 6; i++) + { + glTexSubImage2D(GL_TEXTURE_2D, static_cast<GLint>(i), greenTextureWidth >> i, + greenTextureHeight >> i, greenTextureWidth >> i, greenTextureHeight >> i, + GL_RGBA, GL_UNSIGNED_BYTE, &greenTextureData[0]); + } + + drawQuad(mProgram, "position", 0.5f); + EXPECT_PIXEL_EQ(getWindowWidth() - greenTextureWidth, getWindowHeight() - greenTextureWidth, 0, 255, 0, 255); + + glDeleteTextures(1, &tex); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(IncompleteTextureTest, + ES2_D3D9(), + ES2_D3D11(), + ES2_OPENGL(), + ES2_OPENGLES()); diff --git a/gfx/angle/src/tests/gl_tests/IndexBufferOffsetTest.cpp b/gfx/angle/src/tests/gl_tests/IndexBufferOffsetTest.cpp new file mode 100755 index 000000000..28f032eee --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/IndexBufferOffsetTest.cpp @@ -0,0 +1,156 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +// IndexBufferOffsetTest.cpp: Test glDrawElements with an offset and an index buffer + +#include "test_utils/ANGLETest.h" +#include "system_utils.h" + +using namespace angle; + +class IndexBufferOffsetTest : public ANGLETest +{ + protected: + IndexBufferOffsetTest() + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + const std::string vertexShaderSource = + SHADER_SOURCE(precision highp float; attribute vec2 position; + + void main() + { + gl_Position = vec4(position, 0.0, 1.0); + }); + + const std::string fragmentShaderSource = + SHADER_SOURCE(precision highp float; uniform vec4 color; + + void main() + { + gl_FragColor = color; + }); + + mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource); + ASSERT_NE(0u, mProgram); + + mColorUniformLocation = glGetUniformLocation(mProgram, "color"); + mPositionAttributeLocation = glGetAttribLocation(mProgram, "position"); + + const GLfloat vertices[] = + { + -1.0f, -1.0f, + -1.0f, 1.0f, + 1.0f, -1.0f, + 1.0f, 1.0f + }; + glGenBuffers(1, &mVertexBuffer); + glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), &vertices[0], GL_STATIC_DRAW); + + glGenBuffers(1, &mIndexBuffer); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer); + } + + void TearDown() override + { + glDeleteBuffers(1, &mVertexBuffer); + glDeleteBuffers(1, &mIndexBuffer); + glDeleteProgram(mProgram); + ANGLETest::TearDown(); + } + + void runTest(GLenum type, int typeWidth, void *indexData) + { + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + GLuint nullIndexData[] = {0, 0, 0, 0, 0, 0}; + + size_t indexDataWidth = 6 * typeWidth; + + glBufferData(GL_ELEMENT_ARRAY_BUFFER, 3 * indexDataWidth, nullptr, GL_DYNAMIC_DRAW); + glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, indexDataWidth, nullIndexData); + glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, indexDataWidth, indexDataWidth, indexData); + glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 2 * indexDataWidth, indexDataWidth, nullIndexData); + + glUseProgram(mProgram); + + glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffer); + glVertexAttribPointer(mPositionAttributeLocation, 2, GL_FLOAT, GL_FALSE, 0, 0); + glEnableVertexAttribArray(mPositionAttributeLocation); + + glUniform4f(mColorUniformLocation, 1.0f, 0.0f, 0.0f, 1.0f); + + for (int i = 0; i < 16; i++) + { + glDrawElements(GL_TRIANGLES, 6, type, reinterpret_cast<GLvoid *>(indexDataWidth)); + EXPECT_PIXEL_EQ(64, 64, 255, 0, 0, 255); + } + + glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, indexDataWidth, indexDataWidth, nullIndexData); + glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 2 * indexDataWidth, indexDataWidth, indexData); + + glUniform4f(mColorUniformLocation, 0.0f, 1.0f, 0.0f, 1.0f); + glDrawElements(GL_TRIANGLES, 6, type, reinterpret_cast<GLvoid *>(indexDataWidth * 2)); + EXPECT_PIXEL_EQ(64, 64, 0, 255, 0, 255); + + EXPECT_GL_NO_ERROR(); + swapBuffers(); + } + + GLuint mProgram; + GLint mColorUniformLocation; + GLint mPositionAttributeLocation; + GLuint mVertexBuffer; + GLuint mIndexBuffer; +}; + +// Test using an offset for an UInt8 index buffer +TEST_P(IndexBufferOffsetTest, UInt8Index) +{ + GLubyte indexData[] = {0, 1, 2, 1, 2, 3}; + runTest(GL_UNSIGNED_BYTE, 1, indexData); +} + +// Test using an offset for an UInt16 index buffer +TEST_P(IndexBufferOffsetTest, UInt16Index) +{ + GLushort indexData[] = {0, 1, 2, 1, 2, 3}; + runTest(GL_UNSIGNED_SHORT, 2, indexData); +} + +// Test using an offset for an UInt32 index buffer +TEST_P(IndexBufferOffsetTest, UInt32Index) +{ + if (getClientMajorVersion() < 3 && !extensionEnabled("GL_OES_element_index_uint")) + { + std::cout << "Test skipped because ES3 or GL_OES_element_index_uint is not available." << std::endl; + return; + } + + GLuint indexData[] = {0, 1, 2, 1, 2, 3}; + runTest(GL_UNSIGNED_INT, 4, indexData); +} + +ANGLE_INSTANTIATE_TEST(IndexBufferOffsetTest, + ES2_D3D9(), + ES2_D3D11(), + ES3_D3D11(), + ES2_OPENGL(), + ES3_OPENGL(), + ES2_OPENGLES(), + ES3_OPENGLES()); diff --git a/gfx/angle/src/tests/gl_tests/IndexedPointsTest.cpp b/gfx/angle/src/tests/gl_tests/IndexedPointsTest.cpp new file mode 100755 index 000000000..73b16d8bf --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/IndexedPointsTest.cpp @@ -0,0 +1,403 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "test_utils/ANGLETest.h" + +using namespace angle; + +template <typename IndexType, GLenum IndexTypeName> +class IndexedPointsTest : public ANGLETest +{ + protected: + IndexedPointsTest() + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + setConfigDepthBits(24); + } + + float getIndexPositionX(size_t idx) + { + return (idx == 0 || idx == 3) ? -0.5f : 0.5f; + } + + float getIndexPositionY(size_t idx) + { + return (idx == 2 || idx == 3) ? -0.5f : 0.5f; + } + + virtual void SetUp() + { + ANGLETest::SetUp(); + + const std::string vertexShaderSource = SHADER_SOURCE + ( + precision highp float; + attribute vec2 position; + + void main() + { + gl_PointSize = 5.0; + gl_Position = vec4(position, 0.0, 1.0); + } + ); + + const std::string fragmentShaderSource = SHADER_SOURCE + ( + precision highp float; + + void main() + { + gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); + } + ); + + mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource); + ASSERT_NE(0u, mProgram); + + const std::string vertexShaderSource2 = SHADER_SOURCE + ( + precision highp float; + attribute vec2 position; + attribute vec4 color; + varying vec4 vcolor; + + void main() + { + gl_PointSize = 5.0; + gl_Position = vec4(position, 0.0, 1.0); + vcolor = color; + } + ); + + const std::string fragmentShaderSource2 = SHADER_SOURCE + ( + precision highp float; + varying vec4 vcolor; + void main() + { + gl_FragColor = vec4(vcolor.xyz, 1.0); + } + ); + + mVertexWithColorBufferProgram = CompileProgram(vertexShaderSource2, fragmentShaderSource2); + ASSERT_NE(0u, mVertexWithColorBufferProgram); + + // Construct a vertex buffer of position values and color values + // contained in a single structure + const float verticesWithColor[] = + { + getIndexPositionX(0), getIndexPositionY(0), 0.0f, 1.0f, 0.0f, + getIndexPositionX(2), getIndexPositionY(2), 0.0f, 1.0f, 0.0f, + getIndexPositionX(1), getIndexPositionY(1), 0.0f, 1.0f, 0.0f, + getIndexPositionX(3), getIndexPositionY(3), 0.0f, 1.0f, 0.0f, + }; + + glGenBuffers(1, &mVertexWithColorBuffer); + glBindBuffer(GL_ARRAY_BUFFER, mVertexWithColorBuffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(verticesWithColor), &verticesWithColor[0], GL_STATIC_DRAW); + + // Construct a vertex buffer of position values only + const GLfloat vertices[] = + { + getIndexPositionX(0), getIndexPositionY(0), + getIndexPositionX(2), getIndexPositionY(2), + getIndexPositionX(1), getIndexPositionY(1), + getIndexPositionX(3), getIndexPositionY(3), + }; + glGenBuffers(1, &mVertexBuffer); + glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), &vertices[0], GL_STATIC_DRAW); + + // The indices buffer is shared between both variations of tests + const IndexType indices[] = { 0, 2, 1, 3 }; + glGenBuffers(1, &mIndexBuffer); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), &indices[0], GL_STATIC_DRAW); + } + + virtual void TearDown() + { + glDeleteBuffers(1, &mVertexBuffer); + glDeleteBuffers(1, &mIndexBuffer); + glDeleteProgram(mProgram); + + glDeleteBuffers(1, &mVertexWithColorBuffer); + glDeleteProgram(mVertexWithColorBufferProgram); + ANGLETest::TearDown(); + } + + void runTest(GLuint firstIndex, bool useVertexBufferWithColor = false) + { + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + GLint viewportSize[4]; + glGetIntegerv(GL_VIEWPORT, viewportSize); + + // Choose appropriate program to apply for the test + GLuint program = useVertexBufferWithColor ? mVertexWithColorBufferProgram : mProgram; + + if (useVertexBufferWithColor) + { + glBindBuffer(GL_ARRAY_BUFFER, mVertexWithColorBuffer); + GLint vertexLocation = glGetAttribLocation(program, "position"); + glVertexAttribPointer(vertexLocation, 2, GL_FLOAT, GL_FALSE, + static_cast<const GLsizei>(VertexWithColorSize), 0); + glEnableVertexAttribArray(vertexLocation); + + GLint vertexColorLocation = glGetAttribLocation(program, "color"); + glVertexAttribPointer(vertexColorLocation, 3, GL_FLOAT, GL_FALSE, + static_cast<const GLsizei>(VertexWithColorSize), + (GLvoid *)((sizeof(float) * 2))); + glEnableVertexAttribArray(vertexColorLocation); + } + else + { + glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffer); + GLint vertexLocation = glGetAttribLocation(program, "position"); + glVertexAttribPointer(vertexLocation, 2, GL_FLOAT, GL_FALSE, 0, 0); + glEnableVertexAttribArray(vertexLocation); + } + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer); + glUseProgram(program); + + glDrawElements(GL_POINTS, mPointCount - firstIndex, IndexTypeName, reinterpret_cast<void*>(firstIndex * sizeof(IndexType))); + + for (size_t i = 0; i < mPointCount; i++) + { + GLuint x = static_cast<GLuint>(viewportSize[0] + (getIndexPositionX(i) * 0.5f + 0.5f) * (viewportSize[2] - viewportSize[0])); + GLuint y = static_cast<GLuint>(viewportSize[1] + (getIndexPositionY(i) * 0.5f + 0.5f) * (viewportSize[3] - viewportSize[1])); + + if (i < firstIndex) + { + EXPECT_PIXEL_EQ(x, y, 0, 0, 0, 255); + } + else + { + if (useVertexBufferWithColor) + { + // Pixel data is assumed to be GREEN + EXPECT_PIXEL_EQ(x, y, 0, 255, 0, 255); + } + else + { + // Pixel data is assumed to be RED + EXPECT_PIXEL_EQ(x, y, 255, 0, 0, 255); + } + } + } + swapBuffers(); + } + + GLuint mProgram; + GLuint mVertexBuffer; + GLuint mIndexBuffer; + + GLuint mVertexWithColorBufferProgram; + GLuint mVertexWithColorBuffer; + + static const GLuint mPointCount = 4; + + private: + const size_t VertexWithColorSize = sizeof(float) * 5; +}; + +typedef IndexedPointsTest<GLubyte, GL_UNSIGNED_BYTE> IndexedPointsTestUByte; + +TEST_P(IndexedPointsTestUByte, UnsignedByteOffset0) +{ + runTest(0); +} + +TEST_P(IndexedPointsTestUByte, UnsignedByteOffset1) +{ + runTest(1); +} + +TEST_P(IndexedPointsTestUByte, UnsignedByteOffset2) +{ + runTest(2); +} + +TEST_P(IndexedPointsTestUByte, UnsignedByteOffset3) +{ + runTest(3); +} + +TEST_P(IndexedPointsTestUByte, VertexWithColorUnsignedByteOffset0) +{ + runTest(0, true); +} + +TEST_P(IndexedPointsTestUByte, VertexWithColorUnsignedByteOffset1) +{ + runTest(1, true); +} + +TEST_P(IndexedPointsTestUByte, VertexWithColorUnsignedByteOffset2) +{ + runTest(2, true); +} + +TEST_P(IndexedPointsTestUByte, VertexWithColorUnsignedByteOffset3) +{ + runTest(3, true); +} + +typedef IndexedPointsTest<GLushort, GL_UNSIGNED_SHORT> IndexedPointsTestUShort; + +TEST_P(IndexedPointsTestUShort, UnsignedShortOffset0) +{ + runTest(0); +} + +TEST_P(IndexedPointsTestUShort, UnsignedShortOffset1) +{ + runTest(1); +} + +TEST_P(IndexedPointsTestUShort, UnsignedShortOffset2) +{ + runTest(2); +} + +TEST_P(IndexedPointsTestUShort, UnsignedShortOffset3) +{ + runTest(3); +} + +TEST_P(IndexedPointsTestUShort, VertexWithColorUnsignedShortOffset0) +{ + runTest(0, true); +} + +TEST_P(IndexedPointsTestUShort, VertexWithColorUnsignedShortOffset1) +{ + runTest(1, true); +} + +TEST_P(IndexedPointsTestUShort, VertexWithColorUnsignedShortOffset2) +{ + runTest(2, true); +} + +TEST_P(IndexedPointsTestUShort, VertexWithColorUnsignedShortOffset3) +{ + runTest(3, true); +} + +TEST_P(IndexedPointsTestUShort, VertexWithColorUnsignedShortOffsetChangingIndices) +{ + runTest(3, true); + runTest(1, true); + runTest(0, true); + runTest(2, true); +} + +typedef IndexedPointsTest<GLuint, GL_UNSIGNED_INT> IndexedPointsTestUInt; + +TEST_P(IndexedPointsTestUInt, UnsignedIntOffset0) +{ + if (getClientMajorVersion() < 3 && !extensionEnabled("GL_OES_element_index_uint")) + { + return; + } + + runTest(0); +} + +TEST_P(IndexedPointsTestUInt, UnsignedIntOffset1) +{ + if (getClientMajorVersion() < 3 && !extensionEnabled("GL_OES_element_index_uint")) + { + return; + } + + runTest(1); +} + +TEST_P(IndexedPointsTestUInt, UnsignedIntOffset2) +{ + if (getClientMajorVersion() < 3 && !extensionEnabled("GL_OES_element_index_uint")) + { + return; + } + + runTest(2); +} + +TEST_P(IndexedPointsTestUInt, UnsignedIntOffset3) +{ + if (getClientMajorVersion() < 3 && !extensionEnabled("GL_OES_element_index_uint")) + { + return; + } + + runTest(3); +} + +TEST_P(IndexedPointsTestUInt, VertexWithColorUnsignedIntOffset0) +{ + if (getClientMajorVersion() < 3 && !extensionEnabled("GL_OES_element_index_uint")) + { + return; + } + + runTest(0, false); +} + +TEST_P(IndexedPointsTestUInt, VertexWithColorUnsignedIntOffset1) +{ + if (getClientMajorVersion() < 3 && !extensionEnabled("GL_OES_element_index_uint")) + { + return; + } + + runTest(1, false); +} + +TEST_P(IndexedPointsTestUInt, VertexWithColorUnsignedIntOffset2) +{ + if (getClientMajorVersion() < 3 && !extensionEnabled("GL_OES_element_index_uint")) + { + return; + } + + runTest(2, false); +} + +TEST_P(IndexedPointsTestUInt, VertexWithColorUnsignedIntOffset3) +{ + if (getClientMajorVersion() < 3 && !extensionEnabled("GL_OES_element_index_uint")) + { + return; + } + + runTest(3, false); +} + +// TODO(geofflang): Figure out why this test fails on Intel OpenGL +ANGLE_INSTANTIATE_TEST(IndexedPointsTestUByte, + ES2_D3D11(), + ES2_D3D11_FL9_3(), + ES2_OPENGL(), + ES2_OPENGLES()); +ANGLE_INSTANTIATE_TEST(IndexedPointsTestUShort, + ES2_D3D11(), + ES2_D3D11_FL9_3(), + ES2_OPENGL(), + ES2_OPENGLES()); +ANGLE_INSTANTIATE_TEST(IndexedPointsTestUInt, + ES2_D3D11(), + ES2_D3D11_FL9_3(), + ES2_OPENGL(), + ES2_OPENGLES()); diff --git a/gfx/angle/src/tests/gl_tests/InstancingTest.cpp b/gfx/angle/src/tests/gl_tests/InstancingTest.cpp new file mode 100755 index 000000000..633f96892 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/InstancingTest.cpp @@ -0,0 +1,468 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "test_utils/ANGLETest.h" + +using namespace angle; + +class InstancingTest : public ANGLETest +{ + protected: + InstancingTest() : mProgram(0), mVertexBuffer(0) + { + setWindowWidth(256); + setWindowHeight(256); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + ~InstancingTest() override + { + glDeleteBuffers(1, &mVertexBuffer); + glDeleteProgram(mProgram); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + mVertexAttribDivisorANGLE = NULL; + mDrawArraysInstancedANGLE = NULL; + mDrawElementsInstancedANGLE = NULL; + + char *extensionString = (char*)glGetString(GL_EXTENSIONS); + if (strstr(extensionString, "GL_ANGLE_instanced_arrays")) + { + mVertexAttribDivisorANGLE = (PFNGLVERTEXATTRIBDIVISORANGLEPROC)eglGetProcAddress("glVertexAttribDivisorANGLE"); + mDrawArraysInstancedANGLE = (PFNGLDRAWARRAYSINSTANCEDANGLEPROC)eglGetProcAddress("glDrawArraysInstancedANGLE"); + mDrawElementsInstancedANGLE = (PFNGLDRAWELEMENTSINSTANCEDANGLEPROC)eglGetProcAddress("glDrawElementsInstancedANGLE"); + } + + ASSERT_TRUE(mVertexAttribDivisorANGLE != NULL); + ASSERT_TRUE(mDrawArraysInstancedANGLE != NULL); + ASSERT_TRUE(mDrawElementsInstancedANGLE != NULL); + + // Initialize the vertex and index vectors + GLfloat qvertex1[3] = {-quadRadius, quadRadius, 0.0f}; + GLfloat qvertex2[3] = {-quadRadius, -quadRadius, 0.0f}; + GLfloat qvertex3[3] = { quadRadius, -quadRadius, 0.0f}; + GLfloat qvertex4[3] = { quadRadius, quadRadius, 0.0f}; + mQuadVertices.insert(mQuadVertices.end(), qvertex1, qvertex1 + 3); + mQuadVertices.insert(mQuadVertices.end(), qvertex2, qvertex2 + 3); + mQuadVertices.insert(mQuadVertices.end(), qvertex3, qvertex3 + 3); + mQuadVertices.insert(mQuadVertices.end(), qvertex4, qvertex4 + 3); + + GLfloat coord1[2] = {0.0f, 0.0f}; + GLfloat coord2[2] = {0.0f, 1.0f}; + GLfloat coord3[2] = {1.0f, 1.0f}; + GLfloat coord4[2] = {1.0f, 0.0f}; + mTexcoords.insert(mTexcoords.end(), coord1, coord1 + 2); + mTexcoords.insert(mTexcoords.end(), coord2, coord2 + 2); + mTexcoords.insert(mTexcoords.end(), coord3, coord3 + 2); + mTexcoords.insert(mTexcoords.end(), coord4, coord4 + 2); + + mIndices.push_back(0); + mIndices.push_back(1); + mIndices.push_back(2); + mIndices.push_back(0); + mIndices.push_back(2); + mIndices.push_back(3); + + for (size_t vertexIndex = 0; vertexIndex < 6; ++vertexIndex) + { + mNonIndexedVertices.insert(mNonIndexedVertices.end(), + mQuadVertices.begin() + mIndices[vertexIndex] * 3, + mQuadVertices.begin() + mIndices[vertexIndex] * 3 + 3); + } + + for (size_t vertexIndex = 0; vertexIndex < 6; ++vertexIndex) + { + mNonIndexedVertices.insert(mNonIndexedVertices.end(), + mQuadVertices.begin() + mIndices[vertexIndex] * 3, + mQuadVertices.begin() + mIndices[vertexIndex] * 3 + 3); + } + + // Tile a 2x2 grid of the tiles + for (float y = -1.0f + quadRadius; y < 1.0f - quadRadius; y += quadRadius * 3) + { + for (float x = -1.0f + quadRadius; x < 1.0f - quadRadius; x += quadRadius * 3) + { + GLfloat instance[3] = {x + quadRadius, y + quadRadius, 0.0f}; + mInstances.insert(mInstances.end(), instance, instance + 3); + } + } + + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + + glGenBuffers(1, &mVertexBuffer); + + ASSERT_GL_NO_ERROR(); + } + + void setupDrawArraysTest(const std::string &vs) + { + const std::string fs = SHADER_SOURCE + ( + precision mediump float; + void main() + { + gl_FragColor = vec4(1.0, 0, 0, 1.0); + } + ); + + mProgram = CompileProgram(vs, fs); + ASSERT_NE(0u, mProgram); + + // Set the viewport + glViewport(0, 0, getWindowWidth(), getWindowHeight()); + + // Clear the color buffer + glClear(GL_COLOR_BUFFER_BIT); + + // Use the program object + glUseProgram(mProgram); + } + + void setupInstancedPointsTest() + { + mIndices.clear(); + mIndices.push_back(0); + mIndices.push_back(1); + mIndices.push_back(2); + mIndices.push_back(3); + + // clang-format off + const std::string vs = SHADER_SOURCE + ( + attribute vec3 a_position; + attribute vec3 a_instancePos; + void main() + { + gl_Position = vec4(a_position.xyz, 1.0); + gl_Position = vec4(a_instancePos.xyz, 1.0); + gl_PointSize = 6.0; + } + ); + + const std::string fs = SHADER_SOURCE + ( + precision mediump float; + void main() + { + gl_FragColor = vec4(1.0, 0, 0, 1.0); + } + ); + // clang-format on + + mProgram = CompileProgram(vs, fs); + ASSERT_NE(0u, mProgram); + + // Set the viewport + glViewport(0, 0, getWindowWidth(), getWindowHeight()); + + // Clear the color buffer + glClear(GL_COLOR_BUFFER_BIT); + + // Use the program object + glUseProgram(mProgram); + } + + void runDrawArraysTest(GLint first, GLsizei count, GLsizei instanceCount, float *offset) + { + glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffer); + glBufferData(GL_ARRAY_BUFFER, mInstances.size() * sizeof(mInstances[0]), &mInstances[0], GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + // Get the attribute locations + GLint positionLoc = glGetAttribLocation(mProgram, "a_position"); + GLint instancePosLoc = glGetAttribLocation(mProgram, "a_instancePos"); + + // Load the vertex position + glVertexAttribPointer(positionLoc, 3, GL_FLOAT, GL_FALSE, 0, mNonIndexedVertices.data()); + glEnableVertexAttribArray(positionLoc); + + // Load the instance position + glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffer); + glVertexAttribPointer(instancePosLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glEnableVertexAttribArray(instancePosLoc); + + // Enable instancing + mVertexAttribDivisorANGLE(instancePosLoc, 1); + + // Offset + GLint uniformLoc = glGetUniformLocation(mProgram, "u_offset"); + ASSERT_NE(uniformLoc, -1); + glUniform3fv(uniformLoc, 1, offset); + + // Do the instanced draw + mDrawArraysInstancedANGLE(GL_TRIANGLES, first, count, instanceCount); + + ASSERT_GL_NO_ERROR(); + } + + virtual void runDrawElementsTest(std::string vs, bool shouldAttribZeroBeInstanced) + { + const std::string fs = SHADER_SOURCE + ( + precision mediump float; + void main() + { + gl_FragColor = vec4(1.0, 0, 0, 1.0); + } + ); + + GLuint program = CompileProgram(vs, fs); + ASSERT_NE(program, 0u); + + // Get the attribute locations + GLint positionLoc = glGetAttribLocation(program, "a_position"); + GLint instancePosLoc = glGetAttribLocation(program, "a_instancePos"); + + // If this ASSERT fails then the vertex shader code should be refactored + ASSERT_EQ(shouldAttribZeroBeInstanced, (instancePosLoc == 0)); + + // Set the viewport + glViewport(0, 0, getWindowWidth(), getWindowHeight()); + + // Clear the color buffer + glClear(GL_COLOR_BUFFER_BIT); + + // Use the program object + glUseProgram(program); + + // Load the vertex position + glVertexAttribPointer(positionLoc, 3, GL_FLOAT, GL_FALSE, 0, mQuadVertices.data()); + glEnableVertexAttribArray(positionLoc); + + // Load the instance position + glVertexAttribPointer(instancePosLoc, 3, GL_FLOAT, GL_FALSE, 0, mInstances.data()); + glEnableVertexAttribArray(instancePosLoc); + + // Enable instancing + mVertexAttribDivisorANGLE(instancePosLoc, 1); + + // Do the instanced draw + mDrawElementsInstancedANGLE(GL_TRIANGLES, static_cast<GLsizei>(mIndices.size()), + GL_UNSIGNED_SHORT, mIndices.data(), + static_cast<GLsizei>(mInstances.size()) / 3); + + ASSERT_GL_NO_ERROR(); + + checkQuads(); + } + + void checkQuads() + { + // Check that various pixels are the expected color. + for (unsigned int quadIndex = 0; quadIndex < 4; ++quadIndex) + { + unsigned int baseOffset = quadIndex * 3; + + int quadx = static_cast<int>(((mInstances[baseOffset + 0]) * 0.5f + 0.5f) * getWindowWidth()); + int quady = static_cast<int>(((mInstances[baseOffset + 1]) * 0.5f + 0.5f) * getWindowHeight()); + + EXPECT_PIXEL_EQ(quadx, quady, 255, 0, 0, 255); + } + } + + // Loaded entry points + PFNGLVERTEXATTRIBDIVISORANGLEPROC mVertexAttribDivisorANGLE; + PFNGLDRAWARRAYSINSTANCEDANGLEPROC mDrawArraysInstancedANGLE; + PFNGLDRAWELEMENTSINSTANCEDANGLEPROC mDrawElementsInstancedANGLE; + + // Vertex data + std::vector<GLfloat> mQuadVertices; + std::vector<GLfloat> mNonIndexedVertices; + std::vector<GLfloat> mTexcoords; + std::vector<GLfloat> mInstances; + std::vector<GLushort> mIndices; + + const GLfloat quadRadius = 0.30f; + + GLuint mProgram; + GLuint mVertexBuffer; +}; + +class InstancingTestAllConfigs : public InstancingTest +{ + protected: + InstancingTestAllConfigs() {} +}; + +class InstancingTestNo9_3 : public InstancingTest +{ + protected: + InstancingTestNo9_3() {} +}; + +class InstancingTestPoints : public InstancingTest +{ + protected: + InstancingTestPoints() {} +}; + +// This test uses a vertex shader with the first attribute (attribute zero) instanced. +// On D3D9 and D3D11 FL9_3, this triggers a special codepath that rearranges the input layout sent to D3D, +// to ensure that slot/stream zero of the input layout doesn't contain per-instance data. +TEST_P(InstancingTestAllConfigs, AttributeZeroInstanced) +{ + const std::string vs = SHADER_SOURCE + ( + attribute vec3 a_instancePos; + attribute vec3 a_position; + void main() + { + gl_Position = vec4(a_position.xyz + a_instancePos.xyz, 1.0); + } + ); + + runDrawElementsTest(vs, true); +} + +// Same as AttributeZeroInstanced, but attribute zero is not instanced. +// This ensures the general instancing codepath (i.e. without rearranging the input layout) works as expected. +TEST_P(InstancingTestAllConfigs, AttributeZeroNotInstanced) +{ + const std::string vs = SHADER_SOURCE + ( + attribute vec3 a_position; + attribute vec3 a_instancePos; + void main() + { + gl_Position = vec4(a_position.xyz + a_instancePos.xyz, 1.0); + } + ); + + runDrawElementsTest(vs, false); +} + +// Tests that the "first" parameter to glDrawArraysInstancedANGLE is only an offset into +// the non-instanced vertex attributes. +TEST_P(InstancingTestNo9_3, DrawArraysWithOffset) +{ + const std::string vs = SHADER_SOURCE + ( + attribute vec3 a_position; + attribute vec3 a_instancePos; + uniform vec3 u_offset; + void main() + { + gl_Position = vec4(a_position.xyz + a_instancePos.xyz + u_offset, 1.0); + } + ); + + setupDrawArraysTest(vs); + + float offset1[3] = { 0, 0, 0 }; + runDrawArraysTest(0, 6, 2, offset1); + + float offset2[3] = { 0.0f, 1.0f, 0 }; + runDrawArraysTest(6, 6, 2, offset2); + + checkQuads(); +} + +// This test verifies instancing with GL_POINTS with glDrawArraysInstanced works. +// On D3D11 FL9_3, this triggers a special codepath that emulates instanced points rendering. +TEST_P(InstancingTestPoints, DrawArrays) +{ + // Disable D3D11 SDK Layers warnings checks, see ANGLE issue 667 for details + // On Win7, the D3D SDK Layers emits a false warning for these tests. + // This doesn't occur on Windows 10 (Version 1511) though. + ignoreD3D11SDKLayersWarnings(); + + setupInstancedPointsTest(); + + glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffer); + glBufferData(GL_ARRAY_BUFFER, mInstances.size() * sizeof(mInstances[0]), &mInstances[0], + GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + // Get the attribute locations + GLint positionLoc = glGetAttribLocation(mProgram, "a_position"); + GLint instancePosLoc = glGetAttribLocation(mProgram, "a_instancePos"); + + // Load the vertex position + GLfloat pos[3] = {0, 0, 0}; + glVertexAttribPointer(positionLoc, 3, GL_FLOAT, GL_FALSE, 0, pos); + glEnableVertexAttribArray(positionLoc); + + // Load the instance position + glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffer); + glVertexAttribPointer(instancePosLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glEnableVertexAttribArray(instancePosLoc); + + // Enable instancing + mVertexAttribDivisorANGLE(instancePosLoc, 1); + + // Do the instanced draw + mDrawArraysInstancedANGLE(GL_POINTS, 0, 1, static_cast<GLsizei>(mInstances.size()) / 3); + + ASSERT_GL_NO_ERROR(); + + checkQuads(); +} + +// This test verifies instancing with GL_POINTS with glDrawElementsInstanced works. +// On D3D11 FL9_3, this triggers a special codepath that emulates instanced points rendering. +TEST_P(InstancingTestPoints, DrawElements) +{ + // Disable D3D11 SDK Layers warnings checks, see ANGLE issue 667 for details + // On Win7, the D3D SDK Layers emits a false warning for these tests. + // This doesn't occur on Windows 10 (Version 1511) though. + ignoreD3D11SDKLayersWarnings(); + + setupInstancedPointsTest(); + + glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffer); + glBufferData(GL_ARRAY_BUFFER, mInstances.size() * sizeof(mInstances[0]), &mInstances[0], + GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + // Get the attribute locations + GLint positionLoc = glGetAttribLocation(mProgram, "a_position"); + GLint instancePosLoc = glGetAttribLocation(mProgram, "a_instancePos"); + + // Load the vertex position + GLfloat pos[3] = {0, 0, 0}; + glVertexAttribPointer(positionLoc, 3, GL_FLOAT, GL_FALSE, 0, pos); + glEnableVertexAttribArray(positionLoc); + + // Load the instance position + glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffer); + glVertexAttribPointer(instancePosLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glEnableVertexAttribArray(instancePosLoc); + + // Enable instancing + mVertexAttribDivisorANGLE(instancePosLoc, 1); + + // Do the instanced draw + mDrawElementsInstancedANGLE(GL_POINTS, static_cast<GLsizei>(mIndices.size()), GL_UNSIGNED_SHORT, + mIndices.data(), static_cast<GLsizei>(mInstances.size()) / 3); + + ASSERT_GL_NO_ERROR(); + + checkQuads(); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +// We test on D3D9 and D3D11 9_3 because they use special codepaths when attribute zero is instanced, unlike D3D11. +ANGLE_INSTANTIATE_TEST(InstancingTestAllConfigs, + ES2_D3D9(), + ES2_D3D11(), + ES2_D3D11_FL9_3(), + ES2_OPENGL(), + ES2_OPENGLES()); + +// TODO(jmadill): Figure out the situation with DrawInstanced on FL 9_3 +ANGLE_INSTANTIATE_TEST(InstancingTestNo9_3, ES2_D3D9(), ES2_D3D11()); + +ANGLE_INSTANTIATE_TEST(InstancingTestPoints, ES2_D3D11(), ES2_D3D11_FL9_3()); diff --git a/gfx/angle/src/tests/gl_tests/LineLoopTest.cpp b/gfx/angle/src/tests/gl_tests/LineLoopTest.cpp new file mode 100755 index 000000000..778fee9fe --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/LineLoopTest.cpp @@ -0,0 +1,226 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "test_utils/ANGLETest.h" + +using namespace angle; + +class LineLoopTest : public ANGLETest +{ + protected: + LineLoopTest() + { + setWindowWidth(256); + setWindowHeight(256); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + virtual void SetUp() + { + ANGLETest::SetUp(); + + const std::string vsSource = SHADER_SOURCE + ( + attribute highp vec4 position; + + void main(void) + { + gl_Position = position; + } + ); + + const std::string fsSource = SHADER_SOURCE + ( + uniform highp vec4 color; + void main(void) + { + gl_FragColor = color; + } + ); + + mProgram = CompileProgram(vsSource, fsSource); + if (mProgram == 0) + { + FAIL() << "shader compilation failed."; + } + + mPositionLocation = glGetAttribLocation(mProgram, "position"); + mColorLocation = glGetUniformLocation(mProgram, "color"); + + glBlendFunc(GL_ONE, GL_ONE); + glEnable(GL_BLEND); + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + + ASSERT_GL_NO_ERROR(); + } + + virtual void TearDown() + { + glDeleteProgram(mProgram); + + ANGLETest::TearDown(); + } + + void runTest(GLenum indexType, GLuint indexBuffer, const GLvoid *indexPtr) + { + glClear(GL_COLOR_BUFFER_BIT); + + static const GLfloat loopPositions[] = + { + 0.0f, 0.0f, + 0.0f, 0.0f, + 0.0f, 0.0f, + 0.0f, 0.0f, + 0.0f, 0.0f, + 0.0f, 0.0f, + -0.5f, -0.5f, + -0.5f, 0.5f, + 0.5f, 0.5f, + 0.5f, -0.5f + }; + + static const GLfloat stripPositions[] = + { + -0.5f, -0.5f, + -0.5f, 0.5f, + 0.5f, 0.5f, + 0.5f, -0.5f + }; + static const GLubyte stripIndices[] = + { + 1, 0, 3, 2, 1 + }; + + glUseProgram(mProgram); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); + glEnableVertexAttribArray(mPositionLocation); + glVertexAttribPointer(mPositionLocation, 2, GL_FLOAT, GL_FALSE, 0, loopPositions); + glUniform4f(mColorLocation, 0.0f, 0.0f, 1.0f, 1.0f); + glDrawElements(GL_LINE_LOOP, 4, indexType, indexPtr); + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + glVertexAttribPointer(mPositionLocation, 2, GL_FLOAT, GL_FALSE, 0, stripPositions); + glUniform4f(mColorLocation, 0, 1, 0, 1); + glDrawElements(GL_LINE_STRIP, 5, GL_UNSIGNED_BYTE, stripIndices); + + std::vector<GLubyte> pixels(getWindowWidth() * getWindowHeight() * 4); + glReadPixels(0, 0, getWindowWidth(), getWindowHeight(), GL_RGBA, GL_UNSIGNED_BYTE, &pixels[0]); + + ASSERT_GL_NO_ERROR(); + + for (int y = 0; y < getWindowHeight(); y++) + { + for (int x = 0; x < getWindowWidth(); x++) + { + const GLubyte* pixel = &pixels[0] + ((y * getWindowWidth() + x) * 4); + + EXPECT_EQ(pixel[0], 0); + EXPECT_EQ(pixel[1], pixel[2]); + EXPECT_EQ(pixel[3], 255); + } + } + } + + GLuint mProgram; + GLint mPositionLocation; + GLint mColorLocation; +}; + +TEST_P(LineLoopTest, LineLoopUByteIndices) +{ + // Disable D3D11 SDK Layers warnings checks, see ANGLE issue 667 for details + // On Win7, the D3D SDK Layers emits a false warning for these tests. + // This doesn't occur on Windows 10 (Version 1511) though. + ignoreD3D11SDKLayersWarnings(); + + static const GLubyte indices[] = { 0, 7, 6, 9, 8, 0 }; + runTest(GL_UNSIGNED_BYTE, 0, indices + 1); +} + +TEST_P(LineLoopTest, LineLoopUShortIndices) +{ + // Disable D3D11 SDK Layers warnings checks, see ANGLE issue 667 for details + ignoreD3D11SDKLayersWarnings(); + + static const GLushort indices[] = { 0, 7, 6, 9, 8, 0 }; + runTest(GL_UNSIGNED_SHORT, 0, indices + 1); +} + +TEST_P(LineLoopTest, LineLoopUIntIndices) +{ + if (!extensionEnabled("GL_OES_element_index_uint")) + { + return; + } + + // Disable D3D11 SDK Layers warnings checks, see ANGLE issue 667 for details + ignoreD3D11SDKLayersWarnings(); + + static const GLuint indices[] = { 0, 7, 6, 9, 8, 0 }; + runTest(GL_UNSIGNED_INT, 0, indices + 1); +} + +TEST_P(LineLoopTest, LineLoopUByteIndexBuffer) +{ + // Disable D3D11 SDK Layers warnings checks, see ANGLE issue 667 for details + ignoreD3D11SDKLayersWarnings(); + + static const GLubyte indices[] = { 0, 7, 6, 9, 8, 0 }; + + GLuint buf; + glGenBuffers(1, &buf); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buf); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); + + runTest(GL_UNSIGNED_BYTE, buf, reinterpret_cast<const void *>(sizeof(GLubyte))); + + glDeleteBuffers(1, &buf); +} + +TEST_P(LineLoopTest, LineLoopUShortIndexBuffer) +{ + // Disable D3D11 SDK Layers warnings checks, see ANGLE issue 667 for details + ignoreD3D11SDKLayersWarnings(); + + static const GLushort indices[] = { 0, 7, 6, 9, 8, 0 }; + + GLuint buf; + glGenBuffers(1, &buf); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buf); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); + + runTest(GL_UNSIGNED_SHORT, buf, reinterpret_cast<const void *>(sizeof(GLushort))); + + glDeleteBuffers(1, &buf); +} + +TEST_P(LineLoopTest, LineLoopUIntIndexBuffer) +{ + if (!extensionEnabled("GL_OES_element_index_uint")) + { + return; + } + + // Disable D3D11 SDK Layers warnings checks, see ANGLE issue 667 for details + ignoreD3D11SDKLayersWarnings(); + + static const GLuint indices[] = { 0, 7, 6, 9, 8, 0 }; + + GLuint buf; + glGenBuffers(1, &buf); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buf); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); + + runTest(GL_UNSIGNED_INT, buf, reinterpret_cast<const void *>(sizeof(GLuint))); + + glDeleteBuffers(1, &buf); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(LineLoopTest, ES2_D3D9(), ES2_D3D11(), ES2_OPENGL(), ES2_OPENGLES()); diff --git a/gfx/angle/src/tests/gl_tests/MaxTextureSizeTest.cpp b/gfx/angle/src/tests/gl_tests/MaxTextureSizeTest.cpp new file mode 100755 index 000000000..ab46d6f76 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/MaxTextureSizeTest.cpp @@ -0,0 +1,299 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "test_utils/ANGLETest.h" + +using namespace angle; + +class MaxTextureSizeTest : public ANGLETest +{ + protected: + MaxTextureSizeTest() + { + setWindowWidth(512); + setWindowHeight(512); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + const std::string vsSource = SHADER_SOURCE + ( + precision highp float; + attribute vec4 position; + varying vec2 texcoord; + + void main() + { + gl_Position = position; + texcoord = (position.xy * 0.5) + 0.5; + } + ); + + const std::string textureFSSource = SHADER_SOURCE + ( + precision highp float; + uniform sampler2D tex; + varying vec2 texcoord; + + void main() + { + gl_FragColor = texture2D(tex, texcoord); + } + ); + + const std::string blueFSSource = SHADER_SOURCE + ( + precision highp float; + + void main() + { + gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0); + } + ); + + mTextureProgram = CompileProgram(vsSource, textureFSSource); + mBlueProgram = CompileProgram(vsSource, blueFSSource); + if (mTextureProgram == 0 || mBlueProgram == 0) + { + FAIL() << "shader compilation failed."; + } + + mTextureUniformLocation = glGetUniformLocation(mTextureProgram, "tex"); + + glGetIntegerv(GL_MAX_TEXTURE_SIZE, &mMaxTexture2DSize); + glGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, &mMaxTextureCubeSize); + glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE, &mMaxRenderbufferSize); + + ASSERT_GL_NO_ERROR(); + } + + void TearDown() override + { + glDeleteProgram(mTextureProgram); + glDeleteProgram(mBlueProgram); + + ANGLETest::TearDown(); + } + + GLuint mTextureProgram; + GLint mTextureUniformLocation; + + GLuint mBlueProgram; + + GLint mMaxTexture2DSize; + GLint mMaxTextureCubeSize; + GLint mMaxRenderbufferSize; +}; + +TEST_P(MaxTextureSizeTest, SpecificationTexImage) +{ + GLuint tex; + glGenTextures(1, &tex); + glBindTexture(GL_TEXTURE_2D, tex); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + GLsizei textureWidth = mMaxTexture2DSize; + GLsizei textureHeight = 64; + + std::vector<GLubyte> data(textureWidth * textureHeight * 4); + for (int y = 0; y < textureHeight; y++) + { + for (int x = 0; x < textureWidth; x++) + { + GLubyte* pixel = &data[0] + ((y * textureWidth + x) * 4); + + // Draw a gradient, red in direction, green in y direction + pixel[0] = static_cast<GLubyte>((float(x) / textureWidth) * 255); + pixel[1] = static_cast<GLubyte>((float(y) / textureHeight) * 255); + pixel[2] = 0; + pixel[3] = 255; + } + } + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, textureWidth, textureHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, &data[0]); + EXPECT_GL_NO_ERROR(); + + glUseProgram(mTextureProgram); + glUniform1i(mTextureUniformLocation, 0); + + drawQuad(mTextureProgram, "position", 0.5f); + + std::vector<GLubyte> pixels(getWindowWidth() * getWindowHeight() * 4); + glReadPixels(0, 0, getWindowWidth(), getWindowHeight(), GL_RGBA, GL_UNSIGNED_BYTE, &pixels[0]); + + for (int y = 1; y < getWindowHeight(); y++) + { + for (int x = 1; x < getWindowWidth(); x++) + { + const GLubyte* prevPixel = &pixels[0] + (((y - 1) * getWindowWidth() + (x - 1)) * 4); + const GLubyte* curPixel = &pixels[0] + ((y * getWindowWidth() + x) * 4); + + EXPECT_GE(curPixel[0], prevPixel[0]); + EXPECT_GE(curPixel[1], prevPixel[1]); + EXPECT_EQ(curPixel[2], prevPixel[2]); + EXPECT_EQ(curPixel[3], prevPixel[3]); + } + } +} + +TEST_P(MaxTextureSizeTest, SpecificationTexStorage) +{ + if (getClientMajorVersion() < 3 && + (!extensionEnabled("GL_EXT_texture_storage") || !extensionEnabled("GL_OES_rgb8_rgba8"))) + { + return; + } + + GLuint tex; + glGenTextures(1, &tex); + glBindTexture(GL_TEXTURE_2D, tex); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + GLsizei textureWidth = 64; + GLsizei textureHeight = mMaxTexture2DSize; + + std::vector<GLubyte> data(textureWidth * textureHeight * 4); + for (int y = 0; y < textureHeight; y++) + { + for (int x = 0; x < textureWidth; x++) + { + GLubyte* pixel = &data[0] + ((y * textureWidth + x) * 4); + + // Draw a gradient, red in direction, green in y direction + pixel[0] = static_cast<GLubyte>((float(x) / textureWidth) * 255); + pixel[1] = static_cast<GLubyte>((float(y) / textureHeight) * 255); + pixel[2] = 0; + pixel[3] = 255; + } + } + + if (getClientMajorVersion() < 3) + { + glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, textureWidth, textureHeight); + } + else + { + glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8_OES, textureWidth, textureHeight); + } + EXPECT_GL_NO_ERROR(); + + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, textureWidth, textureHeight, GL_RGBA, GL_UNSIGNED_BYTE, &data[0]); + EXPECT_GL_NO_ERROR(); + + glUseProgram(mTextureProgram); + glUniform1i(mTextureUniformLocation, 0); + + drawQuad(mTextureProgram, "position", 0.5f); + + std::vector<GLubyte> pixels(getWindowWidth() * getWindowHeight() * 4); + glReadPixels(0, 0, getWindowWidth(), getWindowHeight(), GL_RGBA, GL_UNSIGNED_BYTE, &pixels[0]); + + for (int y = 1; y < getWindowHeight(); y++) + { + for (int x = 1; x < getWindowWidth(); x++) + { + const GLubyte* prevPixel = &pixels[0] + (((y - 1) * getWindowWidth() + (x - 1)) * 4); + const GLubyte* curPixel = &pixels[0] + ((y * getWindowWidth() + x) * 4); + + EXPECT_GE(curPixel[0], prevPixel[0]); + EXPECT_GE(curPixel[1], prevPixel[1]); + EXPECT_EQ(curPixel[2], prevPixel[2]); + EXPECT_EQ(curPixel[3], prevPixel[3]); + } + } +} + +TEST_P(MaxTextureSizeTest, RenderToTexture) +{ + if (getClientMajorVersion() < 3 && (!extensionEnabled("GL_ANGLE_framebuffer_blit"))) + { + std::cout << "Test skipped due to missing glBlitFramebuffer[ANGLE] support." << std::endl; + return; + } + + GLuint fbo = 0; + GLuint textureId = 0; + // create a 1-level texture at maximum size + glGenTextures(1, &textureId); + glBindTexture(GL_TEXTURE_2D, textureId); + + GLsizei textureWidth = 64; + GLsizei textureHeight = mMaxTexture2DSize; + + // texture setup code + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, textureWidth, textureHeight, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, NULL); + EXPECT_GL_NO_ERROR(); + + // create an FBO and attach the texture + glGenFramebuffers(1, &fbo); + glBindFramebuffer(GL_FRAMEBUFFER, fbo); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureId, 0); + + EXPECT_GL_NO_ERROR(); + EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + const int frameCount = 64; + for (int i = 0; i < frameCount; i++) + { + // clear the screen + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + GLubyte clearRed = static_cast<GLubyte>((float(i) / frameCount) * 255); + GLubyte clearGreen = 255 - clearRed; + GLubyte clearBlue = 0; + + glClearColor(clearRed / 255.0f, clearGreen / 255.0f, clearBlue / 255.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + // render blue into the texture + glBindFramebuffer(GL_FRAMEBUFFER, fbo); + drawQuad(mBlueProgram, "position", 0.5f); + + // copy corner of texture to LL corner of window + glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, 0); + glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, fbo); + glBlitFramebufferANGLE(0, 0, textureWidth - 1, getWindowHeight() - 1, + 0, 0, textureWidth - 1, getWindowHeight() - 1, + GL_COLOR_BUFFER_BIT, GL_NEAREST); + glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, 0); + EXPECT_GL_NO_ERROR(); + + EXPECT_PIXEL_EQ(textureWidth / 2, getWindowHeight() / 2, 0, 0, 255, 255); + EXPECT_PIXEL_EQ(textureWidth + 10, getWindowHeight() / 2, clearRed, clearGreen, clearBlue, 255); + + swapBuffers(); + } + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + glBindTexture(GL_TEXTURE_2D, 0); + + glDeleteFramebuffers(1, &fbo); + glDeleteTextures(1, &textureId); +} + +// TODO(geofflang): Fix the dependence on glBlitFramebufferANGLE without checks and assuming the +// default framebuffer is BGRA to enable the GL and GLES backends. (http://anglebug.com/1289) + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(MaxTextureSizeTest, ES2_D3D9(), ES2_D3D11(), ES2_D3D11_FL9_3()); diff --git a/gfx/angle/src/tests/gl_tests/MipmapTest.cpp b/gfx/angle/src/tests/gl_tests/MipmapTest.cpp new file mode 100755 index 000000000..2ab9411a8 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/MipmapTest.cpp @@ -0,0 +1,1135 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "test_utils/ANGLETest.h" + +using namespace angle; + +namespace +{ + +void TexImageCubeMapFaces(GLint level, + GLenum internalformat, + GLsizei width, + GLenum format, + GLenum type, + void *pixels) +{ + glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, level, internalformat, width, width, 0, format, + type, pixels); + glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, level, internalformat, width, width, 0, format, + type, pixels); + glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, level, internalformat, width, width, 0, format, + type, pixels); + glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, level, internalformat, width, width, 0, format, + type, pixels); + glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, level, internalformat, width, width, 0, format, + type, pixels); + glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, level, internalformat, width, width, 0, format, + type, pixels); +} + +class BaseMipmapTest : public ANGLETest +{ + protected: + void clearAndDrawQuad(GLuint program, GLsizei viewportWidth, GLsizei viewportHeight) + { + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + glViewport(0, 0, viewportWidth, viewportHeight); + ASSERT_GL_NO_ERROR(); + + drawQuad(program, "position", 0.0f); + } +}; + +} // namespace + +class MipmapTest : public BaseMipmapTest +{ + protected: + MipmapTest() + : m2DProgram(0), + mCubeProgram(0), + mTexture2D(0), + mTextureCube(0), + mLevelZeroBlueInitData(nullptr), + mLevelZeroWhiteInitData(nullptr), + mLevelOneInitData(nullptr), + mLevelTwoInitData(nullptr), + mOffscreenFramebuffer(0) + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + void setUp2DProgram() + { + // Vertex Shader source + // clang-format off + const std::string vs = SHADER_SOURCE + ( + attribute vec4 position; + varying vec2 vTexCoord; + + void main() + { + gl_Position = position; + vTexCoord = (position.xy * 0.5) + 0.5; + } + ); + + // Fragment Shader source + const std::string fs = SHADER_SOURCE + ( + precision mediump float; + + uniform sampler2D uTexture; + varying vec2 vTexCoord; + + void main() + { + gl_FragColor = texture2D(uTexture, vTexCoord); + } + ); + // clang-format on + + m2DProgram = CompileProgram(vs, fs); + ASSERT_NE(0u, m2DProgram); + } + + void setUpCubeProgram() + { + // A simple vertex shader for the texture cube + // clang-format off + const std::string cubeVS = SHADER_SOURCE + ( + attribute vec4 position; + varying vec4 vPosition; + void main() + { + gl_Position = position; + vPosition = position; + } + ); + + // A very simple fragment shader to sample from the negative-Y face of a texture cube. + const std::string cubeFS = SHADER_SOURCE + ( + precision mediump float; + uniform samplerCube uTexture; + varying vec4 vPosition; + + void main() + { + gl_FragColor = textureCube(uTexture, vec3(vPosition.x, -1, vPosition.y)); + } + ); + // clang-format on + + mCubeProgram = CompileProgram(cubeVS, cubeFS); + ASSERT_NE(0u, mCubeProgram); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + setUp2DProgram(); + + setUpCubeProgram(); + + mLevelZeroBlueInitData = createRGBInitData(getWindowWidth(), getWindowHeight(), 0, 0, 255); // Blue + mLevelZeroWhiteInitData = createRGBInitData(getWindowWidth(), getWindowHeight(), 255, 255, 255); // White + mLevelOneInitData = createRGBInitData((getWindowWidth() / 2), (getWindowHeight() / 2), 0, 255, 0); // Green + mLevelTwoInitData = createRGBInitData((getWindowWidth() / 4), (getWindowHeight() / 4), 255, 0, 0); // Red + + glGenFramebuffers(1, &mOffscreenFramebuffer); + glGenTextures(1, &mTexture2D); + + // Initialize the texture2D to be empty, and don't use mips. + glBindTexture(GL_TEXTURE_2D, mTexture2D); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, getWindowWidth(), getWindowHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + ASSERT_EQ(getWindowWidth(), getWindowHeight()); + + // Create a non-mipped texture cube. Set the negative-Y face to be blue. + glGenTextures(1, &mTextureCube); + glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCube); + TexImageCubeMapFaces(0, GL_RGB, getWindowWidth(), GL_RGB, GL_UNSIGNED_BYTE, nullptr); + glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, getWindowWidth(), getWindowWidth(), + 0, GL_RGB, GL_UNSIGNED_BYTE, mLevelZeroBlueInitData); + + // Complete the texture cube without mipmaps to start with. + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + + ASSERT_GL_NO_ERROR(); + } + + void TearDown() override + { + glDeleteProgram(m2DProgram); + glDeleteProgram(mCubeProgram); + glDeleteFramebuffers(1, &mOffscreenFramebuffer); + glDeleteTextures(1, &mTexture2D); + glDeleteTextures(1, &mTextureCube); + + SafeDeleteArray(mLevelZeroBlueInitData); + SafeDeleteArray(mLevelZeroWhiteInitData); + SafeDeleteArray(mLevelOneInitData); + SafeDeleteArray(mLevelTwoInitData); + + ANGLETest::TearDown(); + } + + GLubyte *createRGBInitData(GLint width, GLint height, GLint r, GLint g, GLint b) + { + GLubyte *data = new GLubyte[3 * width * height]; + + for (int i = 0; i < width * height; i+=1) + { + data[3 * i + 0] = static_cast<GLubyte>(r); + data[3 * i + 1] = static_cast<GLubyte>(g); + data[3 * i + 2] = static_cast<GLubyte>(b); + } + + return data; + } + + void clearTextureLevel0(GLenum textarget, + GLuint texture, + GLfloat red, + GLfloat green, + GLfloat blue, + GLfloat alpha) + { + glBindFramebuffer(GL_FRAMEBUFFER, mOffscreenFramebuffer); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, textarget, texture, 0); + ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + glClearColor(red, green, blue, alpha); + glClear(GL_COLOR_BUFFER_BIT); + glBindFramebuffer(GL_FRAMEBUFFER, 0); + } + + GLuint m2DProgram; + GLuint mCubeProgram; + GLuint mTexture2D; + GLuint mTextureCube; + + GLubyte* mLevelZeroBlueInitData; + GLubyte* mLevelZeroWhiteInitData; + GLubyte* mLevelOneInitData; + GLubyte* mLevelTwoInitData; + + private: + GLuint mOffscreenFramebuffer; +}; + +class MipmapTestES3 : public BaseMipmapTest +{ + protected: + MipmapTestES3() + : mTexture(0), + mArrayProgram(0), + mTextureArraySliceUniformLocation(-1), + m3DProgram(0), + mTexture3DSliceUniformLocation(-1), + mTexture3DLODUniformLocation(-1), + m2DProgram(0) + + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + std::string vertexShaderSource() + { + // Don't put "#version ..." on its own line. See [cpp]p1: + // "If there are sequences of preprocessing tokens within the list of arguments that + // would otherwise act as preprocessing directives, the behavior is undefined" + // clang-format off + return SHADER_SOURCE + ( #version 300 es\n + precision highp float; + in vec4 position; + out vec2 texcoord; + + void main() + { + gl_Position = vec4(position.xy, 0.0, 1.0); + texcoord = (position.xy * 0.5) + 0.5; + } + ); + // clang-format on + } + + void setUpArrayProgram() + { + const std::string fragmentShaderSourceArray = SHADER_SOURCE + ( #version 300 es\n + precision highp float; + uniform highp sampler2DArray tex; + uniform int slice; + in vec2 texcoord; + out vec4 out_FragColor; + + void main() + { + out_FragColor = texture(tex, vec3(texcoord, float(slice))); + } + ); + + mArrayProgram = CompileProgram(vertexShaderSource(), fragmentShaderSourceArray); + if (mArrayProgram == 0) + { + FAIL() << "shader compilation failed."; + } + + mTextureArraySliceUniformLocation = glGetUniformLocation(mArrayProgram, "slice"); + ASSERT_NE(-1, mTextureArraySliceUniformLocation); + + glUseProgram(mArrayProgram); + glUseProgram(0); + ASSERT_GL_NO_ERROR(); + } + + void setUp3DProgram() + { + const std::string fragmentShaderSource3D = SHADER_SOURCE + ( #version 300 es\n + precision highp float; + uniform highp sampler3D tex; + uniform float slice; + uniform float lod; + in vec2 texcoord; + out vec4 out_FragColor; + + void main() + { + out_FragColor = textureLod(tex, vec3(texcoord, slice), lod); + } + ); + + m3DProgram = CompileProgram(vertexShaderSource(), fragmentShaderSource3D); + if (m3DProgram == 0) + { + FAIL() << "shader compilation failed."; + } + + mTexture3DSliceUniformLocation = glGetUniformLocation(m3DProgram, "slice"); + ASSERT_NE(-1, mTexture3DSliceUniformLocation); + + mTexture3DLODUniformLocation = glGetUniformLocation(m3DProgram, "lod"); + ASSERT_NE(-1, mTexture3DLODUniformLocation); + + glUseProgram(m3DProgram); + glUniform1f(mTexture3DLODUniformLocation, 0); + glUseProgram(0); + ASSERT_GL_NO_ERROR(); + } + + void setUp2DProgram() + { + // clang-format off + const std::string fragmentShaderSource2D = SHADER_SOURCE + ( #version 300 es\n + precision highp float; + uniform highp sampler2D tex; + in vec2 texcoord; + out vec4 out_FragColor; + + void main() + { + out_FragColor = texture(tex, texcoord); + } + ); + // clang-format on + + m2DProgram = CompileProgram(vertexShaderSource(), fragmentShaderSource2D); + ASSERT_NE(0u, m2DProgram); + + ASSERT_GL_NO_ERROR(); + } + + void setUpCubeProgram() + { + // A very simple fragment shader to sample from the negative-Y face of a texture cube. + // clang-format off + const std::string cubeFS = SHADER_SOURCE + ( #version 300 es\n + precision mediump float; + uniform samplerCube uTexture; + in vec2 texcoord; + out vec4 out_FragColor; + + void main() + { + out_FragColor = texture(uTexture, vec3(texcoord.x, -1, texcoord.y)); + } + ); + // clang-format on + + mCubeProgram = CompileProgram(vertexShaderSource(), cubeFS); + ASSERT_NE(0u, mCubeProgram); + + ASSERT_GL_NO_ERROR(); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + glGenTextures(1, &mTexture); + ASSERT_GL_NO_ERROR(); + + setUpArrayProgram(); + setUp3DProgram(); + setUp2DProgram(); + setUpCubeProgram(); + } + + void TearDown() override + { + glDeleteTextures(1, &mTexture); + + glDeleteProgram(mArrayProgram); + glDeleteProgram(m3DProgram); + glDeleteProgram(m2DProgram); + glDeleteProgram(mCubeProgram); + + ANGLETest::TearDown(); + } + + GLuint mTexture; + + GLuint mArrayProgram; + GLint mTextureArraySliceUniformLocation; + + GLuint m3DProgram; + GLint mTexture3DSliceUniformLocation; + GLint mTexture3DLODUniformLocation; + + GLuint m2DProgram; + + GLuint mCubeProgram; +}; + +// This test uses init data for the first three levels of the texture. It passes the level 0 data in, then renders, then level 1, then renders, etc. +// This ensures that renderers using the zero LOD workaround (e.g. D3D11 FL9_3) correctly pass init data to the mipmapped texture, +// even if the the zero-LOD texture is currently in use. +TEST_P(MipmapTest, DISABLED_ThreeLevelsInitData) +{ + // Pass in level zero init data. + glBindTexture(GL_TEXTURE_2D, mTexture2D); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, getWindowWidth(), getWindowHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, mLevelZeroBlueInitData); + ASSERT_GL_NO_ERROR(); + + // Disable mips. + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + + // Draw a full-sized quad, and check it's blue. + clearAndDrawQuad(m2DProgram, getWindowWidth(), getWindowHeight()); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::blue); + + // Draw a half-sized quad, and check it's blue. + clearAndDrawQuad(m2DProgram, getWindowWidth() / 2, getWindowHeight() / 2); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue); + + // Draw a quarter-sized quad, and check it's blue. + clearAndDrawQuad(m2DProgram, getWindowWidth() / 4, getWindowHeight() / 4); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 8, getWindowHeight() / 8, GLColor::blue); + + // Complete the texture by initializing the remaining levels. + int n = 1; + while (getWindowWidth() / (1U << n) >= 1) + { + glTexImage2D(GL_TEXTURE_2D, n, GL_RGB, getWindowWidth() / (1U << n), getWindowWidth() / (1U << n), 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); + ASSERT_GL_NO_ERROR(); + n+=1; + } + + // Pass in level one init data. + glTexImage2D(GL_TEXTURE_2D, 1, GL_RGB, getWindowWidth() / 2, getWindowHeight() / 2, 0, GL_RGB, GL_UNSIGNED_BYTE, mLevelOneInitData); + ASSERT_GL_NO_ERROR(); + + // Draw a full-sized quad, and check it's blue. + clearAndDrawQuad(m2DProgram, getWindowWidth(), getWindowHeight()); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::blue); + + // Draw a half-sized quad, and check it's blue. We've not enabled mipmaps yet, so our init data for level one shouldn't be used. + clearAndDrawQuad(m2DProgram, getWindowWidth() / 2, getWindowHeight() / 2); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue); + + // Enable mipmaps. + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); + + // Draw a half-sized quad, and check it's green. + clearAndDrawQuad(m2DProgram, getWindowWidth() / 2, getWindowHeight() / 2); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::green); + + // Draw a quarter-sized quad, and check it's black, since we've not passed any init data for level two. + clearAndDrawQuad(m2DProgram, getWindowWidth() / 4, getWindowHeight() / 4); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 8, getWindowHeight() / 8, GLColor::black); + + // Pass in level two init data. + glTexImage2D(GL_TEXTURE_2D, 2, GL_RGB, getWindowWidth() / 4, getWindowHeight() / 4, 0, GL_RGB, GL_UNSIGNED_BYTE, mLevelTwoInitData); + ASSERT_GL_NO_ERROR(); + + // Draw a full-sized quad, and check it's blue. + clearAndDrawQuad(m2DProgram, getWindowWidth(), getWindowHeight()); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::blue); + + // Draw a half-sized quad, and check it's green. + clearAndDrawQuad(m2DProgram, getWindowWidth() / 2, getWindowHeight() / 2); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::green); + + // Draw a quarter-sized quad, and check it's red. + clearAndDrawQuad(m2DProgram, getWindowWidth() / 4, getWindowHeight() / 4); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 8, getWindowHeight() / 8, GLColor::red); + + // Now disable mipmaps again, and render multiple sized quads. They should all be blue, since level 0 is blue. + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + clearAndDrawQuad(m2DProgram, getWindowWidth(), getWindowHeight()); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::blue); + clearAndDrawQuad(m2DProgram, getWindowWidth() / 2, getWindowHeight() / 2); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue); + clearAndDrawQuad(m2DProgram, getWindowWidth() / 4, getWindowHeight() / 4); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 8, getWindowHeight() / 8, GLColor::blue); + + // Now reset level 0 to white, keeping mipmaps disabled. Then, render various sized quads. They should be white. + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, getWindowWidth(), getWindowHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, mLevelZeroWhiteInitData); + ASSERT_GL_NO_ERROR(); + + clearAndDrawQuad(m2DProgram, getWindowWidth(), getWindowHeight()); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::white); + clearAndDrawQuad(m2DProgram, getWindowWidth() / 2, getWindowHeight() / 2); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::white); + clearAndDrawQuad(m2DProgram, getWindowWidth() / 4, getWindowHeight() / 4); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 8, getWindowHeight() / 8, GLColor::white); + + // Then enable mipmaps again. The quads should be white, green, red respectively. + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); + + clearAndDrawQuad(m2DProgram, getWindowWidth(), getWindowHeight()); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::white); + clearAndDrawQuad(m2DProgram, getWindowWidth() / 2, getWindowHeight() / 2); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::green); + clearAndDrawQuad(m2DProgram, getWindowWidth() / 4, getWindowHeight() / 4); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 8, getWindowHeight() / 8, GLColor::red); +} + +// This test generates (and uses) mipmaps on a texture using init data. D3D11 will use a non-renderable TextureStorage for this. +// The test then disables mips, renders to level zero of the texture, and reenables mips before using the texture again. +// To do this, D3D11 has to convert the TextureStorage into a renderable one. +// This test ensures that the conversion works correctly. +// In particular, on D3D11 Feature Level 9_3 it ensures that both the zero LOD workaround texture AND the 'normal' texture are copied during conversion. +TEST_P(MipmapTest, GenerateMipmapFromInitDataThenRender) +{ + // Pass in initial data so the texture is blue. + glBindTexture(GL_TEXTURE_2D, mTexture2D); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, getWindowWidth(), getWindowHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, mLevelZeroBlueInitData); + + // Then generate the mips. + glGenerateMipmap(GL_TEXTURE_2D); + ASSERT_GL_NO_ERROR(); + + // Enable mipmaps. + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); + + // Now draw the texture to various different sized areas. + clearAndDrawQuad(m2DProgram, getWindowWidth(), getWindowHeight()); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::blue); + + // Use mip level 1 + clearAndDrawQuad(m2DProgram, getWindowWidth() / 2, getWindowHeight() / 2); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue); + + // Use mip level 2 + clearAndDrawQuad(m2DProgram, getWindowWidth() / 4, getWindowHeight() / 4); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 8, getWindowHeight() / 8, GLColor::blue); + + ASSERT_GL_NO_ERROR(); + + // Disable mips. Render a quad using the texture and ensure it's blue. + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + clearAndDrawQuad(m2DProgram, getWindowWidth(), getWindowHeight()); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::blue); + + // Clear level 0 of the texture to red. + clearTextureLevel0(GL_TEXTURE_2D, mTexture2D, 1.0f, 0.0f, 0.0f, 1.0f); + + // Reenable mips, and try rendering different-sized quads. + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); + + // Level 0 is now red, so this should render red. + clearAndDrawQuad(m2DProgram, getWindowWidth(), getWindowHeight()); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red); + + // Use mip level 1, blue. + clearAndDrawQuad(m2DProgram, getWindowWidth() / 2, getWindowHeight() / 2); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue); + + // Use mip level 2, blue. + clearAndDrawQuad(m2DProgram, getWindowWidth() / 4, getWindowHeight() / 4); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 8, getWindowHeight() / 8, GLColor::blue); +} + +// This test ensures that mips are correctly generated from a rendered image. +// In particular, on D3D11 Feature Level 9_3, the clear call will be performed on the zero-level texture, rather than the mipped one. +// The test ensures that the zero-level texture is correctly copied into the mipped texture before the mipmaps are generated. +TEST_P(MipmapTest, GenerateMipmapFromRenderedImage) +{ + glBindTexture(GL_TEXTURE_2D, mTexture2D); + // Clear the texture to blue. + clearTextureLevel0(GL_TEXTURE_2D, mTexture2D, 0.0f, 0.0f, 1.0f, 1.0f); + + // Then generate the mips + glGenerateMipmap(GL_TEXTURE_2D); + ASSERT_GL_NO_ERROR(); + + // Enable mips. + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); + + // Now draw the texture to various different sized areas. + clearAndDrawQuad(m2DProgram, getWindowWidth(), getWindowHeight()); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::blue); + + // Use mip level 1 + clearAndDrawQuad(m2DProgram, getWindowWidth() / 2, getWindowHeight() / 2); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue); + + // Use mip level 2 + clearAndDrawQuad(m2DProgram, getWindowWidth() / 4, getWindowHeight() / 4); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 8, getWindowHeight() / 8, GLColor::blue); +} + +// Test to ensure that rendering to a mipmapped texture works, regardless of whether mipmaps are enabled or not. +// TODO: This test hits a texture rebind bug in the D3D11 renderer. Fix this. +TEST_P(MipmapTest, RenderOntoLevelZeroAfterGenerateMipmap) +{ + // TODO(geofflang): Figure out why this is broken on AMD OpenGL + if ((IsAMD() || IsIntel()) && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + std::cout << "Test skipped on Intel/AMD OpenGL." << std::endl; + return; + } + + glBindTexture(GL_TEXTURE_2D, mTexture2D); + + // Clear the texture to blue. + clearTextureLevel0(GL_TEXTURE_2D, mTexture2D, 0.0f, 0.0f, 1.0f, 1.0f); + + // Now, draw the texture to a quad that's the same size as the texture. This draws to the default framebuffer. + // The quad should be blue. + clearAndDrawQuad(m2DProgram, getWindowWidth(), getWindowHeight()); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::blue); + + // Now go back to the texture, and generate mips on it. + glGenerateMipmap(GL_TEXTURE_2D); + ASSERT_GL_NO_ERROR(); + + // Now try rendering the textured quad again. Note: we've not told GL to use the generated mips. + // The quad should be blue. + clearAndDrawQuad(m2DProgram, getWindowWidth(), getWindowHeight()); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::blue); + + // Now tell GL to use the generated mips. + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); + EXPECT_GL_NO_ERROR(); + + // Now render the textured quad again. It should be still be blue. + clearAndDrawQuad(m2DProgram, getWindowWidth(), getWindowHeight()); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::blue); + + // Now render the textured quad to an area smaller than the texture (i.e. to force minification). This should be blue. + clearAndDrawQuad(m2DProgram, getWindowWidth() / 4, getWindowHeight() / 4); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 8, getWindowHeight() / 8, GLColor::blue); + + // Now clear the texture to green. This just clears the top level. The lower mips should remain blue. + clearTextureLevel0(GL_TEXTURE_2D, mTexture2D, 0.0f, 1.0f, 0.0f, 1.0f); + + // Render a textured quad equal in size to the texture. This should be green, since we just cleared level 0. + clearAndDrawQuad(m2DProgram, getWindowWidth(), getWindowHeight()); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::green); + + // Render a small textured quad. This forces minification, so should render blue (the color of levels 1+). + clearAndDrawQuad(m2DProgram, getWindowWidth() / 4, getWindowHeight() / 4); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 8, getWindowHeight() / 8, GLColor::blue); + + // Disable mipmaps again + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + ASSERT_GL_NO_ERROR(); + + // Render a textured quad equal in size to the texture. This should be green, the color of level 0 in the texture. + clearAndDrawQuad(m2DProgram, getWindowWidth(), getWindowHeight()); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::green); + + // Render a small textured quad. This would force minification if mips were enabled, but they're not. Therefore, this should be green. + clearAndDrawQuad(m2DProgram, getWindowWidth() / 4, getWindowHeight() / 4); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 8, getWindowHeight() / 8, GLColor::green); +} + +// This test ensures that the level-zero workaround for TextureCubes (on D3D11 Feature Level 9_3) +// works as expected. It tests enabling/disabling mipmaps, generating mipmaps, and rendering to level zero. +TEST_P(MipmapTest, TextureCubeGeneralLevelZero) +{ + glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCube); + + // Draw. Since the negative-Y face's is blue, this should be blue. + clearAndDrawQuad(mCubeProgram, getWindowWidth(), getWindowHeight()); + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue); + + // Generate mipmaps, and render. This should be blue. + glGenerateMipmap(GL_TEXTURE_CUBE_MAP); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); + clearAndDrawQuad(mCubeProgram, getWindowWidth(), getWindowHeight()); + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue); + + // Draw using a smaller viewport (to force a lower LOD of the texture). This should still be blue. + clearAndDrawQuad(mCubeProgram, getWindowWidth() / 4, getWindowHeight() / 4); + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue); + + // Now clear the negative-Y face of the cube to red. + clearTextureLevel0(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, mTextureCube, 1.0f, 0.0f, 0.0f, 1.0f); + + // Draw using a full-size viewport. This should be red. + clearAndDrawQuad(mCubeProgram, getWindowWidth(), getWindowHeight()); + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red); + + // Draw using a quarter-size viewport, to force a lower LOD. This should be *BLUE*, since we only cleared level zero + // of the negative-Y face to red, and left its mipmaps blue. + clearAndDrawQuad(mCubeProgram, getWindowWidth() / 4, getWindowHeight() / 4); + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue); + + // Disable mipmaps again, and draw a to a quarter-size viewport. + // Since this should use level zero of the texture, this should be *RED*. + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + clearAndDrawQuad(mCubeProgram, getWindowWidth() / 4, getWindowHeight() / 4); + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red); +} + +// This test ensures that rendering to level-zero of a TextureCube works as expected. +TEST_P(MipmapTest, TextureCubeRenderToLevelZero) +{ + glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCube); + + // Draw. Since the negative-Y face's is blue, this should be blue. + clearAndDrawQuad(mCubeProgram, getWindowWidth(), getWindowHeight()); + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue); + + // Now clear the negative-Y face of the cube to red. + clearTextureLevel0(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, mTextureCube, 1.0f, 0.0f, 0.0f, 1.0f); + + // Draw using a full-size viewport. This should be red. + clearAndDrawQuad(mCubeProgram, getWindowWidth(), getWindowHeight()); + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red); + + // Draw a to a quarter-size viewport. This should also be red. + clearAndDrawQuad(mCubeProgram, getWindowWidth() / 4, getWindowHeight() / 4); + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red); +} + +// Creates a mipmapped 2D array texture with three layers, and calls ANGLE's GenerateMipmap. +// Then tests if the mipmaps are rendered correctly for all three layers. +TEST_P(MipmapTestES3, MipmapsForTextureArray) +{ + int px = getWindowWidth() / 2; + int py = getWindowHeight() / 2; + + glBindTexture(GL_TEXTURE_2D_ARRAY, mTexture); + + glTexStorage3D(GL_TEXTURE_2D_ARRAY, 5, GL_RGBA8, 16, 16, 3); + + // Fill the first layer with red + std::vector<GLColor> pixelsRed(16 * 16, GLColor::red); + glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 16, 16, 1, GL_RGBA, GL_UNSIGNED_BYTE, + pixelsRed.data()); + + // Fill the second layer with green + std::vector<GLColor> pixelsGreen(16 * 16, GLColor::green); + glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 1, 16, 16, 1, GL_RGBA, GL_UNSIGNED_BYTE, + pixelsGreen.data()); + + // Fill the third layer with blue + std::vector<GLColor> pixelsBlue(16 * 16, GLColor::blue); + glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 2, 16, 16, 1, GL_RGBA, GL_UNSIGNED_BYTE, + pixelsBlue.data()); + + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + EXPECT_GL_NO_ERROR(); + + glGenerateMipmap(GL_TEXTURE_2D_ARRAY); + + EXPECT_GL_NO_ERROR(); + + glUseProgram(mArrayProgram); + + EXPECT_GL_NO_ERROR(); + + // Draw the first slice + glUniform1i(mTextureArraySliceUniformLocation, 0); + drawQuad(mArrayProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + EXPECT_PIXEL_COLOR_EQ(px, py, GLColor::red); + + // Draw the second slice + glUniform1i(mTextureArraySliceUniformLocation, 1); + drawQuad(mArrayProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + EXPECT_PIXEL_COLOR_EQ(px, py, GLColor::green); + + // Draw the third slice + glUniform1i(mTextureArraySliceUniformLocation, 2); + drawQuad(mArrayProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + EXPECT_PIXEL_COLOR_EQ(px, py, GLColor::blue); +} + +// Create a mipmapped 2D array texture with more layers than width / height, and call +// GenerateMipmap. +TEST_P(MipmapTestES3, MipmapForDeepTextureArray) +{ + int px = getWindowWidth() / 2; + int py = getWindowHeight() / 2; + + glBindTexture(GL_TEXTURE_2D_ARRAY, mTexture); + + // Fill the whole texture with red. + std::vector<GLColor> pixelsRed(2 * 2 * 4, GLColor::red); + glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, 2, 2, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, + pixelsRed.data()); + + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + EXPECT_GL_NO_ERROR(); + + glGenerateMipmap(GL_TEXTURE_2D_ARRAY); + + EXPECT_GL_NO_ERROR(); + + glUseProgram(mArrayProgram); + + EXPECT_GL_NO_ERROR(); + + // Draw the first slice + glUniform1i(mTextureArraySliceUniformLocation, 0); + drawQuad(mArrayProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + EXPECT_PIXEL_COLOR_EQ(px, py, GLColor::red); + + // Draw the fourth slice + glUniform1i(mTextureArraySliceUniformLocation, 3); + drawQuad(mArrayProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + EXPECT_PIXEL_COLOR_EQ(px, py, GLColor::red); +} + +// Creates a mipmapped 3D texture with two layers, and calls ANGLE's GenerateMipmap. +// Then tests if the mipmaps are rendered correctly for all two layers. +TEST_P(MipmapTestES3, MipmapsForTexture3D) +{ + int px = getWindowWidth() / 2; + int py = getWindowHeight() / 2; + + glBindTexture(GL_TEXTURE_3D, mTexture); + + glTexStorage3D(GL_TEXTURE_3D, 5, GL_RGBA8, 16, 16, 2); + + // Fill the first layer with red + std::vector<GLColor> pixelsRed(16 * 16, GLColor::red); + glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 16, 16, 1, GL_RGBA, GL_UNSIGNED_BYTE, + pixelsRed.data()); + + // Fill the second layer with green + std::vector<GLColor> pixelsGreen(16 * 16, GLColor::green); + glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 1, 16, 16, 1, GL_RGBA, GL_UNSIGNED_BYTE, + pixelsGreen.data()); + + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + EXPECT_GL_NO_ERROR(); + + glGenerateMipmap(GL_TEXTURE_3D); + + EXPECT_GL_NO_ERROR(); + + glUseProgram(m3DProgram); + + EXPECT_GL_NO_ERROR(); + + // Mipmap level 0 + // Draw the first slice + glUniform1f(mTexture3DLODUniformLocation, 0.); + glUniform1f(mTexture3DSliceUniformLocation, 0.25f); + drawQuad(m3DProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + EXPECT_PIXEL_COLOR_EQ(px, py, GLColor::red); + + // Draw the second slice + glUniform1f(mTexture3DSliceUniformLocation, 0.75f); + drawQuad(m3DProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + EXPECT_PIXEL_COLOR_EQ(px, py, GLColor::green); + + // Mipmap level 1 + // The second mipmap should only have one slice. + glUniform1f(mTexture3DLODUniformLocation, 1.); + drawQuad(m3DProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + EXPECT_PIXEL_NEAR(px, py, 127, 127, 0, 255, 1.0); + + glUniform1f(mTexture3DSliceUniformLocation, 0.75f); + drawQuad(m3DProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + EXPECT_PIXEL_NEAR(px, py, 127, 127, 0, 255, 1.0); +} + +// Create a 2D texture with levels 0-2, call GenerateMipmap with base level 1 so that level 0 stays +// the same, and then sample levels 0 and 2. +// GLES 3.0.4 section 3.8.10: +// "Mipmap generation replaces texel array levels levelbase + 1 through q with arrays derived from +// the levelbase array, regardless of their previous contents. All other mipmap arrays, including +// the levelbase array, are left unchanged by this computation." +TEST_P(MipmapTestES3, GenerateMipmapBaseLevel) +{ + if (IsAMD() && IsDesktopOpenGL()) + { + // Observed incorrect rendering on AMD, sampling level 2 returns black. + std::cout << "Test skipped on AMD OpenGL." << std::endl; + return; + } + + glBindTexture(GL_TEXTURE_2D, mTexture); + + ASSERT(getWindowWidth() == getWindowHeight()); + + // Fill level 0 with blue + std::vector<GLColor> pixelsBlue(getWindowWidth() * getWindowHeight(), GLColor::blue); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, getWindowWidth(), getWindowHeight(), 0, GL_RGBA, + GL_UNSIGNED_BYTE, pixelsBlue.data()); + + // Fill level 1 with red + std::vector<GLColor> pixelsRed(getWindowWidth() * getWindowHeight() / 4, GLColor::red); + glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, getWindowWidth() / 2, getWindowHeight() / 2, 0, + GL_RGBA, GL_UNSIGNED_BYTE, pixelsRed.data()); + + // Fill level 2 with green + std::vector<GLColor> pixelsGreen(getWindowWidth() * getWindowHeight() / 16, GLColor::green); + glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA8, getWindowWidth() / 4, getWindowHeight() / 4, 0, + GL_RGBA, GL_UNSIGNED_BYTE, pixelsGreen.data()); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1); + + EXPECT_GL_NO_ERROR(); + + // The blue level 0 should be untouched by this since base level is 1. + glGenerateMipmap(GL_TEXTURE_2D); + + EXPECT_GL_NO_ERROR(); + + // Draw using level 2. It should be set to red by GenerateMipmap. + clearAndDrawQuad(m2DProgram, getWindowWidth() / 4, getWindowHeight() / 4); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 8, getWindowHeight() / 8, GLColor::red); + + // Draw using level 0. It should still be blue. + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); + clearAndDrawQuad(m2DProgram, getWindowWidth(), getWindowHeight()); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::blue); +} + +// Create a cube map with levels 0-2, call GenerateMipmap with base level 1 so that level 0 stays +// the same, and then sample levels 0 and 2. +// GLES 3.0.4 section 3.8.10: +// "Mipmap generation replaces texel array levels levelbase + 1 through q with arrays derived from +// the levelbase array, regardless of their previous contents. All other mipmap arrays, including +// the levelbase array, are left unchanged by this computation." +TEST_P(MipmapTestES3, GenerateMipmapCubeBaseLevel) +{ + if (IsAMD() && IsDesktopOpenGL()) + { + // Observed incorrect rendering on AMD, sampling level 2 returns black. + std::cout << "Test skipped on AMD OpenGL." << std::endl; + return; + } + + ASSERT_EQ(getWindowWidth(), getWindowHeight()); + + glBindTexture(GL_TEXTURE_CUBE_MAP, mTexture); + std::vector<GLColor> pixelsBlue(getWindowWidth() * getWindowWidth(), GLColor::blue); + TexImageCubeMapFaces(0, GL_RGBA8, getWindowWidth(), GL_RGBA, GL_UNSIGNED_BYTE, + pixelsBlue.data()); + + // Fill level 1 with red + std::vector<GLColor> pixelsRed(getWindowWidth() * getWindowWidth() / 4, GLColor::red); + TexImageCubeMapFaces(1, GL_RGBA8, getWindowWidth() / 2, GL_RGBA, GL_UNSIGNED_BYTE, + pixelsRed.data()); + + // Fill level 2 with green + std::vector<GLColor> pixelsGreen(getWindowWidth() * getWindowWidth() / 16, GLColor::green); + TexImageCubeMapFaces(2, GL_RGBA8, getWindowWidth() / 4, GL_RGBA, GL_UNSIGNED_BYTE, + pixelsGreen.data()); + + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_BASE_LEVEL, 1); + + EXPECT_GL_NO_ERROR(); + + // The blue level 0 should be untouched by this since base level is 1. + glGenerateMipmap(GL_TEXTURE_CUBE_MAP); + + EXPECT_GL_NO_ERROR(); + + // Draw using level 2. It should be set to red by GenerateMipmap. + clearAndDrawQuad(mCubeProgram, getWindowWidth() / 4, getWindowHeight() / 4); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 8, getWindowHeight() / 8, GLColor::red); + + if (IsNVIDIA() && IsOpenGL()) + { + // Observed incorrect rendering on NVIDIA, level zero seems to be incorrectly affected by + // GenerateMipmap. + std::cout << "Test partially skipped on NVIDIA OpenGL." << std::endl; + return; + } + + // Draw using level 0. It should still be blue. + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_BASE_LEVEL, 0); + clearAndDrawQuad(mCubeProgram, getWindowWidth(), getWindowHeight()); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::blue); +} + +// Create a texture with levels 0-2, call GenerateMipmap with max level 1 so that level 2 stays the +// same, and then sample levels 1 and 2. +// GLES 3.0.4 section 3.8.10: +// "Mipmap generation replaces texel array levels levelbase + 1 through q with arrays derived from +// the levelbase array, regardless of their previous contents. All other mipmap arrays, including +// the levelbase array, are left unchanged by this computation." +TEST_P(MipmapTestES3, GenerateMipmapMaxLevel) +{ + glBindTexture(GL_TEXTURE_2D, mTexture); + + // Fill level 0 with blue + std::vector<GLColor> pixelsBlue(getWindowWidth() * getWindowHeight(), GLColor::blue); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, getWindowWidth(), getWindowHeight(), 0, GL_RGBA, + GL_UNSIGNED_BYTE, pixelsBlue.data()); + + // Fill level 1 with red + std::vector<GLColor> pixelsRed(getWindowWidth() * getWindowHeight() / 4, GLColor::red); + glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, getWindowWidth() / 2, getWindowHeight() / 2, 0, + GL_RGBA, GL_UNSIGNED_BYTE, pixelsRed.data()); + + // Fill level 2 with green + std::vector<GLColor> pixelsGreen(getWindowWidth() * getWindowHeight() / 16, GLColor::green); + glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA8, getWindowWidth() / 4, getWindowHeight() / 4, 0, + GL_RGBA, GL_UNSIGNED_BYTE, pixelsGreen.data()); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1); + + EXPECT_GL_NO_ERROR(); + + // The green level 2 should be untouched by this since max level is 1. + glGenerateMipmap(GL_TEXTURE_2D); + + EXPECT_GL_NO_ERROR(); + + // Draw using level 1. It should be set to blue by GenerateMipmap. + clearAndDrawQuad(m2DProgram, getWindowWidth() / 2, getWindowHeight() / 2); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue); + + // Draw using level 2. It should still be green. + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 2); + clearAndDrawQuad(m2DProgram, getWindowWidth() / 4, getWindowHeight() / 4); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 8, getWindowHeight() / 8, GLColor::green); +} + +// Call GenerateMipmap with out-of-range base level. The spec is interpreted so that an out-of-range +// base level does not have a color-renderable/texture-filterable internal format, so the +// GenerateMipmap call generates INVALID_OPERATION. GLES 3.0.4 section 3.8.10: +// "If the levelbase array was not specified with an unsized internal format from table 3.3 or a +// sized internal format that is both color-renderable and texture-filterable according to table +// 3.13, an INVALID_OPERATION error is generated." +TEST_P(MipmapTestES3, GenerateMipmapBaseLevelOutOfRange) +{ + glBindTexture(GL_TEXTURE_2D, mTexture); + + // Fill level 0 with blue + std::vector<GLColor> pixelsBlue(getWindowWidth() * getWindowHeight(), GLColor::blue); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, getWindowWidth(), getWindowHeight(), 0, GL_RGBA, + GL_UNSIGNED_BYTE, pixelsBlue.data()); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1000); + + EXPECT_GL_NO_ERROR(); + + // Expecting the out-of-range base level to be treated as not color-renderable and + // texture-filterable. + glGenerateMipmap(GL_TEXTURE_2D); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + // Draw using level 0. It should still be blue. + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + clearAndDrawQuad(m2DProgram, getWindowWidth(), getWindowHeight()); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::blue); +} + +// Call GenerateMipmap with out-of-range base level on an immutable texture. The base level should +// be clamped, so the call doesn't generate an error. +TEST_P(MipmapTestES3, GenerateMipmapBaseLevelOutOfRangeImmutableTexture) +{ + glBindTexture(GL_TEXTURE_2D, mTexture); + + glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::green); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1000); + + EXPECT_GL_NO_ERROR(); + + // This is essentially a no-op, since the texture only has one level. + glGenerateMipmap(GL_TEXTURE_2D); + + EXPECT_GL_NO_ERROR(); + + // The only level of the texture should still be green. + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + clearAndDrawQuad(m2DProgram, getWindowWidth(), getWindowHeight()); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::green); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +// Note: we run these tests against 9_3 on WARP due to hardware driver issues on Win7 +ANGLE_INSTANTIATE_TEST(MipmapTest, + ES2_D3D9(), + ES2_D3D11(EGL_EXPERIMENTAL_PRESENT_PATH_COPY_ANGLE), + ES2_D3D11(EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE), + ES2_D3D11_FL9_3_WARP(), + ES2_OPENGL(), + ES3_OPENGL(), + ES2_OPENGLES(), + ES3_OPENGLES()); +ANGLE_INSTANTIATE_TEST(MipmapTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); diff --git a/gfx/angle/src/tests/gl_tests/MultisampleCompatibilityTest.cpp b/gfx/angle/src/tests/gl_tests/MultisampleCompatibilityTest.cpp new file mode 100755 index 000000000..0edc221d7 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/MultisampleCompatibilityTest.cpp @@ -0,0 +1,438 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// StateChangeTest: +// Specifically designed for an ANGLE implementation of GL, these tests validate that +// ANGLE's dirty bits systems don't get confused by certain sequences of state changes. +// + +#include "test_utils/ANGLETest.h" +#include "test_utils/gl_raii.h" +#include "shader_utils.h" + +using namespace angle; + +namespace +{ + +const GLint kWidth = 64; +const GLint kHeight = 64; + +// test drawing with GL_MULTISAMPLE_EXT enabled/disabled. +class EXTMultisampleCompatibilityTest : public ANGLETest +{ + +protected: + EXTMultisampleCompatibilityTest() + { + setWindowWidth(64); + setWindowHeight(64); + setConfigRedBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + static const char* v_shader_str = + "attribute vec4 a_Position;\n" + "void main()\n" + "{ gl_Position = a_Position; }"; + + static const char* f_shader_str = + "precision mediump float;\n" + "uniform vec4 color;" + "void main() { gl_FragColor = color; }"; + + mProgram = CompileProgram(v_shader_str, f_shader_str); + + GLuint position_loc = glGetAttribLocation(mProgram, "a_Position"); + mColorLoc = glGetUniformLocation(mProgram, "color"); + + glGenBuffers(1, &mVBO); + glBindBuffer(GL_ARRAY_BUFFER, mVBO); + static float vertices[] = { + 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, + -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, + }; + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + glEnableVertexAttribArray(position_loc); + glVertexAttribPointer(position_loc, 2, GL_FLOAT, GL_FALSE, 0, 0); + } + + void TearDown() override + { + glDeleteBuffers(1, &mVBO); + glDeleteProgram(mProgram); + + ANGLETest::TearDown(); + } + + void prepareForDraw() + { + // Create a sample buffer. + GLsizei num_samples = 4, max_samples = 0; + glGetIntegerv(GL_MAX_SAMPLES, &max_samples); + num_samples = std::min(num_samples, max_samples); + + glGenRenderbuffers(1, &mSampleRB); + glBindRenderbuffer(GL_RENDERBUFFER, mSampleRB); + glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER, num_samples, + GL_RGBA8_OES, kWidth, kHeight); + GLint param = 0; + glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_SAMPLES, + ¶m); + EXPECT_GE(param, num_samples); + + glGenFramebuffers(1, &mSampleFBO); + glBindFramebuffer(GL_FRAMEBUFFER, mSampleFBO); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_RENDERBUFFER, mSampleRB); + EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE), + glCheckFramebufferStatus(GL_FRAMEBUFFER)); + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + // Create another FBO to resolve the multisample buffer into. + glGenTextures(1, &mResolveTex); + glBindTexture(GL_TEXTURE_2D, mResolveTex); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, + GL_UNSIGNED_BYTE, NULL); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glGenFramebuffers(1, &mResolveFBO); + glBindFramebuffer(GL_FRAMEBUFFER, mResolveFBO); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, + mResolveTex, 0); + EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE), + glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + glUseProgram(mProgram); + glViewport(0, 0, kWidth, kHeight); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + glBindFramebuffer(GL_FRAMEBUFFER, mSampleFBO); + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + glClear(GL_COLOR_BUFFER_BIT); + } + + void prepareForVerify() + { + // Resolve. + glBindFramebuffer(GL_READ_FRAMEBUFFER, mSampleFBO); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mResolveFBO); + glClearColor(1.0f, 0.0f, 0.0f, 0.0f); + glClear(GL_COLOR_BUFFER_BIT); + glBlitFramebufferANGLE(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, + GL_COLOR_BUFFER_BIT, GL_NEAREST); + glBindFramebuffer(GL_READ_FRAMEBUFFER, mResolveFBO); + + ASSERT_GL_NO_ERROR(); + } + + void cleanup() + { + glBindFramebuffer(GL_FRAMEBUFFER, 0); + glDeleteFramebuffers(1, &mResolveFBO); + glDeleteFramebuffers(1, &mSampleFBO); + glDeleteTextures(1, &mResolveTex); + glDeleteRenderbuffers(1, &mSampleRB); + + ASSERT_GL_NO_ERROR(); + + } + + bool isApplicable() const + { + return extensionEnabled("GL_EXT_multisample_compatibility") && + extensionEnabled("GL_ANGLE_framebuffer_multisample") && + extensionEnabled("GL_OES_rgb8_rgba8") && + !IsAMD(); + } + GLuint mSampleFBO; + GLuint mResolveFBO; + GLuint mSampleRB; + GLuint mResolveTex; + + GLuint mColorLoc; + GLuint mProgram; + GLuint mVBO; +}; + +} // + +// Test simple state tracking +TEST_P(EXTMultisampleCompatibilityTest, TestStateTracking) +{ + if (!isApplicable()) + return; + + EXPECT_TRUE(glIsEnabled(GL_MULTISAMPLE_EXT)); + glDisable(GL_MULTISAMPLE_EXT); + EXPECT_FALSE(glIsEnabled(GL_MULTISAMPLE_EXT)); + glEnable(GL_MULTISAMPLE_EXT); + EXPECT_TRUE(glIsEnabled(GL_MULTISAMPLE_EXT)); + + EXPECT_FALSE(glIsEnabled(GL_SAMPLE_ALPHA_TO_ONE_EXT)); + glEnable(GL_SAMPLE_ALPHA_TO_ONE_EXT); + EXPECT_TRUE(glIsEnabled(GL_SAMPLE_ALPHA_TO_ONE_EXT)); + glDisable(GL_SAMPLE_ALPHA_TO_ONE_EXT); + EXPECT_FALSE(glIsEnabled(GL_SAMPLE_ALPHA_TO_ONE_EXT)); + + EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); +} + +// Test that disabling GL_MULTISAMPLE_EXT is handled correctly. +TEST_P(EXTMultisampleCompatibilityTest, DrawAndResolve) +{ + if (!isApplicable()) + return; + + static const float kBlue[] = {0.0f, 0.0f, 1.0f, 1.0f}; + static const float kGreen[] = {0.0f, 1.0f, 0.0f, 1.0f}; + static const float kRed[] = {1.0f, 0.0f, 0.0f, 1.0f}; + + // Different drivers seem to behave differently with respect to resulting + // values. These might be due to different MSAA sample counts causing + // different samples to hit. Other option is driver bugs. Just test that + // disabling multisample causes a difference. + std::unique_ptr<uint8_t[]> results[3]; + const GLint kResultSize = kWidth * kHeight * 4; + for (int pass = 0; pass < 3; pass++) + { + prepareForDraw(); + // Green: from top right to bottom left. + glUniform4fv(mColorLoc, 1, kGreen); + glDrawArrays(GL_TRIANGLES, 0, 3); + + // Blue: from top left to bottom right. + glUniform4fv(mColorLoc, 1, kBlue); + glDrawArrays(GL_TRIANGLES, 3, 3); + + // Red, with and without MSAA: from bottom left to top right. + if (pass == 1) + { + glDisable(GL_MULTISAMPLE_EXT); + } + glUniform4fv(mColorLoc, 1, kRed); + glDrawArrays(GL_TRIANGLES, 6, 3); + if (pass == 1) + { + glEnable(GL_MULTISAMPLE_EXT); + } + prepareForVerify(); + results[pass].reset(new uint8_t[kResultSize]); + memset(results[pass].get(), 123u, kResultSize); + glReadPixels(0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, + results[pass].get()); + + cleanup(); + } + EXPECT_NE(0, memcmp(results[0].get(), results[1].get(), kResultSize)); + // Verify that rendering is deterministic, so that the pass above does not + // come from non-deterministic rendering. + EXPECT_EQ(0, memcmp(results[0].get(), results[2].get(), kResultSize)); +} + +// Test that enabling GL_SAMPLE_ALPHA_TO_ONE_EXT affects rendering. +TEST_P(EXTMultisampleCompatibilityTest, DrawAlphaOneAndResolve) +{ + if (!isApplicable()) + return; + + // SAMPLE_ALPHA_TO_ONE is specified to transform alpha values of + // covered samples to 1.0. In order to detect it, we use non-1.0 + // alpha. + static const float kBlue[] = {0.0f, 0.0f, 1.0f, 0.5f}; + static const float kGreen[] = {0.0f, 1.0f, 0.0f, 0.5f}; + static const float kRed[] = {1.0f, 0.0f, 0.0f, 0.5f}; + + // Different drivers seem to behave differently with respect to resulting + // alpha value. These might be due to different MSAA sample counts causing + // different samples to hit. Other option is driver bugs. Testing exact or + // even approximate sample values is not that easy. Thus, just test + // representative positions which have fractional pixels, inspecting that + // normal rendering is different to SAMPLE_ALPHA_TO_ONE rendering. + std::unique_ptr<uint8_t[]> results[3]; + const GLint kResultSize = kWidth * kHeight * 4; + + for (int pass = 0; pass < 3; ++pass) + { + prepareForDraw(); + if (pass == 1) + { + glEnable(GL_SAMPLE_ALPHA_TO_ONE_EXT); + } + glEnable(GL_MULTISAMPLE_EXT); + glUniform4fv(mColorLoc, 1, kGreen); + glDrawArrays(GL_TRIANGLES, 0, 3); + + glUniform4fv(mColorLoc, 1, kBlue); + glDrawArrays(GL_TRIANGLES, 3, 3); + + glDisable(GL_MULTISAMPLE_EXT); + glUniform4fv(mColorLoc, 1, kRed); + glDrawArrays(GL_TRIANGLES, 6, 3); + + prepareForVerify(); + results[pass].reset(new uint8_t[kResultSize]); + memset(results[pass].get(), 123u, kResultSize); + glReadPixels(0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, + results[pass].get()); + if (pass == 1) + { + glDisable(GL_SAMPLE_ALPHA_TO_ONE_EXT); + } + + cleanup(); + } + EXPECT_NE(0, memcmp(results[0].get(), results[1].get(), kResultSize)); + // Verify that rendering is deterministic, so that the pass above does not + // come from non-deterministic rendering. + EXPECT_EQ(0, memcmp(results[0].get(), results[2].get(), kResultSize)); +} + +ANGLE_INSTANTIATE_TEST(EXTMultisampleCompatibilityTest, ES2_OPENGL(), ES2_OPENGLES(), ES3_OPENGL()); + +class MultisampleCompatibilityTest : public ANGLETest +{ + + protected: + MultisampleCompatibilityTest() + { + setWindowWidth(64); + setWindowHeight(64); + setConfigRedBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + void prepareForDraw(GLsizei numSamples) + { + // Create a sample buffer. + glGenRenderbuffers(1, &mSampleRB); + glBindRenderbuffer(GL_RENDERBUFFER, mSampleRB); + glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER, numSamples, GL_RGBA8, kWidth, + kHeight); + GLint param = 0; + glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_SAMPLES, ¶m); + EXPECT_GE(param, numSamples); + glGenFramebuffers(1, &mSampleFBO); + glBindFramebuffer(GL_FRAMEBUFFER, mSampleFBO); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, mSampleRB); + EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + glBindFramebuffer(GL_FRAMEBUFFER, 0); + // Create another FBO to resolve the multisample buffer into. + glGenTextures(1, &mResolveTex); + glBindTexture(GL_TEXTURE_2D, mResolveTex); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, + NULL); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glGenFramebuffers(1, &mResolveFBO); + glBindFramebuffer(GL_FRAMEBUFFER, mResolveFBO); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mResolveTex, 0); + EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + glViewport(0, 0, kWidth, kHeight); + glBindFramebuffer(GL_FRAMEBUFFER, mSampleFBO); + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + ASSERT_GL_NO_ERROR(); + } + + void prepareForVerify() + { + // Resolve. + glBindFramebuffer(GL_READ_FRAMEBUFFER, mSampleFBO); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mResolveFBO); + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + glBlitFramebufferANGLE(0, 0, kWidth, kHeight, 0, 0, kWidth, kHeight, GL_COLOR_BUFFER_BIT, + GL_NEAREST); + glBindFramebuffer(GL_READ_FRAMEBUFFER, mResolveFBO); + + ASSERT_GL_NO_ERROR(); + } + + void cleanup() + { + glBindFramebuffer(GL_FRAMEBUFFER, 0); + glDeleteFramebuffers(1, &mResolveFBO); + glDeleteFramebuffers(1, &mSampleFBO); + glDeleteTextures(1, &mResolveTex); + glDeleteRenderbuffers(1, &mSampleRB); + + ASSERT_GL_NO_ERROR(); + } + + bool isApplicable() const + { + return extensionEnabled("GL_ANGLE_framebuffer_multisample") && + extensionEnabled("GL_OES_rgb8_rgba8"); + } + + GLuint mSampleFBO; + GLuint mResolveFBO; + GLuint mSampleRB; + GLuint mResolveTex; +}; + +// Test that enabling GL_SAMPLE_COVERAGE affects rendering. +TEST_P(MultisampleCompatibilityTest, DrawCoverageAndResolve) +{ + if (!isApplicable()) + return; + + // TODO: Figure out why this fails on Android. + if (IsAndroid()) + { + std::cout << "Test skipped on Android." << std::endl; + return; + } + + const std::string &vertex = + "attribute vec4 position;\n" + "void main()\n" + "{ gl_Position = position; }"; + const std::string &fragment = + "void main()\n" + "{ gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); }"; + + ANGLE_GL_PROGRAM(drawRed, vertex, fragment); + + GLsizei maxSamples = 0; + glGetIntegerv(GL_MAX_SAMPLES, &maxSamples); + int iterationCount = maxSamples + 1; + for (int samples = 1; samples < iterationCount; samples++) + { + prepareForDraw(samples); + glEnable(GL_SAMPLE_COVERAGE); + glSampleCoverage(1.0, false); + drawQuad(drawRed.get(), "position", 0.5f); + + prepareForVerify(); + GLsizei pixelCount = kWidth * kHeight; + std::vector<GLColor> actual(pixelCount, GLColor::black); + glReadPixels(0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, actual.data()); + glDisable(GL_SAMPLE_COVERAGE); + cleanup(); + + std::vector<GLColor> expected(pixelCount, GLColor::red); + EXPECT_EQ(expected, actual); + } +} + +ANGLE_INSTANTIATE_TEST(MultisampleCompatibilityTest, + ES2_D3D9(), + ES2_OPENGL(), + ES2_OPENGLES(), + ES3_D3D11(), + ES3_OPENGL(), + ES3_OPENGLES());
\ No newline at end of file diff --git a/gfx/angle/src/tests/gl_tests/ObjectAllocationTest.cpp b/gfx/angle/src/tests/gl_tests/ObjectAllocationTest.cpp new file mode 100755 index 000000000..b0e59f7fc --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/ObjectAllocationTest.cpp @@ -0,0 +1,54 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// ObjectAllocationTest +// Tests for object allocations and lifetimes. +// + +#include "test_utils/ANGLETest.h" + +using namespace angle; + +namespace +{ + +class ObjectAllocationTest : public ANGLETest +{ + protected: + ObjectAllocationTest() {} +}; + +// Test that we don't re-allocate a bound framebuffer ID. +TEST_P(ObjectAllocationTest, BindFramebufferBeforeGen) +{ + glBindFramebuffer(GL_FRAMEBUFFER, 1); + GLuint fbo = 0; + glGenFramebuffers(1, &fbo); + EXPECT_NE(1u, fbo); + glDeleteFramebuffers(1, &fbo); + EXPECT_GL_NO_ERROR(); +} + +// Test that we don't re-allocate a bound framebuffer ID, other pattern. +TEST_P(ObjectAllocationTest, BindFramebufferAfterGen) +{ + GLuint firstFBO = 0; + glGenFramebuffers(1, &firstFBO); + glBindFramebuffer(GL_FRAMEBUFFER, 1); + glDeleteFramebuffers(1, &firstFBO); + + glBindFramebuffer(GL_FRAMEBUFFER, 2); + GLuint secondFBOs[2] = {0}; + glGenFramebuffers(2, secondFBOs); + EXPECT_NE(2u, secondFBOs[0]); + EXPECT_NE(2u, secondFBOs[1]); + glDeleteFramebuffers(2, secondFBOs); + + EXPECT_GL_NO_ERROR(); +} + +} // anonymous namespace + +ANGLE_INSTANTIATE_TEST(ObjectAllocationTest, ES3_OPENGL(), ES3_D3D11());
\ No newline at end of file diff --git a/gfx/angle/src/tests/gl_tests/OcclusionQueriesTest.cpp b/gfx/angle/src/tests/gl_tests/OcclusionQueriesTest.cpp new file mode 100755 index 000000000..5c24f8bd7 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/OcclusionQueriesTest.cpp @@ -0,0 +1,366 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "system_utils.h" +#include "test_utils/ANGLETest.h" +#include "random_utils.h" + +using namespace angle; + +class OcclusionQueriesTest : public ANGLETest +{ + protected: + OcclusionQueriesTest() : mProgram(0), mRNG(1) + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + setConfigDepthBits(24); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + const std::string passthroughVS = SHADER_SOURCE + ( + attribute highp vec4 position; + void main(void) + { + gl_Position = position; + } + ); + + const std::string passthroughPS = SHADER_SOURCE + ( + precision highp float; + void main(void) + { + gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); + } + ); + + mProgram = CompileProgram(passthroughVS, passthroughPS); + ASSERT_NE(0u, mProgram); + } + + void TearDown() override + { + glDeleteProgram(mProgram); + + ANGLETest::TearDown(); + } + + GLuint mProgram; + RNG mRNG; +}; + +TEST_P(OcclusionQueriesTest, IsOccluded) +{ + if (getClientMajorVersion() < 3 && !extensionEnabled("GL_EXT_occlusion_query_boolean")) + { + std::cout << "Test skipped because ES3 or GL_EXT_occlusion_query_boolean are not available." + << std::endl; + return; + } + + glDepthMask(GL_TRUE); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + // draw a quad at depth 0.3 + glEnable(GL_DEPTH_TEST); + glUseProgram(mProgram); + drawQuad(mProgram, "position", 0.3f); + glUseProgram(0); + + EXPECT_GL_NO_ERROR(); + + GLuint query = 0; + glGenQueriesEXT(1, &query); + glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, query); + drawQuad(mProgram, "position", 0.8f); // this quad should be occluded by first quad + glEndQueryEXT(GL_ANY_SAMPLES_PASSED_EXT); + + EXPECT_GL_NO_ERROR(); + + swapBuffers(); + + GLuint ready = GL_FALSE; + while (ready == GL_FALSE) + { + angle::Sleep(0); + glGetQueryObjectuivEXT(query, GL_QUERY_RESULT_AVAILABLE_EXT, &ready); + } + + GLuint result = GL_TRUE; + glGetQueryObjectuivEXT(query, GL_QUERY_RESULT_EXT, &result); + + EXPECT_GL_NO_ERROR(); + + glDeleteQueriesEXT(1, &query); + + EXPECT_GLENUM_EQ(GL_FALSE, result); +} + +TEST_P(OcclusionQueriesTest, IsNotOccluded) +{ + if (getClientMajorVersion() < 3 && !extensionEnabled("GL_EXT_occlusion_query_boolean")) + { + std::cout << "Test skipped because ES3 or GL_EXT_occlusion_query_boolean are not available." + << std::endl; + return; + } + + glDepthMask(GL_TRUE); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + EXPECT_GL_NO_ERROR(); + + GLuint query = 0; + glGenQueriesEXT(1, &query); + glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, query); + drawQuad(mProgram, "position", 0.8f); // this quad should not be occluded + glEndQueryEXT(GL_ANY_SAMPLES_PASSED_EXT); + + EXPECT_GL_NO_ERROR(); + + swapBuffers(); + + GLuint result = GL_TRUE; + glGetQueryObjectuivEXT(query, GL_QUERY_RESULT_EXT, &result); // will block waiting for result + + EXPECT_GL_NO_ERROR(); + + glDeleteQueriesEXT(1, &query); + + EXPECT_GLENUM_EQ(GL_TRUE, result); +} + +TEST_P(OcclusionQueriesTest, Errors) +{ + if (getClientMajorVersion() < 3 && !extensionEnabled("GL_EXT_occlusion_query_boolean")) + { + std::cout << "Test skipped because ES3 or GL_EXT_occlusion_query_boolean are not available." + << std::endl; + return; + } + + glDepthMask(GL_TRUE); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + EXPECT_GL_NO_ERROR(); + + GLuint query = 0; + GLuint query2 = 0; + glGenQueriesEXT(1, &query); + + EXPECT_EQ(glIsQueryEXT(query), GL_FALSE); + EXPECT_EQ(glIsQueryEXT(query2), GL_FALSE); + + glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, 0); // can't pass 0 as query id + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, query); + glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, query2); // can't initiate a query while one's already active + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + EXPECT_EQ(glIsQueryEXT(query), GL_TRUE); + EXPECT_EQ(glIsQueryEXT(query2), GL_FALSE); // have not called begin + + drawQuad(mProgram, "position", 0.8f); // this quad should not be occluded + glEndQueryEXT(GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT); // no active query for this target + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + glEndQueryEXT(GL_ANY_SAMPLES_PASSED_EXT); + + glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, query); // can't begin a query as a different type than previously used + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, query2); // have to call genqueries first + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + glGenQueriesEXT(1, &query2); + glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, query2); // should be ok now + EXPECT_EQ(glIsQueryEXT(query2), GL_TRUE); + + drawQuad(mProgram, "position", 0.3f); // this should draw in front of other quad + glDeleteQueriesEXT(1, &query2); // should delete when query becomes inactive + glEndQueryEXT(GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT); // should not incur error; should delete query + 1 at end of execution. + EXPECT_GL_NO_ERROR(); + + swapBuffers(); + + EXPECT_GL_NO_ERROR(); + + GLuint ready = GL_FALSE; + glGetQueryObjectuivEXT(query2, GL_QUERY_RESULT_AVAILABLE_EXT, &ready); // this query is now deleted + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + EXPECT_GL_NO_ERROR(); +} + +// Test that running multiple simultaneous queries from multiple EGL contexts returns the correct +// result for each query. Helps expose bugs in ANGLE's virtual contexts. +TEST_P(OcclusionQueriesTest, MultiContext) +{ + if (getClientMajorVersion() < 3 && !extensionEnabled("GL_EXT_occlusion_query_boolean")) + { + std::cout << "Test skipped because ES3 or GL_EXT_occlusion_query_boolean are not available." + << std::endl; + return; + } + + if (GetParam() == ES2_D3D9() || GetParam() == ES2_D3D11() || GetParam() == ES3_D3D11()) + { + std::cout << "Test skipped because the D3D backends cannot support simultaneous queries on " + "multiple contexts yet." + << std::endl; + return; + } + + glDepthMask(GL_TRUE); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + // draw a quad at depth 0.5 + glEnable(GL_DEPTH_TEST); + drawQuad(mProgram, "position", 0.5f); + + EGLWindow *window = getEGLWindow(); + + EGLDisplay display = window->getDisplay(); + EGLConfig config = window->getConfig(); + EGLSurface surface = window->getSurface(); + + EGLint contextAttributes[] = { + EGL_CONTEXT_MAJOR_VERSION_KHR, + GetParam().majorVersion, + EGL_CONTEXT_MINOR_VERSION_KHR, + GetParam().minorVersion, + EGL_NONE, + }; + + const size_t passCount = 5; + struct ContextInfo + { + EGLContext context; + GLuint program; + GLuint query; + bool visiblePasses[passCount]; + bool shouldPass; + }; + + ContextInfo contexts[] = { + { + EGL_NO_CONTEXT, 0, 0, {false, false, false, false, false}, false, + }, + { + EGL_NO_CONTEXT, 0, 0, {false, true, false, true, false}, true, + }, + { + EGL_NO_CONTEXT, 0, 0, {false, false, false, false, false}, false, + }, + { + EGL_NO_CONTEXT, 0, 0, {true, true, false, true, true}, true, + }, + { + EGL_NO_CONTEXT, 0, 0, {false, true, true, true, true}, true, + }, + { + EGL_NO_CONTEXT, 0, 0, {true, false, false, true, false}, true, + }, + { + EGL_NO_CONTEXT, 0, 0, {false, false, false, false, false}, false, + }, + { + EGL_NO_CONTEXT, 0, 0, {false, false, false, false, false}, false, + }, + }; + + for (auto &context : contexts) + { + context.context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttributes); + ASSERT_NE(context.context, EGL_NO_CONTEXT); + + eglMakeCurrent(display, surface, surface, context.context); + + const std::string passthroughVS = SHADER_SOURCE + ( + attribute highp vec4 position; + void main(void) + { + gl_Position = position; + } + ); + + const std::string passthroughPS = SHADER_SOURCE + ( + precision highp float; + void main(void) + { + gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); + } + ); + + context.program = CompileProgram(passthroughVS, passthroughPS); + ASSERT_NE(context.program, 0u); + + glDepthMask(GL_FALSE); + glEnable(GL_DEPTH_TEST); + + glGenQueriesEXT(1, &context.query); + glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, context.query); + + ASSERT_GL_NO_ERROR(); + } + + for (size_t pass = 0; pass < passCount; pass++) + { + for (const auto &context : contexts) + { + eglMakeCurrent(display, surface, surface, context.context); + + float depth = context.visiblePasses[pass] ? mRNG.randomFloatBetween(0.0f, 0.4f) + : mRNG.randomFloatBetween(0.6f, 1.0f); + drawQuad(context.program, "position", depth); + + EXPECT_GL_NO_ERROR(); + } + } + + for (const auto &context : contexts) + { + eglMakeCurrent(display, surface, surface, context.context); + glEndQueryEXT(GL_ANY_SAMPLES_PASSED_EXT); + + GLuint result = GL_TRUE; + glGetQueryObjectuivEXT(context.query, GL_QUERY_RESULT_EXT, &result); + + EXPECT_GL_NO_ERROR(); + + GLuint expectation = context.shouldPass ? GL_TRUE : GL_FALSE; + EXPECT_EQ(expectation, result); + } + + eglMakeCurrent(display, surface, surface, window->getContext()); + + for (auto &context : contexts) + { + eglDestroyContext(display, context.context); + context.context = EGL_NO_CONTEXT; + } +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(OcclusionQueriesTest, + ES2_D3D9(), + ES2_D3D11(), + ES3_D3D11(), + ES2_OPENGL(), + ES3_OPENGL(), + ES2_OPENGLES(), + ES3_OPENGLES()); diff --git a/gfx/angle/src/tests/gl_tests/PBOExtensionTest.cpp b/gfx/angle/src/tests/gl_tests/PBOExtensionTest.cpp new file mode 100755 index 000000000..f0c0bd393 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/PBOExtensionTest.cpp @@ -0,0 +1,153 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "test_utils/ANGLETest.h" + +using namespace angle; + +class PBOExtensionTest : public ANGLETest +{ + protected: + PBOExtensionTest() + { + setWindowWidth(32); + setWindowHeight(32); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + virtual void SetUp() + { + ANGLETest::SetUp(); + + if (extensionEnabled("NV_pixel_buffer_object")) + { + glGenBuffers(1, &mPBO); + glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO); + glBufferData(GL_PIXEL_PACK_BUFFER, 4 * getWindowWidth() * getWindowHeight(), NULL, GL_STATIC_DRAW); + glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); + + const char *vertexShaderSrc = SHADER_SOURCE + ( + attribute vec4 aTest; + attribute vec2 aPosition; + varying vec4 vTest; + + void main() + { + vTest = aTest; + gl_Position = vec4(aPosition, 0.0, 1.0); + gl_PointSize = 1.0; + } + ); + + const char *fragmentShaderSrc = SHADER_SOURCE + ( + precision mediump float; + varying vec4 vTest; + + void main() + { + gl_FragColor = vTest; + } + ); + + mProgram = CompileProgram(vertexShaderSrc, fragmentShaderSrc); + + glGenBuffers(1, &mPositionVBO); + glBindBuffer(GL_ARRAY_BUFFER, mPositionVBO); + glBufferData(GL_ARRAY_BUFFER, 128, NULL, GL_DYNAMIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, 0); + } + ASSERT_GL_NO_ERROR(); + } + + virtual void TearDown() + { + ANGLETest::TearDown(); + + glDeleteBuffers(1, &mPBO); + glDeleteProgram(mProgram); + } + + GLuint mPBO; + GLuint mProgram; + GLuint mPositionVBO; +}; + +TEST_P(PBOExtensionTest, PBOWithOtherTarget) +{ + if (extensionEnabled("NV_pixel_buffer_object")) + { + glClearColor(1.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + EXPECT_GL_NO_ERROR(); + + glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO); + glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0); + + glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); + glBindBuffer(GL_ARRAY_BUFFER, mPBO); + + GLvoid *mappedPtr = glMapBufferRangeEXT(GL_ARRAY_BUFFER, 0, 32, GL_MAP_READ_BIT); + unsigned char *dataPtr = static_cast<unsigned char *>(mappedPtr); + EXPECT_GL_NO_ERROR(); + + EXPECT_EQ(255, dataPtr[0]); + EXPECT_EQ(0, dataPtr[1]); + EXPECT_EQ(0, dataPtr[2]); + EXPECT_EQ(255, dataPtr[3]); + + glUnmapBufferOES(GL_ARRAY_BUFFER); + } + EXPECT_GL_NO_ERROR(); +} + +TEST_P(PBOExtensionTest, PBOWithExistingData) +{ + if (extensionEnabled("NV_pixel_buffer_object")) + { + // Clear backbuffer to red + glClearColor(1.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + EXPECT_GL_NO_ERROR(); + + // Read 16x16 region from red backbuffer to PBO + glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO); + glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0); + + // Clear backbuffer to green + glClearColor(0.0f, 1.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + EXPECT_GL_NO_ERROR(); + + // Read 16x16 region from green backbuffer to PBO at offset 16 + glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, reinterpret_cast<GLvoid*>(16)); + GLvoid * mappedPtr = glMapBufferRangeEXT(GL_PIXEL_PACK_BUFFER, 0, 32, GL_MAP_READ_BIT); + unsigned char *dataPtr = static_cast<unsigned char *>(mappedPtr); + EXPECT_GL_NO_ERROR(); + + // Test pixel 0 is red (existing data) + EXPECT_EQ(255, dataPtr[0]); + EXPECT_EQ(0, dataPtr[1]); + EXPECT_EQ(0, dataPtr[2]); + EXPECT_EQ(255, dataPtr[3]); + + // Test pixel 16 is green (new data) + EXPECT_EQ(0, dataPtr[16 * 4 + 0]); + EXPECT_EQ(255, dataPtr[16 * 4 + 1]); + EXPECT_EQ(0, dataPtr[16 * 4 + 2]); + EXPECT_EQ(255, dataPtr[16 * 4 + 3]); + + glUnmapBufferOES(GL_PIXEL_PACK_BUFFER); + } + EXPECT_GL_NO_ERROR(); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(PBOExtensionTest, ES2_D3D11(), ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); diff --git a/gfx/angle/src/tests/gl_tests/PackUnpackTest.cpp b/gfx/angle/src/tests/gl_tests/PackUnpackTest.cpp new file mode 100755 index 000000000..032504b80 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/PackUnpackTest.cpp @@ -0,0 +1,268 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// PackUnpackTest: +// Tests the corrrectness of opengl 4.1 emulation of pack/unpack built-in functions. +// + +#include "test_utils/ANGLETest.h" + +using namespace angle; + +namespace +{ + +class PackUnpackTest : public ANGLETest +{ + protected: + PackUnpackTest() + { + setWindowWidth(16); + setWindowHeight(16); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + // Vertex Shader source + const std::string vs = SHADER_SOURCE + ( #version 300 es\n + precision mediump float; + in vec4 position; + + void main() + { + gl_Position = position; + } + ); + + // clang-format off + // Fragment Shader source + const std::string sNormFS = SHADER_SOURCE + ( #version 300 es\n + precision mediump float; + uniform mediump vec2 v; + layout(location = 0) out mediump vec4 fragColor; + + void main() + { + uint u = packSnorm2x16(v); + vec2 r = unpackSnorm2x16(u); + fragColor = vec4(r, 0.0, 1.0); + } + ); + + // Fragment Shader source + const std::string uNormFS = SHADER_SOURCE + ( #version 300 es\n + precision mediump float; + uniform mediump vec2 v; + layout(location = 0) out mediump vec4 fragColor; + + void main() + { + uint u = packUnorm2x16(v); + vec2 r = unpackUnorm2x16(u); + fragColor = vec4(r, 0.0, 1.0); + } + ); + + // Fragment Shader source + const std::string halfFS = SHADER_SOURCE + ( #version 300 es\n + precision mediump float; + uniform mediump vec2 v; + layout(location = 0) out mediump vec4 fragColor; + + void main() + { + uint u = packHalf2x16(v); + vec2 r = unpackHalf2x16(u); + fragColor = vec4(r, 0.0, 1.0); + } + ); + // clang-format on + + mSNormProgram = CompileProgram(vs, sNormFS); + mUNormProgram = CompileProgram(vs, uNormFS); + mHalfProgram = CompileProgram(vs, halfFS); + if (mSNormProgram == 0 || mUNormProgram == 0 || mHalfProgram == 0) + { + FAIL() << "shader compilation failed."; + } + + glGenTextures(1, &mOffscreenTexture2D); + glBindTexture(GL_TEXTURE_2D, mOffscreenTexture2D); + glTexStorage2D(GL_TEXTURE_2D, 1, GL_RG32F, getWindowWidth(), getWindowHeight()); + + glGenFramebuffers(1, &mOffscreenFramebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, mOffscreenFramebuffer); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mOffscreenTexture2D, 0); + + glViewport(0, 0, 16, 16); + + const GLfloat color[] = { 1.0f, 1.0f, 0.0f, 1.0f }; + glClearBufferfv(GL_COLOR, 0, color); + } + + void TearDown() override + { + glDeleteTextures(1, &mOffscreenTexture2D); + glDeleteFramebuffers(1, &mOffscreenFramebuffer); + glDeleteProgram(mSNormProgram); + glDeleteProgram(mUNormProgram); + glDeleteProgram(mHalfProgram); + + ANGLETest::TearDown(); + } + + void compareBeforeAfter(GLuint program, float input1, float input2) + { + compareBeforeAfter(program, input1, input2, input1, input2); + } + + void compareBeforeAfter(GLuint program, float input1, float input2, float expect1, float expect2) + { + GLint vec2Location = glGetUniformLocation(program, "v"); + + glUseProgram(program); + glUniform2f(vec2Location, input1, input2); + + drawQuad(program, "position", 0.5f); + + ASSERT_GL_NO_ERROR(); + + GLfloat p[2] = { 0 }; + glReadPixels(8, 8, 1, 1, GL_RG, GL_FLOAT, p); + + ASSERT_GL_NO_ERROR(); + + static const double epsilon = 0.0005; + EXPECT_NEAR(p[0], expect1, epsilon); + EXPECT_NEAR(p[1], expect2, epsilon); + } + + GLuint mSNormProgram; + GLuint mUNormProgram; + GLuint mHalfProgram; + GLuint mOffscreenFramebuffer; + GLuint mOffscreenTexture2D; +}; + +// Test the correctness of packSnorm2x16 and unpackSnorm2x16 functions calculating normal floating numbers. +TEST_P(PackUnpackTest, PackUnpackSnormNormal) +{ + // Expect the shader to output the same value as the input + compareBeforeAfter(mSNormProgram, 0.5f, -0.2f); + compareBeforeAfter(mSNormProgram, -0.35f, 0.75f); + compareBeforeAfter(mSNormProgram, 0.00392f, -0.99215f); + compareBeforeAfter(mSNormProgram, 1.0f, -0.00392f); +} + +// Test the correctness of packSnorm2x16 and unpackSnorm2x16 functions calculating normal floating +// numbers. +TEST_P(PackUnpackTest, PackUnpackUnormNormal) +{ + // Expect the shader to output the same value as the input + compareBeforeAfter(mUNormProgram, 0.5f, 0.2f, 0.5f, 0.2f); + compareBeforeAfter(mUNormProgram, 0.35f, 0.75f, 0.35f, 0.75f); + compareBeforeAfter(mUNormProgram, 0.00392f, 0.99215f, 0.00392f, 0.99215f); + compareBeforeAfter(mUNormProgram, 1.0f, 0.00392f, 1.0f, 0.00392f); +} + +// Test the correctness of packHalf2x16 and unpackHalf2x16 functions calculating normal floating numbers. +TEST_P(PackUnpackTest, PackUnpackHalfNormal) +{ + // TODO(cwallez) figure out why it is broken on Intel on Mac +#if defined(ANGLE_PLATFORM_APPLE) + if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + std::cout << "Test skipped on Intel on Mac." << std::endl; + return; + } +#endif + + // Expect the shader to output the same value as the input + compareBeforeAfter(mHalfProgram, 0.5f, -0.2f); + compareBeforeAfter(mHalfProgram, -0.35f, 0.75f); + compareBeforeAfter(mHalfProgram, 0.00392f, -0.99215f); + compareBeforeAfter(mHalfProgram, 1.0f, -0.00392f); +} + +// Test the correctness of packSnorm2x16 and unpackSnorm2x16 functions calculating subnormal floating numbers. +TEST_P(PackUnpackTest, PackUnpackSnormSubnormal) +{ + // Expect the shader to output the same value as the input + compareBeforeAfter(mSNormProgram, 0.00001f, -0.00001f); +} + +// Test the correctness of packUnorm2x16 and unpackUnorm2x16 functions calculating subnormal +// floating numbers. +TEST_P(PackUnpackTest, PackUnpackUnormSubnormal) +{ + // Expect the shader to output the same value as the input for positive numbers and clamp + // to [0, 1] + compareBeforeAfter(mUNormProgram, 0.00001f, -0.00001f, 0.00001f, 0.0f); +} + +// Test the correctness of packHalf2x16 and unpackHalf2x16 functions calculating subnormal floating numbers. +TEST_P(PackUnpackTest, PackUnpackHalfSubnormal) +{ + // Expect the shader to output the same value as the input + compareBeforeAfter(mHalfProgram, 0.00001f, -0.00001f); +} + +// Test the correctness of packSnorm2x16 and unpackSnorm2x16 functions calculating zero floating numbers. +TEST_P(PackUnpackTest, PackUnpackSnormZero) +{ + // Expect the shader to output the same value as the input + compareBeforeAfter(mSNormProgram, 0.00000f, -0.00000f); +} + +// Test the correctness of packUnorm2x16 and unpackUnorm2x16 functions calculating zero floating +// numbers. +TEST_P(PackUnpackTest, PackUnpackUnormZero) +{ + compareBeforeAfter(mUNormProgram, 0.00000f, -0.00000f, 0.00000f, 0.00000f); +} + +// Test the correctness of packHalf2x16 and unpackHalf2x16 functions calculating zero floating numbers. +TEST_P(PackUnpackTest, PackUnpackHalfZero) +{ + // Expect the shader to output the same value as the input + compareBeforeAfter(mHalfProgram, 0.00000f, -0.00000f); +} + +// Test the correctness of packUnorm2x16 and unpackUnorm2x16 functions calculating overflow floating +// numbers. +TEST_P(PackUnpackTest, PackUnpackUnormOverflow) +{ + // Expect the shader to clamp the input to [0, 1] + compareBeforeAfter(mUNormProgram, 67000.0f, -67000.0f, 1.0f, 0.0f); +} + +// Test the correctness of packSnorm2x16 and unpackSnorm2x16 functions calculating overflow floating numbers. +TEST_P(PackUnpackTest, PackUnpackSnormOverflow) +{ + // Expect the shader to clamp the input to [-1, 1] + compareBeforeAfter(mSNormProgram, 67000.0f, -67000.0f, 1.0f, -1.0f); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(PackUnpackTest, + ES3_OPENGL(3, 3), + ES3_OPENGL(4, 0), + ES3_OPENGL(4, 1), + ES3_OPENGL(4, 2), + ES3_OPENGL(4, 3), + ES3_OPENGL(4, 4), + ES3_OPENGL(4, 5), + ES3_OPENGLES()); +} diff --git a/gfx/angle/src/tests/gl_tests/PathRenderingTest.cpp b/gfx/angle/src/tests/gl_tests/PathRenderingTest.cpp new file mode 100755 index 000000000..962531071 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/PathRenderingTest.cpp @@ -0,0 +1,1984 @@ +// +// Copyright 2016 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// CHROMIUMPathRenderingTest +// Test CHROMIUM subset of NV_path_rendering +// This extension allows to render geometric paths as first class GL objects. + +#include "test_utils/ANGLETest.h" +#include "shader_utils.h" + +#include "common/angleutils.h" + +#include <cmath> +#include <cstring> +#include <cstddef> +#include <fstream> + +using namespace angle; + +namespace +{ + +bool CheckPixels(GLint x, + GLint y, + GLsizei width, + GLsizei height, + GLint tolerance, + const angle::GLColor &color) +{ + for (GLint yy = 0; yy < height; ++yy) + { + for (GLint xx = 0; xx < width; ++xx) + { + const auto px = x + xx; + const auto py = y + yy; + EXPECT_PIXEL_NEAR(px, py, color.R, color.G, color.B, color.A, tolerance); + } + } + + return true; +} + +void ExpectEqualMatrix(const GLfloat *expected, const GLfloat *actual) +{ + for (size_t i = 0; i < 16; ++i) + { + EXPECT_EQ(expected[i], actual[i]); + } +} + +void ExpectEqualMatrix(const GLfloat *expected, const GLint *actual) +{ + for (size_t i = 0; i < 16; ++i) + { + EXPECT_EQ(static_cast<GLint>(std::roundf(expected[i])), actual[i]); + } +} + +const int kResolution = 300; + +class CHROMIUMPathRenderingTest : public ANGLETest +{ + protected: + CHROMIUMPathRenderingTest() + { + setWindowWidth(kResolution); + setWindowHeight(kResolution); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + setConfigDepthBits(8); + setConfigStencilBits(8); + } + + bool isApplicable() const { return extensionEnabled("GL_CHROMIUM_path_rendering"); } + + void tryAllDrawFunctions(GLuint path, GLenum err) + { + glStencilFillPathCHROMIUM(path, GL_COUNT_UP_CHROMIUM, 0x7F); + EXPECT_GL_ERROR(err); + + glStencilFillPathCHROMIUM(path, GL_COUNT_DOWN_CHROMIUM, 0x7F); + EXPECT_GL_ERROR(err); + + glStencilStrokePathCHROMIUM(path, 0x80, 0x80); + EXPECT_GL_ERROR(err); + + glCoverFillPathCHROMIUM(path, GL_BOUNDING_BOX_CHROMIUM); + EXPECT_GL_ERROR(err); + + glCoverStrokePathCHROMIUM(path, GL_BOUNDING_BOX_CHROMIUM); + EXPECT_GL_ERROR(err); + + glStencilThenCoverStrokePathCHROMIUM(path, 0x80, 0x80, GL_BOUNDING_BOX_CHROMIUM); + EXPECT_GL_ERROR(err); + + glStencilThenCoverFillPathCHROMIUM(path, GL_COUNT_UP_CHROMIUM, 0x7F, + GL_BOUNDING_BOX_CHROMIUM); + EXPECT_GL_ERROR(err); + } +}; + +// Test setting and getting of path rendering matrices. +TEST_P(CHROMIUMPathRenderingTest, TestMatrix) +{ + if (!isApplicable()) + return; + + static const GLfloat kIdentityMatrix[16] = {1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}; + + static const GLfloat kSeqMatrix[16] = {0.5f, -0.5f, -0.1f, -0.8f, 4.4f, 5.5f, + 6.6f, 7.7f, 8.8f, 9.9f, 10.11f, 11.22f, + 12.33f, 13.44f, 14.55f, 15.66f}; + + static const GLenum kMatrixModes[] = {GL_PATH_MODELVIEW_CHROMIUM, GL_PATH_PROJECTION_CHROMIUM}; + + static const GLenum kGetMatrixModes[] = {GL_PATH_MODELVIEW_MATRIX_CHROMIUM, + GL_PATH_PROJECTION_MATRIX_CHROMIUM}; + + for (size_t i = 0; i < 2; ++i) + { + GLfloat mf[16]; + GLint mi[16]; + std::memset(mf, 0, sizeof(mf)); + std::memset(mi, 0, sizeof(mi)); + glGetFloatv(kGetMatrixModes[i], mf); + glGetIntegerv(kGetMatrixModes[i], mi); + ExpectEqualMatrix(kIdentityMatrix, mf); + ExpectEqualMatrix(kIdentityMatrix, mi); + + glMatrixLoadfCHROMIUM(kMatrixModes[i], kSeqMatrix); + std::memset(mf, 0, sizeof(mf)); + std::memset(mi, 0, sizeof(mi)); + glGetFloatv(kGetMatrixModes[i], mf); + glGetIntegerv(kGetMatrixModes[i], mi); + ExpectEqualMatrix(kSeqMatrix, mf); + ExpectEqualMatrix(kSeqMatrix, mi); + + glMatrixLoadIdentityCHROMIUM(kMatrixModes[i]); + std::memset(mf, 0, sizeof(mf)); + std::memset(mi, 0, sizeof(mi)); + glGetFloatv(kGetMatrixModes[i], mf); + glGetIntegerv(kGetMatrixModes[i], mi); + ExpectEqualMatrix(kIdentityMatrix, mf); + ExpectEqualMatrix(kIdentityMatrix, mi); + + ASSERT_GL_NO_ERROR(); + } +} + +// Test that trying to set incorrect matrix target results +// in a GL error. +TEST_P(CHROMIUMPathRenderingTest, TestMatrixErrors) +{ + if (!isApplicable()) + return; + + GLfloat mf[16]; + std::memset(mf, 0, sizeof(mf)); + + glMatrixLoadfCHROMIUM(GL_PATH_MODELVIEW_CHROMIUM, mf); + ASSERT_GL_NO_ERROR(); + + glMatrixLoadIdentityCHROMIUM(GL_PATH_PROJECTION_CHROMIUM); + ASSERT_GL_NO_ERROR(); + + // Test that invalid matrix targets fail. + glMatrixLoadfCHROMIUM(GL_PATH_MODELVIEW_CHROMIUM - 1, mf); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + // Test that invalid matrix targets fail. + glMatrixLoadIdentityCHROMIUM(GL_PATH_PROJECTION_CHROMIUM + 1); + EXPECT_GL_ERROR(GL_INVALID_ENUM); +} + +// Test basic path create and delete. +TEST_P(CHROMIUMPathRenderingTest, TestGenDelete) +{ + if (!isApplicable()) + return; + + // This is unspecified in NV_path_rendering. + EXPECT_EQ(0u, glGenPathsCHROMIUM(0)); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + GLuint path = glGenPathsCHROMIUM(1); + EXPECT_NE(0u, path); + glDeletePathsCHROMIUM(path, 1); + ASSERT_GL_NO_ERROR(); + + GLuint first_path = glGenPathsCHROMIUM(5); + EXPECT_NE(0u, first_path); + glDeletePathsCHROMIUM(first_path, 5); + ASSERT_GL_NO_ERROR(); + + // Test deleting paths that are not actually allocated: + // "unused names in /paths/ are silently ignored". + first_path = glGenPathsCHROMIUM(5); + EXPECT_NE(0u, first_path); + glDeletePathsCHROMIUM(first_path, 6); + ASSERT_GL_NO_ERROR(); + + GLsizei big_range = 0xffff; + first_path = glGenPathsCHROMIUM(big_range); + EXPECT_NE(0u, first_path); + glDeletePathsCHROMIUM(first_path, big_range); + ASSERT_GL_NO_ERROR(); + + // Test glIsPathCHROMIUM(). A path object is not considered a path untill + // it has actually been specified with a path data. + + path = glGenPathsCHROMIUM(1); + ASSERT_TRUE(glIsPathCHROMIUM(path) == GL_FALSE); + + // specify the data. + GLubyte commands[] = {GL_MOVE_TO_CHROMIUM, GL_CLOSE_PATH_CHROMIUM}; + GLfloat coords[] = {50.0f, 50.0f}; + glPathCommandsCHROMIUM(path, 2, commands, 2, GL_FLOAT, coords); + ASSERT_TRUE(glIsPathCHROMIUM(path) == GL_TRUE); + glDeletePathsCHROMIUM(path, 1); + ASSERT_TRUE(glIsPathCHROMIUM(path) == GL_FALSE); +} + +// Test incorrect path creation and deletion and expect GL errors. +TEST_P(CHROMIUMPathRenderingTest, TestGenDeleteErrors) +{ + if (!isApplicable()) + return; + + // GenPaths / DeletePaths tests. + // std::numeric_limits<GLuint>::max() is wrong for GLsizei. + GLuint first_path = glGenPathsCHROMIUM(std::numeric_limits<GLuint>::max()); + EXPECT_EQ(first_path, 0u); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + first_path = glGenPathsCHROMIUM(-1); + EXPECT_EQ(0u, first_path); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + glDeletePathsCHROMIUM(1, -5); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + first_path = glGenPathsCHROMIUM(-1); + EXPECT_EQ(0u, first_path); + EXPECT_GL_ERROR(GL_INVALID_VALUE); +} + +// Test setting and getting path parameters. +TEST_P(CHROMIUMPathRenderingTest, TestPathParameter) +{ + if (!isApplicable()) + return; + + GLuint path = glGenPathsCHROMIUM(1); + + // specify the data. + GLubyte commands[] = {GL_MOVE_TO_CHROMIUM, GL_CLOSE_PATH_CHROMIUM}; + GLfloat coords[] = {50.0f, 50.0f}; + glPathCommandsCHROMIUM(path, 2, commands, 2, GL_FLOAT, coords); + ASSERT_GL_NO_ERROR(); + EXPECT_TRUE(glIsPathCHROMIUM(path) == GL_TRUE); + + static const GLenum kEndCaps[] = {GL_FLAT_CHROMIUM, GL_SQUARE_CHROMIUM, GL_ROUND_CHROMIUM}; + for (std::size_t i = 0; i < 3; ++i) + { + GLint x; + glPathParameteriCHROMIUM(path, GL_PATH_END_CAPS_CHROMIUM, static_cast<GLenum>(kEndCaps[i])); + ASSERT_GL_NO_ERROR(); + glGetPathParameterivCHROMIUM(path, GL_PATH_END_CAPS_CHROMIUM, &x); + ASSERT_GL_NO_ERROR(); + EXPECT_EQ(kEndCaps[i], static_cast<GLenum>(x)); + + GLfloat f; + glPathParameterfCHROMIUM(path, GL_PATH_END_CAPS_CHROMIUM, + static_cast<GLfloat>(kEndCaps[(i + 1) % 3])); + glGetPathParameterfvCHROMIUM(path, GL_PATH_END_CAPS_CHROMIUM, &f); + ASSERT_GL_NO_ERROR(); + EXPECT_EQ(kEndCaps[(i + 1) % 3], static_cast<GLenum>(f)); + } + + static const GLenum kJoinStyles[] = {GL_MITER_REVERT_CHROMIUM, GL_BEVEL_CHROMIUM, + GL_ROUND_CHROMIUM}; + for (std::size_t i = 0; i < 3; ++i) + { + GLint x; + glPathParameteriCHROMIUM(path, GL_PATH_JOIN_STYLE_CHROMIUM, + static_cast<GLenum>(kJoinStyles[i])); + ASSERT_GL_NO_ERROR(); + glGetPathParameterivCHROMIUM(path, GL_PATH_JOIN_STYLE_CHROMIUM, &x); + ASSERT_GL_NO_ERROR(); + EXPECT_EQ(kJoinStyles[i], static_cast<GLenum>(x)); + + GLfloat f; + glPathParameterfCHROMIUM(path, GL_PATH_JOIN_STYLE_CHROMIUM, + static_cast<GLfloat>(kJoinStyles[(i + 1) % 3])); + ASSERT_GL_NO_ERROR(); + glGetPathParameterfvCHROMIUM(path, GL_PATH_JOIN_STYLE_CHROMIUM, &f); + ASSERT_GL_NO_ERROR(); + EXPECT_EQ(kJoinStyles[(i + 1) % 3], static_cast<GLenum>(f)); + } + + { + glPathParameterfCHROMIUM(path, GL_PATH_STROKE_WIDTH_CHROMIUM, 5.0f); + ASSERT_GL_NO_ERROR(); + + GLfloat f; + glGetPathParameterfvCHROMIUM(path, GL_PATH_STROKE_WIDTH_CHROMIUM, &f); + EXPECT_EQ(5.0f, f); + } + + glDeletePathsCHROMIUM(path, 1); +} + +// Test that setting incorrect path parameter generates GL error. +TEST_P(CHROMIUMPathRenderingTest, TestPathParameterErrors) +{ + if (!isApplicable()) + return; + + GLuint path = glGenPathsCHROMIUM(1); + + // PathParameter*: Wrong value for the pname should fail. + glPathParameteriCHROMIUM(path, GL_PATH_JOIN_STYLE_CHROMIUM, GL_FLAT_CHROMIUM); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + glPathParameterfCHROMIUM(path, GL_PATH_END_CAPS_CHROMIUM, GL_MITER_REVERT_CHROMIUM); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + // PathParameter*: Wrong floating-point value should fail. + glPathParameterfCHROMIUM(path, GL_PATH_STROKE_WIDTH_CHROMIUM, -0.1f); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + // PathParameter*: Wrong pname should fail. + glPathParameteriCHROMIUM(path, GL_PATH_STROKE_WIDTH_CHROMIUM - 1, 5); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + glDeletePathsCHROMIUM(path, 1); +} + +// Test expected path object state. +TEST_P(CHROMIUMPathRenderingTest, TestPathObjectState) +{ + if (!isApplicable()) + return; + + glViewport(0, 0, kResolution, kResolution); + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + glStencilMask(0xffffffff); + glClearStencil(0); + glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + glPathStencilFuncCHROMIUM(GL_ALWAYS, 0, 0xFF); + glStencilOp(GL_KEEP, GL_KEEP, GL_ZERO); + ASSERT_GL_NO_ERROR(); + + // Test that trying to draw non-existing paths does not produce errors or results. + GLuint non_existing_paths[] = {0, 55, 74744}; + for (auto &p : non_existing_paths) + { + EXPECT_TRUE(glIsPathCHROMIUM(p) == GL_FALSE); + ASSERT_GL_NO_ERROR(); + tryAllDrawFunctions(p, GL_NO_ERROR); + } + + // Path name marked as used but without path object state causes + // a GL error upon any draw command. + GLuint path = glGenPathsCHROMIUM(1); + EXPECT_TRUE(glIsPathCHROMIUM(path) == GL_FALSE); + tryAllDrawFunctions(path, GL_INVALID_OPERATION); + glDeletePathsCHROMIUM(path, 1); + + // Document a bit of an inconsistency: path name marked as used but without + // path object state causes a GL error upon any draw command (tested above). + // Path name that had path object state, but then was "cleared", still has a + // path object state, even though the state is empty. + path = glGenPathsCHROMIUM(1); + EXPECT_TRUE(glIsPathCHROMIUM(path) == GL_FALSE); + + GLubyte commands[] = {GL_MOVE_TO_CHROMIUM, GL_CLOSE_PATH_CHROMIUM}; + GLfloat coords[] = {50.0f, 50.0f}; + glPathCommandsCHROMIUM(path, 2, commands, 2, GL_FLOAT, coords); + EXPECT_TRUE(glIsPathCHROMIUM(path) == GL_TRUE); + + glPathCommandsCHROMIUM(path, 0, NULL, 0, GL_FLOAT, NULL); + EXPECT_TRUE(glIsPathCHROMIUM(path) == GL_TRUE); // The surprise. + + tryAllDrawFunctions(path, GL_NO_ERROR); + glDeletePathsCHROMIUM(path, 1); + + // Make sure nothing got drawn by the drawing commands that should not produce + // anything. + const angle::GLColor black = {0, 0, 0, 0}; + EXPECT_TRUE(CheckPixels(0, 0, kResolution, kResolution, 0, black)); +} + +// Test that trying to use path object that doesn't exist generates +// a GL error. +TEST_P(CHROMIUMPathRenderingTest, TestUnnamedPathsErrors) +{ + if (!isApplicable()) + return; + + // Unnamed paths: Trying to create a path object with non-existing path name + // produces error. (Not a error in real NV_path_rendering). + ASSERT_GL_NO_ERROR(); + GLubyte commands[] = {GL_MOVE_TO_CHROMIUM, GL_CLOSE_PATH_CHROMIUM}; + GLfloat coords[] = {50.0f, 50.0f}; + glPathCommandsCHROMIUM(555, 2, commands, 2, GL_FLOAT, coords); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + // PathParameter*: Using non-existing path object produces error. + ASSERT_GL_NO_ERROR(); + glPathParameterfCHROMIUM(555, GL_PATH_STROKE_WIDTH_CHROMIUM, 5.0f); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + ASSERT_GL_NO_ERROR(); + glPathParameteriCHROMIUM(555, GL_PATH_JOIN_STYLE_CHROMIUM, GL_ROUND_CHROMIUM); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); +} + +// Test that setting incorrect path data generates a GL error. +TEST_P(CHROMIUMPathRenderingTest, TestPathCommandsErrors) +{ + if (!isApplicable()) + return; + + static const GLenum kInvalidCoordType = GL_NONE; + + GLuint path = glGenPathsCHROMIUM(1); + GLubyte commands[] = {GL_MOVE_TO_CHROMIUM, GL_CLOSE_PATH_CHROMIUM}; + GLfloat coords[] = {50.0f, 50.0f}; + + glPathCommandsCHROMIUM(path, 2, commands, -4, GL_FLOAT, coords); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + glPathCommandsCHROMIUM(path, -1, commands, 2, GL_FLOAT, coords); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + glPathCommandsCHROMIUM(path, 2, commands, 2, kInvalidCoordType, coords); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + // incorrect number of coordinates + glPathCommandsCHROMIUM(path, 2, commands, std::numeric_limits<GLsizei>::max(), GL_FLOAT, + coords); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + // This should fail due to cmd count + coord count * short size. + glPathCommandsCHROMIUM(path, 2, commands, std::numeric_limits<GLsizei>::max(), GL_SHORT, + coords); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + glDeletePathsCHROMIUM(path, 1); +} + +// Test that trying to render a path with invalid arguments +// generates a GL error. +TEST_P(CHROMIUMPathRenderingTest, TestPathRenderingInvalidArgs) +{ + if (!isApplicable()) + return; + + GLuint path = glGenPathsCHROMIUM(1); + glPathCommandsCHROMIUM(path, 0, NULL, 0, GL_FLOAT, NULL); + + // Verify that normal calls work. + glStencilFillPathCHROMIUM(path, GL_COUNT_UP_CHROMIUM, 0x7F); + ASSERT_GL_NO_ERROR(); + glStencilThenCoverFillPathCHROMIUM(path, GL_COUNT_UP_CHROMIUM, 0x7F, GL_BOUNDING_BOX_CHROMIUM); + ASSERT_GL_NO_ERROR(); + + // Using invalid fill mode causes INVALID_ENUM. + glStencilFillPathCHROMIUM(path, GL_COUNT_UP_CHROMIUM - 1, 0x7F); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + glStencilThenCoverFillPathCHROMIUM(path, GL_COUNT_UP_CHROMIUM - 1, 0x7F, + GL_BOUNDING_BOX_CHROMIUM); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + // Using invalid cover mode causes INVALID_ENUM. + glCoverFillPathCHROMIUM(path, GL_CONVEX_HULL_CHROMIUM - 1); + EXPECT_EQ(static_cast<GLenum>(GL_INVALID_ENUM), glGetError()); + glStencilThenCoverFillPathCHROMIUM(path, GL_COUNT_UP_CHROMIUM, 0x7F, + GL_BOUNDING_BOX_CHROMIUM + 1); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + // Using mask+1 not being power of two causes INVALID_VALUE with up/down fill mode + glStencilFillPathCHROMIUM(path, GL_COUNT_UP_CHROMIUM, 0x40); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + glStencilThenCoverFillPathCHROMIUM(path, GL_COUNT_DOWN_CHROMIUM, 12, GL_BOUNDING_BOX_CHROMIUM); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + // check incorrect instance parameters. + + // CoverFillPathInstanced + { + glCoverFillPathInstancedCHROMIUM(-1, GL_UNSIGNED_INT, &path, 0, GL_CONVEX_HULL_CHROMIUM, + GL_NONE, NULL); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + glCoverFillPathInstancedCHROMIUM(1, GL_FLOAT, &path, 0, GL_CONVEX_HULL_CHROMIUM, GL_NONE, + NULL); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + glCoverFillPathInstancedCHROMIUM(1, GL_UNSIGNED_INT, NULL, 0, GL_CONVEX_HULL_CHROMIUM, + GL_NONE, NULL); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + glCoverFillPathInstancedCHROMIUM(1, GL_UNSIGNED_INT, &path, 0, GL_UNSIGNED_INT, GL_NONE, + NULL); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + glCoverFillPathInstancedCHROMIUM(1, GL_UNSIGNED_INT, &path, 0, GL_CONVEX_HULL_CHROMIUM, + GL_UNSIGNED_INT, NULL); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + glCoverFillPathInstancedCHROMIUM(1, GL_UNSIGNED_INT, &path, 0, GL_CONVEX_HULL_CHROMIUM, + GL_TRANSLATE_X_CHROMIUM, NULL); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + } + + // CoverStrokePathInstanced + { + glCoverStrokePathInstancedCHROMIUM(-1, GL_UNSIGNED_INT, &path, 0, GL_CONVEX_HULL_CHROMIUM, + GL_NONE, NULL); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + glCoverStrokePathInstancedCHROMIUM(1, GL_FLOAT, &path, 0, GL_CONVEX_HULL_CHROMIUM, GL_NONE, + NULL); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + glCoverStrokePathInstancedCHROMIUM(1, GL_UNSIGNED_INT, NULL, 0, GL_CONVEX_HULL_CHROMIUM, + GL_NONE, NULL); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + glCoverStrokePathInstancedCHROMIUM(1, GL_UNSIGNED_INT, &path, 0, GL_UNSIGNED_INT, GL_NONE, + NULL); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + glCoverStrokePathInstancedCHROMIUM(1, GL_UNSIGNED_INT, &path, 0, GL_CONVEX_HULL_CHROMIUM, + GL_UNSIGNED_INT, NULL); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + glCoverStrokePathInstancedCHROMIUM(1, GL_UNSIGNED_INT, &path, 0, GL_CONVEX_HULL_CHROMIUM, + GL_TRANSLATE_X_CHROMIUM, NULL); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + } + + // StencilFillPathInstanced + { + glStencilFillPathInstancedCHROMIUM(-1, GL_UNSIGNED_INT, &path, 0, GL_COUNT_UP_CHROMIUM, 0x0, + GL_NONE, NULL); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + glStencilFillPathInstancedCHROMIUM(1, GL_FLOAT, &path, 0, GL_COUNT_UP_CHROMIUM, 0x0, + GL_NONE, NULL); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + glStencilFillPathInstancedCHROMIUM(1, GL_UNSIGNED_INT, NULL, 0, GL_COUNT_UP_CHROMIUM, 0x0, + GL_NONE, NULL); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + glStencilFillPathInstancedCHROMIUM(1, GL_UNSIGNED_INT, &path, 0, GL_UNSIGNED_INT, 0x0, + GL_NONE, NULL); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + glStencilFillPathInstancedCHROMIUM(1, GL_UNSIGNED_INT, &path, 0, GL_COUNT_UP_CHROMIUM, 0x2, + GL_NONE, NULL); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + glStencilFillPathInstancedCHROMIUM(1, GL_UNSIGNED_INT, &path, 0, GL_COUNT_UP_CHROMIUM, 0x0, + GL_UNSIGNED_INT, NULL); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + glStencilFillPathInstancedCHROMIUM(1, GL_UNSIGNED_INT, &path, 0, GL_COUNT_UP_CHROMIUM, 0x0, + GL_TRANSLATE_X_CHROMIUM, NULL); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + } + + // StencilStrokePathInstanced + { + glStencilStrokePathInstancedCHROMIUM(-1, GL_UNSIGNED_INT, &path, 0, 0x00, 0x00, GL_NONE, + NULL); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + glStencilStrokePathInstancedCHROMIUM(1, GL_FLOAT, &path, 0, 0x00, 0x00, GL_NONE, NULL); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + glStencilStrokePathInstancedCHROMIUM(1, GL_UNSIGNED_INT, nullptr, 0, 0x00, 0x00, GL_NONE, + NULL); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + glStencilStrokePathInstancedCHROMIUM(1, GL_UNSIGNED_INT, &path, 0, 0x00, 0x00, + GL_UNSIGNED_INT, NULL); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + glStencilStrokePathInstancedCHROMIUM(1, GL_UNSIGNED_INT, &path, 0, 0x00, 0x00, + GL_TRANSLATE_X_CHROMIUM, NULL); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + } + + // StencilThenCoverFillPathInstanced + { + glStencilThenCoverFillPathInstancedCHROMIUM(-1, GL_UNSIGNED_INT, &path, 0, + GL_COUNT_UP_CHROMIUM, 0, GL_COUNT_UP_CHROMIUM, + GL_NONE, NULL); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + glStencilThenCoverFillPathInstancedCHROMIUM(1, GL_FLOAT, &path, 0, GL_CONVEX_HULL_CHROMIUM, + 0, GL_COUNT_UP_CHROMIUM, GL_NONE, NULL); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + glStencilThenCoverFillPathInstancedCHROMIUM(1, GL_UNSIGNED_INT, NULL, 0, + GL_CONVEX_HULL_CHROMIUM, 0, + GL_COUNT_UP_CHROMIUM, GL_NONE, NULL); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + glStencilThenCoverFillPathInstancedCHROMIUM(1, GL_UNSIGNED_INT, &path, 0, GL_UNSIGNED_INT, + 0, GL_COUNT_UP_CHROMIUM, GL_NONE, NULL); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + glStencilThenCoverFillPathInstancedCHROMIUM(1, GL_UNSIGNED_INT, &path, 0, + GL_CONVEX_HULL_CHROMIUM, 0, GL_UNSIGNED_INT, + GL_NONE, NULL); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + glStencilThenCoverFillPathInstancedCHROMIUM(1, GL_UNSIGNED_INT, &path, 0, + GL_CONVEX_HULL_CHROMIUM, 0, + GL_COUNT_UP_CHROMIUM, GL_FLOAT, NULL); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + glStencilThenCoverFillPathInstancedCHROMIUM( + 1, GL_UNSIGNED_INT, &path, 0, GL_CONVEX_HULL_CHROMIUM, 0, GL_COUNT_UP_CHROMIUM, + GL_TRANSLATE_X_CHROMIUM, NULL); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + } + + // StencilThenCoverStrokePathInstanced + { + glStencilThenCoverStrokePathInstancedCHROMIUM(-1, GL_UNSIGNED_INT, &path, 0, 0x0, 0x0, + GL_CONVEX_HULL_CHROMIUM, GL_NONE, NULL); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + glStencilThenCoverStrokePathInstancedCHROMIUM(1, GL_FLOAT, &path, 0, 0x0, 0x0, + GL_CONVEX_HULL_CHROMIUM, GL_NONE, NULL); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + glStencilThenCoverStrokePathInstancedCHROMIUM(1, GL_UNSIGNED_INT, NULL, 0, 0x0, 0x0, + GL_CONVEX_HULL_CHROMIUM, GL_NONE, NULL); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + glStencilThenCoverStrokePathInstancedCHROMIUM(1, GL_UNSIGNED_INT, &path, 0, 0x0, 0x0, + GL_FLOAT, GL_NONE, NULL); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + glStencilThenCoverStrokePathInstancedCHROMIUM(1, GL_UNSIGNED_INT, &path, 0, 0x0, 0x0, + GL_CONVEX_HULL_CHROMIUM, GL_FLOAT, NULL); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + glStencilThenCoverStrokePathInstancedCHROMIUM(1, GL_UNSIGNED_INT, &path, 0, 0x0, 0x0, + GL_CONVEX_HULL_CHROMIUM, + GL_TRANSLATE_X_CHROMIUM, NULL); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + } + + glDeletePathsCHROMIUM(path, 1); +} + +const GLfloat kProjectionMatrix[16] = {2.0f / kResolution, + 0.0f, + 0.0f, + 0.0f, + 0.0f, + 2.0f / kResolution, + 0.0f, + 0.0f, + 0.0f, + 0.0f, + -1.0f, + 0.0f, + -1.0f, + -1.0f, + 0.0f, + 1.0f}; + +class CHROMIUMPathRenderingDrawTest : public ANGLETest +{ + protected: + CHROMIUMPathRenderingDrawTest() + { + setWindowWidth(kResolution); + setWindowHeight(kResolution); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + setConfigDepthBits(8); + setConfigStencilBits(8); + } + + bool isApplicable() const { return extensionEnabled("GL_CHROMIUM_path_rendering"); } + + void setupStateForTestPattern() + { + glViewport(0, 0, kResolution, kResolution); + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + glStencilMask(0xffffffff); + glClearStencil(0); + glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + glEnable(GL_STENCIL_TEST); + + static const char *kVertexShaderSource = + "void main() {\n" + " gl_Position = vec4(1.0); \n" + "}"; + + static const char *kFragmentShaderSource = + "precision mediump float;\n" + "uniform vec4 color;\n" + "void main() {\n" + " gl_FragColor = color;\n" + "}"; + + GLuint program = CompileProgram(kVertexShaderSource, kFragmentShaderSource); + glUseProgram(program); + mColorLoc = glGetUniformLocation(program, "color"); + glDeleteProgram(program); + + // Set up orthogonal projection with near/far plane distance of 2. + glMatrixLoadfCHROMIUM(GL_PATH_PROJECTION_CHROMIUM, kProjectionMatrix); + glMatrixLoadIdentityCHROMIUM(GL_PATH_MODELVIEW_CHROMIUM); + + ASSERT_GL_NO_ERROR(); + } + + void setupPathStateForTestPattern(GLuint path) + { + static const GLubyte kCommands[] = {GL_MOVE_TO_CHROMIUM, GL_LINE_TO_CHROMIUM, + GL_QUADRATIC_CURVE_TO_CHROMIUM, + GL_CUBIC_CURVE_TO_CHROMIUM, GL_CLOSE_PATH_CHROMIUM}; + + static const GLfloat kCoords[] = {50.0f, 50.0f, 75.0f, 75.0f, 100.0f, 62.5f, 50.0f, + 25.5f, 0.0f, 62.5f, 50.0f, 50.0f, 25.0f, 75.0f}; + + glPathCommandsCHROMIUM(path, 5, kCommands, 14, GL_FLOAT, kCoords); + glPathParameterfCHROMIUM(path, GL_PATH_STROKE_WIDTH_CHROMIUM, 5.0f); + glPathParameterfCHROMIUM(path, GL_PATH_MITER_LIMIT_CHROMIUM, 1.0f); + glPathParameterfCHROMIUM(path, GL_PATH_STROKE_BOUND_CHROMIUM, .02f); + glPathParameteriCHROMIUM(path, GL_PATH_JOIN_STYLE_CHROMIUM, GL_ROUND_CHROMIUM); + glPathParameteriCHROMIUM(path, GL_PATH_END_CAPS_CHROMIUM, GL_SQUARE_CHROMIUM); + ASSERT_GL_NO_ERROR(); + } + + void verifyTestPatternFill(GLfloat flx, GLfloat fly) + { + static const GLint kFillCoords[] = {55, 54, 50, 28, 66, 63}; + static const angle::GLColor kBlue = {0, 0, 255, 255}; + + GLint x = static_cast<GLint>(flx); + GLint y = static_cast<GLint>(fly); + + for (size_t i = 0; i < 6; i += 2) + { + GLint fx = kFillCoords[i]; + GLint fy = kFillCoords[i + 1]; + EXPECT_TRUE(CheckPixels(x + fx, y + fy, 1, 1, 0, kBlue)); + } + } + void verifyTestPatternBg(GLfloat fx, GLfloat fy) + { + static const GLint kBackgroundCoords[] = {80, 80, 20, 20, 90, 1}; + static const angle::GLColor kExpectedColor = {0, 0, 0, 0}; + + GLint x = static_cast<GLint>(fx); + GLint y = static_cast<GLint>(fy); + + for (size_t i = 0; i < 6; i += 2) + { + GLint bx = kBackgroundCoords[i]; + GLint by = kBackgroundCoords[i + 1]; + EXPECT_TRUE(CheckPixels(x + bx, y + by, 1, 1, 0, kExpectedColor)); + } + } + + void verifyTestPatternStroke(GLfloat fx, GLfloat fy) + { + GLint x = static_cast<GLint>(fx); + GLint y = static_cast<GLint>(fy); + + // Inside the stroke we should have green. + static const angle::GLColor kGreen = {0, 255, 0, 255}; + EXPECT_TRUE(CheckPixels(x + 50, y + 53, 1, 1, 0, kGreen)); + EXPECT_TRUE(CheckPixels(x + 26, y + 76, 1, 1, 0, kGreen)); + + // Outside the path we should have black. + static const angle::GLColor black = {0, 0, 0, 0}; + EXPECT_TRUE(CheckPixels(x + 10, y + 10, 1, 1, 0, black)); + EXPECT_TRUE(CheckPixels(x + 80, y + 80, 1, 1, 0, black)); + } + + GLuint mColorLoc; +}; + +// Tests that basic path rendering functions work. +TEST_P(CHROMIUMPathRenderingDrawTest, TestPathRendering) +{ + if (!isApplicable()) + return; + + static const float kBlue[] = {0.0f, 0.0f, 1.0f, 1.0f}; + static const float kGreen[] = {0.0f, 1.0f, 0.0f, 1.0f}; + + setupStateForTestPattern(); + + GLuint path = glGenPathsCHROMIUM(1); + setupPathStateForTestPattern(path); + + // Do the stencil fill, cover fill, stencil stroke, cover stroke + // in unconventional order: + // 1) stencil the stroke in stencil high bit + // 2) stencil the fill in low bits + // 3) cover the fill + // 4) cover the stroke + // This is done to check that glPathStencilFunc works, eg the mask + // goes through. Stencil func is not tested ATM, for simplicity. + + glPathStencilFuncCHROMIUM(GL_ALWAYS, 0, 0xFF); + glStencilStrokePathCHROMIUM(path, 0x80, 0x80); + + glPathStencilFuncCHROMIUM(GL_ALWAYS, 0, 0x7F); + glStencilFillPathCHROMIUM(path, GL_COUNT_UP_CHROMIUM, 0x7F); + + glStencilFunc(GL_LESS, 0, 0x7F); + glStencilOp(GL_KEEP, GL_KEEP, GL_ZERO); + glUniform4fv(mColorLoc, 1, kBlue); + glCoverFillPathCHROMIUM(path, GL_BOUNDING_BOX_CHROMIUM); + + glStencilFunc(GL_EQUAL, 0x80, 0x80); + glStencilOp(GL_KEEP, GL_KEEP, GL_ZERO); + glUniform4fv(mColorLoc, 1, kGreen); + glCoverStrokePathCHROMIUM(path, GL_CONVEX_HULL_CHROMIUM); + + glDeletePathsCHROMIUM(path, 1); + + ASSERT_GL_NO_ERROR(); + + // Verify the image. + verifyTestPatternFill(0, 0); + verifyTestPatternBg(0, 0); + verifyTestPatternStroke(0, 0); +} + +// Test that StencilThen{Stroke,Fill} path rendering functions work +TEST_P(CHROMIUMPathRenderingDrawTest, TestPathRenderingThenFunctions) +{ + if (!isApplicable()) + return; + + static float kBlue[] = {0.0f, 0.0f, 1.0f, 1.0f}; + static float kGreen[] = {0.0f, 1.0f, 0.0f, 1.0f}; + + setupStateForTestPattern(); + + GLuint path = glGenPathsCHROMIUM(1); + setupPathStateForTestPattern(path); + + glPathStencilFuncCHROMIUM(GL_ALWAYS, 0, 0xFF); + glStencilFunc(GL_EQUAL, 0x80, 0x80); + glStencilOp(GL_KEEP, GL_KEEP, GL_ZERO); + glUniform4fv(mColorLoc, 1, kGreen); + glStencilThenCoverStrokePathCHROMIUM(path, 0x80, 0x80, GL_BOUNDING_BOX_CHROMIUM); + + glPathStencilFuncCHROMIUM(GL_ALWAYS, 0, 0x7F); + glStencilFunc(GL_LESS, 0, 0x7F); + glStencilOp(GL_KEEP, GL_KEEP, GL_ZERO); + glUniform4fv(mColorLoc, 1, kBlue); + glStencilThenCoverFillPathCHROMIUM(path, GL_COUNT_UP_CHROMIUM, 0x7F, GL_CONVEX_HULL_CHROMIUM); + + glDeletePathsCHROMIUM(path, 1); + + // Verify the image. + verifyTestPatternFill(0, 0); + verifyTestPatternBg(0, 0); + verifyTestPatternStroke(0, 0); +} + +// Tests that drawing with *Instanced functions work. +TEST_P(CHROMIUMPathRenderingDrawTest, TestPathRenderingInstanced) +{ + if (!isApplicable()) + return; + + static const float kBlue[] = {0.0f, 0.0f, 1.0f, 1.0f}; + static const float kGreen[] = {0.0f, 1.0f, 0.0f, 1.0f}; + + setupStateForTestPattern(); + + GLuint path = glGenPathsCHROMIUM(1); + setupPathStateForTestPattern(path); + + const GLuint kPaths[] = {1, 1, 1, 1, 1}; + const GLsizei kPathCount = 5; + const GLfloat kShapeSize = 80.0f; + static const GLfloat kTransforms[kPathCount * 12] = { + 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, + 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, kShapeSize, 0.0f, 0.0f, + 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, kShapeSize * 2, 0.0f, 0.0f, + 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, kShapeSize, 0.0f, + 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, kShapeSize, kShapeSize, 0.0f}; + + // The test pattern is the same as in the simple draw case above, + // except that the path is drawn kPathCount times with different offsets. + glPathStencilFuncCHROMIUM(GL_ALWAYS, 0, 0xFF); + glStencilStrokePathInstancedCHROMIUM(kPathCount, GL_UNSIGNED_INT, kPaths, path - 1, 0x80, 0x80, + GL_AFFINE_3D_CHROMIUM, kTransforms); + + glPathStencilFuncCHROMIUM(GL_ALWAYS, 0, 0x7F); + glUniform4fv(mColorLoc, 1, kBlue); + glStencilFillPathInstancedCHROMIUM(kPathCount, GL_UNSIGNED_INT, kPaths, path - 1, + GL_COUNT_UP_CHROMIUM, 0x7F, GL_AFFINE_3D_CHROMIUM, + kTransforms); + + ASSERT_GL_NO_ERROR(); + + glStencilFunc(GL_LESS, 0, 0x7F); + glStencilOp(GL_KEEP, GL_KEEP, GL_ZERO); + glCoverFillPathInstancedCHROMIUM(kPathCount, GL_UNSIGNED_INT, kPaths, path - 1, + GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM, + GL_AFFINE_3D_CHROMIUM, kTransforms); + + ASSERT_GL_NO_ERROR(); + + glStencilFunc(GL_EQUAL, 0x80, 0x80); + glStencilOp(GL_KEEP, GL_KEEP, GL_ZERO); + glUniform4fv(mColorLoc, 1, kGreen); + glCoverStrokePathInstancedCHROMIUM(kPathCount, GL_UNSIGNED_INT, kPaths, path - 1, + GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM, + GL_AFFINE_3D_CHROMIUM, kTransforms); + + ASSERT_GL_NO_ERROR(); + + glDeletePathsCHROMIUM(path, 1); + + // Verify the image. + verifyTestPatternFill(0.0f, 0.0f); + verifyTestPatternBg(0.0f, 0.0f); + verifyTestPatternStroke(0.0f, 0.0f); + + verifyTestPatternFill(kShapeSize, 0.0f); + verifyTestPatternBg(kShapeSize, 0.0f); + verifyTestPatternStroke(kShapeSize, 0.0f); + + verifyTestPatternFill(kShapeSize * 2, 0.0f); + verifyTestPatternBg(kShapeSize * 2, 0.0f); + verifyTestPatternStroke(kShapeSize * 2, 0.0f); + + verifyTestPatternFill(0.0f, kShapeSize); + verifyTestPatternBg(0.0f, kShapeSize); + verifyTestPatternStroke(0.0f, kShapeSize); + + verifyTestPatternFill(kShapeSize, kShapeSize); + verifyTestPatternBg(kShapeSize, kShapeSize); + verifyTestPatternStroke(kShapeSize, kShapeSize); +} + +// Test that instanced fill/stroke then cover functions work. +TEST_P(CHROMIUMPathRenderingDrawTest, TestPathRenderingThenFunctionsInstanced) +{ + if (!isApplicable()) + return; + + static const float kBlue[] = {0.0f, 0.0f, 1.0f, 1.0f}; + static const float kGreen[] = {0.0f, 1.0f, 0.0f, 1.0f}; + + setupStateForTestPattern(); + + GLuint path = glGenPathsCHROMIUM(1); + setupPathStateForTestPattern(path); + + const GLuint kPaths[] = {1, 1, 1, 1, 1}; + const GLsizei kPathCount = 5; + const GLfloat kShapeSize = 80.0f; + static const GLfloat kTransforms[] = { + 0.0f, 0.0f, kShapeSize, 0.0f, kShapeSize * 2, + 0.0f, 0.0f, kShapeSize, kShapeSize, kShapeSize, + }; + + glPathStencilFuncCHROMIUM(GL_ALWAYS, 0, 0xFF); + glStencilFunc(GL_EQUAL, 0x80, 0x80); + glStencilOp(GL_KEEP, GL_KEEP, GL_ZERO); + glUniform4fv(mColorLoc, 1, kGreen); + glStencilThenCoverStrokePathInstancedCHROMIUM( + kPathCount, GL_UNSIGNED_INT, kPaths, path - 1, 0x80, 0x80, + GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM, GL_TRANSLATE_2D_CHROMIUM, kTransforms); + + ASSERT_GL_NO_ERROR(); + + glPathStencilFuncCHROMIUM(GL_ALWAYS, 0, 0x7F); + glStencilFunc(GL_LESS, 0, 0x7F); + glStencilOp(GL_KEEP, GL_KEEP, GL_ZERO); + glUniform4fv(mColorLoc, 1, kBlue); + glStencilThenCoverFillPathInstancedCHROMIUM( + kPathCount, GL_UNSIGNED_INT, kPaths, path - 1, GL_COUNT_UP_CHROMIUM, 0x7F, + GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM, GL_TRANSLATE_2D_CHROMIUM, kTransforms); + + ASSERT_GL_NO_ERROR(); + + glDeletePathsCHROMIUM(path, 1); + + // Verify the image. + verifyTestPatternFill(0.0f, 0.0f); + verifyTestPatternBg(0.0f, 0.0f); + verifyTestPatternStroke(0.0f, 0.0f); + + verifyTestPatternFill(kShapeSize, 0.0f); + verifyTestPatternBg(kShapeSize, 0.0f); + verifyTestPatternStroke(kShapeSize, 0.0f); + + verifyTestPatternFill(kShapeSize * 2, 0.0f); + verifyTestPatternBg(kShapeSize * 2, 0.0f); + verifyTestPatternStroke(kShapeSize * 2, 0.0f); + + verifyTestPatternFill(0.0f, kShapeSize); + verifyTestPatternBg(0.0f, kShapeSize); + verifyTestPatternStroke(0.0f, kShapeSize); + + verifyTestPatternFill(kShapeSize, kShapeSize); + verifyTestPatternBg(kShapeSize, kShapeSize); + verifyTestPatternStroke(kShapeSize, kShapeSize); +} + + +// This class implements a test that draws a grid of v-shapes. The grid is +// drawn so that even rows (from the bottom) are drawn with DrawArrays and odd +// rows are drawn with path rendering. It can be used to test various texturing +// modes, comparing how the fill would work in normal GL rendering and how to +// setup same sort of fill with path rendering. +// The texturing test is parametrized to run the test with and without +// ANGLE name hashing. +class CHROMIUMPathRenderingWithTexturingTest : public ANGLETest +{ + protected: + CHROMIUMPathRenderingWithTexturingTest() : mProgram(0) + { + setWindowWidth(kResolution); + setWindowHeight(kResolution); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + setConfigDepthBits(8); + setConfigStencilBits(8); + } + + bool isApplicable() const { return extensionEnabled("GL_CHROMIUM_path_rendering"); } + + void TearDown() override + { + if (mProgram) + { + glDeleteProgram(mProgram); + ASSERT_GL_NO_ERROR(); + } + + ANGLETest::TearDown(); + } + + void SetUp() override + { + ANGLETest::SetUp(); + mBindUniformLocation = reinterpret_cast<PFNGLBINDUNIFORMLOCATIONCHROMIUMPROC>( + eglGetProcAddress("glBindUniformLocationCHROMIUM")); + } + + // Sets up the GL program state for the test. + // Vertex shader needs at least following variables: + // uniform mat4 view_matrix; + // uniform mat? color_matrix; (accessible with kColorMatrixLocation) + // uniform vec2 model_translate; + // attribute vec2 position; + // varying vec4 color; + // + // Fragment shader needs at least following variables: + // varying vec4 color; + // + // (? can be anything) + void compileProgram(const char *vertexShaderSource, const char *fragmentShaderSource) + { + glViewport(0, 0, kResolution, kResolution); + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + glStencilMask(0xffffffff); + glClearStencil(0); + glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + ASSERT_GL_NO_ERROR(); + + GLuint vShader = compileShader(GL_VERTEX_SHADER, vertexShaderSource); + GLuint fShader = compileShader(GL_FRAGMENT_SHADER, fragmentShaderSource); + ASSERT_NE(0u, vShader); + ASSERT_NE(0u, fShader); + + mProgram = glCreateProgram(); + + glAttachShader(mProgram, vShader); + glAttachShader(mProgram, fShader); + glDeleteShader(vShader); + glDeleteShader(fShader); + + ASSERT_GL_NO_ERROR(); + } + + void bindProgram() + { + glBindAttribLocation(mProgram, kPositionLocation, "position"); + mBindUniformLocation(mProgram, kViewMatrixLocation, "view_matrix"); + mBindUniformLocation(mProgram, kColorMatrixLocation, "color_matrix"); + mBindUniformLocation(mProgram, kModelTranslateLocation, "model_translate"); + glBindFragmentInputLocationCHROMIUM(mProgram, kColorFragmentInputLocation, "color"); + + ASSERT_GL_NO_ERROR(); + } + + bool linkProgram() + { + glLinkProgram(mProgram); + + GLint linked = 0; + glGetProgramiv(mProgram, GL_LINK_STATUS, &linked); + if (linked) + { + glUseProgram(mProgram); + } + + return (linked == 1); + } + + void drawTestPattern() + { + // This v-shape is used both for DrawArrays and path rendering. + static const GLfloat kVertices[] = {75.0f, 75.0f, 50.0f, 25.5f, 50.0f, 50.0f, 25.0f, 75.0f}; + + GLuint vbo = 0; + glGenBuffers(1, &vbo); + glBindBuffer(GL_ARRAY_BUFFER, vbo); + glBufferData(GL_ARRAY_BUFFER, sizeof(kVertices), kVertices, GL_STATIC_DRAW); + glEnableVertexAttribArray(kPositionLocation); + glVertexAttribPointer(kPositionLocation, 2, GL_FLOAT, GL_FALSE, 0, 0); + + // Setup state for drawing the shape with path rendering. + glPathStencilFuncCHROMIUM(GL_ALWAYS, 0, 0x7F); + glStencilFunc(GL_LESS, 0, 0x7F); + glStencilOp(GL_KEEP, GL_KEEP, GL_ZERO); + glMatrixLoadfCHROMIUM(GL_PATH_PROJECTION_CHROMIUM, kProjectionMatrix); + glMatrixLoadIdentityCHROMIUM(GL_PATH_MODELVIEW_CHROMIUM); + + static const GLubyte kCommands[] = {GL_MOVE_TO_CHROMIUM, GL_LINE_TO_CHROMIUM, + GL_LINE_TO_CHROMIUM, GL_LINE_TO_CHROMIUM, + GL_CLOSE_PATH_CHROMIUM}; + + static const GLfloat kCoords[] = { + kVertices[0], kVertices[1], kVertices[2], kVertices[3], + kVertices[6], kVertices[7], kVertices[4], kVertices[5], + }; + + GLuint path = glGenPathsCHROMIUM(1); + glPathCommandsCHROMIUM(path, static_cast<GLsizei>(ArraySize(kCommands)), kCommands, + static_cast<GLsizei>(ArraySize(kCoords)), GL_FLOAT, kCoords); + ASSERT_GL_NO_ERROR(); + + GLfloat path_model_translate[16] = { + 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, + }; + + // Draws the shapes. Every even row from the bottom is drawn with + // DrawArrays, odd row with path rendering. The shader program is + // the same for the both draws. + for (int j = 0; j < kTestRows; ++j) + { + for (int i = 0; i < kTestColumns; ++i) + { + if (j % 2 == 0) + { + glDisable(GL_STENCIL_TEST); + glUniform2f(kModelTranslateLocation, static_cast<GLfloat>(i * kShapeWidth), + static_cast<GLfloat>(j * kShapeHeight)); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + } + else + { + glEnable(GL_STENCIL_TEST); + path_model_translate[12] = static_cast<GLfloat>(i * kShapeWidth); + path_model_translate[13] = static_cast<GLfloat>(j * kShapeHeight); + glMatrixLoadfCHROMIUM(GL_PATH_MODELVIEW_CHROMIUM, path_model_translate); + glStencilThenCoverFillPathCHROMIUM(path, GL_COUNT_UP_CHROMIUM, 0x7F, + GL_BOUNDING_BOX_CHROMIUM); + } + } + } + ASSERT_GL_NO_ERROR(); + + glDisableVertexAttribArray(kPositionLocation); + glDeleteBuffers(1, &vbo); + glDeletePathsCHROMIUM(path, 1); + ASSERT_GL_NO_ERROR(); + } + + enum + { + kShapeWidth = 75, + kShapeHeight = 75, + kTestRows = kResolution / kShapeHeight, + kTestColumns = kResolution / kShapeWidth, + }; + + typedef void(GL_APIENTRYP PFNGLBINDUNIFORMLOCATIONCHROMIUMPROC)(GLuint mProgram, + GLint location, + const GLchar *name); + PFNGLBINDUNIFORMLOCATIONCHROMIUMPROC mBindUniformLocation = nullptr; + + GLuint mProgram; + + // This uniform be can set by the test. It should be used to set the color for + // drawing with DrawArrays. + static const GLint kColorMatrixLocation = 4; + + // This fragment input can be set by the test. It should be used to set the + // color for drawing with path rendering. + static const GLint kColorFragmentInputLocation = 7; + + static const GLint kModelTranslateLocation = 3; + static const GLint kPositionLocation = 0; + static const GLint kViewMatrixLocation = 7; +}; + +// Test success and error cases for binding fragment input location. +TEST_P(CHROMIUMPathRenderingWithTexturingTest, TestBindFragmentInputLocation) +{ + if (!isApplicable()) + return; + + // original NV_path_rendering specification doesn't define whether the + // fragment shader input variables should be defined in the vertex shader or + // not. In fact it doesn't even require a vertex shader. + // However the GLES3.1 spec basically says that fragment inputs are + // either built-ins or come from the previous shader stage. + // (§ 14.1, Fragment Shader Variables). + // Additionally there are many places that are based on the assumption of having + // a vertex shader (command buffer, angle) so we're going to stick to the same + // semantics and require a vertex shader and to have the vertex shader define the + // varying fragment shader input. + + // clang-format off + const char* kVertexShaderSource = + "varying vec4 color;\n" + "void main() {}\n"; + + const char* kFragmentShaderSource = + "precision mediump float;\n" + "varying vec4 color;\n" + "void main() {\n" + " gl_FragColor = vec4(1.0);\n" + "}\n"; + + // clang-format on + compileProgram(kVertexShaderSource, kFragmentShaderSource); + + enum kBindLocations + { + kColorLocation = 5, + kFragColorLocation = 6 + }; + + // successful bind. + glBindFragmentInputLocationCHROMIUM(mProgram, kColorLocation, "color"); + ASSERT_GL_NO_ERROR(); + + // any name can be bound and names that do not actually exist in the program after + // linking are ignored. + glBindFragmentInputLocationCHROMIUM(mProgram, kColorLocation, "doesnt_exist"); + ASSERT_GL_NO_ERROR(); + + // illegal program + glBindFragmentInputLocationCHROMIUM(mProgram + 1, kColorLocation, "color"); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + // illegal bind (built-in) + glBindFragmentInputLocationCHROMIUM(mProgram, kFragColorLocation, "gl_FragColor"); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + glBindFragmentInputLocationCHROMIUM(mProgram, kFragColorLocation, NULL); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + glBindFragmentInputLocationCHROMIUM(mProgram, 0xffffff, "color"); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + ASSERT_TRUE(linkProgram() == true); + + const GLfloat kCoefficients16[] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, + 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f}; + + glProgramPathFragmentInputGenCHROMIUM(mProgram, kColorLocation, GL_EYE_LINEAR_CHROMIUM, 4, + kCoefficients16); + ASSERT_GL_NO_ERROR(); + + glProgramPathFragmentInputGenCHROMIUM(mProgram, -1, GL_EYE_LINEAR_CHROMIUM, 4, kCoefficients16); + ASSERT_GL_NO_ERROR(); +} + +// Test fragment input interpolation in CHROMIUM_EYE coordinates. +TEST_P(CHROMIUMPathRenderingWithTexturingTest, TestProgramPathFragmentInputGenCHROMIUM_EYE) +{ + if (!isApplicable()) + return; + + // clang-format off + const char *kVertexShaderSource = + "uniform mat4 view_matrix;\n" + "uniform mat4 color_matrix;\n" + "uniform vec2 model_translate;\n" + "attribute vec2 position;\n" + "varying vec3 color;\n" + "void main() {\n" + " vec4 p = vec4(model_translate + position, 1.0, 1.0);\n" + " color = (color_matrix * p).rgb;\n" + " gl_Position = view_matrix * p;\n" + "}\n"; + + const char *kFragmentShaderSource = + "precision mediump float;\n" + "varying vec3 color;\n" + "void main() {\n" + " gl_FragColor = vec4(color, 1.0);\n" + "}\n"; + // clang-format on + + compileProgram(kVertexShaderSource, kFragmentShaderSource); + bindProgram(); + ASSERT_TRUE(linkProgram() == true); + + glUniformMatrix4fv(kViewMatrixLocation, 1, GL_FALSE, kProjectionMatrix); + + static const GLfloat kColorMatrix[16] = { + 1.0f / kResolution, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f / kResolution, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f}; + + glUniformMatrix4fv(kColorMatrixLocation, 1, GL_FALSE, kColorMatrix); + + // This is the functionality we are testing: ProgramPathFragmentInputGen + // does the same work as the color transform in vertex shader. + static const GLfloat kColorCoefficients[12] = { + 1.0f / kResolution, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f / kResolution, + 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f}; + glProgramPathFragmentInputGenCHROMIUM(mProgram, kColorFragmentInputLocation, + GL_EYE_LINEAR_CHROMIUM, 3, kColorCoefficients); + ASSERT_GL_NO_ERROR(); + + drawTestPattern(); + + const GLfloat kFillCoords[6] = {59.0f, 50.0f, 50.0f, 28.0f, 66.0f, 63.0f}; + + for (int j = 0; j < kTestRows; ++j) + { + for (int i = 0; i < kTestColumns; ++i) + { + for (size_t k = 0; k < ArraySize(kFillCoords); k += 2) + { + const float fx = kFillCoords[k]; + const float fy = kFillCoords[k + 1]; + const float px = static_cast<float>(i * kShapeWidth); + const float py = static_cast<float>(j * kShapeHeight); + + angle::GLColor color; + color.R = static_cast<GLubyte>(std::roundf((px + fx) / kResolution * 255.0f)); + color.G = static_cast<GLubyte>(std::roundf((py + fy) / kResolution * 255.0f)); + color.B = 0; + color.A = 255; + CheckPixels(static_cast<GLint>(px + fx), static_cast<GLint>(py + fy), 1, 1, 2, + color); + } + } + } +} + +// Test fragment input interpolation in CHROMIUM_OBJECT coordinates. +TEST_P(CHROMIUMPathRenderingWithTexturingTest, TestProgramPathFragmentInputGenCHROMIUM_OBJECT) +{ + if (!isApplicable()) + return; + + // clang-format off + const char *kVertexShaderSource = + "uniform mat4 view_matrix;\n" + "uniform mat4 color_matrix;\n" + "uniform vec2 model_translate;\n" + "attribute vec2 position;\n" + "varying vec3 color;\n" + "void main() {\n" + " color = (color_matrix * vec4(position, 1.0, 1.0)).rgb;\n" + " vec4 p = vec4(model_translate + position, 1.0, 1.0);\n" + " gl_Position = view_matrix * p;\n" + "}"; + + const char *kFragmentShaderSource = + "precision mediump float;\n" + "varying vec3 color;\n" + "void main() {\n" + " gl_FragColor = vec4(color.rgb, 1.0);\n" + "}"; + // clang-format on + + compileProgram(kVertexShaderSource, kFragmentShaderSource); + bindProgram(); + ASSERT_TRUE(linkProgram() == true); + + glUniformMatrix4fv(kViewMatrixLocation, 1, GL_FALSE, kProjectionMatrix); + + static const GLfloat kColorMatrix[16] = { + 1.0f / kShapeWidth, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f / kShapeHeight, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f }; + glUniformMatrix4fv(kColorMatrixLocation, 1, GL_FALSE, kColorMatrix); + + // This is the functionality we are testing: ProgramPathFragmentInputGen + // does the same work as the color transform in vertex shader. + static const GLfloat kColorCoefficients[9] = { + 1.0f / kShapeWidth, 0.0f, 0.0f, 0.0f, 1.0f / kShapeHeight, 0.0f, 0.0f, 0.0f, 0.0f}; + glProgramPathFragmentInputGenCHROMIUM(mProgram, kColorFragmentInputLocation, + GL_OBJECT_LINEAR_CHROMIUM, 3, kColorCoefficients); + + ASSERT_GL_NO_ERROR(); + + drawTestPattern(); + + const GLfloat kFillCoords[6] = {59.0f, 50.0f, 50.0f, 28.0f, 66.0f, 63.0f}; + + for (int j = 0; j < kTestRows; ++j) + { + for (int i = 0; i < kTestColumns; ++i) + { + for (size_t k = 0; k < ArraySize(kFillCoords); k += 2) + { + const float fx = kFillCoords[k]; + const float fy = kFillCoords[k + 1]; + const float px = static_cast<float>(i * kShapeWidth); + const float py = static_cast<float>(j * kShapeHeight); + + angle::GLColor color; + color.R = static_cast<GLubyte>(std::roundf(fx / kShapeWidth * 255.0f)); + color.G = static_cast<GLubyte>(std::roundf(fy / kShapeHeight * 255.0f)); + color.B = 0; + color.A = 255; + CheckPixels(static_cast<GLint>(px + fx), static_cast<GLint>(py + fy), 1, 1, 2, + color); + } + } + } +} + +// Test success and error cases for setting interpolation parameters. +TEST_P(CHROMIUMPathRenderingWithTexturingTest, TestProgramPathFragmentInputGenArgs) +{ + if (!isApplicable()) + return; + + // clang-format off + const char *kVertexShaderSource = + "varying vec2 vec2_var;\n" + "varying vec3 vec3_var;\n" + "varying vec4 vec4_var;\n" + "varying float float_var;\n" + "varying mat2 mat2_var;\n" + "varying mat3 mat3_var;\n" + "varying mat4 mat4_var;\n" + "attribute float avoid_opt;\n" + "void main() {\n" + " vec2_var = vec2(1.0, 2.0 + avoid_opt);\n" + " vec3_var = vec3(1.0, 2.0, 3.0 + avoid_opt);\n" + " vec4_var = vec4(1.0, 2.0, 3.0, 4.0 + avoid_opt);\n" + " float_var = 5.0 + avoid_opt;\n" + " mat2_var = mat2(2.0 + avoid_opt);\n" + " mat3_var = mat3(3.0 + avoid_opt);\n" + " mat4_var = mat4(4.0 + avoid_opt);\n" + " gl_Position = vec4(1.0);\n" + "}"; + + const char* kFragmentShaderSource = + "precision mediump float;\n" + "varying vec2 vec2_var;\n" + "varying vec3 vec3_var;\n" + "varying vec4 vec4_var;\n" + "varying float float_var;\n" + "varying mat2 mat2_var;\n" + "varying mat3 mat3_var;\n" + "varying mat4 mat4_var;\n" + "void main() {\n" + " gl_FragColor = vec4(vec2_var, 0, 0) + vec4(vec3_var, 0) + vec4_var + " + " vec4(float_var) + " + " vec4(mat2_var[0][0], mat3_var[1][1], mat4_var[2][2], 1);\n" + "}"; + // clang-format on + + enum + { + kVec2Location = 0, + kVec3Location, + kVec4Location, + kFloatLocation, + kMat2Location, + kMat3Location, + kMat4Location, + }; + struct + { + GLint location; + const char *name; + GLint components; + } variables[] = { + {kVec2Location, "vec2_var", 2}, + {kVec3Location, "vec3_var", 3}, + {kVec4Location, "vec4_var", 4}, + {kFloatLocation, "float_var", 1}, + // If a varying is not single-precision floating-point scalar or + // vector, it always causes an invalid operation. + {kMat2Location, "mat2_var", -1}, + {kMat3Location, "mat3_var", -1}, + {kMat4Location, "mat4_var", -1}, + }; + + compileProgram(kVertexShaderSource, kFragmentShaderSource); + + for (size_t i = 0; i < ArraySize(variables); ++i) + { + glBindFragmentInputLocationCHROMIUM(mProgram, variables[i].location, variables[i].name); + } + + // test that using invalid (not linked) program is an invalid operation. + // See similar calls at the end of the test for discussion about the arguments. + glProgramPathFragmentInputGenCHROMIUM(mProgram, -1, GL_NONE, 0, NULL); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + ASSERT_TRUE(linkProgram() == true); + + const GLfloat kCoefficients16[] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, + 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f}; + const GLenum kGenModes[] = {GL_NONE, GL_EYE_LINEAR_CHROMIUM, GL_OBJECT_LINEAR_CHROMIUM, + GL_CONSTANT_CHROMIUM}; + + for (size_t variable = 0; variable < ArraySize(variables); ++variable) + { + for (GLint components = 0; components <= 4; ++components) + { + for (size_t genmode = 0; genmode < ArraySize(kGenModes); ++genmode) + { + glProgramPathFragmentInputGenCHROMIUM(mProgram, variables[variable].location, + kGenModes[genmode], components, + kCoefficients16); + + if (components == 0 && kGenModes[genmode] == GL_NONE) + { + if (variables[variable].components == -1) + { + // Clearing a fragment input that is not single-precision floating + // point scalar or vector is an invalid operation. + ASSERT_GL_ERROR(GL_INVALID_OPERATION); + } + else + { + // Clearing a valid fragment input is ok. + ASSERT_GL_NO_ERROR(); + } + } + else if (components == 0 || kGenModes[genmode] == GL_NONE) + { + ASSERT_GL_ERROR(GL_INVALID_VALUE); + } + else + { + if (components == variables[variable].components) + { + // Setting a generator for a single-precision floating point + // scalar or vector fragment input is ok. + ASSERT_GL_NO_ERROR(); + } + else + { + // Setting a generator when components do not match is an invalid operation. + ASSERT_GL_ERROR(GL_INVALID_OPERATION); + } + } + } + } + } + + enum + { + kValidGenMode = GL_CONSTANT_CHROMIUM, + kValidComponents = 3, + kInvalidGenMode = 0xAB, + kInvalidComponents = 5, + }; + + // The location == -1 would mean fragment input was optimized away. At the + // time of writing, -1 can not happen because the only way to obtain the + // location numbers is through bind. Test just to be consistent. + glProgramPathFragmentInputGenCHROMIUM(mProgram, -1, kValidGenMode, kValidComponents, + kCoefficients16); + ASSERT_GL_NO_ERROR(); + + // Test that even though the spec says location == -1 causes the operation to + // be skipped, the verification of other parameters is still done. This is a + // GL policy. + glProgramPathFragmentInputGenCHROMIUM(mProgram, -1, kInvalidGenMode, kValidComponents, + kCoefficients16); + ASSERT_GL_ERROR(GL_INVALID_ENUM); + + glProgramPathFragmentInputGenCHROMIUM(mProgram, -1, kInvalidGenMode, kInvalidComponents, + kCoefficients16); + ASSERT_GL_ERROR(GL_INVALID_ENUM); + + glProgramPathFragmentInputGenCHROMIUM(mProgram, -1, kValidGenMode, kInvalidComponents, + kCoefficients16); + ASSERT_GL_ERROR(GL_INVALID_VALUE); + + glDeleteProgram(mProgram); + + // Test that using invalid (deleted) program is an invalid operation. + EXPECT_FALSE(glIsProgram(mProgram) == GL_FALSE); + + glProgramPathFragmentInputGenCHROMIUM(mProgram, -1, kValidGenMode, kValidComponents, + kCoefficients16); + ASSERT_GL_ERROR(GL_INVALID_OPERATION); + + glProgramPathFragmentInputGenCHROMIUM(mProgram, -1, kInvalidGenMode, kValidComponents, + kCoefficients16); + ASSERT_GL_ERROR(GL_INVALID_OPERATION); + + glProgramPathFragmentInputGenCHROMIUM(mProgram, -1, kInvalidGenMode, kInvalidComponents, + kCoefficients16); + ASSERT_GL_ERROR(GL_INVALID_OPERATION); + + glProgramPathFragmentInputGenCHROMIUM(mProgram, -1, kValidGenMode, kInvalidComponents, + kCoefficients16); + ASSERT_GL_ERROR(GL_INVALID_OPERATION); + + mProgram = 0u; +} + +// Test that having input statically aliased fragment inputs the linking fails +// and then succeeds when the conflict is resolved. +TEST_P(CHROMIUMPathRenderingWithTexturingTest, TestConflictingBind) +{ + if (!isApplicable()) + return; + + // clang-format off + const char* kVertexShaderSource = + "attribute vec4 position;\n" + "varying vec4 colorA;\n" + "varying vec4 colorB;\n" + "void main() {\n" + " gl_Position = position;\n" + " colorA = position + vec4(1);\n" + " colorB = position + vec4(2);\n" + "}"; + + const char* kFragmentShaderSource = + "precision mediump float;\n" + "varying vec4 colorA;\n" + "varying vec4 colorB;\n" + "void main() {\n" + " gl_FragColor = colorA + colorB;\n" + "}"; + // clang-format on + + const GLint kColorALocation = 3; + const GLint kColorBLocation = 4; + + compileProgram(kVertexShaderSource, kFragmentShaderSource); + + glBindFragmentInputLocationCHROMIUM(mProgram, kColorALocation, "colorA"); + // Bind colorB to location a, causing conflicts. Linking should fail. + glBindFragmentInputLocationCHROMIUM(mProgram, kColorALocation, "colorB"); + + // Should fail now. + ASSERT_TRUE(linkProgram() == false); + ASSERT_GL_NO_ERROR(); + + // Resolve the bind conflict. + glBindFragmentInputLocationCHROMIUM(mProgram, kColorBLocation, "colorB"); + + ASSERT_TRUE(linkProgram() == true); + ASSERT_GL_NO_ERROR(); +} + +// Test binding with array variables, using zero indices. Tests that +// binding colorA[0] with explicit "colorA[0]" as well as "colorA" produces +// a correct location that can be used with PathProgramFragmentInputGen. +// For path rendering, colorA[0] is bound to a location. The input generator for +// the location is set to produce vec4(0, 0.1, 0, 0.1). +// The default varying, color, is bound to a location and its generator +// will produce vec4(10.0). The shader program produces green pixels. +// For vertex-based rendering, the vertex shader produces the same effect as +// the input generator for path rendering. +TEST_P(CHROMIUMPathRenderingWithTexturingTest, BindFragmentInputArray) +{ + if (!isApplicable()) + return; + + //clang-format off + const char* kVertexShaderSource = + "uniform mat4 view_matrix;\n" + "uniform mat4 color_matrix;\n" + "uniform vec2 model_translate;\n" + "attribute vec2 position;\n" + "varying vec4 color;\n" + "varying vec4 colorA[4];\n" + "void main() {\n" + " vec4 p = vec4(model_translate + position, 1, 1);\n" + " gl_Position = view_matrix * p;\n" + " colorA[0] = vec4(0.0, 0.1, 0, 0.1);\n" + " colorA[1] = vec4(0.2);\n" + " colorA[2] = vec4(0.3);\n" + " colorA[3] = vec4(0.4);\n" + " color = vec4(10.0);\n" + "}"; + + const char* kFragmentShaderSource = + "precision mediump float;\n" + "varying vec4 color;\n" + "varying vec4 colorA[4];\n" + "void main() {\n" + " gl_FragColor = colorA[0] * color;\n" + "}"; + // clang-format on + + const GLint kColorA0Location = 4; + const GLint kUnusedLocation = 5; + const GLfloat kColorA0[] = {0.0f, 0.1f, 0.0f, 0.1f}; + const GLfloat kColor[] = {10.0f, 10.0f, 10.0f, 10.0f}; + const GLfloat kFillCoords[6] = {59.0f, 50.0f, 50.0f, 28.0f, 66.0f, 63.0f}; + + for (int pass = 0; pass < 2; ++pass) + { + compileProgram(kVertexShaderSource, kFragmentShaderSource); + if (pass == 0) + { + glBindFragmentInputLocationCHROMIUM(mProgram, kUnusedLocation, "colorA[0]"); + glBindFragmentInputLocationCHROMIUM(mProgram, kColorA0Location, "colorA"); + } + else + { + glBindFragmentInputLocationCHROMIUM(mProgram, kUnusedLocation, "colorA"); + glBindFragmentInputLocationCHROMIUM(mProgram, kColorA0Location, "colorA[0]"); + } + + bindProgram(); + + ASSERT_TRUE(linkProgram() == true); + + glUniformMatrix4fv(kViewMatrixLocation, 1, GL_FALSE, kProjectionMatrix); + glProgramPathFragmentInputGenCHROMIUM(mProgram, kColorA0Location, GL_CONSTANT_CHROMIUM, 4, kColorA0); + glProgramPathFragmentInputGenCHROMIUM(mProgram, kColorFragmentInputLocation, GL_CONSTANT_CHROMIUM, 4, kColor); + ASSERT_GL_NO_ERROR(); + + drawTestPattern(); + + for (int j = 0; j < kTestRows; ++j) + { + for (int i = 0; i < kTestColumns; ++i) + { + for (size_t k = 0; k < ArraySize(kFillCoords); k += 2) + { + const float fx = kFillCoords[k]; + const float fy = kFillCoords[k + 1]; + const float px = static_cast<float>(i * kShapeWidth); + const float py = static_cast<float>(j * kShapeHeight); + + angle::GLColor color; + color.R = 0; + color.G = 255; + color.B = 0; + color.A = 255; + CheckPixels(static_cast<GLint>(px + fx), static_cast<GLint>(py + fy), 1, 1, 2, + color); + } + } + } + } +} + +// Test binding array variables. This is like BindFragmentInputArray. +// Currently disabled since it seems there's a driver bug with the +// older drivers. This should work with driver >= 364.12 +TEST_P(CHROMIUMPathRenderingWithTexturingTest, + DISABLED_BindFragmentInputArrayNonZeroIndex) +{ + if (!isApplicable()) + return; + + // clang-format off + const char* kVertexShaderSource = + "uniform mat4 view_matrix;\n" + "uniform mat4 color_matrix;\n" + "uniform vec2 model_translate;\n" + "attribute vec2 position;\n" + "varying vec4 color;\n" + "varying vec4 colorA[4];\n" + "void main() {\n" + " vec4 p = vec4(model_translate + position, 1, 1);\n" + " gl_Position = view_matrix * p;\n" + " colorA[0] = vec4(0, 0.1, 0, 0.1);\n" + " colorA[1] = vec4(0, 1, 0, 1);\n" + " colorA[2] = vec4(0, 0.8, 0, 0.8);\n" + " colorA[3] = vec4(0, 0.5, 0, 0.5);\n" + " color = vec4(0.2);\n" + "}\n"; + + const char* kFragmentShaderSource = + "precision mediump float;\n" + "varying vec4 colorA[4];\n" + "varying vec4 color;\n" + "void main() {\n" + " gl_FragColor = (colorA[0] * colorA[1]) +\n" + " colorA[2] + (colorA[3] * color);\n" + "}\n"; + // clang-format on + + const GLint kColorA0Location = 4; + const GLint kColorA1Location = 1; + const GLint kColorA2Location = 2; + const GLint kColorA3Location = 3; + const GLint kUnusedLocation = 5; + const GLfloat kColorA0[] = {0.0f, 0.1f, 0.0f, 0.1f}; + const GLfloat kColorA1[] = {0.0f, 1.0f, 0.0f, 1.0f}; + const GLfloat kColorA2[] = {0.0f, 0.8f, 0.0f, 0.8f}; + const GLfloat kColorA3[] = {0.0f, 0.5f, 0.0f, 0.5f}; + const GLfloat kColor[] = {0.2f, 0.2f, 0.2f, 0.2f}; + const GLfloat kFillCoords[6] = {59.0f, 50.0f, 50.0f, 28.0f, 66.0f, 63.0f}; + + compileProgram(kVertexShaderSource, kFragmentShaderSource); + + glBindFragmentInputLocationCHROMIUM(mProgram, kUnusedLocation, "colorA[0]"); + glBindFragmentInputLocationCHROMIUM(mProgram, kColorA1Location, "colorA[1]"); + glBindFragmentInputLocationCHROMIUM(mProgram, kColorA2Location, "colorA[2]"); + glBindFragmentInputLocationCHROMIUM(mProgram, kColorA3Location, "colorA[3]"); + glBindFragmentInputLocationCHROMIUM(mProgram, kColorA0Location, "colorA"); + ASSERT_GL_NO_ERROR(); + + bindProgram(); + ASSERT_TRUE(linkProgram() == true); + + glUniformMatrix4fv(kViewMatrixLocation, 1, GL_FALSE, kProjectionMatrix); + + glProgramPathFragmentInputGenCHROMIUM(mProgram, kColorA0Location, GL_CONSTANT_CHROMIUM, 4, kColorA0); + glProgramPathFragmentInputGenCHROMIUM(mProgram, kColorA1Location, GL_CONSTANT_CHROMIUM, 4, kColorA1); + glProgramPathFragmentInputGenCHROMIUM(mProgram, kColorA2Location, GL_CONSTANT_CHROMIUM, 4, kColorA2); + glProgramPathFragmentInputGenCHROMIUM(mProgram, kColorA3Location, GL_CONSTANT_CHROMIUM, 4, kColorA3); + glProgramPathFragmentInputGenCHROMIUM(mProgram, kColorFragmentInputLocation, + GL_CONSTANT_CHROMIUM, 4, kColor); + ASSERT_GL_NO_ERROR(); + + drawTestPattern(); + + for (int j = 0; j < kTestRows; ++j) + { + for (int i = 0; i < kTestColumns; ++i) + { + for (size_t k = 0; k < ArraySize(kFillCoords); k += 2) + { + const float fx = kFillCoords[k]; + const float fy = kFillCoords[k + 1]; + const float px = static_cast<float>(i * kShapeWidth); + const float py = static_cast<float>(j * kShapeHeight); + + angle::GLColor color; + color.R = 0; + color.G = 255; + color.B = 0; + color.A = 255; + CheckPixels(static_cast<GLint>(px + fx), static_cast<GLint>(py + fy), 1, 1, 2, + color); + } + } + } +} + +TEST_P(CHROMIUMPathRenderingWithTexturingTest, UnusedFragmentInputUpdate) +{ + if (!isApplicable()) + return; + + // clang-format off + const char* kVertexShaderString = + "attribute vec4 a_position;\n" + "void main() {\n" + " gl_Position = a_position;\n" + "}"; + + const char* kFragmentShaderString = + "precision mediump float;\n" + "uniform vec4 u_colorA;\n" + "uniform float u_colorU;\n" + "uniform vec4 u_colorC;\n" + "void main() {\n" + " gl_FragColor = u_colorA + u_colorC;\n" + "}"; + // clang-format on + + const GLint kColorULocation = 1; + const GLint kNonexistingLocation = 5; + const GLint kUnboundLocation = 6; + + compileProgram(kVertexShaderString, kFragmentShaderString); + + glBindFragmentInputLocationCHROMIUM(mProgram, kColorULocation, "u_colorU"); + + // The non-existing input should behave like existing but optimized away input. + glBindFragmentInputLocationCHROMIUM(mProgram, kNonexistingLocation, "nonexisting"); + + // Let A and C be assigned automatic locations. + ASSERT_TRUE(linkProgram() == true); + + const GLfloat kColor[16] = {}; + + // No errors on bound locations, since caller does not know + // if the driver optimizes them away or not. + glProgramPathFragmentInputGenCHROMIUM(mProgram, kColorULocation, GL_CONSTANT_CHROMIUM, 1, kColor); + ASSERT_GL_NO_ERROR(); + + // No errors on bound locations of names that do not exist + // in the shader. Otherwise it would be inconsistent wrt the + // optimization case. + glProgramPathFragmentInputGenCHROMIUM(mProgram, kNonexistingLocation, GL_CONSTANT_CHROMIUM, 1, kColor); + ASSERT_GL_NO_ERROR(); + + // The above are equal to updating -1. + glProgramPathFragmentInputGenCHROMIUM(mProgram, -1, GL_CONSTANT_CHROMIUM, 1, kColor); + ASSERT_GL_NO_ERROR(); + + // No errors when updating with other type either. + // The type can not be known with the non-existing case. + glProgramPathFragmentInputGenCHROMIUM(mProgram, kColorULocation, GL_CONSTANT_CHROMIUM, 4, kColor); + ASSERT_GL_NO_ERROR(); + + glProgramPathFragmentInputGenCHROMIUM(mProgram, kNonexistingLocation, GL_CONSTANT_CHROMIUM, 4, kColor); + ASSERT_GL_NO_ERROR(); + + glProgramPathFragmentInputGenCHROMIUM(mProgram, -1, GL_CONSTANT_CHROMIUM, 4, kColor); + ASSERT_GL_NO_ERROR(); + + // Updating an unbound, non-existing location still causes an error. + glProgramPathFragmentInputGenCHROMIUM(mProgram, kUnboundLocation, GL_CONSTANT_CHROMIUM, 4, kColor); + ASSERT_GL_ERROR(GL_INVALID_OPERATION); +} + + +} // namespace + +ANGLE_INSTANTIATE_TEST(CHROMIUMPathRenderingTest, + ES2_OPENGL(), + ES2_OPENGLES(), + ES3_OPENGL(), + ES3_OPENGLES()); +ANGLE_INSTANTIATE_TEST(CHROMIUMPathRenderingDrawTest, + ES2_OPENGL(), + ES2_OPENGLES(), + ES3_OPENGL(), + ES3_OPENGLES()); + +ANGLE_INSTANTIATE_TEST(CHROMIUMPathRenderingWithTexturingTest, + ES2_OPENGL(), + ES2_OPENGLES(), + ES3_OPENGL(), + ES3_OPENGLES());
\ No newline at end of file diff --git a/gfx/angle/src/tests/gl_tests/PbufferTest.cpp b/gfx/angle/src/tests/gl_tests/PbufferTest.cpp new file mode 100755 index 000000000..fb381e143 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/PbufferTest.cpp @@ -0,0 +1,343 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "test_utils/ANGLETest.h" + +using namespace angle; + +class PbufferTest : public ANGLETest +{ + protected: + PbufferTest() + { + setWindowWidth(512); + setWindowHeight(512); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + virtual void SetUp() + { + ANGLETest::SetUp(); + + const std::string vsSource = SHADER_SOURCE + ( + precision highp float; + attribute vec4 position; + varying vec2 texcoord; + + void main() + { + gl_Position = position; + texcoord = (position.xy * 0.5) + 0.5; + texcoord.y = 1.0 - texcoord.y; + } + ); + + const std::string textureFSSource = SHADER_SOURCE + ( + precision highp float; + uniform sampler2D tex; + varying vec2 texcoord; + + void main() + { + gl_FragColor = texture2D(tex, texcoord); + } + ); + + mTextureProgram = CompileProgram(vsSource, textureFSSource); + if (mTextureProgram == 0) + { + FAIL() << "shader compilation failed."; + } + + mTextureUniformLocation = glGetUniformLocation(mTextureProgram, "tex"); + + EGLWindow *window = getEGLWindow(); + + EGLint surfaceType = 0; + eglGetConfigAttrib(window->getDisplay(), window->getConfig(), EGL_SURFACE_TYPE, &surfaceType); + mSupportsPbuffers = (surfaceType & EGL_PBUFFER_BIT) != 0; + + EGLint bindToTextureRGBA = 0; + eglGetConfigAttrib(window->getDisplay(), window->getConfig(), EGL_BIND_TO_TEXTURE_RGBA, &bindToTextureRGBA); + mSupportsBindTexImage = (bindToTextureRGBA == EGL_TRUE); + + const EGLint pBufferAttributes[] = + { + EGL_WIDTH, static_cast<EGLint>(mPbufferSize), + EGL_HEIGHT, static_cast<EGLint>(mPbufferSize), + EGL_TEXTURE_FORMAT, mSupportsBindTexImage ? EGL_TEXTURE_RGBA : EGL_NO_TEXTURE, + EGL_TEXTURE_TARGET, mSupportsBindTexImage ? EGL_TEXTURE_2D : EGL_NO_TEXTURE, + EGL_NONE, EGL_NONE, + }; + + mPbuffer = eglCreatePbufferSurface(window->getDisplay(), window->getConfig(), pBufferAttributes); + if (mSupportsPbuffers) + { + ASSERT_NE(mPbuffer, EGL_NO_SURFACE); + ASSERT_EGL_SUCCESS(); + } + else + { + ASSERT_EQ(mPbuffer, EGL_NO_SURFACE); + ASSERT_EGL_ERROR(EGL_BAD_MATCH); + } + + ASSERT_GL_NO_ERROR(); + } + + virtual void TearDown() + { + glDeleteProgram(mTextureProgram); + + EGLWindow *window = getEGLWindow(); + eglDestroySurface(window->getDisplay(), mPbuffer); + + ANGLETest::TearDown(); + } + + GLuint mTextureProgram; + GLint mTextureUniformLocation; + + const size_t mPbufferSize = 32; + EGLSurface mPbuffer; + bool mSupportsPbuffers; + bool mSupportsBindTexImage; +}; + +// Test clearing a Pbuffer and checking the color is correct +TEST_P(PbufferTest, Clearing) +{ + if (!mSupportsPbuffers) + { + std::cout << "Test skipped because Pbuffers are not supported." << std::endl; + return; + } + + EGLWindow *window = getEGLWindow(); + + // Clear the window surface to blue and verify + eglMakeCurrent(window->getDisplay(), window->getSurface(), window->getSurface(), window->getContext()); + ASSERT_EGL_SUCCESS(); + + glClearColor(0.0f, 0.0f, 1.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + ASSERT_GL_NO_ERROR(); + EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 0, 0, 255, 255); + + // Apply the Pbuffer and clear it to purple and verify + eglMakeCurrent(window->getDisplay(), mPbuffer, mPbuffer, window->getContext()); + ASSERT_EGL_SUCCESS(); + + glViewport(0, 0, static_cast<GLsizei>(mPbufferSize), static_cast<GLsizei>(mPbufferSize)); + glClearColor(1.0f, 0.0f, 1.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + ASSERT_GL_NO_ERROR(); + EXPECT_PIXEL_EQ(static_cast<GLint>(mPbufferSize) / 2, static_cast<GLint>(mPbufferSize) / 2, 255, + 0, 255, 255); + + // Rebind the window surface and verify that it is still blue + eglMakeCurrent(window->getDisplay(), window->getSurface(), window->getSurface(), window->getContext()); + ASSERT_EGL_SUCCESS(); + EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 0, 0, 255, 255); +} + +// Bind the Pbuffer to a texture and verify it renders correctly +TEST_P(PbufferTest, BindTexImage) +{ + if (!mSupportsPbuffers) + { + std::cout << "Test skipped because Pbuffers are not supported." << std::endl; + return; + } + + if (!mSupportsBindTexImage) + { + std::cout << "Test skipped because Pbuffer does not support binding to RGBA textures." << std::endl; + return; + } + + EGLWindow *window = getEGLWindow(); + + // Apply the Pbuffer and clear it to purple + eglMakeCurrent(window->getDisplay(), mPbuffer, mPbuffer, window->getContext()); + ASSERT_EGL_SUCCESS(); + + glViewport(0, 0, static_cast<GLsizei>(mPbufferSize), static_cast<GLsizei>(mPbufferSize)); + glClearColor(1.0f, 0.0f, 1.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + ASSERT_GL_NO_ERROR(); + + EXPECT_PIXEL_EQ(static_cast<GLint>(mPbufferSize) / 2, static_cast<GLint>(mPbufferSize) / 2, 255, + 0, 255, 255); + + // Apply the window surface + eglMakeCurrent(window->getDisplay(), window->getSurface(), window->getSurface(), window->getContext()); + + // Create a texture and bind the Pbuffer to it + GLuint texture = 0; + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_2D, texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + EXPECT_GL_NO_ERROR(); + + eglBindTexImage(window->getDisplay(), mPbuffer, EGL_BACK_BUFFER); + glViewport(0, 0, getWindowWidth(), getWindowHeight()); + ASSERT_EGL_SUCCESS(); + + // Draw a quad and verify that it is purple + glUseProgram(mTextureProgram); + glUniform1i(mTextureUniformLocation, 0); + + drawQuad(mTextureProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + + // Unbind the texture + eglReleaseTexImage(window->getDisplay(), mPbuffer, EGL_BACK_BUFFER); + ASSERT_EGL_SUCCESS(); + + // Verify that purple was drawn + EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 255, 0, 255, 255); + + glDeleteTextures(1, &texture); +} + +// Verify that when eglBind/ReleaseTexImage are called, the texture images are freed and their +// size information is correctly updated. +TEST_P(PbufferTest, TextureSizeReset) +{ + if (!mSupportsPbuffers) + { + std::cout << "Test skipped because Pbuffers are not supported." << std::endl; + return; + } + + if (!mSupportsBindTexImage) + { + std::cout << "Test skipped because Pbuffer does not support binding to RGBA textures." << std::endl; + return; + } + + GLuint texture = 0; + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_2D, texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + EXPECT_GL_NO_ERROR(); + + glUseProgram(mTextureProgram); + glUniform1i(mTextureUniformLocation, 0); + + // Fill the texture with white pixels + std::vector<GLubyte> whitePixels(mPbufferSize * mPbufferSize * 4, 255); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, static_cast<GLsizei>(mPbufferSize), + static_cast<GLsizei>(mPbufferSize), 0, GL_RGBA, GL_UNSIGNED_BYTE, &whitePixels[0]); + EXPECT_GL_NO_ERROR(); + + // Draw the white texture and verify that the pixels are correct + drawQuad(mTextureProgram, "position", 0.5f); + EXPECT_PIXEL_EQ(0, 0, 255, 255, 255, 255); + + // Bind the EGL surface and draw with it, results are undefined since nothing has + // been written to it + EGLWindow *window = getEGLWindow(); + eglBindTexImage(window->getDisplay(), mPbuffer, EGL_BACK_BUFFER); + drawQuad(mTextureProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + + // Clear the back buffer to a unique color (green) + glClearColor(0.0f, 1.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + EXPECT_PIXEL_EQ(0, 0, 0, 255, 0, 255); + + // Unbind the EGL surface and try to draw with the texture again, the texture's size should + // now be zero and incomplete so the back buffer should be black + eglReleaseTexImage(window->getDisplay(), mPbuffer, EGL_BACK_BUFFER); + drawQuad(mTextureProgram, "position", 0.5f); + EXPECT_PIXEL_EQ(0, 0, 0, 0, 0, 255); +} + +// Bind a Pbuffer, redefine the texture, and verify it renders correctly +TEST_P(PbufferTest, BindTexImageAndRedefineTexture) +{ + if (!mSupportsPbuffers) + { + std::cout << "Test skipped because Pbuffers are not supported." << std::endl; + return; + } + + if (!mSupportsBindTexImage) + { + std::cout << "Test skipped because Pbuffer does not support binding to RGBA textures." << std::endl; + return; + } + + EGLWindow *window = getEGLWindow(); + + // Apply the Pbuffer and clear it to purple + eglMakeCurrent(window->getDisplay(), mPbuffer, mPbuffer, window->getContext()); + ASSERT_EGL_SUCCESS(); + + glViewport(0, 0, static_cast<GLsizei>(mPbufferSize), static_cast<GLsizei>(mPbufferSize)); + glClearColor(1.0f, 0.0f, 1.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + ASSERT_GL_NO_ERROR(); + + EXPECT_PIXEL_EQ(static_cast<GLint>(mPbufferSize) / 2, static_cast<GLint>(mPbufferSize) / 2, 255, + 0, 255, 255); + + // Apply the window surface + eglMakeCurrent(window->getDisplay(), window->getSurface(), window->getSurface(), window->getContext()); + + // Create a texture and bind the Pbuffer to it + GLuint texture = 0; + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_2D, texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + EXPECT_GL_NO_ERROR(); + + eglBindTexImage(window->getDisplay(), mPbuffer, EGL_BACK_BUFFER); + glViewport(0, 0, getWindowWidth(), getWindowHeight()); + ASSERT_EGL_SUCCESS(); + + // Redefine the texture + unsigned int pixelValue = 0xFFFF00FF; + std::vector<unsigned int> pixelData(getWindowWidth() * getWindowHeight(), pixelValue); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWindowWidth(), getWindowHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, &pixelData[0]); + + // Draw a quad and verify that it is magenta + glUseProgram(mTextureProgram); + glUniform1i(mTextureUniformLocation, 0); + + drawQuad(mTextureProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + + // Verify that magenta was drawn + EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 255, 0, 255, 255); + + glDeleteTextures(1, &texture); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(PbufferTest, + ES2_D3D9(), + ES2_D3D11(), + ES2_OPENGL(), + ES2_D3D11_WARP(), + ES2_D3D11_REFERENCE(), + ES2_OPENGLES()); diff --git a/gfx/angle/src/tests/gl_tests/PointSpritesTest.cpp b/gfx/angle/src/tests/gl_tests/PointSpritesTest.cpp new file mode 100755 index 000000000..2045e48cc --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/PointSpritesTest.cpp @@ -0,0 +1,526 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// Some of the pointsprite tests below were ported from Khronos WebGL +// conformance test suite. + +#include "test_utils/ANGLETest.h" + +#include <cmath> + +using namespace angle; + +class PointSpritesTest : public ANGLETest +{ + protected: + const int windowWidth = 256; + const int windowHeight = 256; + PointSpritesTest() + { + setWindowWidth(windowWidth); + setWindowHeight(windowHeight); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + virtual void SetUp() + { + ANGLETest::SetUp(); + } + + float s2p(float s) + { + return (s + 1.0f) * 0.5f * (GLfloat)windowWidth; + } +}; + +// Checks gl_PointCoord and gl_PointSize +// https://www.khronos.org/registry/webgl/sdk/tests/conformance/glsl/variables/gl-pointcoord.html +TEST_P(PointSpritesTest, PointCoordAndPointSizeCompliance) +{ + // TODO(jmadill): figure out why this fails + if (IsIntel() && GetParam() == ES2_D3D9()) + { + std::cout << "Test skipped on Intel due to failures." << std::endl; + return; + } + + const std::string fs = SHADER_SOURCE + ( + precision mediump float; + void main() + { + gl_FragColor = vec4( + gl_PointCoord.x, + gl_PointCoord.y, + 0, + 1); + } + ); + + const std::string vs = SHADER_SOURCE + ( + attribute vec4 vPosition; + uniform float uPointSize; + void main() + { + gl_PointSize = uPointSize; + gl_Position = vPosition; + } + ); + + GLuint program = CompileProgram(vs, fs); + ASSERT_NE(program, 0u); + ASSERT_GL_NO_ERROR(); + + glUseProgram(program); + + GLfloat pointSizeRange[2] = {}; + glGetFloatv(GL_ALIASED_POINT_SIZE_RANGE, pointSizeRange); + + GLfloat maxPointSize = pointSizeRange[1]; + + ASSERT_TRUE(maxPointSize >= 1); + maxPointSize = floorf(maxPointSize); + ASSERT_TRUE((int)maxPointSize % 1 == 0); + + maxPointSize = std::min(maxPointSize, 64.0f); + GLfloat pointWidth = maxPointSize / windowWidth; + GLint step = static_cast<GLint>(floorf(maxPointSize / 4)); + GLint pointStep = std::max<GLint>(1, step); + + GLint pointSizeLoc = glGetUniformLocation(program, "uPointSize"); + ASSERT_GL_NO_ERROR(); + + glUniform1f(pointSizeLoc, maxPointSize); + ASSERT_GL_NO_ERROR(); + + GLfloat pixelOffset = ((int)maxPointSize % 2) ? (1.0f / (GLfloat)windowWidth) : 0; + GLuint vertexObject = 0; + glGenBuffers(1, &vertexObject); + ASSERT_NE(vertexObject, 0U); + ASSERT_GL_NO_ERROR(); + + glBindBuffer(GL_ARRAY_BUFFER, vertexObject); + ASSERT_GL_NO_ERROR(); + + GLfloat thePoints[] = { -0.5f + pixelOffset, -0.5f + pixelOffset, + 0.5f + pixelOffset, -0.5f + pixelOffset, + -0.5f + pixelOffset, 0.5f + pixelOffset, + 0.5f + pixelOffset, 0.5f + pixelOffset }; + + glBufferData(GL_ARRAY_BUFFER, sizeof(thePoints), thePoints, GL_STATIC_DRAW); + ASSERT_GL_NO_ERROR(); + + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glDrawArrays(GL_POINTS, 0, 4); + ASSERT_GL_NO_ERROR(); + + glDeleteBuffers(1, &vertexObject); + + std::string debugText; + for (float py = 0; py < 2; ++py) { + for (float px = 0; px < 2; ++px) { + float pointX = -0.5f + px + pixelOffset; + float pointY = -0.5f + py + pixelOffset; + for (int yy = 0; yy < maxPointSize; yy += pointStep) { + for (int xx = 0; xx < maxPointSize; xx += pointStep) { + // formula for s and t from OpenGL ES 2.0 spec section 3.3 + float xw = s2p(pointX); + float yw = s2p(pointY); + float u = xx / maxPointSize * 2 - 1; + float v = yy / maxPointSize * 2 - 1; + int xf = static_cast<int>(floorf(s2p(pointX + u * pointWidth))); + int yf = static_cast<int>(floorf(s2p(pointY + v * pointWidth))); + float s = 0.5f + (xf + 0.5f - xw) / maxPointSize; + float t = 0.5f + (yf + 0.5f - yw) / maxPointSize; + GLubyte color[4] = { static_cast<GLubyte>(floorf(s * 255)), static_cast<GLubyte>(floorf((1 - t) * 255)), 0, 255 }; + EXPECT_PIXEL_NEAR(xf, yf, color[0], color[1], color[2], color[3], 4); + } + } + } + } +} + +// Verify that drawing a point without enabling any attributes succeeds +// https://www.khronos.org/registry/webgl/sdk/tests/conformance/rendering/point-no-attributes.html +TEST_P(PointSpritesTest, PointWithoutAttributesCompliance) +{ + // clang-format off + const std::string fs = SHADER_SOURCE + ( + precision mediump float; + void main() + { + gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); + } + ); + + const std::string vs = SHADER_SOURCE + ( + void main() + { + gl_PointSize = 2.0; + gl_Position = vec4(0.0, 0.0, 0.0, 1.0); + } + ); + // clang-format on + + GLuint program = CompileProgram(vs, fs); + ASSERT_NE(program, 0u); + ASSERT_GL_NO_ERROR(); + + glUseProgram(program); + + glDrawArrays(GL_POINTS, 0, 1); + ASSERT_GL_NO_ERROR(); + + // expect the center pixel to be green + EXPECT_PIXEL_EQ((windowWidth - 1) / 2, (windowHeight - 1) / 2, 0, 255, 0, 255); +} + +// This is a regression test for a graphics driver bug affecting end caps on roads in MapsGL +// https://www.khronos.org/registry/webgl/sdk/tests/conformance/rendering/point-with-gl-pointcoord-in-fragment-shader.html +TEST_P(PointSpritesTest, PointCoordRegressionTest) +{ + const std::string fs = SHADER_SOURCE + ( + precision mediump float; + varying vec4 v_color; + void main() + { + // It seems as long as this mathematical expression references + // gl_PointCoord, the fragment's color is incorrect. + vec2 diff = gl_PointCoord - vec2(.5, .5); + if (length(diff) > 0.5) + discard; + + // The point should be a solid color. + gl_FragColor = v_color; + } + ); + + const std::string vs = SHADER_SOURCE + ( + varying vec4 v_color; + // The X and Y coordinates of the center of the point. + attribute vec2 a_vertex; + uniform float u_pointSize; + void main() + { + gl_PointSize = u_pointSize; + gl_Position = vec4(a_vertex, 0.0, 1.0); + // The color of the point. + v_color = vec4(0.0, 1.0, 0.0, 1.0); + } + ); + + GLuint program = CompileProgram(vs, fs); + ASSERT_NE(program, 0u); + ASSERT_GL_NO_ERROR(); + + glUseProgram(program); + + GLfloat pointSizeRange[2] = {}; + glGetFloatv(GL_ALIASED_POINT_SIZE_RANGE, pointSizeRange); + + GLfloat maxPointSize = pointSizeRange[1]; + + ASSERT_TRUE(maxPointSize > 2); + + glClearColor(0, 0, 0, 1); + glDisable(GL_DEPTH_TEST); + glClear(GL_COLOR_BUFFER_BIT); + + GLint pointSizeLoc = glGetUniformLocation(program, "u_pointSize"); + ASSERT_GL_NO_ERROR(); + + GLfloat pointSize = std::min<GLfloat>(20.0f, maxPointSize); + glUniform1f(pointSizeLoc, pointSize); + ASSERT_GL_NO_ERROR(); + + GLuint vertexObject = 0; + glGenBuffers(1, &vertexObject); + ASSERT_NE(vertexObject, 0U); + ASSERT_GL_NO_ERROR(); + + glBindBuffer(GL_ARRAY_BUFFER, vertexObject); + ASSERT_GL_NO_ERROR(); + + GLfloat thePoints[] = { 0.0f, 0.0f }; + + glBufferData(GL_ARRAY_BUFFER, sizeof(thePoints), thePoints, GL_STATIC_DRAW); + ASSERT_GL_NO_ERROR(); + + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0); + + glDrawArrays(GL_POINTS, 0, 1); + ASSERT_GL_NO_ERROR(); + + // expect the center pixel to be green + EXPECT_PIXEL_EQ((windowWidth - 1) / 2, (windowHeight - 1) / 2, 0, 255, 0, 255); + + glDeleteBuffers(1, &vertexObject); +} + +// Verify GL_VERTEX_PROGRAM_POINT_SIZE is enabled +// https://www.khronos.org/registry/webgl/sdk/tests/conformance/rendering/point-size.html +TEST_P(PointSpritesTest, PointSizeEnabledCompliance) +{ + const std::string fs = SHADER_SOURCE + ( + precision mediump float; + varying vec4 color; + + void main() + { + gl_FragColor = color; + } + ); + + const std::string vs = SHADER_SOURCE + ( + attribute vec3 pos; + attribute vec4 colorIn; + uniform float pointSize; + varying vec4 color; + + void main() + { + gl_PointSize = pointSize; + color = colorIn; + gl_Position = vec4(pos, 1.0); + } + ); + + // The WebGL test is drawn on a 2x2 canvas. Emulate this by setting a 2x2 viewport. + glViewport(0, 0, 2, 2); + + GLuint program = CompileProgram(vs, fs); + ASSERT_NE(program, 0u); + ASSERT_GL_NO_ERROR(); + + glUseProgram(program); + + glDisable(GL_BLEND); + + // The choice of (0.4, 0.4) ensures that the centers of the surrounding + // pixels are not contained within the point when it is of size 1, but + // that they definitely are when it is of size 2. + GLfloat vertices[] = { 0.4f, 0.4f, 0.0f }; + GLubyte colors[] = { 255, 0, 0, 255 }; + + GLuint vertexObject = 0; + glGenBuffers(1, &vertexObject); + ASSERT_NE(vertexObject, 0U); + ASSERT_GL_NO_ERROR(); + + glBindBuffer(GL_ARRAY_BUFFER, vertexObject); + ASSERT_GL_NO_ERROR(); + + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices) + sizeof(colors), NULL, GL_STATIC_DRAW); + ASSERT_GL_NO_ERROR(); + + glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); + ASSERT_GL_NO_ERROR(); + + glBufferSubData(GL_ARRAY_BUFFER, sizeof(vertices), sizeof(colors), colors); + ASSERT_GL_NO_ERROR(); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); + glEnableVertexAttribArray(0); + + glVertexAttribPointer(1, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, (GLvoid*)sizeof(vertices)); + glEnableVertexAttribArray(1); + + GLint pointSizeLoc = glGetUniformLocation(program, "pointSize"); + ASSERT_GL_NO_ERROR(); + + glUniform1f(pointSizeLoc, 1.0f); + ASSERT_GL_NO_ERROR(); + + glDrawArrays(GL_POINTS, 0, static_cast<GLsizei>(ArraySize(vertices)) / 3); + ASSERT_GL_NO_ERROR(); + + // Test the pixels around the target Red pixel to ensure + // they are the expected color values + for (GLint y = 0; y < 2; ++y) + { + for (GLint x = 0; x < 2; ++x) + { + // 1x1 is expected to be a red pixel + // All others are black + GLubyte expectedColor[4] = { 0, 0, 0, 0 }; + if (x == 1 && y == 1) + { + expectedColor[0] = 255; + expectedColor[3] = 255; + } + EXPECT_PIXEL_EQ(x, y, expectedColor[0], expectedColor[1], expectedColor[2], expectedColor[3]); + } + } + + GLfloat pointSizeRange[2] = {}; + glGetFloatv(GL_ALIASED_POINT_SIZE_RANGE, pointSizeRange); + + if (pointSizeRange[1] >= 2.0) + { + // Draw a point of size 2 and verify it fills the appropriate region. + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glUniform1f(pointSizeLoc, 2.0f); + ASSERT_GL_NO_ERROR(); + + glDrawArrays(GL_POINTS, 0, static_cast<GLsizei>(ArraySize(vertices)) / 3); + ASSERT_GL_NO_ERROR(); + + // Test the pixels to ensure the target is ALL Red pixels + for (GLint y = 0; y < 2; ++y) + { + for (GLint x = 0; x < 2; ++x) + { + EXPECT_PIXEL_EQ(x, y, 255, 0, 0, 255); + } + } + } + + glDeleteBuffers(1, &vertexObject); +} + +// Verify that rendering works correctly when gl_PointSize is declared in a shader but isn't used +TEST_P(PointSpritesTest, PointSizeDeclaredButUnused) +{ + const std::string vs = SHADER_SOURCE + ( + attribute highp vec4 position; + + void main(void) + { + gl_PointSize = 1.0; + gl_Position = position; + } + ); + + const std::string fs = SHADER_SOURCE + ( + void main(void) + { + gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); + } + ); + + GLuint program = CompileProgram(vs, fs); + ASSERT_NE(program, 0u); + ASSERT_GL_NO_ERROR(); + + glUseProgram(program); + drawQuad(program, "position", 0.5f, 1.0f); + ASSERT_GL_NO_ERROR(); + + // expect the center pixel to be red + EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 255, 0, 0, 255); + + glDeleteProgram(program); +} + +// Test to cover a bug where the D3D11 rasterizer state would not be update when switching between +// draw types. This causes the cull face to potentially be incorrect when drawing emulated point +// spites. +TEST_P(PointSpritesTest, PointSpriteAlternatingDrawTypes) +{ + // clang-format off + const std::string pointFS = SHADER_SOURCE + ( + precision mediump float; + void main() + { + gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); + } + ); + + const std::string pointVS = SHADER_SOURCE + ( + void main() + { + gl_PointSize = 16.0; + gl_Position = vec4(0.0, 0.0, 0.0, 1.0); + } + ); + + const std::string quadFS = SHADER_SOURCE + ( + precision mediump float; + void main() + { + gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); + } + ); + + const std::string quadVS = SHADER_SOURCE + ( + precision mediump float; + attribute vec4 pos; + void main() + { + gl_Position = pos; + } + ); + // clang-format on + + GLuint pointProgram = CompileProgram(pointVS, pointFS); + ASSERT_NE(pointProgram, 0u); + ASSERT_GL_NO_ERROR(); + + GLuint quadProgram = CompileProgram(quadVS, quadFS); + ASSERT_NE(pointProgram, 0u); + ASSERT_GL_NO_ERROR(); + + glEnable(GL_CULL_FACE); + glCullFace(GL_FRONT); + + const GLfloat quadVertices[] = { + -1.0f, 1.0f, 0.5f, 1.0f, -1.0f, 0.5f, -1.0f, -1.0f, 0.5f, + + -1.0f, 1.0f, 0.5f, 1.0f, 1.0f, 0.5f, 1.0f, -1.0f, 0.5f, + }; + + glUseProgram(quadProgram); + GLint positionLocation = glGetAttribLocation(quadProgram, "pos"); + glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, quadVertices); + glEnableVertexAttribArray(positionLocation); + glDrawArrays(GL_TRIANGLES, 0, 6); + + glUseProgram(pointProgram); + glDrawArrays(GL_POINTS, 0, 1); + ASSERT_GL_NO_ERROR(); + + // expect the center pixel to be green + EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 0, 255, 0, 255); + + glDeleteProgram(pointProgram); + glDeleteProgram(quadProgram); +} + +// Use this to select which configurations (e.g. which renderer, which GLES +// major version) these tests should be run against. +// +// We test on D3D11 9_3 because the existing D3D11 PointSprite implementation +// uses Geometry Shaders which are not supported for 9_3. +// D3D9 and D3D11 are also tested to ensure no regressions. +ANGLE_INSTANTIATE_TEST(PointSpritesTest, + ES2_D3D9(), + ES2_D3D11(), + ES2_D3D11_FL9_3(), + ES2_OPENGL(), + ES2_OPENGLES()); diff --git a/gfx/angle/src/tests/gl_tests/ProgramBinaryTest.cpp b/gfx/angle/src/tests/gl_tests/ProgramBinaryTest.cpp new file mode 100755 index 000000000..011725fc5 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/ProgramBinaryTest.cpp @@ -0,0 +1,639 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "test_utils/ANGLETest.h" + +#include <memory> +#include <stdint.h> + +#include "EGLWindow.h" +#include "OSWindow.h" +#include "test_utils/angle_test_configs.h" + +using namespace angle; + +class ProgramBinaryTest : public ANGLETest +{ + protected: + ProgramBinaryTest() + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + const std::string vertexShaderSource = SHADER_SOURCE + ( + attribute vec4 inputAttribute; + void main() + { + gl_Position = inputAttribute; + } + ); + + const std::string fragmentShaderSource = SHADER_SOURCE + ( + void main() + { + gl_FragColor = vec4(1,0,0,1); + } + ); + + mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource); + if (mProgram == 0) + { + FAIL() << "shader compilation failed."; + } + + glGenBuffers(1, &mBuffer); + glBindBuffer(GL_ARRAY_BUFFER, mBuffer); + glBufferData(GL_ARRAY_BUFFER, 128, NULL, GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + ASSERT_GL_NO_ERROR(); + } + + void TearDown() override + { + glDeleteProgram(mProgram); + glDeleteBuffers(1, &mBuffer); + + ANGLETest::TearDown(); + } + + GLint getAvailableProgramBinaryFormatCount() const + { + GLint formatCount; + glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS_OES, &formatCount); + return formatCount; + } + + GLuint mProgram; + GLuint mBuffer; +}; + +// This tests the assumption that float attribs of different size +// should not internally cause a vertex shader recompile (for conversion). +TEST_P(ProgramBinaryTest, FloatDynamicShaderSize) +{ + if (!extensionEnabled("GL_OES_get_program_binary")) + { + std::cout << "Test skipped because GL_OES_get_program_binary is not available." + << std::endl; + return; + } + + if (getAvailableProgramBinaryFormatCount() == 0) + { + std::cout << "Test skipped because no program binary formats are available." << std::endl; + return; + } + + glUseProgram(mProgram); + glBindBuffer(GL_ARRAY_BUFFER, mBuffer); + + glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 8, NULL); + glEnableVertexAttribArray(0); + glDrawArrays(GL_POINTS, 0, 1); + + GLint programLength; + glGetProgramiv(mProgram, GL_PROGRAM_BINARY_LENGTH_OES, &programLength); + + EXPECT_GL_NO_ERROR(); + + for (GLsizei size = 1; size <= 3; size++) + { + glVertexAttribPointer(0, size, GL_FLOAT, GL_FALSE, 8, NULL); + glEnableVertexAttribArray(0); + glDrawArrays(GL_POINTS, 0, 1); + + GLint newProgramLength; + glGetProgramiv(mProgram, GL_PROGRAM_BINARY_LENGTH_OES, &newProgramLength); + EXPECT_GL_NO_ERROR(); + EXPECT_EQ(programLength, newProgramLength); + } +} + +// Tests that switching between signed and unsigned un-normalized data doesn't trigger a bug +// in the D3D11 back-end. +TEST_P(ProgramBinaryTest, DynamicShadersSignatureBug) +{ + glUseProgram(mProgram); + glBindBuffer(GL_ARRAY_BUFFER, mBuffer); + + GLint attribLocation = glGetAttribLocation(mProgram, "inputAttribute"); + ASSERT_NE(-1, attribLocation); + glEnableVertexAttribArray(attribLocation); + + glVertexAttribPointer(attribLocation, 2, GL_BYTE, GL_FALSE, 0, nullptr); + glDrawArrays(GL_POINTS, 0, 1); + + glVertexAttribPointer(attribLocation, 2, GL_UNSIGNED_BYTE, GL_FALSE, 0, nullptr); + glDrawArrays(GL_POINTS, 0, 1); +} + +// This tests the ability to successfully save and load a program binary. +TEST_P(ProgramBinaryTest, SaveAndLoadBinary) +{ + if (!extensionEnabled("GL_OES_get_program_binary")) + { + std::cout << "Test skipped because GL_OES_get_program_binary is not available." + << std::endl; + return; + } + + if (getAvailableProgramBinaryFormatCount() == 0) + { + std::cout << "Test skipped because no program binary formats are available." << std::endl; + return; + } + + GLint programLength = 0; + GLint writtenLength = 0; + GLenum binaryFormat = 0; + + glGetProgramiv(mProgram, GL_PROGRAM_BINARY_LENGTH_OES, &programLength); + EXPECT_GL_NO_ERROR(); + + std::vector<uint8_t> binary(programLength); + glGetProgramBinaryOES(mProgram, programLength, &writtenLength, &binaryFormat, binary.data()); + EXPECT_GL_NO_ERROR(); + + // The lengths reported by glGetProgramiv and glGetProgramBinaryOES should match + EXPECT_EQ(programLength, writtenLength); + + if (writtenLength) + { + GLuint program2 = glCreateProgram(); + glProgramBinaryOES(program2, binaryFormat, binary.data(), writtenLength); + + EXPECT_GL_NO_ERROR(); + + GLint linkStatus; + glGetProgramiv(program2, GL_LINK_STATUS, &linkStatus); + if (linkStatus == 0) + { + GLint infoLogLength; + glGetProgramiv(program2, GL_INFO_LOG_LENGTH, &infoLogLength); + + if (infoLogLength > 0) + { + std::vector<GLchar> infoLog(infoLogLength); + glGetProgramInfoLog(program2, static_cast<GLsizei>(infoLog.size()), NULL, + &infoLog[0]); + FAIL() << "program link failed: " << &infoLog[0]; + } + else + { + FAIL() << "program link failed."; + } + } + else + { + glUseProgram(program2); + glBindBuffer(GL_ARRAY_BUFFER, mBuffer); + + glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 8, NULL); + glEnableVertexAttribArray(0); + glDrawArrays(GL_POINTS, 0, 1); + + EXPECT_GL_NO_ERROR(); + } + + glDeleteProgram(program2); + } +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(ProgramBinaryTest, + ES2_D3D9(), + ES2_D3D11(), + ES3_D3D11(), + ES2_OPENGL(), + ES3_OPENGL()); + +class ProgramBinaryTransformFeedbackTest : public ANGLETest +{ + protected: + ProgramBinaryTransformFeedbackTest() + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + const std::string vertexShaderSource = SHADER_SOURCE + ( #version 300 es\n + in vec4 inputAttribute; + out vec4 outputVarying; + void main() + { + outputVarying = inputAttribute; + } + ); + + const std::string fragmentShaderSource = SHADER_SOURCE + ( #version 300 es\n + precision highp float; + out vec4 outputColor; + void main() + { + outputColor = vec4(1,0,0,1); + } + ); + + std::vector<std::string> transformFeedbackVaryings; + transformFeedbackVaryings.push_back("outputVarying"); + + mProgram = CompileProgramWithTransformFeedback( + vertexShaderSource, fragmentShaderSource, transformFeedbackVaryings, + GL_SEPARATE_ATTRIBS); + if (mProgram == 0) + { + FAIL() << "shader compilation failed."; + } + + ASSERT_GL_NO_ERROR(); + } + + void TearDown() override + { + glDeleteProgram(mProgram); + + ANGLETest::TearDown(); + } + + GLint getAvailableProgramBinaryFormatCount() const + { + GLint formatCount; + glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS_OES, &formatCount); + return formatCount; + } + + GLuint mProgram; +}; + +// This tests the assumption that float attribs of different size +// should not internally cause a vertex shader recompile (for conversion). +TEST_P(ProgramBinaryTransformFeedbackTest, GetTransformFeedbackVarying) +{ + if (!extensionEnabled("GL_OES_get_program_binary")) + { + std::cout << "Test skipped because GL_OES_get_program_binary is not available." + << std::endl; + return; + } + + if (getAvailableProgramBinaryFormatCount() == 0) + { + std::cout << "Test skipped because no program binary formats are available." << std::endl; + return; + } + + std::vector<uint8_t> binary(0); + GLint programLength = 0; + GLint writtenLength = 0; + GLenum binaryFormat = 0; + + // Save the program binary out + glGetProgramiv(mProgram, GL_PROGRAM_BINARY_LENGTH_OES, &programLength); + ASSERT_GL_NO_ERROR(); + binary.resize(programLength); + glGetProgramBinaryOES(mProgram, programLength, &writtenLength, &binaryFormat, binary.data()); + ASSERT_GL_NO_ERROR(); + + glDeleteProgram(mProgram); + + // Load program binary + mProgram = glCreateProgram(); + glProgramBinaryOES(mProgram, binaryFormat, binary.data(), writtenLength); + + // Ensure the loaded binary is linked + GLint linkStatus; + glGetProgramiv(mProgram, GL_LINK_STATUS, &linkStatus); + EXPECT_TRUE(linkStatus != 0); + + // Query information about the transform feedback varying + char varyingName[64]; + GLsizei varyingSize = 0; + GLenum varyingType = GL_NONE; + + glGetTransformFeedbackVarying(mProgram, 0, 64, &writtenLength, &varyingSize, &varyingType, varyingName); + EXPECT_GL_NO_ERROR(); + + EXPECT_EQ(13, writtenLength); + EXPECT_STREQ("outputVarying", varyingName); + EXPECT_EQ(1, varyingSize); + EXPECT_GLENUM_EQ(GL_FLOAT_VEC4, varyingType); + + EXPECT_GL_NO_ERROR(); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(ProgramBinaryTransformFeedbackTest, + ES3_D3D11(), + ES3_OPENGL()); + +// For the ProgramBinariesAcrossPlatforms tests, we need two sets of params: +// - a set to save the program binary +// - a set to load the program binary +// We combine these into one struct extending PlatformParameters so we can reuse existing ANGLE test macros +struct PlatformsWithLinkResult : PlatformParameters +{ + PlatformsWithLinkResult(PlatformParameters saveParams, PlatformParameters loadParamsIn, bool expectedLinkResultIn) + { + majorVersion = saveParams.majorVersion; + minorVersion = saveParams.minorVersion; + eglParameters = saveParams.eglParameters; + loadParams = loadParamsIn; + expectedLinkResult = expectedLinkResultIn; + } + + PlatformParameters loadParams; + bool expectedLinkResult; +}; + +// Provide a custom gtest parameter name function for PlatformsWithLinkResult +// to avoid returning the same parameter name twice. Such a conflict would happen +// between ES2_D3D11_to_ES2D3D11 and ES2_D3D11_to_ES3D3D11 as they were both +// named ES2_D3D11 +std::ostream &operator<<(std::ostream& stream, const PlatformsWithLinkResult &platform) +{ + const PlatformParameters &platform1 = platform; + const PlatformParameters &platform2 = platform.loadParams; + stream << platform1 << "_to_" << platform2; + return stream; +} + +class ProgramBinariesAcrossPlatforms : public testing::TestWithParam<PlatformsWithLinkResult> +{ + public: + void SetUp() override + { + mOSWindow = CreateOSWindow(); + bool result = mOSWindow->initialize("ProgramBinariesAcrossRenderersTests", 100, 100); + + if (result == false) + { + FAIL() << "Failed to create OS window"; + } + } + + EGLWindow *createAndInitEGLWindow(angle::PlatformParameters ¶m) + { + EGLWindow *eglWindow = + new EGLWindow(param.majorVersion, param.minorVersion, param.eglParameters); + bool result = eglWindow->initializeGL(mOSWindow); + if (result == false) + { + SafeDelete(eglWindow); + eglWindow = nullptr; + } + + return eglWindow; + } + + void destroyEGLWindow(EGLWindow **eglWindow) + { + ASSERT(*eglWindow != nullptr); + (*eglWindow)->destroyGL(); + SafeDelete(*eglWindow); + *eglWindow = nullptr; + } + + GLuint createES2ProgramFromSource() + { + const std::string testVertexShaderSource = SHADER_SOURCE + ( + attribute highp vec4 position; + + void main(void) + { + gl_Position = position; + } + ); + + const std::string testFragmentShaderSource = SHADER_SOURCE + ( + void main(void) + { + gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); + } + ); + + return CompileProgram(testVertexShaderSource, testFragmentShaderSource); + } + + GLuint createES3ProgramFromSource() + { + const std::string testVertexShaderSource = SHADER_SOURCE + ( #version 300 es\n + precision highp float; + in highp vec4 position; + + void main(void) + { + gl_Position = position; + } + ); + + const std::string testFragmentShaderSource = SHADER_SOURCE + ( #version 300 es \n + precision highp float; + out vec4 out_FragColor; + + void main(void) + { + out_FragColor = vec4(1.0, 0.0, 0.0, 1.0); + } + ); + + return CompileProgram(testVertexShaderSource, testFragmentShaderSource); + } + + void drawWithProgram(GLuint program) + { + glClearColor(0, 0, 0, 1); + glClear(GL_COLOR_BUFFER_BIT); + + GLint positionLocation = glGetAttribLocation(program, "position"); + + glUseProgram(program); + + const GLfloat vertices[] = + { + -1.0f, 1.0f, 0.5f, + -1.0f, -1.0f, 0.5f, + 1.0f, -1.0f, 0.5f, + + -1.0f, 1.0f, 0.5f, + 1.0f, -1.0f, 0.5f, + 1.0f, 1.0f, 0.5f, + }; + + glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, vertices); + glEnableVertexAttribArray(positionLocation); + + glDrawArrays(GL_TRIANGLES, 0, 6); + + glDisableVertexAttribArray(positionLocation); + glVertexAttribPointer(positionLocation, 4, GL_FLOAT, GL_FALSE, 0, NULL); + + EXPECT_PIXEL_EQ(mOSWindow->getWidth() / 2, mOSWindow->getHeight() / 2, 255, 0, 0, 255); + } + + void TearDown() override + { + mOSWindow->destroy(); + SafeDelete(mOSWindow); + } + + OSWindow *mOSWindow; +}; + +// Tries to create a program binary using one set of platform params, then load it using a different sent of params +TEST_P(ProgramBinariesAcrossPlatforms, CreateAndReloadBinary) +{ + angle::PlatformParameters firstRenderer = GetParam(); + angle::PlatformParameters secondRenderer = GetParam().loadParams; + bool expectedLinkResult = GetParam().expectedLinkResult; + + if (!(IsPlatformAvailable(firstRenderer))) + { + std::cout << "First renderer not supported, skipping test"; + return; + } + + if (!(IsPlatformAvailable(secondRenderer))) + { + std::cout << "Second renderer not supported, skipping test"; + return; + } + + EGLWindow *eglWindow = nullptr; + std::vector<uint8_t> binary(0); + GLuint program = 0; + + GLint programLength = 0; + GLint writtenLength = 0; + GLenum binaryFormat = 0; + + // Create a EGL window with the first renderer + eglWindow = createAndInitEGLWindow(firstRenderer); + if (eglWindow == nullptr) + { + FAIL() << "Failed to create EGL window"; + return; + } + + // If the test is trying to use both the default GPU and WARP, but the default GPU *IS* WARP, + // then our expectations for the test results will be invalid. + if (firstRenderer.eglParameters.deviceType != EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE && + secondRenderer.eglParameters.deviceType == EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE) + { + std::string rendererString = std::string(reinterpret_cast<const char*>(glGetString(GL_RENDERER))); + std::transform(rendererString.begin(), rendererString.end(), rendererString.begin(), ::tolower); + + auto basicRenderPos = rendererString.find(std::string("microsoft basic render")); + auto softwareAdapterPos = rendererString.find(std::string("software adapter")); + + if (basicRenderPos != std::string::npos || softwareAdapterPos != std::string::npos) + { + // The first renderer is using WARP, even though we didn't explictly request it + // We should skip this test + std::cout << "Test skipped on when default GPU is WARP." << std::endl; + return; + } + } + + // Create a program + if (firstRenderer.majorVersion == 3) + { + program = createES3ProgramFromSource(); + } + else + { + program = createES2ProgramFromSource(); + } + + if (program == 0) + { + destroyEGLWindow(&eglWindow); + FAIL() << "Failed to create program from source"; + } + + // Draw using the program to ensure it works as expected + drawWithProgram(program); + EXPECT_GL_NO_ERROR(); + + // Save the program binary out from this renderer + glGetProgramiv(program, GL_PROGRAM_BINARY_LENGTH_OES, &programLength); + EXPECT_GL_NO_ERROR(); + binary.resize(programLength); + glGetProgramBinaryOES(program, programLength, &writtenLength, &binaryFormat, binary.data()); + EXPECT_GL_NO_ERROR(); + + // Destroy the first renderer + glDeleteProgram(program); + destroyEGLWindow(&eglWindow); + + // Create an EGL window with the second renderer + eglWindow = createAndInitEGLWindow(secondRenderer); + if (eglWindow == nullptr) + { + FAIL() << "Failed to create EGL window"; + return; + } + + program = glCreateProgram(); + glProgramBinaryOES(program, binaryFormat, binary.data(), writtenLength); + + GLint linkStatus; + glGetProgramiv(program, GL_LINK_STATUS, &linkStatus); + EXPECT_EQ(expectedLinkResult, (linkStatus != 0)); + + if (linkStatus != 0) + { + // If the link was successful, then we should try to draw using the program to ensure it works as expected + drawWithProgram(program); + EXPECT_GL_NO_ERROR(); + } + + // Destroy the second renderer + glDeleteProgram(program); + destroyEGLWindow(&eglWindow); +} + +ANGLE_INSTANTIATE_TEST(ProgramBinariesAcrossPlatforms, + // | Save the program | Load the program | Expected + // | using these params | using these params | link result + PlatformsWithLinkResult(ES2_D3D11(), ES2_D3D11(), true ), // Loading + reloading binary should work + PlatformsWithLinkResult(ES3_D3D11(), ES3_D3D11(), true ), // Loading + reloading binary should work + PlatformsWithLinkResult(ES2_D3D11_FL11_0(), ES2_D3D11_FL9_3(), false ), // Switching feature level shouldn't work + PlatformsWithLinkResult(ES2_D3D11(), ES2_D3D11_WARP(), false ), // Switching from hardware to software shouldn't work + PlatformsWithLinkResult(ES2_D3D11_FL9_3(), ES2_D3D11_FL9_3_WARP(), false ), // Switching from hardware to software shouldn't work for FL9 either + PlatformsWithLinkResult(ES2_D3D11(), ES2_D3D9(), false ), // Switching from D3D11 to D3D9 shouldn't work + PlatformsWithLinkResult(ES2_D3D9(), ES2_D3D11(), false ), // Switching from D3D9 to D3D11 shouldn't work + PlatformsWithLinkResult(ES2_D3D11(), ES3_D3D11(), true ) // Switching to newer client version should work + + // TODO: ANGLE issue 523 + // Compiling a program with client version 3, saving the binary, then loading it with client version 2 should not work + // PlatformsWithLinkResult(ES3_D3D11(), ES2_D3D11(), false ) + ); diff --git a/gfx/angle/src/tests/gl_tests/ProvokingVertexTest.cpp b/gfx/angle/src/tests/gl_tests/ProvokingVertexTest.cpp new file mode 100755 index 000000000..adf0b1a6e --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/ProvokingVertexTest.cpp @@ -0,0 +1,316 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// ProvkingVertexTest: +// Tests on the conformance of the provoking vertex, which applies to flat +// shading and compatibility with D3D. See the section on 'flatshading' +// in the ES 3 specs. +// + +#include "test_utils/ANGLETest.h" + +using namespace angle; + +namespace +{ + +class ProvokingVertexTest : public ANGLETest +{ + protected: + ProvokingVertexTest() + : mProgram(0), + mFramebuffer(0), + mTexture(0), + mTransformFeedback(0), + mBuffer(0), + mIntAttribLocation(-1) + { + setWindowWidth(64); + setWindowHeight(64); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + setConfigDepthBits(24); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + const std::string &vertexShader = + "#version 300 es\n" + "in int intAttrib;\n" + "in vec2 position;\n" + "flat out int attrib;\n" + "void main() {\n" + " gl_Position = vec4(position, 0, 1);\n" + " attrib = intAttrib;\n" + "}"; + + const std::string &fragmentShader = + "#version 300 es\n" + "flat in int attrib;\n" + "out int fragColor;\n" + "void main() {\n" + " fragColor = attrib;\n" + "}"; + + std::vector<std::string> tfVaryings; + tfVaryings.push_back("attrib"); + mProgram = CompileProgramWithTransformFeedback(vertexShader, fragmentShader, tfVaryings, + GL_SEPARATE_ATTRIBS); + ASSERT_NE(0u, mProgram); + + glGenTextures(1, &mTexture); + glBindTexture(GL_TEXTURE_2D, mTexture); + glTexStorage2D(GL_TEXTURE_2D, 1, GL_R32I, getWindowWidth(), getWindowHeight()); + + glGenFramebuffers(1, &mFramebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTexture, 0); + + mIntAttribLocation = glGetAttribLocation(mProgram, "intAttrib"); + ASSERT_NE(-1, mIntAttribLocation); + glEnableVertexAttribArray(mIntAttribLocation); + + ASSERT_GL_NO_ERROR(); + } + + void TearDown() override + { + if (mProgram != 0) + { + glDeleteProgram(mProgram); + mProgram = 0; + } + + if (mFramebuffer != 0) + { + glDeleteFramebuffers(1, &mFramebuffer); + mFramebuffer = 0; + } + + if (mTexture != 0) + { + glDeleteTextures(1, &mTexture); + mTexture = 0; + } + + if (mTransformFeedback != 0) + { + glDeleteTransformFeedbacks(1, &mTransformFeedback); + mTransformFeedback = 0; + } + + if (mBuffer != 0) + { + glDeleteBuffers(1, &mBuffer); + mBuffer = 0; + } + + ANGLETest::TearDown(); + } + + GLuint mProgram; + GLuint mFramebuffer; + GLuint mTexture; + GLuint mTransformFeedback; + GLuint mBuffer; + GLint mIntAttribLocation; +}; + +// Test drawing a simple triangle with flat shading, and different valued vertices. +TEST_P(ProvokingVertexTest, FlatTriangle) +{ + GLint vertexData[] = {1, 2, 3, 1, 2, 3}; + glVertexAttribIPointer(mIntAttribLocation, 1, GL_INT, 0, vertexData); + + drawQuad(mProgram, "position", 0.5f); + + GLint pixelValue = 0; + glReadPixels(0, 0, 1, 1, GL_RED_INTEGER, GL_INT, &pixelValue); + + ASSERT_GL_NO_ERROR(); + EXPECT_EQ(vertexData[2], pixelValue); +} + +// Ensure that any provoking vertex shenanigans still gives correct vertex streams. +TEST_P(ProvokingVertexTest, FlatTriWithTransformFeedback) +{ + // TODO(cwallez) figure out why it is broken on AMD on Mac +#if defined(ANGLE_PLATFORM_APPLE) + if (IsAMD()) + { + std::cout << "Test skipped on AMD on Mac." << std::endl; + return; + } +#endif + + glGenTransformFeedbacks(1, &mTransformFeedback); + glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, mTransformFeedback); + + glGenBuffers(1, &mBuffer); + glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, mBuffer); + glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 128, nullptr, GL_STREAM_DRAW); + + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, mBuffer); + + GLint vertexData[] = {1, 2, 3, 1, 2, 3}; + glVertexAttribIPointer(mIntAttribLocation, 1, GL_INT, 0, vertexData); + + glUseProgram(mProgram); + glBeginTransformFeedback(GL_TRIANGLES); + drawQuad(mProgram, "position", 0.5f); + glEndTransformFeedback(); + glUseProgram(0); + + GLint pixelValue = 0; + glReadPixels(0, 0, 1, 1, GL_RED_INTEGER, GL_INT, &pixelValue); + + ASSERT_GL_NO_ERROR(); + EXPECT_EQ(vertexData[2], pixelValue); + + GLvoid *mapPointer = + glMapBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, sizeof(int) * 6, GL_MAP_READ_BIT); + ASSERT_NE(nullptr, mapPointer); + + int *mappedInts = static_cast<int *>(mapPointer); + for (unsigned int cnt = 0; cnt < 6; ++cnt) + { + EXPECT_EQ(vertexData[cnt], mappedInts[cnt]); + } +} + +// Test drawing a simple line with flat shading, and different valued vertices. +TEST_P(ProvokingVertexTest, FlatLine) +{ + GLfloat halfPixel = 1.0f / static_cast<GLfloat>(getWindowWidth()); + + GLint vertexData[] = {1, 2}; + GLfloat positionData[] = {-1.0f + halfPixel, -1.0f, -1.0f + halfPixel, 1.0f}; + + glVertexAttribIPointer(mIntAttribLocation, 1, GL_INT, 0, vertexData); + + GLint positionLocation = glGetAttribLocation(mProgram, "position"); + glEnableVertexAttribArray(positionLocation); + glVertexAttribPointer(positionLocation, 2, GL_FLOAT, GL_FALSE, 0, positionData); + + glUseProgram(mProgram); + glDrawArrays(GL_LINES, 0, 2); + + GLint pixelValue = 0; + glReadPixels(0, 0, 1, 1, GL_RED_INTEGER, GL_INT, &pixelValue); + + ASSERT_GL_NO_ERROR(); + EXPECT_EQ(vertexData[1], pixelValue); +} + +// Test drawing a simple triangle strip with flat shading, and different valued vertices. +TEST_P(ProvokingVertexTest, FlatTriStrip) +{ + GLint vertexData[] = {1, 2, 3, 4, 5, 6}; + GLfloat positionData[] = {-1.0f, -1.0f, -1.0f, 1.0f, 0.0f, -1.0f, + 0.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f}; + + glVertexAttribIPointer(mIntAttribLocation, 1, GL_INT, 0, vertexData); + + GLint positionLocation = glGetAttribLocation(mProgram, "position"); + glEnableVertexAttribArray(positionLocation); + glVertexAttribPointer(positionLocation, 2, GL_FLOAT, GL_FALSE, 0, positionData); + + glUseProgram(mProgram); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 6); + + std::vector<GLint> pixelBuffer(getWindowWidth() * getWindowHeight(), 0); + glReadPixels(0, 0, getWindowWidth(), getWindowHeight(), GL_RED_INTEGER, GL_INT, + &pixelBuffer[0]); + + ASSERT_GL_NO_ERROR(); + + for (unsigned int triIndex = 0; triIndex < 4; ++triIndex) + { + GLfloat sumX = positionData[triIndex * 2 + 0] + positionData[triIndex * 2 + 2] + + positionData[triIndex * 2 + 4]; + GLfloat sumY = positionData[triIndex * 2 + 1] + positionData[triIndex * 2 + 3] + + positionData[triIndex * 2 + 5]; + + float centerX = sumX / 3.0f * 0.5f + 0.5f; + float centerY = sumY / 3.0f * 0.5f + 0.5f; + unsigned int pixelX = + static_cast<unsigned int>(centerX * static_cast<GLfloat>(getWindowWidth())); + unsigned int pixelY = + static_cast<unsigned int>(centerY * static_cast<GLfloat>(getWindowHeight())); + unsigned int pixelIndex = pixelY * getWindowWidth() + pixelX; + + unsigned int provokingVertexIndex = triIndex + 2; + + EXPECT_EQ(vertexData[provokingVertexIndex], pixelBuffer[pixelIndex]); + } +} + +// Test drawing an indexed triangle strip with flat shading and primitive restart. +TEST_P(ProvokingVertexTest, FlatTriStripPrimitiveRestart) +{ + // TODO(jmadill): Implement on the D3D back-end. + if (IsD3D11()) + { + std::cout << "Test disabled on D3D11." << std::endl; + return; + } + + GLint indexData[] = {0, 1, 2, -1, 1, 2, 3, 4, -1, 3, 4, 5}; + GLint vertexData[] = {1, 2, 3, 4, 5, 6}; + GLfloat positionData[] = {-1.0f, -1.0f, -1.0f, 1.0f, 0.0f, -1.0f, + 0.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f}; + + glVertexAttribIPointer(mIntAttribLocation, 1, GL_INT, 0, vertexData); + + GLint positionLocation = glGetAttribLocation(mProgram, "position"); + glEnableVertexAttribArray(positionLocation); + glVertexAttribPointer(positionLocation, 2, GL_FLOAT, GL_FALSE, 0, positionData); + + glDisable(GL_CULL_FACE); + glEnable(GL_PRIMITIVE_RESTART_FIXED_INDEX); + glUseProgram(mProgram); + glDrawElements(GL_TRIANGLE_STRIP, 12, GL_UNSIGNED_INT, indexData); + + std::vector<GLint> pixelBuffer(getWindowWidth() * getWindowHeight(), 0); + glReadPixels(0, 0, getWindowWidth(), getWindowHeight(), GL_RED_INTEGER, GL_INT, + &pixelBuffer[0]); + + ASSERT_GL_NO_ERROR(); + + // Account for primitive restart when checking the tris. + GLint triOffsets[] = {0, 4, 5, 9}; + + for (unsigned int triIndex = 0; triIndex < 4; ++triIndex) + { + GLint vertexA = indexData[triOffsets[triIndex] + 0]; + GLint vertexB = indexData[triOffsets[triIndex] + 1]; + GLint vertexC = indexData[triOffsets[triIndex] + 2]; + + GLfloat sumX = + positionData[vertexA * 2] + positionData[vertexB * 2] + positionData[vertexC * 2]; + GLfloat sumY = positionData[vertexA * 2 + 1] + positionData[vertexB * 2 + 1] + + positionData[vertexC * 2 + 1]; + + float centerX = sumX / 3.0f * 0.5f + 0.5f; + float centerY = sumY / 3.0f * 0.5f + 0.5f; + unsigned int pixelX = + static_cast<unsigned int>(centerX * static_cast<GLfloat>(getWindowWidth())); + unsigned int pixelY = + static_cast<unsigned int>(centerY * static_cast<GLfloat>(getWindowHeight())); + unsigned int pixelIndex = pixelY * getWindowWidth() + pixelX; + + unsigned int provokingVertexIndex = triIndex + 2; + + EXPECT_EQ(vertexData[provokingVertexIndex], pixelBuffer[pixelIndex]); + } +} + +ANGLE_INSTANTIATE_TEST(ProvokingVertexTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); + +} // anonymous namespace diff --git a/gfx/angle/src/tests/gl_tests/ReadPixelsTest.cpp b/gfx/angle/src/tests/gl_tests/ReadPixelsTest.cpp new file mode 100755 index 000000000..47d2e3dba --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/ReadPixelsTest.cpp @@ -0,0 +1,722 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// ReadPixelsTest: +// Tests calls related to glReadPixels. +// + +#include "test_utils/ANGLETest.h" + +#include <array> + +#include "random_utils.h" + +using namespace angle; + +namespace +{ + +class ReadPixelsTest : public ANGLETest +{ + protected: + ReadPixelsTest() + { + setWindowWidth(32); + setWindowHeight(32); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } +}; + +// Test out of bounds framebuffer reads. +TEST_P(ReadPixelsTest, OutOfBounds) +{ + // TODO: re-enable once root cause of http://anglebug.com/1413 is fixed + if (IsAndroid() && IsAdreno() && IsOpenGLES()) + { + std::cout << "Test skipped on Adreno OpenGLES on Android." << std::endl; + return; + } + + glClearColor(1.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + EXPECT_GL_NO_ERROR(); + + GLsizei pixelsWidth = 32; + GLsizei pixelsHeight = 32; + GLint offset = 16; + std::vector<GLColor> pixels((pixelsWidth + offset) * (pixelsHeight + offset)); + + glReadPixels(-offset, -offset, pixelsWidth + offset, pixelsHeight + offset, GL_RGBA, GL_UNSIGNED_BYTE, &pixels[0]); + EXPECT_GL_NO_ERROR(); + + // Expect that all pixels which fell within the framebuffer are red + for (int y = pixelsHeight / 2; y < pixelsHeight; y++) + { + for (int x = pixelsWidth / 2; x < pixelsWidth; x++) + { + EXPECT_EQ(GLColor::red, pixels[y * (pixelsWidth + offset) + x]); + } + } +} + +class ReadPixelsPBOTest : public ReadPixelsTest +{ + protected: + ReadPixelsPBOTest() : mPBO(0), mTexture(0), mFBO(0) {} + + void SetUp() override + { + ANGLETest::SetUp(); + + glGenBuffers(1, &mPBO); + glGenFramebuffers(1, &mFBO); + + Reset(4 * getWindowWidth() * getWindowHeight(), 4, 1); + } + + void Reset(GLuint bufferSize, GLuint fboWidth, GLuint fboHeight) + { + glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO); + glBufferData(GL_PIXEL_PACK_BUFFER, bufferSize, nullptr, GL_STATIC_DRAW); + glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); + + glDeleteTextures(1, &mTexture); + glGenTextures(1, &mTexture); + glBindTexture(GL_TEXTURE_2D, mTexture); + glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, fboWidth, fboHeight); + + glBindFramebuffer(GL_FRAMEBUFFER, mFBO); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTexture, 0); + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + ASSERT_GL_NO_ERROR(); + } + + void TearDown() override + { + glDeleteBuffers(1, &mPBO); + glDeleteTextures(1, &mTexture); + glDeleteFramebuffers(1, &mFBO); + + ANGLETest::TearDown(); + } + + GLuint mPBO = 0; + GLuint mTexture = 0; + GLuint mFBO = 0; +}; + +// Test basic usage of PBOs. +TEST_P(ReadPixelsPBOTest, Basic) +{ + glClearColor(1.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + EXPECT_GL_NO_ERROR(); + + glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO); + glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0); + + GLvoid *mappedPtr = glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, 32, GL_MAP_READ_BIT); + GLColor *dataColor = static_cast<GLColor *>(mappedPtr); + EXPECT_GL_NO_ERROR(); + + EXPECT_EQ(GLColor::red, dataColor[0]); + + glUnmapBuffer(GL_PIXEL_PACK_BUFFER); + EXPECT_GL_NO_ERROR(); +} + +// Test an error is generated when the PBO is too small. +TEST_P(ReadPixelsPBOTest, PBOTooSmall) +{ + Reset(4 * 16 * 16 - 1, 16, 16); + + glClearColor(1.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + EXPECT_GL_NO_ERROR(); + + glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO); + glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0); + + EXPECT_GL_ERROR(GL_INVALID_OPERATION); +} + +// Test an error is generated when the PBO is mapped. +TEST_P(ReadPixelsPBOTest, PBOMapped) +{ + glClearColor(1.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + EXPECT_GL_NO_ERROR(); + + glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO); + glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, 32, GL_MAP_READ_BIT); + glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0); + + EXPECT_GL_ERROR(GL_INVALID_OPERATION); +} + +// Test that binding a PBO to ARRAY_BUFFER works as expected. +TEST_P(ReadPixelsPBOTest, ArrayBufferTarget) +{ + glClearColor(1.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + EXPECT_GL_NO_ERROR(); + + glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO); + glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0); + + glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); + glBindBuffer(GL_ARRAY_BUFFER, mPBO); + + GLvoid *mappedPtr = glMapBufferRange(GL_ARRAY_BUFFER, 0, 32, GL_MAP_READ_BIT); + GLColor *dataColor = static_cast<GLColor *>(mappedPtr); + EXPECT_GL_NO_ERROR(); + + EXPECT_EQ(GLColor::red, dataColor[0]); + + glUnmapBuffer(GL_ARRAY_BUFFER); + EXPECT_GL_NO_ERROR(); +} + +// Test that using a PBO does not overwrite existing data. +TEST_P(ReadPixelsPBOTest, ExistingDataPreserved) +{ + // TODO(geofflang): Figure out why this fails on AMD OpenGL (http://anglebug.com/1291) + if (IsAMD() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + std::cout << "Test disabled on AMD OpenGL." << std::endl; + return; + } + + // Clear backbuffer to red + glClearColor(1.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + EXPECT_GL_NO_ERROR(); + + // Read 16x16 region from red backbuffer to PBO + glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO); + glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0); + + // Clear backbuffer to green + glClearColor(0.0f, 1.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + EXPECT_GL_NO_ERROR(); + + // Read 16x16 region from green backbuffer to PBO at offset 16 + glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, reinterpret_cast<GLvoid*>(16)); + GLvoid *mappedPtr = glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, 32, GL_MAP_READ_BIT); + GLColor *dataColor = static_cast<GLColor *>(mappedPtr); + EXPECT_GL_NO_ERROR(); + + // Test pixel 0 is red (existing data) + EXPECT_EQ(GLColor::red, dataColor[0]); + + // Test pixel 16 is green (new data) + EXPECT_EQ(GLColor::green, dataColor[16]); + + glUnmapBuffer(GL_PIXEL_PACK_BUFFER); + EXPECT_GL_NO_ERROR(); +} + +// Test that calling SubData preserves PBO data. +TEST_P(ReadPixelsPBOTest, SubDataPreservesContents) +{ + glClearColor(1.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + EXPECT_GL_NO_ERROR(); + + glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO); + glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0); + + unsigned char data[4] = { 1, 2, 3, 4 }; + + glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); + glBindBuffer(GL_ARRAY_BUFFER, mPBO); + glBufferSubData(GL_ARRAY_BUFFER, 0, 4, data); + + GLvoid *mappedPtr = glMapBufferRange(GL_ARRAY_BUFFER, 0, 32, GL_MAP_READ_BIT); + GLColor *dataColor = static_cast<GLColor *>(mappedPtr); + EXPECT_GL_NO_ERROR(); + + EXPECT_EQ(GLColor(1, 2, 3, 4), dataColor[0]); + + glUnmapBuffer(GL_ARRAY_BUFFER); + EXPECT_GL_NO_ERROR(); +} + +// Same as the prior test, but with an offset. +TEST_P(ReadPixelsPBOTest, SubDataOffsetPreservesContents) +{ + // TODO: re-enable once root cause of http://anglebug.com/1415 is fixed + if (IsAndroid() && IsAdreno() && IsOpenGLES()) + { + std::cout << "Test skipped on Adreno OpenGLES on Android." << std::endl; + return; + } + + glClearColor(1.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + EXPECT_GL_NO_ERROR(); + + glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO); + glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0); + + unsigned char data[4] = { 1, 2, 3, 4 }; + + glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); + glBindBuffer(GL_ARRAY_BUFFER, mPBO); + glBufferSubData(GL_ARRAY_BUFFER, 16, 4, data); + + GLvoid *mappedPtr = glMapBufferRange(GL_ARRAY_BUFFER, 0, 32, GL_MAP_READ_BIT); + GLColor *dataColor = static_cast<GLColor *>(mappedPtr); + EXPECT_GL_NO_ERROR(); + + EXPECT_EQ(GLColor::red, dataColor[0]); + EXPECT_EQ(GLColor(1, 2, 3, 4), dataColor[4]); + + glUnmapBuffer(GL_ARRAY_BUFFER); + EXPECT_GL_NO_ERROR(); +} + +class ReadPixelsPBODrawTest : public ReadPixelsPBOTest +{ + protected: + ReadPixelsPBODrawTest() : mProgram(0), mPositionVBO(0) {} + + void SetUp() override + { + ReadPixelsPBOTest::SetUp(); + + const char *vertexShaderSrc = + "attribute vec4 aTest; attribute vec2 aPosition; varying vec4 vTest;\n" + "void main()\n" + "{\n" + " vTest = aTest;\n" + " gl_Position = vec4(aPosition, 0.0, 1.0);\n" + " gl_PointSize = 1.0;\n" + "}"; + + const char *fragmentShaderSrc = + "precision mediump float; varying vec4 vTest;\n" + "void main()\n" + "{\n" + " gl_FragColor = vTest;\n" + "}"; + + mProgram = CompileProgram(vertexShaderSrc, fragmentShaderSrc); + ASSERT_NE(0u, mProgram); + + glGenBuffers(1, &mPositionVBO); + glBindBuffer(GL_ARRAY_BUFFER, mPositionVBO); + glBufferData(GL_ARRAY_BUFFER, 128, NULL, GL_DYNAMIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, 0); + } + + void TearDown() override + { + glDeleteProgram(mProgram); + glDeleteBuffers(1, &mPositionVBO); + ReadPixelsPBOTest::TearDown(); + } + + GLuint mProgram; + GLuint mPositionVBO; +}; + +// Test that we can draw with PBO data. +TEST_P(ReadPixelsPBODrawTest, DrawWithPBO) +{ + GLColor color(1, 2, 3, 4); + glBindTexture(GL_TEXTURE_2D, mTexture); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &color); + EXPECT_GL_NO_ERROR(); + + glBindFramebuffer(GL_READ_FRAMEBUFFER, mFBO); + EXPECT_GL_NO_ERROR(); + + glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO); + glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, 0); + glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); + EXPECT_GL_NO_ERROR(); + + float positionData[] = { 0.5f, 0.5f }; + + glUseProgram(mProgram); + glViewport(0, 0, 1, 1); + glBindBuffer(GL_ARRAY_BUFFER, mPositionVBO); + glBufferSubData(GL_ARRAY_BUFFER, 0, 1 * 2 * 4, positionData); + EXPECT_GL_NO_ERROR(); + + GLint positionLocation = glGetAttribLocation(mProgram, "aPosition"); + EXPECT_NE(-1, positionLocation); + + GLint testLocation = glGetAttribLocation(mProgram, "aTest"); + EXPECT_NE(-1, testLocation); + + glVertexAttribPointer(positionLocation, 2, GL_FLOAT, GL_FALSE, 0, 0); + glEnableVertexAttribArray(positionLocation); + EXPECT_GL_NO_ERROR(); + + glBindBuffer(GL_ARRAY_BUFFER, mPBO); + glVertexAttribPointer(testLocation, 4, GL_UNSIGNED_BYTE, GL_FALSE, 0, 0); + glEnableVertexAttribArray(testLocation); + EXPECT_GL_NO_ERROR(); + + glDrawArrays(GL_POINTS, 0, 1); + EXPECT_GL_NO_ERROR(); + + color = GLColor(0, 0, 0, 0); + glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &color); + EXPECT_GL_NO_ERROR(); + + EXPECT_EQ(GLColor(1, 2, 3, 4), color); +} + +class ReadPixelsMultisampleTest : public ReadPixelsTest +{ + protected: + ReadPixelsMultisampleTest() : mFBO(0), mRBO(0), mPBO(0) {} + + void SetUp() override + { + ANGLETest::SetUp(); + + glGenFramebuffers(1, &mFBO); + glBindFramebuffer(GL_FRAMEBUFFER, mFBO); + + glGenRenderbuffers(1, &mRBO); + glBindRenderbuffer(GL_RENDERBUFFER, mRBO); + + glGenBuffers(1, &mPBO); + glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO); + glBufferData(GL_PIXEL_PACK_BUFFER, 4 * getWindowWidth() * getWindowHeight(), nullptr, + GL_STATIC_DRAW); + glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); + + ASSERT_GL_NO_ERROR(); + } + + void TearDown() override + { + ANGLETest::TearDown(); + + glDeleteFramebuffers(1, &mFBO); + glDeleteRenderbuffers(1, &mRBO); + glDeleteBuffers(1, &mPBO); + } + + GLuint mFBO; + GLuint mRBO; + GLuint mPBO; +}; + +// Test ReadPixels from a multisampled framebuffer. +TEST_P(ReadPixelsMultisampleTest, BasicClear) +{ + if (getClientMajorVersion() < 3 && !extensionEnabled("GL_ANGLE_framebuffer_multisample")) + { + std::cout << "Test skipped because ES3 or GL_ANGLE_framebuffer_multisample is not available." << std::endl; + return; + } + + if (extensionEnabled("GL_ANGLE_framebuffer_multisample")) + { + glRenderbufferStorageMultisampleANGLE(GL_RENDERBUFFER, 2, GL_RGBA8, 4, 4); + } + else + { + glRenderbufferStorageMultisample(GL_RENDERBUFFER, 2, GL_RGBA8, 4, 4); + } + + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, mRBO); + ASSERT_GL_NO_ERROR(); + + glClearColor(1.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO); + EXPECT_GL_NO_ERROR(); + + glReadPixels(0, 0, 1, 1, GL_RGBA8, GL_UNSIGNED_BYTE, NULL); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); +} + +class ReadPixelsTextureTest : public ANGLETest +{ + public: + ReadPixelsTextureTest() : mFBO(0), mTexture(0) + { + setWindowWidth(32); + setWindowHeight(32); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + glGenTextures(1, &mTexture); + glGenFramebuffers(1, &mFBO); + glBindFramebuffer(GL_FRAMEBUFFER, mFBO); + } + + void TearDown() override + { + glDeleteFramebuffers(1, &mFBO); + glDeleteTextures(1, &mTexture); + + ANGLETest::TearDown(); + } + + void initTexture(GLenum textureTarget, + GLint levels, + GLint attachmentLevel, + GLint attachmentLayer) + { + glBindTexture(textureTarget, mTexture); + glTexStorage3D(textureTarget, levels, GL_RGBA8, 4, 4, 4); + glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTexture, attachmentLevel, + attachmentLayer); + initializeTextureData(textureTarget, levels); + } + + void testRead(GLenum textureTarget, GLint levels, GLint attachmentLevel, GLint attachmentLayer) + { + initTexture(textureTarget, levels, attachmentLevel, attachmentLayer); + verifyColor(attachmentLevel, attachmentLayer); + } + + void initPBO() + { + glGenBuffers(1, &mBuffer); + glBindBuffer(GL_PIXEL_PACK_BUFFER, mBuffer); + glBufferData(GL_PIXEL_PACK_BUFFER, sizeof(angle::GLColor), nullptr, GL_STREAM_COPY); + ASSERT_GL_NO_ERROR(); + } + + void testPBORead(GLenum textureTarget, + GLint levels, + GLint attachmentLevel, + GLint attachmentLayer) + { + initPBO(); + initTexture(textureTarget, levels, attachmentLevel, attachmentLayer); + verifyPBO(attachmentLevel, attachmentLayer); + } + + // Give each {level,layer} pair a (probably) unique color via random. + GLuint getColorValue(GLint level, GLint layer) + { + mRNG.reseed(level + layer * 32); + return mRNG.randomUInt(); + } + + void verifyColor(GLint level, GLint layer) + { + angle::GLColor colorValue(getColorValue(level, layer)); + EXPECT_PIXEL_COLOR_EQ(0, 0, colorValue); + } + + void verifyPBO(GLint level, GLint layer) + { + glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + + angle::GLColor expectedColor(getColorValue(level, layer)); + void *mapPointer = + glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, sizeof(angle::GLColor), GL_MAP_READ_BIT); + ASSERT_NE(nullptr, mapPointer); + angle::GLColor actualColor; + memcpy(&actualColor, mapPointer, sizeof(angle::GLColor)); + glUnmapBuffer(GL_PIXEL_PACK_BUFFER); + ASSERT_GL_NO_ERROR(); + EXPECT_EQ(expectedColor, actualColor); + } + + void initializeTextureData(GLenum textureTarget, GLint levels) + { + for (GLint level = 0; level < levels; ++level) + { + GLint mipSize = 4 >> level; + GLint layers = (textureTarget == GL_TEXTURE_3D ? mipSize : 4); + + size_t layerSize = mipSize * mipSize; + std::vector<GLuint> textureData(layers * layerSize); + + for (GLint layer = 0; layer < layers; ++layer) + { + GLuint colorValue = getColorValue(level, layer); + size_t offset = (layer * layerSize); + std::fill(textureData.begin() + offset, textureData.begin() + offset + layerSize, + colorValue); + } + + glTexSubImage3D(textureTarget, level, 0, 0, 0, mipSize, mipSize, layers, GL_RGBA, + GL_UNSIGNED_BYTE, textureData.data()); + } + } + + angle::RNG mRNG; + GLuint mFBO; + GLuint mTexture; + GLuint mBuffer; +}; + +// Test 3D attachment readback. +TEST_P(ReadPixelsTextureTest, BasicAttachment3D) +{ + testRead(GL_TEXTURE_3D, 1, 0, 0); +} + +// Test 3D attachment readback, non-zero mip. +TEST_P(ReadPixelsTextureTest, MipAttachment3D) +{ + testRead(GL_TEXTURE_3D, 2, 1, 0); +} + +// Test 3D attachment readback, non-zero layer. +TEST_P(ReadPixelsTextureTest, LayerAttachment3D) +{ + testRead(GL_TEXTURE_3D, 1, 0, 1); +} + +// Test 3D attachment readback, non-zero mip and layer. +TEST_P(ReadPixelsTextureTest, MipLayerAttachment3D) +{ + testRead(GL_TEXTURE_3D, 2, 1, 1); +} + +// Test 2D array attachment readback. +TEST_P(ReadPixelsTextureTest, BasicAttachment2DArray) +{ + testRead(GL_TEXTURE_2D_ARRAY, 1, 0, 0); +} + +// Test 3D attachment readback, non-zero mip. +TEST_P(ReadPixelsTextureTest, MipAttachment2DArray) +{ + testRead(GL_TEXTURE_2D_ARRAY, 2, 1, 0); +} + +// Test 3D attachment readback, non-zero layer. +TEST_P(ReadPixelsTextureTest, LayerAttachment2DArray) +{ + testRead(GL_TEXTURE_2D_ARRAY, 1, 0, 1); +} + +// Test 3D attachment readback, non-zero mip and layer. +TEST_P(ReadPixelsTextureTest, MipLayerAttachment2DArray) +{ + testRead(GL_TEXTURE_2D_ARRAY, 2, 1, 1); +} + +// Test 3D attachment PBO readback. +TEST_P(ReadPixelsTextureTest, BasicAttachment3DPBO) +{ + testPBORead(GL_TEXTURE_3D, 1, 0, 0); +} + +// Test 3D attachment readback, non-zero mip. +TEST_P(ReadPixelsTextureTest, MipAttachment3DPBO) +{ + testPBORead(GL_TEXTURE_3D, 2, 1, 0); +} + +// Test 3D attachment readback, non-zero layer. +TEST_P(ReadPixelsTextureTest, LayerAttachment3DPBO) +{ + testPBORead(GL_TEXTURE_3D, 1, 0, 1); +} + +// Test 3D attachment readback, non-zero mip and layer. +TEST_P(ReadPixelsTextureTest, MipLayerAttachment3DPBO) +{ + testPBORead(GL_TEXTURE_3D, 2, 1, 1); +} + +// Test 2D array attachment readback. +TEST_P(ReadPixelsTextureTest, BasicAttachment2DArrayPBO) +{ + testPBORead(GL_TEXTURE_2D_ARRAY, 1, 0, 0); +} + +// Test 3D attachment readback, non-zero mip. +TEST_P(ReadPixelsTextureTest, MipAttachment2DArrayPBO) +{ + testPBORead(GL_TEXTURE_2D_ARRAY, 2, 1, 0); +} + +// Test 3D attachment readback, non-zero layer. +TEST_P(ReadPixelsTextureTest, LayerAttachment2DArrayPBO) +{ + testPBORead(GL_TEXTURE_2D_ARRAY, 1, 0, 1); +} + +// Test 3D attachment readback, non-zero mip and layer. +TEST_P(ReadPixelsTextureTest, MipLayerAttachment2DArrayPBO) +{ + testPBORead(GL_TEXTURE_2D_ARRAY, 2, 1, 1); +} + +// a test class to be used for error checking of glReadPixels +class ReadPixelsErrorTest : public ReadPixelsTest +{ + protected: + ReadPixelsErrorTest() : mTexture(0), mFBO(0) {} + + void SetUp() override + { + ANGLETest::SetUp(); + + glGenTextures(1, &mTexture); + glBindTexture(GL_TEXTURE_2D, mTexture); + glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 4, 1); + + glGenFramebuffers(1, &mFBO); + glBindFramebuffer(GL_FRAMEBUFFER, mFBO); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTexture, 0); + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + ASSERT_GL_NO_ERROR(); + } + + void TearDown() override + { + ANGLETest::TearDown(); + + glDeleteTextures(1, &mTexture); + glDeleteFramebuffers(1, &mFBO); + } + + GLuint mTexture; + GLuint mFBO; +}; + +// The test verifies that glReadPixels generates a GL_INVALID_OPERATION error +// when the read buffer is GL_NONE. +// Reference: GLES 3.0.4, Section 4.3.2 Reading Pixels +TEST_P(ReadPixelsErrorTest, ReadBufferIsNone) +{ + glBindFramebuffer(GL_FRAMEBUFFER, mFBO); + glReadBuffer(GL_NONE); + std::vector<GLubyte> pixels(4); + glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels.data()); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); +} + +} // anonymous namespace + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(ReadPixelsTest, ES2_D3D11(), ES2_OPENGL(), ES2_OPENGLES()); +ANGLE_INSTANTIATE_TEST(ReadPixelsPBOTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); +ANGLE_INSTANTIATE_TEST(ReadPixelsPBODrawTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); +ANGLE_INSTANTIATE_TEST(ReadPixelsMultisampleTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); +ANGLE_INSTANTIATE_TEST(ReadPixelsTextureTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); +ANGLE_INSTANTIATE_TEST(ReadPixelsErrorTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); diff --git a/gfx/angle/src/tests/gl_tests/RendererTest.cpp b/gfx/angle/src/tests/gl_tests/RendererTest.cpp new file mode 100755 index 000000000..1b07acbf7 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/RendererTest.cpp @@ -0,0 +1,210 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// RendererTest: +// These tests are designed to ensure that the various configurations of the test fixtures work as expected. +// If one of these tests fails, then it is likely that some of the other tests are being configured incorrectly. +// For example, they might be using the D3D11 renderer when the test is meant to be using the D3D9 renderer. + +#include "test_utils/ANGLETest.h" + +using namespace angle; + +namespace +{ + +class RendererTest : public ANGLETest +{ + protected: + RendererTest() + { + setWindowWidth(128); + setWindowHeight(128); + } +}; + +TEST_P(RendererTest, RequestedRendererCreated) +{ + std::string rendererString = std::string(reinterpret_cast<const char*>(glGetString(GL_RENDERER))); + std::transform(rendererString.begin(), rendererString.end(), rendererString.begin(), ::tolower); + + std::string versionString = std::string(reinterpret_cast<const char*>(glGetString(GL_VERSION))); + std::transform(versionString.begin(), versionString.end(), versionString.begin(), ::tolower); + + const EGLPlatformParameters &platform = GetParam().eglParameters; + + // Ensure that the renderer string contains D3D11, if we requested a D3D11 renderer. + if (platform.renderer == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE) + { + ASSERT_NE(rendererString.find(std::string("direct3d11")), std::string::npos); + } + + // Ensure that the renderer string contains D3D9, if we requested a D3D9 renderer. + if (platform.renderer == EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE) + { + ASSERT_NE(rendererString.find(std::string("direct3d9")), std::string::npos); + } + + // Ensure that the major and minor versions trigger expected behavior in D3D11 + if (platform.renderer == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE) + { + // Ensure that the renderer uses WARP, if we requested it. + if (platform.deviceType == EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE) + { + auto basicRenderPos = rendererString.find(std::string("microsoft basic render")); + auto softwareAdapterPos = rendererString.find(std::string("software adapter")); + ASSERT_TRUE(basicRenderPos != std::string::npos || softwareAdapterPos != std::string::npos); + } + + std::vector<std::string> acceptableShaderModels; + + // When no specific major/minor version is requested, then ANGLE should return the highest possible feature level by default. + // The current hardware driver might not support Feature Level 11_0, but WARP always does. + // Therefore if WARP is specified but no major/minor version is specified, then we test to check that ANGLE returns FL11_0. + if (platform.majorVersion >= 11 || platform.majorVersion == EGL_DONT_CARE) + { + // Feature Level 10_0 corresponds to shader model 5_0 + acceptableShaderModels.push_back("ps_5_0"); + } + + if (platform.majorVersion >= 10 || platform.majorVersion == EGL_DONT_CARE) + { + if (platform.minorVersion >= 1 || platform.minorVersion == EGL_DONT_CARE) + { + // Feature Level 10_1 corresponds to shader model 4_1 + acceptableShaderModels.push_back("ps_4_1"); + } + + if (platform.minorVersion >= 0 || platform.minorVersion == EGL_DONT_CARE) + { + // Feature Level 10_0 corresponds to shader model 4_0 + acceptableShaderModels.push_back("ps_4_0"); + } + } + + if (platform.majorVersion == 9 && platform.minorVersion == 3) + { + acceptableShaderModels.push_back("ps_4_0_level_9_3"); + } + + bool found = false; + for (size_t i = 0; i < acceptableShaderModels.size(); i++) + { + if (rendererString.find(acceptableShaderModels[i]) != std::string::npos) + { + found = true; + } + } + + ASSERT_TRUE(found); + } + + EGLint glesMajorVersion = GetParam().majorVersion; + + // Ensure that the renderer string contains GL ES 3.0, if we requested a GL ES 3.0 + if (glesMajorVersion == 3) + { + ASSERT_NE(versionString.find(std::string("es 3.0")), std::string::npos); + } + + // Ensure that the version string contains GL ES 2.0, if we requested GL ES 2.0 + if (glesMajorVersion == 2) + { + ASSERT_NE(versionString.find(std::string("es 2.0")), std::string::npos); + } +} + +// Perform a simple operation (clear and read pixels) to verify the device is working +TEST_P(RendererTest, SimpleOperation) +{ + glClearColor(0.0f, 1.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + EXPECT_PIXEL_EQ(0, 0, 0, 255, 0, 255); +} + +// Select configurations (e.g. which renderer, which GLES major version) these tests should be run against. + +ANGLE_INSTANTIATE_TEST(RendererTest, + // ES2 on top of D3D9 + ES2_D3D9(), + ES2_D3D9_REFERENCE(), + + // ES2 on top of D3D11 feature level 9.3 to 11.0 + ES2_D3D11(), + ES2_D3D11_FL11_0(), + ES2_D3D11_FL10_1(), + ES2_D3D11_FL10_0(), + ES2_D3D11_FL9_3(), + + // ES2 on top of D3D11 WARP feature level 9.3 to 11.0 + ES2_D3D11_WARP(), + ES2_D3D11_FL11_0_WARP(), + ES2_D3D11_FL10_1_WARP(), + ES2_D3D11_FL10_0_WARP(), + ES2_D3D11_FL9_3_WARP(), + + // ES2 on top of D3D11 reference feature level 9.3 to 11.0 + ES2_D3D11_REFERENCE(), + ES2_D3D11_FL11_0_REFERENCE(), + ES2_D3D11_FL10_1_REFERENCE(), + ES2_D3D11_FL10_0_REFERENCE(), + ES2_D3D11_FL9_3_REFERENCE(), + + // ES3 on top of D3D11 feature level 9.3 to 11.0 + ES3_D3D11(), + ES3_D3D11_FL11_0(), + ES3_D3D11_FL10_1(), + ES3_D3D11_FL10_0(), + + // ES3 on top of D3D11 WARP feature level 9.3 to 11.0 + ES3_D3D11_WARP(), + ES3_D3D11_FL11_0_WARP(), + ES3_D3D11_FL10_1_WARP(), + ES3_D3D11_FL10_0_WARP(), + + // ES3 on top of D3D11 reference feature level 9.3 to 11.0 + ES3_D3D11_REFERENCE(), + ES3_D3D11_FL11_0_REFERENCE(), + ES3_D3D11_FL10_1_REFERENCE(), + ES3_D3D11_FL10_0_REFERENCE(), + + // ES2 on top of desktop OpenGL versions 2.1 to 4.5 + ES2_OPENGL(), + ES2_OPENGL(2, 1), + ES2_OPENGL(3, 0), + ES2_OPENGL(3, 1), + ES2_OPENGL(3, 2), + ES2_OPENGL(3, 3), + ES2_OPENGL(4, 0), + ES2_OPENGL(4, 1), + ES2_OPENGL(4, 2), + ES2_OPENGL(4, 3), + ES2_OPENGL(4, 4), + ES2_OPENGL(4, 5), + + // ES2 on top of desktop OpenGL versions 3.2 to 4.5 + ES3_OPENGL(), + ES3_OPENGL(3, 2), + ES3_OPENGL(3, 3), + ES3_OPENGL(4, 0), + ES3_OPENGL(4, 1), + ES3_OPENGL(4, 2), + ES3_OPENGL(4, 3), + ES3_OPENGL(4, 4), + ES3_OPENGL(4, 5), + + // ES2 on top of OpenGL ES 2.0 to 3.2 + ES2_OPENGLES(), + ES2_OPENGLES(2, 0), + ES2_OPENGLES(3, 0), + ES2_OPENGLES(3, 1), + ES2_OPENGLES(3, 2), + + // ES2 on top of OpenGL ES 3.0 to 3.2 + ES3_OPENGLES(), + ES3_OPENGLES(3, 0), + ES3_OPENGLES(3, 1), + ES3_OPENGLES(3, 2)); +} diff --git a/gfx/angle/src/tests/gl_tests/RobustClientMemoryTest.cpp b/gfx/angle/src/tests/gl_tests/RobustClientMemoryTest.cpp new file mode 100644 index 000000000..b5f89e904 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/RobustClientMemoryTest.cpp @@ -0,0 +1,385 @@ +// +// Copyright 2016 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +// RobustClientMemoryTest.cpp : Tests of the GL_ANGLE_robust_client_memory extension. + +#include "test_utils/ANGLETest.h" + +#include "test_utils/gl_raii.h" + +namespace angle +{ +class RobustClientMemoryTest : public ANGLETest +{ + protected: + RobustClientMemoryTest() + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + glGetBooleanvRobustANGLE = reinterpret_cast<PFNGLGETBOOLEANVROBUSTANGLE>( + eglGetProcAddress("glGetBooleanvRobustANGLE")); + glGetBufferParameterivRobustANGLE = reinterpret_cast<PFNGLGETBUFFERPARAMETERIVROBUSTANGLE>( + eglGetProcAddress("glGetBufferParameterivRobustANGLE")); + glGetFloatvRobustANGLE = reinterpret_cast<PFNGLGETFLOATVROBUSTANGLE>( + eglGetProcAddress("glGetFloatvRobustANGLE")); + glGetFramebufferAttachmentParameterivRobustANGLE = + reinterpret_cast<PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVROBUSTANGLE>( + eglGetProcAddress("glGetFramebufferAttachmentParameterivRobustANGLE")); + glGetIntegervRobustANGLE = reinterpret_cast<PFNGLGETINTEGERVROBUSTANGLE>( + eglGetProcAddress("glGetIntegervRobustANGLE")); + glGetProgramivRobustANGLE = reinterpret_cast<PFNGLGETPROGRAMIVROBUSTANGLE>( + eglGetProcAddress("glGetProgramivRobustANGLE")); + glGetRenderbufferParameterivRobustANGLE = + reinterpret_cast<PFNGLGETRENDERBUFFERPARAMETERIVROBUSTANGLE>( + eglGetProcAddress("glGetRenderbufferParameterivRobustANGLE")); + glGetShaderivRobustANGLE = reinterpret_cast<PFNGLGETSHADERIVROBUSTANGLE>( + eglGetProcAddress("glGetShaderivRobustANGLE")); + glGetTexParameterfvRobustANGLE = reinterpret_cast<PFNGLGETTEXPARAMETERFVROBUSTANGLE>( + eglGetProcAddress("glGetTexParameterfvRobustANGLE")); + glGetTexParameterivRobustANGLE = reinterpret_cast<PFNGLGETTEXPARAMETERIVROBUSTANGLE>( + eglGetProcAddress("glGetTexParameterivRobustANGLE")); + glGetUniformfvRobustANGLE = reinterpret_cast<PFNGLGETUNIFORMFVROBUSTANGLE>( + eglGetProcAddress("glGetUniformfvRobustANGLE")); + glGetUniformivRobustANGLE = reinterpret_cast<PFNGLGETUNIFORMIVROBUSTANGLE>( + eglGetProcAddress("glGetUniformivRobustANGLE")); + glGetVertexAttribfvRobustANGLE = reinterpret_cast<PFNGLGETVERTEXATTRIBFVROBUSTANGLE>( + eglGetProcAddress("glGetVertexAttribfvRobustANGLE")); + glGetVertexAttribivRobustANGLE = reinterpret_cast<PFNGLGETVERTEXATTRIBIVROBUSTANGLE>( + eglGetProcAddress("glGetVertexAttribivRobustANGLE")); + glGetVertexAttribPointervRobustANGLE = + reinterpret_cast<PFNGLGETVERTEXATTRIBPOINTERVROBUSTANGLE>( + eglGetProcAddress("glGetVertexAttribPointervRobustANGLE")); + glReadPixelsRobustANGLE = reinterpret_cast<PFNGLREADPIXELSROBUSTANGLE>( + eglGetProcAddress("glReadPixelsRobustANGLE")); + glTexImage2DRobustANGLE = reinterpret_cast<PFNGLTEXIMAGE2DROBUSTANGLE>( + eglGetProcAddress("glTexImage2DRobustANGLE")); + glTexParameterfvRobustANGLE = reinterpret_cast<PFNGLTEXPARAMETERFVROBUSTANGLE>( + eglGetProcAddress("glTexParameterfvRobustANGLE")); + glTexParameterivRobustANGLE = reinterpret_cast<PFNGLTEXPARAMETERIVROBUSTANGLE>( + eglGetProcAddress("glTexParameterivRobustANGLE")); + glTexSubImage2DRobustANGLE = reinterpret_cast<PFNGLTEXSUBIMAGE2DROBUSTANGLE>( + eglGetProcAddress("glTexSubImage2DRobustANGLE")); + glTexImage3DRobustANGLE = reinterpret_cast<PFNGLTEXIMAGE3DROBUSTANGLE>( + eglGetProcAddress("glTexImage3DRobustANGLE")); + glTexSubImage3DRobustANGLE = reinterpret_cast<PFNGLTEXSUBIMAGE3DROBUSTANGLE>( + eglGetProcAddress("glTexSubImage3DRobustANGLE")); + glGetQueryivRobustANGLE = reinterpret_cast<PFNGLGETQUERYIVROBUSTANGLE>( + eglGetProcAddress("glGetQueryivRobustANGLE")); + glGetQueryObjectuivRobustANGLE = reinterpret_cast<PFNGLGETQUERYOBJECTUIVROBUSTANGLE>( + eglGetProcAddress("glGetQueryObjectuivRobustANGLE")); + glGetBufferPointervRobustANGLE = reinterpret_cast<PFNGLGETBUFFERPOINTERVROBUSTANGLE>( + eglGetProcAddress("glGetBufferPointervRobustANGLE")); + glGetIntegeri_vRobustANGLE = reinterpret_cast<PFNGLGETINTEGERI_VROBUSTANGLE>( + eglGetProcAddress("glGetIntegeri_vRobustANGLE")); + glGetInternalformativRobustANGLE = reinterpret_cast<PFNGETINTERNALFORMATIVROBUSTANGLE>( + eglGetProcAddress("glGetInternalformativRobustANGLE")); + glGetVertexAttribIivRobustANGLE = reinterpret_cast<PFNGLGETVERTEXATTRIBIIVROBUSTANGLE>( + eglGetProcAddress("glGetVertexAttribIivRobustANGLE")); + glGetVertexAttribIuivRobustANGLE = reinterpret_cast<PFNGLGETVERTEXATTRIBIUIVROBUSTANGLE>( + eglGetProcAddress("glGetVertexAttribIuivRobustANGLE")); + glGetUniformuivRobustANGLE = reinterpret_cast<PFNGLGETUNIFORMUIVROBUSTANGLE>( + eglGetProcAddress("glGetUniformuivRobustANGLE")); + glGetActiveUniformBlockivRobustANGLE = + reinterpret_cast<PFNGLGETACTIVEUNIFORMBLOCKIVROBUSTANGLE>( + eglGetProcAddress("glGetActiveUniformBlockivRobustANGLE")); + glGetInteger64vRobustANGLE = reinterpret_cast<PFNGLGETINTEGER64VROBUSTANGLE>( + eglGetProcAddress("glGetInteger64vRobustANGLE")); + glGetInteger64i_vRobustANGLE = reinterpret_cast<PFNGLGETINTEGER64I_VROBUSTANGLE>( + eglGetProcAddress("glGetInteger64i_vRobustANGLE")); + glGetBufferParameteri64vRobustANGLE = + reinterpret_cast<PFNGLGETBUFFERPARAMETERI64VROBUSTANGLE>( + eglGetProcAddress("glGetBufferParameteri64vRobustANGLE")); + glSamplerParameterivRobustANGLE = reinterpret_cast<PFNGLSAMPLERPARAMETERIVROBUSTANGLE>( + eglGetProcAddress("glSamplerParameterivRobustANGLE")); + glSamplerParameterfvRobustANGLE = reinterpret_cast<PFNGLSAMPLERPARAMETERFVROBUSTANGLE>( + eglGetProcAddress("glSamplerParameterfvRobustANGLE")); + glGetSamplerParameterivRobustANGLE = + reinterpret_cast<PFNGLGETSAMPLERPARAMETERIVROBUSTANGLE>( + eglGetProcAddress("glGetSamplerParameterivRobustANGLE")); + glGetSamplerParameterfvRobustANGLE = + reinterpret_cast<PFNGLGETSAMPLERPARAMETERFVROBUSTANGLE>( + eglGetProcAddress("glGetSamplerParameterfvRobustANGLE")); + glGetFramebufferParameterivRobustANGLE = + reinterpret_cast<PFNGLGETFRAMEBUFFERPARAMETERIVROBUSTANGLE>( + eglGetProcAddress("glGetFramebufferParameterivRobustANGLE")); + glGetProgramInterfaceivRobustANGLE = + reinterpret_cast<PFNGLGETPROGRAMINTERFACEIVROBUSTANGLE>( + eglGetProcAddress("glGetProgramInterfaceivRobustANGLE")); + glGetBooleani_vRobustANGLE = reinterpret_cast<PFNGLGETBOOLEANI_VROBUSTANGLE>( + eglGetProcAddress("glGetBooleani_vRobustANGLE")); + glGetMultisamplefvRobustANGLE = reinterpret_cast<PFNGLGETMULTISAMPLEFVROBUSTANGLE>( + eglGetProcAddress("glGetMultisamplefvRobustANGLE")); + glGetTexLevelParameterivRobustANGLE = + reinterpret_cast<PFNGLGETTEXLEVELPARAMETERIVROBUSTANGLE>( + eglGetProcAddress("glGetTexLevelParameterivRobustANGLE")); + glGetTexLevelParameterfvRobustANGLE = + reinterpret_cast<PFNGLGETTEXLEVELPARAMETERFVROBUSTANGLE>( + eglGetProcAddress("glGetTexLevelParameterfvRobustANGLE")); + glGetPointervRobustANGLERobustANGLE = + reinterpret_cast<PFNGLGETPOINTERVROBUSTANGLEROBUSTANGLE>( + eglGetProcAddress("glGetPointervRobustANGLERobustANGLE")); + glReadnPixelsRobustANGLE = reinterpret_cast<PFNGLREADNPIXELSROBUSTANGLE>( + eglGetProcAddress("glReadnPixelsRobustANGLE")); + glGetnUniformfvRobustANGLE = reinterpret_cast<PFNGLGETNUNIFORMFVROBUSTANGLE>( + eglGetProcAddress("glGetnUniformfvRobustANGLE")); + glGetnUniformivRobustANGLE = reinterpret_cast<PFNGLGETNUNIFORMIVROBUSTANGLE>( + eglGetProcAddress("glGetnUniformivRobustANGLE")); + glGetnUniformuivRobustANGLE = reinterpret_cast<PFNGLGETNUNIFORMUIVROBUSTANGLE>( + eglGetProcAddress("glGetnUniformuivRobustANGLE")); + glTexParameterIivRobustANGLE = reinterpret_cast<PFNGLTEXPARAMETERIIVROBUSTANGLE>( + eglGetProcAddress("glTexParameterIivRobustANGLE")); + glTexParameterIuivRobustANGLE = reinterpret_cast<PFNGLTEXPARAMETERIUIVROBUSTANGLE>( + eglGetProcAddress("glTexParameterIuivRobustANGLE")); + glGetTexParameterIivRobustANGLE = reinterpret_cast<PFNGLGETTEXPARAMETERIIVROBUSTANGLE>( + eglGetProcAddress("glGetTexParameterIivRobustANGLE")); + glGetTexParameterIuivRobustANGLE = reinterpret_cast<PFNGLGETTEXPARAMETERIUIVROBUSTANGLE>( + eglGetProcAddress("glGetTexParameterIuivRobustANGLE")); + glSamplerParameterIivRobustANGLE = reinterpret_cast<PFNGLSAMPLERPARAMETERIIVROBUSTANGLE>( + eglGetProcAddress("glSamplerParameterIivRobustANGLE")); + glSamplerParameterIuivRobustANGLE = reinterpret_cast<PFNGLSAMPLERPARAMETERIUIVROBUSTANGLE>( + eglGetProcAddress("glSamplerParameterIuivRobustANGLE")); + glGetSamplerParameterIivRobustANGLE = + reinterpret_cast<PFNGLGETSAMPLERPARAMETERIIVROBUSTANGLE>( + eglGetProcAddress("glGetSamplerParameterIivRobustANGLE")); + glGetSamplerParameterIuivRobustANGLE = + reinterpret_cast<PFNGLGETSAMPLERPARAMETERIUIVROBUSTANGLE>( + eglGetProcAddress("glGetSamplerParameterIuivRobustANGLE")); + glGetQueryObjectivRobustANGLE = reinterpret_cast<PFNGLGETQUERYOBJECTIVROBUSTANGLE>( + eglGetProcAddress("glGetQueryObjectivRobustANGLE")); + glGetQueryObjecti64vRobustANGLE = reinterpret_cast<PFNGLGETQUERYOBJECTI64VROBUSTANGLE>( + eglGetProcAddress("glGetQueryObjecti64vRobustANGLE")); + glGetQueryObjectui64vRobustANGLE = reinterpret_cast<PFNGLGETQUERYOBJECTUI64VROBUSTANGLE>( + eglGetProcAddress("glGetQueryObjectui64vRobustANGLE")); + } + + void TearDown() override { ANGLETest::TearDown(); } + + bool extensionsPresent() const + { + if (!extensionEnabled("GL_ANGLE_robust_client_memory")) + { + std::cout << "Test skipped because GL_ANGLE_robust_client_memory is not available."; + return false; + } + + return true; + } + + PFNGLGETBOOLEANVROBUSTANGLE glGetBooleanvRobustANGLE = nullptr; + PFNGLGETBUFFERPARAMETERIVROBUSTANGLE glGetBufferParameterivRobustANGLE = nullptr; + PFNGLGETFLOATVROBUSTANGLE glGetFloatvRobustANGLE = nullptr; + PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVROBUSTANGLE + glGetFramebufferAttachmentParameterivRobustANGLE = nullptr; + PFNGLGETINTEGERVROBUSTANGLE glGetIntegervRobustANGLE = nullptr; + PFNGLGETPROGRAMIVROBUSTANGLE glGetProgramivRobustANGLE = nullptr; + PFNGLGETRENDERBUFFERPARAMETERIVROBUSTANGLE glGetRenderbufferParameterivRobustANGLE = nullptr; + PFNGLGETSHADERIVROBUSTANGLE glGetShaderivRobustANGLE = nullptr; + PFNGLGETTEXPARAMETERFVROBUSTANGLE glGetTexParameterfvRobustANGLE = nullptr; + PFNGLGETTEXPARAMETERIVROBUSTANGLE glGetTexParameterivRobustANGLE = nullptr; + PFNGLGETUNIFORMFVROBUSTANGLE glGetUniformfvRobustANGLE = nullptr; + PFNGLGETUNIFORMIVROBUSTANGLE glGetUniformivRobustANGLE = nullptr; + PFNGLGETVERTEXATTRIBFVROBUSTANGLE glGetVertexAttribfvRobustANGLE = nullptr; + PFNGLGETVERTEXATTRIBIVROBUSTANGLE glGetVertexAttribivRobustANGLE = nullptr; + PFNGLGETVERTEXATTRIBPOINTERVROBUSTANGLE glGetVertexAttribPointervRobustANGLE = nullptr; + PFNGLREADPIXELSROBUSTANGLE glReadPixelsRobustANGLE = nullptr; + PFNGLTEXIMAGE2DROBUSTANGLE glTexImage2DRobustANGLE = nullptr; + PFNGLTEXPARAMETERFVROBUSTANGLE glTexParameterfvRobustANGLE = nullptr; + PFNGLTEXPARAMETERIVROBUSTANGLE glTexParameterivRobustANGLE = nullptr; + PFNGLTEXSUBIMAGE2DROBUSTANGLE glTexSubImage2DRobustANGLE = nullptr; + PFNGLTEXIMAGE3DROBUSTANGLE glTexImage3DRobustANGLE = nullptr; + PFNGLTEXSUBIMAGE3DROBUSTANGLE glTexSubImage3DRobustANGLE = nullptr; + PFNGLGETQUERYIVROBUSTANGLE glGetQueryivRobustANGLE = nullptr; + PFNGLGETQUERYOBJECTUIVROBUSTANGLE glGetQueryObjectuivRobustANGLE = nullptr; + PFNGLGETBUFFERPOINTERVROBUSTANGLE glGetBufferPointervRobustANGLE = nullptr; + PFNGLGETINTEGERI_VROBUSTANGLE glGetIntegeri_vRobustANGLE = nullptr; + PFNGETINTERNALFORMATIVROBUSTANGLE glGetInternalformativRobustANGLE = nullptr; + PFNGLGETVERTEXATTRIBIIVROBUSTANGLE glGetVertexAttribIivRobustANGLE = nullptr; + PFNGLGETVERTEXATTRIBIUIVROBUSTANGLE glGetVertexAttribIuivRobustANGLE = nullptr; + PFNGLGETUNIFORMUIVROBUSTANGLE glGetUniformuivRobustANGLE = nullptr; + PFNGLGETACTIVEUNIFORMBLOCKIVROBUSTANGLE glGetActiveUniformBlockivRobustANGLE = nullptr; + PFNGLGETINTEGER64VROBUSTANGLE glGetInteger64vRobustANGLE = nullptr; + PFNGLGETINTEGER64I_VROBUSTANGLE glGetInteger64i_vRobustANGLE = nullptr; + PFNGLGETBUFFERPARAMETERI64VROBUSTANGLE glGetBufferParameteri64vRobustANGLE = nullptr; + PFNGLSAMPLERPARAMETERIVROBUSTANGLE glSamplerParameterivRobustANGLE = nullptr; + PFNGLSAMPLERPARAMETERFVROBUSTANGLE glSamplerParameterfvRobustANGLE = nullptr; + PFNGLGETSAMPLERPARAMETERIVROBUSTANGLE glGetSamplerParameterivRobustANGLE = nullptr; + PFNGLGETSAMPLERPARAMETERFVROBUSTANGLE glGetSamplerParameterfvRobustANGLE = nullptr; + PFNGLGETFRAMEBUFFERPARAMETERIVROBUSTANGLE glGetFramebufferParameterivRobustANGLE = nullptr; + PFNGLGETPROGRAMINTERFACEIVROBUSTANGLE glGetProgramInterfaceivRobustANGLE = nullptr; + PFNGLGETBOOLEANI_VROBUSTANGLE glGetBooleani_vRobustANGLE = nullptr; + PFNGLGETMULTISAMPLEFVROBUSTANGLE glGetMultisamplefvRobustANGLE = nullptr; + PFNGLGETTEXLEVELPARAMETERIVROBUSTANGLE glGetTexLevelParameterivRobustANGLE = nullptr; + PFNGLGETTEXLEVELPARAMETERFVROBUSTANGLE glGetTexLevelParameterfvRobustANGLE = nullptr; + PFNGLGETPOINTERVROBUSTANGLEROBUSTANGLE glGetPointervRobustANGLERobustANGLE = nullptr; + PFNGLREADNPIXELSROBUSTANGLE glReadnPixelsRobustANGLE = nullptr; + PFNGLGETNUNIFORMFVROBUSTANGLE glGetnUniformfvRobustANGLE = nullptr; + PFNGLGETNUNIFORMIVROBUSTANGLE glGetnUniformivRobustANGLE = nullptr; + PFNGLGETNUNIFORMUIVROBUSTANGLE glGetnUniformuivRobustANGLE = nullptr; + PFNGLTEXPARAMETERIIVROBUSTANGLE glTexParameterIivRobustANGLE = nullptr; + PFNGLTEXPARAMETERIUIVROBUSTANGLE glTexParameterIuivRobustANGLE = nullptr; + PFNGLGETTEXPARAMETERIIVROBUSTANGLE glGetTexParameterIivRobustANGLE = nullptr; + PFNGLGETTEXPARAMETERIUIVROBUSTANGLE glGetTexParameterIuivRobustANGLE = nullptr; + PFNGLSAMPLERPARAMETERIIVROBUSTANGLE glSamplerParameterIivRobustANGLE = nullptr; + PFNGLSAMPLERPARAMETERIUIVROBUSTANGLE glSamplerParameterIuivRobustANGLE = nullptr; + PFNGLGETSAMPLERPARAMETERIIVROBUSTANGLE glGetSamplerParameterIivRobustANGLE = nullptr; + PFNGLGETSAMPLERPARAMETERIUIVROBUSTANGLE glGetSamplerParameterIuivRobustANGLE = nullptr; + PFNGLGETQUERYOBJECTIVROBUSTANGLE glGetQueryObjectivRobustANGLE = nullptr; + PFNGLGETQUERYOBJECTI64VROBUSTANGLE glGetQueryObjecti64vRobustANGLE = nullptr; + PFNGLGETQUERYOBJECTUI64VROBUSTANGLE glGetQueryObjectui64vRobustANGLE = nullptr; +}; + +// Test basic usage and validation of glGetIntegervRobustANGLE +TEST_P(RobustClientMemoryTest, GetInteger) +{ + if (!extensionsPresent()) + { + return; + } + + // Verify that the robust and regular entry points return the same values + GLint resultRobust; + GLsizei length; + glGetIntegervRobustANGLE(GL_MAX_VERTEX_ATTRIBS, 1, &length, &resultRobust); + EXPECT_GL_NO_ERROR(); + EXPECT_EQ(1, length); + + GLint resultRegular; + glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &resultRegular); + EXPECT_GL_NO_ERROR(); + EXPECT_EQ(resultRegular, resultRobust); + + // Query a dynamic value + GLint numCompressedFormats; + glGetIntegervRobustANGLE(GL_NUM_COMPRESSED_TEXTURE_FORMATS, 1, &length, &numCompressedFormats); + ASSERT_GL_NO_ERROR(); + EXPECT_EQ(1, length); + + if (numCompressedFormats > 0) + { + std::vector<GLint> resultBuf(numCompressedFormats * 2, 0); + + // Test when the bufSize is too low + glGetIntegervRobustANGLE(GL_COMPRESSED_TEXTURE_FORMATS, numCompressedFormats - 1, &length, + resultBuf.data()); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + EXPECT_TRUE(std::all_of(resultBuf.begin(), resultBuf.end(), + [](GLint value) { return value == 0; })); + + // Make sure the GL doesn't touch the end of the buffer + glGetIntegervRobustANGLE(GL_COMPRESSED_TEXTURE_FORMATS, + static_cast<GLsizei>(resultBuf.size()), &length, resultBuf.data()); + EXPECT_GL_NO_ERROR(); + EXPECT_EQ(numCompressedFormats, length); + EXPECT_TRUE(std::none_of(resultBuf.begin(), resultBuf.begin() + length, + [](GLint value) { return value == 0; })); + EXPECT_TRUE(std::all_of(resultBuf.begin() + length, resultBuf.end(), + [](GLint value) { return value == 0; })); + } + + // Test with null length + glGetIntegervRobustANGLE(GL_MAX_VARYING_VECTORS, 1, nullptr, &resultRobust); + EXPECT_GL_NO_ERROR(); + + glGetIntegervRobustANGLE(GL_MAX_VIEWPORT_DIMS, 1, nullptr, &resultRobust); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + GLint maxViewportDims[2]; + glGetIntegervRobustANGLE(GL_MAX_VIEWPORT_DIMS, 2, nullptr, maxViewportDims); + EXPECT_GL_NO_ERROR(); +} + +// Test basic usage and validation of glTexImage2DRobustANGLE +TEST_P(RobustClientMemoryTest, TexImage2D) +{ + if (!extensionsPresent()) + { + return; + } + GLTexture tex; + glBindTexture(GL_TEXTURE_2D, tex.get()); + + GLsizei dataDimension = 1024; + std::vector<GLubyte> rgbaData(dataDimension * dataDimension * 4); + + // Test the regular case + glTexImage2DRobustANGLE(GL_TEXTURE_2D, 0, GL_RGBA, dataDimension, dataDimension, 0, GL_RGBA, + GL_UNSIGNED_BYTE, static_cast<GLsizei>(rgbaData.size()), + rgbaData.data()); + EXPECT_GL_NO_ERROR(); + + // Test with a data size that is too small + glTexImage2DRobustANGLE(GL_TEXTURE_2D, 0, GL_RGBA, dataDimension, dataDimension, 0, GL_RGBA, + GL_UNSIGNED_BYTE, static_cast<GLsizei>(rgbaData.size()) / 2, + rgbaData.data()); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + if (getClientMajorVersion() >= 3) + { + // Set an unpack parameter that would cause the driver to read past the end of the buffer + glPixelStorei(GL_UNPACK_ROW_LENGTH, dataDimension + 1); + glTexImage2DRobustANGLE(GL_TEXTURE_2D, 0, GL_RGBA, dataDimension, dataDimension, 0, GL_RGBA, + GL_UNSIGNED_BYTE, static_cast<GLsizei>(rgbaData.size()), + rgbaData.data()); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + } +} + +// Test basic usage and validation of glReadPixelsRobustANGLE +TEST_P(RobustClientMemoryTest, ReadPixels) +{ + if (!extensionsPresent()) + { + return; + } + + GLsizei dataDimension = 16; + std::vector<GLubyte> rgbaData(dataDimension * dataDimension * 4); + + // Test the regular case + GLsizei length = 0; + glReadPixelsRobustANGLE(0, 0, dataDimension, dataDimension, GL_RGBA, GL_UNSIGNED_BYTE, + static_cast<GLsizei>(rgbaData.size()), &length, rgbaData.data()); + EXPECT_GL_NO_ERROR(); + EXPECT_EQ(static_cast<GLsizei>(rgbaData.size()), length); + + // Test with a data size that is too small + glReadPixelsRobustANGLE(0, 0, dataDimension, dataDimension, GL_RGBA, GL_UNSIGNED_BYTE, + static_cast<GLsizei>(rgbaData.size()) - 1, &length, rgbaData.data()); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + if (getClientMajorVersion() >= 3) + { + // Set a pack parameter that would cause the driver to write past the end of the buffer + glPixelStorei(GL_PACK_ROW_LENGTH, dataDimension + 1); + glReadPixelsRobustANGLE(0, 0, dataDimension, dataDimension, GL_RGBA, GL_UNSIGNED_BYTE, + static_cast<GLsizei>(rgbaData.size()), &length, rgbaData.data()); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + } +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these +// tests should be run against. +ANGLE_INSTANTIATE_TEST(RobustClientMemoryTest, + ES2_D3D9(), + ES2_D3D11(), + ES3_D3D11(), + ES2_D3D11_FL9_3(), + ES2_OPENGL(), + ES3_OPENGL(), + ES2_OPENGLES(), + ES3_OPENGLES()); + +} // namespace diff --git a/gfx/angle/src/tests/gl_tests/SRGBFramebufferTest.cpp b/gfx/angle/src/tests/gl_tests/SRGBFramebufferTest.cpp new file mode 100644 index 000000000..47ff2f3e0 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/SRGBFramebufferTest.cpp @@ -0,0 +1,141 @@ +// +// Copyright 2016 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +// SRGBFramebufferTest.cpp: Tests of sRGB framebuffer functionality. + +#include "test_utils/ANGLETest.h" +#include "test_utils/gl_raii.h" + +namespace angle +{ + +class SRGBFramebufferTest : public ANGLETest +{ + protected: + SRGBFramebufferTest() + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + const std::string vs = + "precision highp float;\n" + "attribute vec4 position;\n" + "void main()\n" + "{\n" + " gl_Position = vec4(position.xy, 0.0, 1.0);\n" + "}\n"; + + const std::string fs = + "precision highp float;\n" + "uniform vec4 color;\n" + "void main()\n" + "{\n" + " gl_FragColor = color;\n" + "}\n"; + + mProgram = CompileProgram(vs, fs); + ASSERT_NE(0u, mProgram); + + mColorLocation = glGetUniformLocation(mProgram, "color"); + ASSERT_NE(-1, mColorLocation); + } + + void TearDown() override + { + glDeleteProgram(mProgram); + + ANGLETest::TearDown(); + } + + GLuint mProgram = 0; + GLint mColorLocation = -1; +}; + +// Test basic validation of GL_EXT_sRGB_write_control +TEST_P(SRGBFramebufferTest, Validation) +{ + GLenum expectedError = + extensionEnabled("GL_EXT_sRGB_write_control") ? GL_NO_ERROR : GL_INVALID_ENUM; + + GLboolean value = GL_FALSE; + glEnable(GL_FRAMEBUFFER_SRGB_EXT); + EXPECT_GL_ERROR(expectedError); + + glGetBooleanv(GL_FRAMEBUFFER_SRGB_EXT, &value); + EXPECT_GL_ERROR(expectedError); + if (expectedError == GL_NO_ERROR) + { + EXPECT_EQ(GL_TRUE, value); + } + + glDisable(GL_FRAMEBUFFER_SRGB_EXT); + EXPECT_GL_ERROR(expectedError); + + glGetBooleanv(GL_FRAMEBUFFER_SRGB_EXT, &value); + EXPECT_GL_ERROR(expectedError); + if (expectedError == GL_NO_ERROR) + { + EXPECT_EQ(GL_FALSE, value); + } +} + +// Test basic functionality of GL_EXT_sRGB_write_control +TEST_P(SRGBFramebufferTest, BasicUsage) +{ + if (!extensionEnabled("GL_EXT_sRGB_write_control") || + (!extensionEnabled("GL_EXT_sRGB") && getClientMajorVersion() < 3)) + { + std::cout + << "Test skipped because GL_EXT_sRGB_write_control and GL_EXT_sRGB are not available." + << std::endl; + return; + } + + GLColor linearColor(64, 127, 191, 255); + GLColor srgbColor(13, 54, 133, 255); + + GLTexture texture; + glBindTexture(GL_TEXTURE_2D, texture.get()); + glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB_ALPHA_EXT, 1, 1, 0, GL_SRGB_ALPHA_EXT, GL_UNSIGNED_BYTE, + nullptr); + + GLFramebuffer framebuffer; + glBindFramebuffer(GL_FRAMEBUFFER, framebuffer.get()); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture.get(), 0); + + glUseProgram(mProgram); + glUniform4fv(mColorLocation, 1, srgbColor.toNormalizedVector().data()); + + glEnable(GL_FRAMEBUFFER_SRGB_EXT); + drawQuad(mProgram, "position", 0.5f); + EXPECT_PIXEL_COLOR_NEAR(0, 0, linearColor, 1.0); + + glDisable(GL_FRAMEBUFFER_SRGB_EXT); + drawQuad(mProgram, "position", 0.5f); + EXPECT_PIXEL_COLOR_NEAR(0, 0, srgbColor, 1.0); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these +// tests should be run against. +ANGLE_INSTANTIATE_TEST(SRGBFramebufferTest, + ES2_D3D9(), + ES2_D3D11(), + ES3_D3D11(), + ES2_OPENGL(), + ES3_OPENGL(), + ES2_OPENGLES(), + ES3_OPENGLES()); + +} // namespace angle diff --git a/gfx/angle/src/tests/gl_tests/SRGBTextureTest.cpp b/gfx/angle/src/tests/gl_tests/SRGBTextureTest.cpp new file mode 100755 index 000000000..f379f429f --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/SRGBTextureTest.cpp @@ -0,0 +1,268 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "test_utils/ANGLETest.h" +#include "test_utils/gl_raii.h" + +namespace angle +{ + +class SRGBTextureTest : public ANGLETest +{ + protected: + SRGBTextureTest() + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + const std::string vs = + "precision highp float;\n" + "attribute vec4 position;\n" + "varying vec2 texcoord;\n" + "\n" + "void main()\n" + "{\n" + " gl_Position = vec4(position.xy, 0.0, 1.0);\n" + " texcoord = (position.xy * 0.5) + 0.5;\n" + "}\n"; + + const std::string fs = + "precision highp float;\n" + "uniform sampler2D tex;\n" + "varying vec2 texcoord;\n" + "\n" + "void main()\n" + "{\n" + " gl_FragColor = texture2D(tex, texcoord);\n" + "}\n"; + + mProgram = CompileProgram(vs, fs); + ASSERT_NE(0u, mProgram); + + mTextureLocation = glGetUniformLocation(mProgram, "tex"); + ASSERT_NE(-1, mTextureLocation); + } + + void TearDown() override + { + glDeleteProgram(mProgram); + + ANGLETest::TearDown(); + } + + GLuint mProgram = 0; + GLint mTextureLocation = -1; +}; + +TEST_P(SRGBTextureTest, SRGBValidation) +{ + bool supported = extensionEnabled("GL_EXT_sRGB") || getClientMajorVersion() == 3; + + GLuint tex = 0; + glGenTextures(1, &tex); + glBindTexture(GL_TEXTURE_2D, tex); + + GLubyte pixel[3] = { 0 }; + glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB, 1, 1, 0, GL_SRGB, GL_UNSIGNED_BYTE, pixel); + if (supported) + { + EXPECT_GL_NO_ERROR(); + + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, GL_SRGB, GL_UNSIGNED_BYTE, pixel); + EXPECT_GL_NO_ERROR(); + + glGenerateMipmap(GL_TEXTURE_2D); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + } + else + { + EXPECT_GL_ERROR(GL_INVALID_ENUM); + } + + glDeleteTextures(1, &tex); +} + +TEST_P(SRGBTextureTest, SRGBAValidation) +{ + bool supported = extensionEnabled("GL_EXT_sRGB") || getClientMajorVersion() == 3; + + GLuint tex = 0; + glGenTextures(1, &tex); + glBindTexture(GL_TEXTURE_2D, tex); + + GLubyte pixel[4] = { 0 }; + glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB_ALPHA_EXT, 1, 1, 0, GL_SRGB_ALPHA_EXT, GL_UNSIGNED_BYTE, pixel); + if (supported) + { + EXPECT_GL_NO_ERROR(); + + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, GL_SRGB_ALPHA_EXT, GL_UNSIGNED_BYTE, pixel); + EXPECT_GL_NO_ERROR(); + + glGenerateMipmap(GL_TEXTURE_2D); + if (getClientMajorVersion() == 2) + { + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + } + else + { + EXPECT_GL_NO_ERROR(); + } + } + else + { + EXPECT_GL_ERROR(GL_INVALID_ENUM); + } + + glDeleteTextures(1, &tex); +} + +TEST_P(SRGBTextureTest, SRGBARenderbuffer) +{ + bool supported = extensionEnabled("GL_EXT_sRGB") || getClientMajorVersion() == 3; + + GLuint rbo = 0; + glGenRenderbuffers(1, &rbo); + glBindRenderbuffer(GL_RENDERBUFFER, rbo); + + glRenderbufferStorage(GL_RENDERBUFFER, GL_SRGB8_ALPHA8_EXT, 1, 1); + if (supported) + { + EXPECT_GL_NO_ERROR(); + } + else + { + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + // Make sure the rbo has a size for future tests + glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8_OES, 1, 1); + EXPECT_GL_NO_ERROR(); + } + + GLuint fbo = 0; + glGenFramebuffers(1, &fbo); + glBindFramebuffer(GL_FRAMEBUFFER, fbo); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo); + EXPECT_GL_NO_ERROR(); + + GLint colorEncoding = 0; + glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT, &colorEncoding); + if (supported) + { + EXPECT_GL_NO_ERROR(); + EXPECT_EQ(GL_SRGB_EXT, colorEncoding); + } + else + { + EXPECT_GL_ERROR(GL_INVALID_ENUM); + } + + glDeleteFramebuffers(1, &fbo); + glDeleteRenderbuffers(1, &rbo); +} + +// Verify that if the srgb decode extension is available, srgb textures are too +TEST_P(SRGBTextureTest, SRGBDecodeExtensionAvailability) +{ + bool hasSRGBDecode = extensionEnabled("GL_EXT_texture_sRGB_decode"); + if (hasSRGBDecode) + { + bool hasSRGBTextures = extensionEnabled("GL_EXT_sRGB") || getClientMajorVersion() >= 3; + EXPECT_TRUE(hasSRGBTextures); + } +} + +// Test basic functionality of SRGB decode using the texture parameter +TEST_P(SRGBTextureTest, SRGBDecodeTextureParameter) +{ + if (!extensionEnabled("GL_EXT_texture_sRGB_decode")) + { + std::cout << "Test skipped because GL_EXT_texture_sRGB_decode is not available." + << std::endl; + return; + } + + GLColor linearColor(64, 127, 191, 255); + GLColor srgbColor(13, 54, 133, 255); + + GLTexture tex; + glBindTexture(GL_TEXTURE_2D, tex.get()); + glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB_ALPHA_EXT, 1, 1, 0, GL_SRGB_ALPHA_EXT, GL_UNSIGNED_BYTE, + &linearColor); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SRGB_DECODE_EXT, GL_DECODE_EXT); + ASSERT_GL_NO_ERROR(); + + glUseProgram(mProgram); + glUniform1i(mTextureLocation, 0); + + glDisable(GL_DEPTH_TEST); + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_COLOR_NEAR(0, 0, srgbColor, 1.0); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SRGB_DECODE_EXT, GL_SKIP_DECODE_EXT); + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_COLOR_NEAR(0, 0, linearColor, 1.0); +} + +// Test basic functionality of SRGB decode using the sampler parameter +TEST_P(SRGBTextureTest, SRGBDecodeSamplerParameter) +{ + if (!extensionEnabled("GL_EXT_texture_sRGB_decode") || getClientMajorVersion() < 3) + { + std::cout << "Test skipped because GL_EXT_texture_sRGB_decode or ES3 is not available." + << std::endl; + return; + } + + GLColor linearColor(64, 127, 191, 255); + GLColor srgbColor(13, 54, 133, 255); + + GLTexture tex; + glBindTexture(GL_TEXTURE_2D, tex.get()); + glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB_ALPHA_EXT, 1, 1, 0, GL_SRGB_ALPHA_EXT, GL_UNSIGNED_BYTE, + &linearColor); + ASSERT_GL_NO_ERROR(); + + GLSampler sampler; + glBindSampler(0, sampler.get()); + glSamplerParameteri(sampler.get(), GL_TEXTURE_SRGB_DECODE_EXT, GL_DECODE_EXT); + + glUseProgram(mProgram); + glUniform1i(mTextureLocation, 0); + + glDisable(GL_DEPTH_TEST); + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_COLOR_NEAR(0, 0, srgbColor, 1.0); + + glSamplerParameteri(sampler.get(), GL_TEXTURE_SRGB_DECODE_EXT, GL_SKIP_DECODE_EXT); + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_COLOR_NEAR(0, 0, linearColor, 1.0); +} +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(SRGBTextureTest, + ES2_D3D9(), + ES2_D3D11(), + ES3_D3D11(), + ES2_OPENGL(), + ES3_OPENGL(), + ES2_OPENGLES(), + ES3_OPENGLES()); + +} // namespace diff --git a/gfx/angle/src/tests/gl_tests/SimpleOperationTest.cpp b/gfx/angle/src/tests/gl_tests/SimpleOperationTest.cpp new file mode 100755 index 000000000..b11fb9fe9 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/SimpleOperationTest.cpp @@ -0,0 +1,212 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// SimpleOperationTest: +// Basic GL commands such as linking a program, initializing a buffer, etc. + +#include "test_utils/ANGLETest.h" + +#include <vector> + +using namespace angle; + +namespace +{ + +class SimpleOperationTest : public ANGLETest +{ + protected: + SimpleOperationTest() + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } +}; + +TEST_P(SimpleOperationTest, CompileVertexShader) +{ + const std::string source = SHADER_SOURCE + ( + attribute vec4 a_input; + void main() + { + gl_Position = a_input; + } + ); + + GLuint shader = CompileShader(GL_VERTEX_SHADER, source); + EXPECT_NE(shader, 0u); + glDeleteShader(shader); + + EXPECT_GL_NO_ERROR(); +} + +TEST_P(SimpleOperationTest, CompileFragmentShader) +{ + const std::string source = SHADER_SOURCE + ( + precision mediump float; + varying vec4 v_input; + void main() + { + gl_FragColor = v_input; + } + ); + + GLuint shader = CompileShader(GL_FRAGMENT_SHADER, source); + EXPECT_NE(shader, 0u); + glDeleteShader(shader); + + EXPECT_GL_NO_ERROR(); +} + +TEST_P(SimpleOperationTest, LinkProgram) +{ + const std::string vsSource = SHADER_SOURCE + ( + void main() + { + gl_Position = vec4(1.0, 1.0, 1.0, 1.0); + } + ); + + const std::string fsSource = SHADER_SOURCE + ( + void main() + { + gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); + } + ); + + GLuint program = CompileProgram(vsSource, fsSource); + EXPECT_NE(program, 0u); + glDeleteProgram(program); + + EXPECT_GL_NO_ERROR(); +} + +TEST_P(SimpleOperationTest, LinkProgramWithUniforms) +{ + const std::string vsSource = SHADER_SOURCE + ( + void main() + { + gl_Position = vec4(1.0, 1.0, 1.0, 1.0); + } + ); + + const std::string fsSource = SHADER_SOURCE + ( + precision mediump float; + uniform vec4 u_input; + void main() + { + gl_FragColor = u_input; + } + ); + + GLuint program = CompileProgram(vsSource, fsSource); + EXPECT_NE(program, 0u); + + GLint uniformLoc = glGetUniformLocation(program, "u_input"); + EXPECT_NE(-1, uniformLoc); + + glDeleteProgram(program); + + EXPECT_GL_NO_ERROR(); +} + +TEST_P(SimpleOperationTest, LinkProgramWithAttributes) +{ + const std::string vsSource = SHADER_SOURCE + ( + attribute vec4 a_input; + void main() + { + gl_Position = a_input; + } + ); + + const std::string fsSource = SHADER_SOURCE + ( + void main() + { + gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); + } + ); + + GLuint program = CompileProgram(vsSource, fsSource); + EXPECT_NE(program, 0u); + + GLint attribLoc = glGetAttribLocation(program, "a_input"); + EXPECT_NE(-1, attribLoc); + + glDeleteProgram(program); + + EXPECT_GL_NO_ERROR(); +} + +TEST_P(SimpleOperationTest, BufferDataWithData) +{ + GLuint buffer; + glGenBuffers(1, &buffer); + glBindBuffer(GL_ARRAY_BUFFER, buffer); + + std::vector<uint8_t> data(1024); + glBufferData(GL_ARRAY_BUFFER, data.size(), &data[0], GL_STATIC_DRAW); + + glDeleteBuffers(1, &buffer); + + EXPECT_GL_NO_ERROR(); +} + +TEST_P(SimpleOperationTest, BufferDataWithNoData) +{ + GLuint buffer; + glGenBuffers(1, &buffer); + glBindBuffer(GL_ARRAY_BUFFER, buffer); + glBufferData(GL_ARRAY_BUFFER, 1024, nullptr, GL_STATIC_DRAW); + glDeleteBuffers(1, &buffer); + + EXPECT_GL_NO_ERROR(); +} + +TEST_P(SimpleOperationTest, BufferSubData) +{ + GLuint buffer; + glGenBuffers(1, &buffer); + glBindBuffer(GL_ARRAY_BUFFER, buffer); + + const size_t bufferSize = 1024; + glBufferData(GL_ARRAY_BUFFER, bufferSize, nullptr, GL_STATIC_DRAW); + + const size_t subDataCount = 16; + std::vector<uint8_t> data(bufferSize / subDataCount); + for (size_t i = 0; i < subDataCount; i++) + { + glBufferSubData(GL_ARRAY_BUFFER, data.size() * i, data.size(), &data[0]); + } + + glDeleteBuffers(1, &buffer); + + EXPECT_GL_NO_ERROR(); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(SimpleOperationTest, + ES2_D3D9(), + ES2_D3D11(EGL_EXPERIMENTAL_PRESENT_PATH_COPY_ANGLE), + ES2_D3D11(EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE), + ES3_D3D11(), + ES2_OPENGL(), + ES3_OPENGL(), + ES2_OPENGLES(), + ES3_OPENGLES()); + +} // namespace diff --git a/gfx/angle/src/tests/gl_tests/SixteenBppTextureTest.cpp b/gfx/angle/src/tests/gl_tests/SixteenBppTextureTest.cpp new file mode 100755 index 000000000..dfc4111d7 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/SixteenBppTextureTest.cpp @@ -0,0 +1,551 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// SixteenBppTextureTest: +// Basic tests using 16bpp texture formats (e.g. GL_RGB565). + +#include "test_utils/ANGLETest.h" +#include "test_utils/gl_raii.h" + +#include "image_util/imageformats.h" + +using namespace angle; + +namespace +{ + +GLColor Convert565(const R5G6B5 &rgb565) +{ + gl::ColorF colorf; + R5G6B5::readColor(&colorf, &rgb565); + Vector4 vecColor(colorf.red, colorf.green, colorf.blue, colorf.alpha); + return GLColor(vecColor); +} + +R5G6B5 Convert565(const GLColor &glColor) +{ + const Vector4 &vecColor = glColor.toNormalizedVector(); + gl::ColorF colorf(vecColor.x, vecColor.y, vecColor.z, vecColor.w); + R5G6B5 rgb565; + R5G6B5::writeColor(&rgb565, &colorf); + return rgb565; +} + +class SixteenBppTextureTest : public ANGLETest +{ + protected: + SixteenBppTextureTest() + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + const std::string vertexShaderSource = SHADER_SOURCE + ( + precision highp float; + attribute vec4 position; + varying vec2 texcoord; + + void main() + { + gl_Position = vec4(position.xy, 0.0, 1.0); + texcoord = (position.xy * 0.5) + 0.5; + } + ); + + const std::string fragmentShaderSource2D = SHADER_SOURCE + ( + precision highp float; + uniform sampler2D tex; + varying vec2 texcoord; + + void main() + { + gl_FragColor = texture2D(tex, texcoord); + } + ); + + m2DProgram = CompileProgram(vertexShaderSource, fragmentShaderSource2D); + mTexture2DUniformLocation = glGetUniformLocation(m2DProgram, "tex"); + } + + void TearDown() override + { + glDeleteProgram(m2DProgram); + + ANGLETest::TearDown(); + } + + void simpleValidationBase(GLuint tex) + { + // Draw a quad using the texture + glClear(GL_COLOR_BUFFER_BIT); + glUseProgram(m2DProgram); + glUniform1i(mTexture2DUniformLocation, 0); + drawQuad(m2DProgram, "position", 0.5f); + ASSERT_GL_NO_ERROR(); + + int w = getWindowWidth() - 1; + int h = getWindowHeight() - 1; + + // Check that it drew as expected + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red); + EXPECT_PIXEL_COLOR_EQ(w, 0, GLColor::green); + EXPECT_PIXEL_COLOR_EQ(0, h, GLColor::blue); + EXPECT_PIXEL_COLOR_EQ(w, h, GLColor::yellow); + + // Generate mipmaps + glGenerateMipmap(GL_TEXTURE_2D); + + // Draw a quad using the texture + glClear(GL_COLOR_BUFFER_BIT); + glUseProgram(m2DProgram); + glUniform1i(mTexture2DUniformLocation, 0); + drawQuad(m2DProgram, "position", 0.5f); + ASSERT_GL_NO_ERROR(); + + // Check that it drew as expected + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red); + EXPECT_PIXEL_COLOR_EQ(w, 0, GLColor::green); + EXPECT_PIXEL_COLOR_EQ(0, h, GLColor::blue); + EXPECT_PIXEL_COLOR_EQ(w, h, GLColor::yellow); + + // Bind the texture as a framebuffer, render to it, then check the results + GLFramebuffer fbo; + glBindFramebuffer(GL_FRAMEBUFFER, fbo.get()); + glBindTexture(GL_TEXTURE_2D, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0); + + if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_UNSUPPORTED) + { + glClearColor(1.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255); + EXPECT_PIXEL_EQ(1, 0, 255, 0, 0, 255); + EXPECT_PIXEL_EQ(1, 1, 255, 0, 0, 255); + EXPECT_PIXEL_EQ(0, 1, 255, 0, 0, 255); + } + else + { + std::cout << "Skipping rendering to an unsupported framebuffer format" << std::endl; + } + } + + GLuint m2DProgram; + GLint mTexture2DUniformLocation; +}; + +class SixteenBppTextureTestES3 : public SixteenBppTextureTest +{ +}; + +// Simple validation test for GL_RGB565 textures. +// Samples from the texture, renders to it, generates mipmaps etc. +TEST_P(SixteenBppTextureTest, RGB565Validation) +{ + // These tests fail on certain Intel machines running an un-updated version of Win7 + // The tests pass after installing the latest updates from Windows Update. + // TODO: reenable these tests once the bots have been updated + if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE) + { + std::cout << "Test skipped on Intel D3D11." << std::endl; + return; + } + + GLuint test; + memcpy(&test, &GLColor::black, 4); + + R5G6B5 pixels[4] = {Convert565(GLColor::red), Convert565(GLColor::green), + Convert565(GLColor::blue), Convert565(GLColor::yellow)}; + + glClearColor(0, 0, 0, 0); + + // Create a simple RGB565 texture + GLTexture tex; + glBindTexture(GL_TEXTURE_2D, tex.get()); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, nullptr); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + EXPECT_GL_NO_ERROR(); + + // Supply the data to it + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, pixels); + EXPECT_GL_NO_ERROR(); + + simpleValidationBase(tex.get()); +} + +// Simple validation test for GL_RGBA5551 textures. +// Samples from the texture, renders to it, generates mipmaps etc. +TEST_P(SixteenBppTextureTest, RGBA5551Validation) +{ + // These tests fail on certain Intel machines running an un-updated version of Win7 + // The tests pass after installing the latest updates from Windows Update. + // TODO: reenable these tests once the bots have been updated + if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE) + { + std::cout << "Test skipped on Intel D3D11." << std::endl; + return; + } + + GLushort pixels[4] = + { + 0xF801, // Red + 0x07C1, // Green + 0x003F, // Blue + 0xFFC1 // Red + Green + }; + + // Create a simple 5551 texture + GLTexture tex; + glBindTexture(GL_TEXTURE_2D, tex.get()); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, nullptr); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + EXPECT_GL_NO_ERROR(); + + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, pixels); + EXPECT_GL_NO_ERROR(); + + simpleValidationBase(tex.get()); +} + +// Test to ensure calling Clear() on an RGBA5551 texture does something reasonable +// Based on WebGL test conformance/textures/texture-attachment-formats.html +TEST_P(SixteenBppTextureTest, RGBA5551ClearAlpha) +{ + // These tests fail on certain Intel machines running an un-updated version of Win7 + // The tests pass after installing the latest updates from Windows Update. + // TODO: reenable these tests once the bots have been updated + if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE) + { + std::cout << "Test skipped on Intel D3D11." << std::endl; + return; + } + + GLTexture tex; + GLFramebuffer fbo; + + // Create a simple 5551 texture + glBindTexture(GL_TEXTURE_2D, tex.get()); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, nullptr); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + EXPECT_GL_NO_ERROR(); + + // Bind the texture as a framebuffer, clear it, then check the results + glBindFramebuffer(GL_FRAMEBUFFER, fbo.get()); + glBindTexture(GL_TEXTURE_2D, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex.get(), 0); + + if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_UNSUPPORTED) + { + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + glClear(GL_COLOR_BUFFER_BIT); + EXPECT_PIXEL_EQ(0, 0, 0, 0, 0, 0); + + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + EXPECT_PIXEL_EQ(0, 0, 0, 0, 0, 255); + } + else + { + std::cout << "Skipping rendering to an unsupported framebuffer format" << std::endl; + } +} + +// Simple validation test for GL_RGBA4444 textures. +// Samples from the texture, renders to it, generates mipmaps etc. +TEST_P(SixteenBppTextureTest, RGBA4444Validation) +{ + // These tests fail on certain Intel machines running an un-updated version of Win7 + // The tests pass after installing the latest updates from Windows Update. + // TODO: reenable these tests once the bots have been updated + if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE) + { + std::cout << "Test skipped on Intel D3D11." << std::endl; + return; + } + + GLushort pixels[4] = + { + 0xF00F, // Red + 0x0F0F, // Green + 0x00FF, // Blue + 0xFF0F // Red + Green + }; + + glClearColor(0, 0, 0, 0); + + // Generate a RGBA4444 texture, no mipmaps + GLTexture tex; + glBindTexture(GL_TEXTURE_2D, tex.get()); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, nullptr); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + EXPECT_GL_NO_ERROR(); + + // Provide some data for the texture + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, pixels); + EXPECT_GL_NO_ERROR(); + + simpleValidationBase(tex.get()); +} + +// Test uploading RGBA8 data to RGBA4 textures. +TEST_P(SixteenBppTextureTestES3, RGBA4UploadRGBA8) +{ + std::vector<GLColor> fourColors; + fourColors.push_back(GLColor::red); + fourColors.push_back(GLColor::green); + fourColors.push_back(GLColor::blue); + fourColors.push_back(GLColor::yellow); + + GLTexture tex; + glBindTexture(GL_TEXTURE_2D, tex.get()); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA4, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, fourColors.data()); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + ASSERT_GL_NO_ERROR(); + simpleValidationBase(tex.get()); +} + +// Test uploading RGB8 data to RGB565 textures. +TEST_P(SixteenBppTextureTestES3, RGB565UploadRGB8) +{ + std::vector<GLColorRGB> fourColors; + fourColors.push_back(GLColorRGB::red); + fourColors.push_back(GLColorRGB::green); + fourColors.push_back(GLColorRGB::blue); + fourColors.push_back(GLColorRGB::yellow); + + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + + GLTexture tex; + glBindTexture(GL_TEXTURE_2D, tex.get()); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB565, 2, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, fourColors.data()); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + ASSERT_GL_NO_ERROR(); + + simpleValidationBase(tex.get()); +} + +// Test uploading RGBA8 data to RGB5A41 textures. +TEST_P(SixteenBppTextureTestES3, RGB5A1UploadRGBA8) +{ + std::vector<GLColor> fourColors; + fourColors.push_back(GLColor::red); + fourColors.push_back(GLColor::green); + fourColors.push_back(GLColor::blue); + fourColors.push_back(GLColor::yellow); + + GLTexture tex; + glBindTexture(GL_TEXTURE_2D, tex.get()); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB5_A1, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, + fourColors.data()); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + ASSERT_GL_NO_ERROR(); + simpleValidationBase(tex.get()); +} + +// Test uploading RGB10A2 data to RGB5A1 textures. +TEST_P(SixteenBppTextureTestES3, RGB5A1UploadRGB10A2) +{ + struct RGB10A2 + { + RGB10A2(uint32_t r, uint32_t g, uint32_t b, uint32_t a) : R(r), G(g), B(b), A(a) {} + + uint32_t R : 10; + uint32_t G : 10; + uint32_t B : 10; + uint32_t A : 2; + }; + + uint32_t one10 = (1u << 10u) - 1u; + + RGB10A2 red(one10, 0u, 0u, 0x3u); + RGB10A2 green(0u, one10, 0u, 0x3u); + RGB10A2 blue(0u, 0u, one10, 0x3u); + RGB10A2 yellow(one10, one10, 0u, 0x3u); + + std::vector<RGB10A2> fourColors; + fourColors.push_back(red); + fourColors.push_back(green); + fourColors.push_back(blue); + fourColors.push_back(yellow); + + GLTexture tex; + glBindTexture(GL_TEXTURE_2D, tex.get()); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB5_A1, 2, 2, 0, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, + fourColors.data()); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + ASSERT_GL_NO_ERROR(); + simpleValidationBase(tex.get()); +} + +// Test reading from RGBA4 textures attached to FBO. +TEST_P(SixteenBppTextureTestES3, RGBA4FramebufferReadback) +{ + // TODO(jmadill): Fix bug with GLES + if (IsOpenGLES()) + { + std::cout << "Test skipped on GLES." << std::endl; + return; + } + + Vector4 rawColor(0.5f, 0.7f, 1.0f, 0.0f); + GLColor expectedColor(rawColor); + + GLFramebuffer fbo; + glBindFramebuffer(GL_FRAMEBUFFER, fbo.get()); + + GLTexture tex; + glBindTexture(GL_TEXTURE_2D, tex.get()); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA4, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex.get(), 0); + + glClearColor(rawColor.x, rawColor.y, rawColor.z, rawColor.w); + glClear(GL_COLOR_BUFFER_BIT); + + ASSERT_GL_NO_ERROR(); + + GLenum colorReadFormat = GL_NONE; + GLenum colorReadType = GL_NONE; + glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT, reinterpret_cast<GLint *>(&colorReadFormat)); + glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE, reinterpret_cast<GLint *>(&colorReadType)); + + if (colorReadFormat == GL_RGBA && colorReadType == GL_UNSIGNED_BYTE) + { + GLColor actualColor = GLColor::black; + glReadPixels(0, 0, 1, 1, colorReadFormat, colorReadType, &actualColor); + EXPECT_COLOR_NEAR(expectedColor, actualColor, 20); + } + else + { + ASSERT_GLENUM_EQ(GL_RGBA, colorReadFormat); + ASSERT_TRUE(colorReadType == GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT || + colorReadType == GL_UNSIGNED_SHORT_4_4_4_4); + + uint16_t rgba = 0; + glReadPixels(0, 0, 1, 1, colorReadFormat, colorReadType, &rgba); + + GLubyte r8 = static_cast<GLubyte>((rgba & 0xF000) >> 12); + GLubyte g8 = static_cast<GLubyte>((rgba & 0x0F00) >> 8); + GLubyte b8 = static_cast<GLubyte>((rgba & 0x00F0) >> 4); + GLubyte a8 = static_cast<GLubyte>((rgba & 0x000F)); + + GLColor actualColor(r8 << 4, g8 << 4, b8 << 4, a8 << 4); + EXPECT_COLOR_NEAR(expectedColor, actualColor, 20); + } + + ASSERT_GL_NO_ERROR(); +} + +// Test reading from RGB565 textures attached to FBO. +TEST_P(SixteenBppTextureTestES3, RGB565FramebufferReadback) +{ + // TODO(jmadill): Fix bug with GLES + if (IsOpenGLES()) + { + std::cout << "Test skipped on GLES." << std::endl; + return; + } + + GLFramebuffer fbo; + glBindFramebuffer(GL_FRAMEBUFFER, fbo.get()); + + std::vector<GLColor> fourColors; + fourColors.push_back(GLColor::red); + fourColors.push_back(GLColor::green); + fourColors.push_back(GLColor::blue); + fourColors.push_back(GLColor::white); + + const std::string &vertexShader = + "#version 300 es\n" + "in vec4 color;\n" + "in vec2 position;\n" + "out vec4 fcolor;\n" + "void main() {\n" + " fcolor = color;\n" + " gl_Position = vec4(position, 0.5, 1.0);\n" + "}"; + const std::string &fragmentShader = + "#version 300 es\n" + "in mediump vec4 fcolor;\n" + "out mediump vec4 color;\n" + "void main() {\n" + " color = fcolor;\n" + "}"; + + GLuint program = CompileProgram(vertexShader, fragmentShader); + glUseProgram(program); + + GLint colorLocation = glGetAttribLocation(program, "color"); + ASSERT_NE(-1, colorLocation); + glEnableVertexAttribArray(colorLocation); + glVertexAttribPointer(colorLocation, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, fourColors.data()); + + int w = getWindowWidth(); + int h = getWindowHeight(); + + glViewport(0, 0, w, h); + + GLTexture tex; + glBindTexture(GL_TEXTURE_2D, tex.get()); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB565, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex.get(), 0); + + drawIndexedQuad(program, "position", 0.5f); + + ASSERT_GL_NO_ERROR(); + + int t = 12; + EXPECT_PIXEL_COLOR_NEAR(0, h - 1, GLColor::red, t); + EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor::green, t); + EXPECT_PIXEL_COLOR_NEAR(w - 1, 0, GLColor::blue, t); + EXPECT_PIXEL_COLOR_NEAR(w - 1, h - 1, GLColor::white, t); + + GLenum colorReadFormat = GL_NONE; + GLenum colorReadType = GL_NONE; + glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT, reinterpret_cast<GLint *>(&colorReadFormat)); + glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE, reinterpret_cast<GLint *>(&colorReadType)); + + if (colorReadFormat == GL_RGB && colorReadType == GL_UNSIGNED_SHORT_5_6_5) + { + std::vector<R5G6B5> readColors(w * h); + glReadPixels(0, 0, w, h, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, readColors.data()); + + int hoffset = (h - 1) * w; + EXPECT_COLOR_NEAR(GLColor::red, Convert565(readColors[hoffset]), t); + EXPECT_COLOR_NEAR(GLColor::green, Convert565(readColors[0]), t); + EXPECT_COLOR_NEAR(GLColor::blue, Convert565(readColors[w - 1]), t); + EXPECT_COLOR_NEAR(GLColor::white, Convert565(readColors[w - 1 + hoffset]), t); + } + + glDeleteProgram(program); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(SixteenBppTextureTest, + ES2_D3D9(), + ES2_D3D11(), + ES2_D3D11_FL9_3(), + ES2_OPENGL(), + ES2_OPENGLES()); + +ANGLE_INSTANTIATE_TEST(SixteenBppTextureTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); + +} // namespace diff --git a/gfx/angle/src/tests/gl_tests/StateChangeTest.cpp b/gfx/angle/src/tests/gl_tests/StateChangeTest.cpp new file mode 100755 index 000000000..439a78439 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/StateChangeTest.cpp @@ -0,0 +1,591 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// StateChangeTest: +// Specifically designed for an ANGLE implementation of GL, these tests validate that +// ANGLE's dirty bits systems don't get confused by certain sequences of state changes. +// + +#include "test_utils/ANGLETest.h" +#include "test_utils/gl_raii.h" + +using namespace angle; + +namespace +{ + +class StateChangeTest : public ANGLETest +{ + protected: + StateChangeTest() + { + setWindowWidth(64); + setWindowHeight(64); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + + // Enable the no error extension to avoid syncing the FBO state on validation. + setNoErrorEnabled(true); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + glGenFramebuffers(1, &mFramebuffer); + glGenTextures(2, mTextures.data()); + glGenRenderbuffers(1, &mRenderbuffer); + + ASSERT_GL_NO_ERROR(); + } + + void TearDown() override + { + if (mFramebuffer != 0) + { + glDeleteFramebuffers(1, &mFramebuffer); + mFramebuffer = 0; + } + + if (!mTextures.empty()) + { + glDeleteTextures(static_cast<GLsizei>(mTextures.size()), mTextures.data()); + mTextures.clear(); + } + + glDeleteRenderbuffers(1, &mRenderbuffer); + + ANGLETest::TearDown(); + } + + GLuint mFramebuffer = 0; + GLuint mRenderbuffer = 0; + std::vector<GLuint> mTextures = {0, 0}; +}; + +class StateChangeTestES3 : public StateChangeTest +{ + protected: + StateChangeTestES3() {} +}; + +} // anonymous namespace + +// Ensure that CopyTexImage2D syncs framebuffer changes. +TEST_P(StateChangeTest, CopyTexImage2DSync) +{ + if (IsAMD() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + // TODO(geofflang): Fix on Linux AMD drivers (http://anglebug.com/1291) + std::cout << "Test disabled on AMD OpenGL." << std::endl; + return; + } + + glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer); + + // Init first texture to red + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0); + glClearColor(1.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255); + + // Init second texture to green + glBindTexture(GL_TEXTURE_2D, mTextures[1]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[1], 0); + glClearColor(0.0f, 1.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + EXPECT_PIXEL_EQ(0, 0, 0, 255, 0, 255); + + // Copy in the red texture to the green one. + // CopyTexImage should sync the framebuffer attachment change. + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0); + glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 16, 16, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[1], 0); + EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255); + + ASSERT_GL_NO_ERROR(); +} + +// Ensure that CopyTexSubImage2D syncs framebuffer changes. +TEST_P(StateChangeTest, CopyTexSubImage2DSync) +{ + glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer); + + // Init first texture to red + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0); + glClearColor(1.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255); + + // Init second texture to green + glBindTexture(GL_TEXTURE_2D, mTextures[1]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[1], 0); + glClearColor(0.0f, 1.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + EXPECT_PIXEL_EQ(0, 0, 0, 255, 0, 255); + + // Copy in the red texture to the green one. + // CopyTexImage should sync the framebuffer attachment change. + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0); + glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 16, 16); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[1], 0); + EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255); + + ASSERT_GL_NO_ERROR(); +} + +// Test that Framebuffer completeness caching works when color attachments change. +TEST_P(StateChangeTest, FramebufferIncompleteColorAttachment) +{ + glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer); + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0); + EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + // Change the texture at color attachment 0 to be non-color-renderable. + glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 16, 16, 0, GL_ALPHA, GL_UNSIGNED_BYTE, nullptr); + EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT, + glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + ASSERT_GL_NO_ERROR(); +} + +// Test that caching works when color attachments change with TexStorage. +TEST_P(StateChangeTest, FramebufferIncompleteWithTexStorage) +{ + if (!extensionEnabled("GL_EXT_texture_storage")) + { + std::cout << "Test skipped because TexStorage2DEXT not available." << std::endl; + } + + glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer); + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0); + EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + // Change the texture at color attachment 0 to be non-color-renderable. + glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_ALPHA8_EXT, 16, 16); + EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT, + glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + ASSERT_GL_NO_ERROR(); +} + +// Test that caching works when color attachments change with CompressedTexImage2D. +TEST_P(StateChangeTestES3, FramebufferIncompleteWithCompressedTex) +{ + glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer); + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0); + EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + // Change the texture at color attachment 0 to be non-color-renderable. + glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB8_ETC2, 16, 16, 0, 64, nullptr); + EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT, + glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + ASSERT_GL_NO_ERROR(); +} + +// Test that caching works when color attachments are deleted. +TEST_P(StateChangeTestES3, FramebufferIncompleteWhenAttachmentDeleted) +{ + glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer); + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0); + EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + // Delete the texture at color attachment 0. + glDeleteTextures(1, &mTextures[0]); + mTextures[0] = 0; + EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT, + glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + ASSERT_GL_NO_ERROR(); +} + +// Test that Framebuffer completeness caching works when depth attachments change. +TEST_P(StateChangeTest, FramebufferIncompleteDepthAttachment) +{ + glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer); + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0); + glBindRenderbuffer(GL_RENDERBUFFER, mRenderbuffer); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 16, 16); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mRenderbuffer); + EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + // Change the texture at color attachment 0 to be non-depth-renderable. + glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 16, 16); + EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT, + glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + ASSERT_GL_NO_ERROR(); +} + +// Test that Framebuffer completeness caching works when stencil attachments change. +TEST_P(StateChangeTest, FramebufferIncompleteStencilAttachment) +{ + glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer); + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0); + glBindRenderbuffer(GL_RENDERBUFFER, mRenderbuffer); + glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, 16, 16); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, + mRenderbuffer); + EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + // Change the texture at the stencil attachment to be non-stencil-renderable. + glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 16, 16); + EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT, + glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + ASSERT_GL_NO_ERROR(); +} + +// Test that Framebuffer completeness caching works when depth-stencil attachments change. +TEST_P(StateChangeTest, FramebufferIncompleteDepthStencilAttachment) +{ + if (getClientMajorVersion() < 3 && !extensionEnabled("GL_OES_packed_depth_stencil")) + { + std::cout << "Test skipped because packed depth+stencil not availble." << std::endl; + return; + } + + if (IsWindows() && IsIntel() && IsOpenGL()) + { + // TODO(jmadill): Investigate the failure (https://anglebug.com/1388) + std::cout << "Test disabled on Windows Intel OpenGL." << std::endl; + return; + } + + glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer); + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0); + glBindRenderbuffer(GL_RENDERBUFFER, mRenderbuffer); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 16, 16); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, + mRenderbuffer); + EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + // Change the texture the depth-stencil attachment to be non-depth-stencil-renderable. + glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 16, 16); + EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT, + glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + ASSERT_GL_NO_ERROR(); +} + +// Ensure that CopyTexSubImage3D syncs framebuffer changes. +TEST_P(StateChangeTestES3, CopyTexSubImage3DSync) +{ + glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer); + + // Init first texture to red + glBindTexture(GL_TEXTURE_3D, mTextures[0]); + glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 16, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTextures[0], 0, 0); + glClearColor(1.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255); + + // Init second texture to green + glBindTexture(GL_TEXTURE_3D, mTextures[1]); + glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 16, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTextures[1], 0, 0); + glClearColor(0.0f, 1.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + EXPECT_PIXEL_EQ(0, 0, 0, 255, 0, 255); + + // Copy in the red texture to the green one. + // CopyTexImage should sync the framebuffer attachment change. + glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTextures[0], 0, 0); + glCopyTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 0, 0, 16, 16); + glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTextures[1], 0, 0); + EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255); + + ASSERT_GL_NO_ERROR(); +} + +// Ensure that BlitFramebuffer syncs framebuffer changes. +TEST_P(StateChangeTestES3, BlitFramebufferSync) +{ + glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer); + + // Init first texture to red + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0); + glClearColor(1.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255); + + // Init second texture to green + glBindTexture(GL_TEXTURE_2D, mTextures[1]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[1], 0); + glClearColor(0.0f, 1.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + EXPECT_PIXEL_EQ(0, 0, 0, 255, 0, 255); + + // Change to the red textures and blit. + // BlitFramebuffer should sync the framebuffer attachment change. + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); + glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], + 0); + glBlitFramebuffer(0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT, GL_NEAREST); + glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); + EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255); + + ASSERT_GL_NO_ERROR(); +} + +// Ensure that ReadBuffer and DrawBuffers sync framebuffer changes. +TEST_P(StateChangeTestES3, ReadBufferAndDrawBuffersSync) +{ + glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer); + + // Initialize two FBO attachments + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0); + glBindTexture(GL_TEXTURE_2D, mTextures[1]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, mTextures[1], 0); + + // Clear first attachment to red + GLenum bufs1[] = {GL_COLOR_ATTACHMENT0, GL_NONE}; + glDrawBuffers(2, bufs1); + glClearColor(1.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + // Clear second texture to green + GLenum bufs2[] = {GL_NONE, GL_COLOR_ATTACHMENT1}; + glDrawBuffers(2, bufs2); + glClearColor(0.0f, 1.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + // Verify first attachment is red and second is green + glReadBuffer(GL_COLOR_ATTACHMENT1); + EXPECT_PIXEL_EQ(0, 0, 0, 255, 0, 255); + + glReadBuffer(GL_COLOR_ATTACHMENT0); + EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255); + + ASSERT_GL_NO_ERROR(); +} + +// Tests calling invalidate on incomplete framebuffers after switching attachments. +// Adapted partially from WebGL 2 test "renderbuffers/invalidate-framebuffer" +TEST_P(StateChangeTestES3, IncompleteRenderbufferAttachmentInvalidateSync) +{ + glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer); + glBindRenderbuffer(GL_RENDERBUFFER, mRenderbuffer); + GLint samples = 0; + glGetInternalformativ(GL_RENDERBUFFER, GL_RGBA8, GL_SAMPLES, 1, &samples); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, mRenderbuffer); + ASSERT_GL_NO_ERROR(); + + // invalidate the framebuffer when the attachment is incomplete: no storage allocated to the + // attached renderbuffer + EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT, + glCheckFramebufferStatus(GL_FRAMEBUFFER)); + GLenum attachments1[] = {GL_COLOR_ATTACHMENT0}; + glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, attachments1); + ASSERT_GL_NO_ERROR(); + + glRenderbufferStorageMultisample(GL_RENDERBUFFER, static_cast<GLsizei>(samples), GL_RGBA8, + getWindowWidth(), getWindowHeight()); + EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + glClear(GL_COLOR_BUFFER_BIT); + ASSERT_GL_NO_ERROR(); + + GLRenderbuffer renderbuf; + + glBindRenderbuffer(GL_RENDERBUFFER, renderbuf.get()); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, + renderbuf.get()); + ASSERT_GL_NO_ERROR(); + + // invalidate the framebuffer when the attachment is incomplete: no storage allocated to the + // attached renderbuffer + // Note: the bug will only repro *without* a call to checkStatus before the invalidate. + GLenum attachments2[] = {GL_DEPTH_ATTACHMENT}; + glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, attachments2); + + glRenderbufferStorageMultisample(GL_RENDERBUFFER, static_cast<GLsizei>(samples), + GL_DEPTH_COMPONENT16, getWindowWidth(), getWindowHeight()); + EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + glClear(GL_DEPTH_BUFFER_BIT); + ASSERT_GL_NO_ERROR(); +} + +class StateChangeRenderTest : public StateChangeTest +{ + protected: + StateChangeRenderTest() : mProgram(0), mRenderbuffer(0) {} + + void SetUp() override + { + StateChangeTest::SetUp(); + + const std::string vertexShaderSource = + "attribute vec2 position;\n" + "void main() {\n" + " gl_Position = vec4(position, 0, 1);\n" + "}"; + const std::string fragmentShaderSource = + "uniform highp vec4 uniformColor;\n" + "void main() {\n" + " gl_FragColor = uniformColor;\n" + "}"; + + mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource); + ASSERT_NE(0u, mProgram); + + glGenRenderbuffers(1, &mRenderbuffer); + } + + void TearDown() override + { + glDeleteProgram(mProgram); + glDeleteRenderbuffers(1, &mRenderbuffer); + + StateChangeTest::TearDown(); + } + + void setUniformColor(const GLColor &color) + { + glUseProgram(mProgram); + const Vector4 &normalizedColor = color.toNormalizedVector(); + GLint uniformLocation = glGetUniformLocation(mProgram, "uniformColor"); + ASSERT_NE(-1, uniformLocation); + glUniform4fv(uniformLocation, 1, normalizedColor.data()); + } + + GLuint mProgram; + GLuint mRenderbuffer; +}; + +// Test that re-creating a currently attached texture works as expected. +TEST_P(StateChangeRenderTest, RecreateTexture) +{ + if (IsIntel() && IsLinux()) + { + // TODO(cwallez): Fix on Linux Intel drivers (http://anglebug.com/1346) + std::cout << "Test disabled on Linux Intel OpenGL." << std::endl; + return; + } + + glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer); + + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0); + + // Draw with red to the FBO. + GLColor red(255, 0, 0, 255); + setUniformColor(red); + drawQuad(mProgram, "position", 0.5f); + EXPECT_PIXEL_COLOR_EQ(0, 0, red); + + // Recreate the texture with green. + GLColor green(0, 255, 0, 255); + std::vector<GLColor> greenPixels(32 * 32, green); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, + greenPixels.data()); + EXPECT_PIXEL_COLOR_EQ(0, 0, green); + + // Verify drawing blue gives blue. This covers the FBO sync with D3D dirty bits. + GLColor blue(0, 0, 255, 255); + setUniformColor(blue); + drawQuad(mProgram, "position", 0.5f); + EXPECT_PIXEL_COLOR_EQ(0, 0, blue); + + EXPECT_GL_NO_ERROR(); +} + +// Test that re-creating a currently attached renderbuffer works as expected. +TEST_P(StateChangeRenderTest, RecreateRenderbuffer) +{ + glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer); + + glBindRenderbuffer(GL_RENDERBUFFER, mRenderbuffer); + glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 16, 16); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, mRenderbuffer); + + // Draw with red to the FBO. + GLColor red(255, 0, 0, 255); + setUniformColor(red); + drawQuad(mProgram, "position", 0.5f); + EXPECT_PIXEL_COLOR_EQ(0, 0, red); + + // Recreate the renderbuffer and clear to green. + glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 32, 32); + glClearColor(0.0f, 1.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + GLColor green(0, 255, 0, 255); + EXPECT_PIXEL_COLOR_EQ(0, 0, green); + + // Verify drawing blue gives blue. This covers the FBO sync with D3D dirty bits. + GLColor blue(0, 0, 255, 255); + setUniformColor(blue); + drawQuad(mProgram, "position", 0.5f); + EXPECT_PIXEL_COLOR_EQ(0, 0, blue); + + EXPECT_GL_NO_ERROR(); +} + +// Test that recreating a texture with GenerateMipmaps signals the FBO is dirty. +TEST_P(StateChangeRenderTest, GenerateMipmap) +{ + glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer); + + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], 0); + + // Draw once to set the RenderTarget in D3D11 + GLColor red(255, 0, 0, 255); + setUniformColor(red); + drawQuad(mProgram, "position", 0.5f); + EXPECT_PIXEL_COLOR_EQ(0, 0, red); + + // This will trigger the texture to be re-created on FL9_3. + glGenerateMipmap(GL_TEXTURE_2D); + + // Now ensure we don't have a stale render target. + GLColor blue(0, 0, 255, 255); + setUniformColor(blue); + drawQuad(mProgram, "position", 0.5f); + EXPECT_PIXEL_COLOR_EQ(0, 0, blue); + + EXPECT_GL_NO_ERROR(); +} + +ANGLE_INSTANTIATE_TEST(StateChangeTest, ES2_D3D9(), ES2_D3D11(), ES2_OPENGL()); +ANGLE_INSTANTIATE_TEST(StateChangeRenderTest, + ES2_D3D9(), + ES2_D3D11(), + ES2_OPENGL(), + ES2_D3D11_FL9_3()); +ANGLE_INSTANTIATE_TEST(StateChangeTestES3, ES3_D3D11(), ES3_OPENGL()); diff --git a/gfx/angle/src/tests/gl_tests/SwizzleTest.cpp b/gfx/angle/src/tests/gl_tests/SwizzleTest.cpp new file mode 100755 index 000000000..b1ad13102 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/SwizzleTest.cpp @@ -0,0 +1,441 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "test_utils/ANGLETest.h" + +#include <vector> + +using namespace angle; + +namespace +{ + +class SwizzleTest : public ANGLETest +{ + protected: + SwizzleTest() + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + + GLenum swizzles[] = + { + GL_RED, + GL_GREEN, + GL_BLUE, + GL_ALPHA, + GL_ZERO, + GL_ONE, + }; + + for (int r = 0; r < 6; r++) + { + for (int g = 0; g < 6; g++) + { + for (int b = 0; b < 6; b++) + { + for (int a = 0; a < 6; a++) + { + swizzlePermutation permutation; + permutation.swizzleRed = swizzles[r]; + permutation.swizzleGreen = swizzles[g]; + permutation.swizzleBlue = swizzles[b]; + permutation.swizzleAlpha = swizzles[a]; + mPermutations.push_back(permutation); + } + } + } + } + } + + void SetUp() override + { + ANGLETest::SetUp(); + + const std::string vertexShaderSource = SHADER_SOURCE + ( + precision highp float; + attribute vec4 position; + varying vec2 texcoord; + + void main() + { + gl_Position = position; + texcoord = (position.xy * 0.5) + 0.5; + } + ); + + const std::string fragmentShaderSource = SHADER_SOURCE + ( + precision highp float; + uniform sampler2D tex; + varying vec2 texcoord; + + void main() + { + gl_FragColor = texture2D(tex, texcoord); + } + ); + + mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource); + ASSERT_NE(0u, mProgram); + + mTextureUniformLocation = glGetUniformLocation(mProgram, "tex"); + ASSERT_NE(-1, mTextureUniformLocation); + + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + ASSERT_GL_NO_ERROR(); + } + + void TearDown() override + { + glDeleteProgram(mProgram); + glDeleteTextures(1, &mTexture); + + ANGLETest::TearDown(); + } + + template <typename T> + void init2DTexture(GLenum internalFormat, GLenum dataFormat, GLenum dataType, const T* data) + { + glGenTextures(1, &mTexture); + glBindTexture(GL_TEXTURE_2D, mTexture); + glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, 1, 1, 0, dataFormat, dataType, data); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + } + + void init2DCompressedTexture(GLenum internalFormat, GLsizei width, GLsizei height, GLsizei dataSize, const GLubyte* data) + { + glGenTextures(1, &mTexture); + glBindTexture(GL_TEXTURE_2D, mTexture); + glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, width, height, 0, dataSize, data); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + } + + GLubyte getExpectedValue(GLenum swizzle, GLubyte unswizzled[4]) + { + switch (swizzle) + { + case GL_RED: return unswizzled[0]; + case GL_GREEN: return unswizzled[1]; + case GL_BLUE: return unswizzled[2]; + case GL_ALPHA: return unswizzled[3]; + case GL_ZERO: return 0; + case GL_ONE: return 255; + default: return 0; + } + } + + void runTest2D() + { + // TODO(jmadill): Figure out why this fails on Intel. + if (IsIntel() && GetParam().getRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + std::cout << "Test skipped on Intel." << std::endl; + return; + } + + glUseProgram(mProgram); + glBindTexture(GL_TEXTURE_2D, mTexture); + glUniform1i(mTextureUniformLocation, 0); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_RED); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_GREEN); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_BLUE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_ALPHA); + + glClear(GL_COLOR_BUFFER_BIT); + drawQuad(mProgram, "position", 0.5f); + + GLubyte unswizzled[4]; + glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &unswizzled); + + ASSERT_GL_NO_ERROR(); + + for (size_t i = 0; i < mPermutations.size(); i++) + { + const swizzlePermutation& permutation = mPermutations[i]; + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, permutation.swizzleRed); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, permutation.swizzleGreen); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, permutation.swizzleBlue); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, permutation.swizzleAlpha); + + glClear(GL_COLOR_BUFFER_BIT); + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_EQ(0, 0, + getExpectedValue(permutation.swizzleRed, unswizzled), + getExpectedValue(permutation.swizzleGreen, unswizzled), + getExpectedValue(permutation.swizzleBlue, unswizzled), + getExpectedValue(permutation.swizzleAlpha, unswizzled)); + + ASSERT_GL_NO_ERROR(); + } + } + + GLuint mProgram; + GLint mTextureUniformLocation; + + GLuint mTexture; + + struct swizzlePermutation + { + GLenum swizzleRed; + GLenum swizzleGreen; + GLenum swizzleBlue; + GLenum swizzleAlpha; + }; + std::vector<swizzlePermutation> mPermutations; +}; + +class SwizzleIntegerTest : public SwizzleTest +{ + protected: + void SetUp() override + { + ANGLETest::SetUp(); + + const std::string vertexShaderSource = + "#version 300 es\n" + "precision highp float;\n" + "in vec4 position;\n" + "out vec2 texcoord;\n" + "\n" + "void main()\n" + "{\n" + " gl_Position = position;\n" + " texcoord = (position.xy * 0.5) + 0.5;\n" + "}\n"; + + const std::string fragmentShaderSource = + "#version 300 es\n" + "precision highp float;\n" + "precision highp usampler2D;\n" + "uniform usampler2D tex;\n" + "in vec2 texcoord;\n" + "out vec4 my_FragColor;\n" + "\n" + "void main()\n" + "{\n" + " uvec4 s = texture(tex, texcoord);\n" + " if (s[0] == 1u) s[0] = 255u;\n" + " if (s[1] == 1u) s[1] = 255u;\n" + " if (s[2] == 1u) s[2] = 255u;\n" + " if (s[3] == 1u) s[3] = 255u;\n" + " my_FragColor = vec4(s) / 255.0;\n" + "}\n"; + + mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource); + ASSERT_NE(0u, mProgram); + + mTextureUniformLocation = glGetUniformLocation(mProgram, "tex"); + ASSERT_NE(-1, mTextureUniformLocation); + + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + ASSERT_GL_NO_ERROR(); + } +}; + +TEST_P(SwizzleTest, RGBA8_2D) +{ + GLubyte data[] = { 1, 64, 128, 200 }; + init2DTexture(GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, data); + runTest2D(); +} + +TEST_P(SwizzleTest, RGB8_2D) +{ + GLubyte data[] = { 77, 66, 55 }; + init2DTexture(GL_RGB8, GL_RGB, GL_UNSIGNED_BYTE, data); + runTest2D(); +} + +TEST_P(SwizzleTest, RG8_2D) +{ + GLubyte data[] = { 11, 99 }; + init2DTexture(GL_RG8, GL_RG, GL_UNSIGNED_BYTE, data); + runTest2D(); +} + +TEST_P(SwizzleTest, R8_2D) +{ + GLubyte data[] = { 2 }; + init2DTexture(GL_R8, GL_RED, GL_UNSIGNED_BYTE, data); + runTest2D(); +} + +TEST_P(SwizzleTest, RGB10_A2_2D) +{ + GLuint data[] = {20u | (40u << 10) | (60u << 20) | (2u << 30)}; + init2DTexture(GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, data); + runTest2D(); +} + +TEST_P(SwizzleTest, RGBA32F_2D) +{ + GLfloat data[] = { 0.25f, 0.5f, 0.75f, 0.8f }; + init2DTexture(GL_RGBA32F, GL_RGBA, GL_FLOAT, data); + runTest2D(); +} + +TEST_P(SwizzleTest, RGB32F_2D) +{ + GLfloat data[] = { 0.1f, 0.2f, 0.3f }; + init2DTexture(GL_RGB32F, GL_RGB, GL_FLOAT, data); + runTest2D(); +} + +TEST_P(SwizzleTest, RG32F_2D) +{ + GLfloat data[] = { 0.9f, 0.1f }; + init2DTexture(GL_RG32F, GL_RG, GL_FLOAT, data); + runTest2D(); +} + +TEST_P(SwizzleTest, R32F_2D) +{ + GLfloat data[] = { 0.5f }; + init2DTexture(GL_R32F, GL_RED, GL_FLOAT, data); + runTest2D(); +} + +TEST_P(SwizzleTest, D32F_2D) +{ + GLfloat data[] = { 0.5f }; + init2DTexture(GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT, data); + runTest2D(); +} + +TEST_P(SwizzleTest, D16_2D) +{ + GLushort data[] = { 0xFF }; + init2DTexture(GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, data); + runTest2D(); +} + +TEST_P(SwizzleTest, D24_2D) +{ + GLuint data[] = { 0xFFFF }; + init2DTexture(GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, data); + runTest2D(); +} + +TEST_P(SwizzleTest, L8_2D) +{ + GLubyte data[] = {0x77}; + init2DTexture(GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE, data); + runTest2D(); +} + +TEST_P(SwizzleTest, A8_2D) +{ + GLubyte data[] = {0x55}; + init2DTexture(GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, data); + runTest2D(); +} + +TEST_P(SwizzleTest, LA8_2D) +{ + GLubyte data[] = {0x77, 0x66}; + init2DTexture(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, data); + runTest2D(); +} + +TEST_P(SwizzleTest, L32F_2D) +{ + GLfloat data[] = {0.7f}; + init2DTexture(GL_LUMINANCE, GL_LUMINANCE, GL_FLOAT, data); + runTest2D(); +} + +TEST_P(SwizzleTest, A32F_2D) +{ + GLfloat data[] = { + 0.4f, + }; + init2DTexture(GL_ALPHA, GL_ALPHA, GL_FLOAT, data); + runTest2D(); +} + +TEST_P(SwizzleTest, LA32F_2D) +{ + GLfloat data[] = { + 0.5f, 0.6f, + }; + init2DTexture(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_FLOAT, data); + runTest2D(); +} + +#include "media/pixel.inl" + +TEST_P(SwizzleTest, CompressedDXT_2D) +{ + if (!extensionEnabled("GL_EXT_texture_compression_dxt1")) + { + std::cout << "Test skipped due to missing GL_EXT_texture_compression_dxt1." << std::endl; + return; + } + + init2DCompressedTexture(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width, pixel_0_height, pixel_0_size, pixel_0_data); + runTest2D(); +} + +TEST_P(SwizzleIntegerTest, RGB8UI_2D) +{ + GLubyte data[] = {77, 66, 55}; + init2DTexture(GL_RGB8UI, GL_RGB_INTEGER, GL_UNSIGNED_BYTE, data); + runTest2D(); +} + +// Test that updating the texture data still generates the correct swizzles +TEST_P(SwizzleTest, SubUpdate) +{ + GLColor data(1, 64, 128, 200); + init2DTexture(GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, &data); + + glUseProgram(mProgram); + glBindTexture(GL_TEXTURE_2D, mTexture); + glUniform1i(mTextureUniformLocation, 0); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_RED); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_RED); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_RED); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_RED); + + glClear(GL_COLOR_BUFFER_BIT); + drawQuad(mProgram, "position", 0.5f); + + GLColor expectedData(data.R, data.R, data.R, data.R); + EXPECT_PIXEL_COLOR_EQ(0, 0, expectedData); + + GLColor updateData(32, 234, 28, 232); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &updateData); + + glClear(GL_COLOR_BUFFER_BIT); + drawQuad(mProgram, "position", 0.5f); + + GLColor expectedUpdateData(updateData.R, updateData.R, updateData.R, updateData.R); + EXPECT_PIXEL_COLOR_EQ(0, 0, expectedUpdateData); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(SwizzleTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGL(3, 3), ES3_OPENGLES()); +ANGLE_INSTANTIATE_TEST(SwizzleIntegerTest, + ES3_D3D11(), + ES3_OPENGL(), + ES3_OPENGL(3, 3), + ES3_OPENGLES()); + +} // namespace diff --git a/gfx/angle/src/tests/gl_tests/SyncQueriesTest.cpp b/gfx/angle/src/tests/gl_tests/SyncQueriesTest.cpp new file mode 100755 index 000000000..b36311254 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/SyncQueriesTest.cpp @@ -0,0 +1,108 @@ +// +// Copyright 2016 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +// SyncQueriesTest.cpp: Tests of the GL_CHROMIUM_sync_query extension + +#include "test_utils/ANGLETest.h" + +namespace angle +{ + +class SyncQueriesTest : public ANGLETest +{ + protected: + SyncQueriesTest() + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + setConfigDepthBits(24); + } + + void TearDown() override + { + if (mQuery != 0) + { + glDeleteQueriesEXT(1, &mQuery); + mQuery = 0; + } + + ANGLETest::TearDown(); + } + + GLuint mQuery = 0; +}; + +// Test basic usage of sync queries +TEST_P(SyncQueriesTest, Basic) +{ + if (!extensionEnabled("GL_CHROMIUM_sync_query")) + { + std::cout << "Test skipped because GL_CHROMIUM_sync_query is not available." << std::endl; + return; + } + + glGenQueriesEXT(1, &mQuery); + glBeginQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM, mQuery); + EXPECT_GL_NO_ERROR(); + + glClearColor(0.0, 0.0, 1.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT); + + glEndQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM); + + glFlush(); + GLuint result = 0; + glGetQueryObjectuivEXT(mQuery, GL_QUERY_RESULT_EXT, &result); + EXPECT_EQ(static_cast<GLuint>(GL_TRUE), result); + EXPECT_GL_NO_ERROR(); +} + +// Test that the sync query enums are not accepted unless the extension is available +TEST_P(SyncQueriesTest, Validation) +{ + // Need the GL_EXT_occlusion_query_boolean extension for the entry points + if (!extensionEnabled("GL_EXT_occlusion_query_boolean")) + { + std::cout << "Test skipped because GL_EXT_occlusion_query_boolean is not available." + << std::endl; + return; + } + + bool extensionAvailable = extensionEnabled("GL_CHROMIUM_sync_query"); + + glGenQueriesEXT(1, &mQuery); + + glBeginQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM, mQuery); + if (extensionAvailable) + { + EXPECT_GL_NO_ERROR(); + } + else + { + EXPECT_GL_ERROR(GL_INVALID_ENUM); + } + + glDeleteQueriesEXT(1, &mQuery); + + EXPECT_GL_NO_ERROR(); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these +// tests should be run against. +ANGLE_INSTANTIATE_TEST(SyncQueriesTest, + ES2_D3D9(), + ES2_D3D11(), + ES3_D3D11(), + ES2_OPENGL(), + ES3_OPENGL(), + ES2_OPENGLES(), + ES3_OPENGLES()); + +} // namespace angle diff --git a/gfx/angle/src/tests/gl_tests/TextureTest.cpp b/gfx/angle/src/tests/gl_tests/TextureTest.cpp new file mode 100755 index 000000000..ee2fc7ca9 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/TextureTest.cpp @@ -0,0 +1,3772 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "common/mathutil.h" +#include "test_utils/ANGLETest.h" +#include "test_utils/gl_raii.h" + +using namespace angle; + +namespace +{ + +// Take a pixel, and reset the components not covered by the format to default +// values. In particular, the default value for the alpha component is 255 +// (1.0 as unsigned normalized fixed point value). +GLColor SliceFormatColor(GLenum format, GLColor full) +{ + switch (format) + { + case GL_RED: + return GLColor(full.R, 0, 0, 255u); + case GL_RG: + return GLColor(full.R, full.G, 0, 255u); + case GL_RGB: + return GLColor(full.R, full.G, full.B, 255u); + case GL_RGBA: + return full; + default: + UNREACHABLE(); + return GLColor::white; + } +} + +class TexCoordDrawTest : public ANGLETest +{ + protected: + TexCoordDrawTest() : ANGLETest(), mProgram(0), mFramebuffer(0), mFramebufferColorTexture(0) + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + virtual std::string getVertexShaderSource() + { + return std::string(SHADER_SOURCE + ( + precision highp float; + attribute vec4 position; + varying vec2 texcoord; + + void main() + { + gl_Position = vec4(position.xy, 0.0, 1.0); + texcoord = (position.xy * 0.5) + 0.5; + } + ) + ); + } + + virtual std::string getFragmentShaderSource() = 0; + + virtual void setUpProgram() + { + const std::string vertexShaderSource = getVertexShaderSource(); + const std::string fragmentShaderSource = getFragmentShaderSource(); + + mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource); + ASSERT_NE(0u, mProgram); + ASSERT_GL_NO_ERROR(); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + setUpFramebuffer(); + } + + void TearDown() override + { + glBindFramebuffer(GL_FRAMEBUFFER, 0); + glDeleteFramebuffers(1, &mFramebuffer); + glDeleteTextures(1, &mFramebufferColorTexture); + glDeleteProgram(mProgram); + ANGLETest::TearDown(); + } + + void setUpFramebuffer() + { + // We use an FBO to work around an issue where the default framebuffer applies SRGB + // conversion (particularly known to happen incorrectly on Intel GL drivers). It's not + // clear whether this issue can even be fixed on all backends. For example GLES 3.0.4 spec + // section 4.4 says that the format of the default framebuffer is entirely up to the window + // system, so it might be SRGB, and GLES 3.0 doesn't have a "FRAMEBUFFER_SRGB" to turn off + // SRGB conversion like desktop GL does. + // TODO(oetuaho): Get rid of this if the underlying issue is fixed. + glGenFramebuffers(1, &mFramebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer); + + glGenTextures(1, &mFramebufferColorTexture); + glBindTexture(GL_TEXTURE_2D, mFramebufferColorTexture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWindowWidth(), getWindowHeight(), 0, GL_RGBA, + GL_UNSIGNED_BYTE, nullptr); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, + mFramebufferColorTexture, 0); + ASSERT_GL_NO_ERROR(); + ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + glBindTexture(GL_TEXTURE_2D, 0); + } + + // Returns the created texture ID. + GLuint create2DTexture() + { + GLuint texture2D; + glGenTextures(1, &texture2D); + glBindTexture(GL_TEXTURE_2D, texture2D); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + EXPECT_GL_NO_ERROR(); + return texture2D; + } + + GLuint mProgram; + GLuint mFramebuffer; + + private: + GLuint mFramebufferColorTexture; +}; + +class Texture2DTest : public TexCoordDrawTest +{ + protected: + Texture2DTest() : TexCoordDrawTest(), mTexture2D(0), mTexture2DUniformLocation(-1) {} + + std::string getFragmentShaderSource() override + { + return std::string(SHADER_SOURCE + ( + precision highp float; + uniform sampler2D tex; + varying vec2 texcoord; + + void main() + { + gl_FragColor = texture2D(tex, texcoord); + } + ) + ); + } + + virtual const char *getTextureUniformName() { return "tex"; } + + void setUpProgram() override + { + TexCoordDrawTest::setUpProgram(); + mTexture2DUniformLocation = glGetUniformLocation(mProgram, getTextureUniformName()); + ASSERT_NE(-1, mTexture2DUniformLocation); + } + + void SetUp() override + { + TexCoordDrawTest::SetUp(); + mTexture2D = create2DTexture(); + + ASSERT_GL_NO_ERROR(); + } + + void TearDown() override + { + glDeleteTextures(1, &mTexture2D); + TexCoordDrawTest::TearDown(); + } + + // Tests CopyTexSubImage with floating point textures of various formats. + void testFloatCopySubImage(int sourceImageChannels, int destImageChannels) + { + // TODO(jmadill): Figure out why this is broken on Intel D3D11 + if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE) + { + std::cout << "Test skipped on Intel D3D11." << std::endl; + return; + } + + setUpProgram(); + + if (getClientMajorVersion() < 3) + { + if (!extensionEnabled("GL_OES_texture_float")) + { + std::cout << "Test skipped due to missing GL_OES_texture_float." << std::endl; + return; + } + + if ((sourceImageChannels < 3 || destImageChannels < 3) && !extensionEnabled("GL_EXT_texture_rg")) + { + std::cout << "Test skipped due to missing GL_EXT_texture_rg." << std::endl; + return; + } + } + + GLfloat sourceImageData[4][16] = + { + { // R + 1.0f, + 0.0f, + 0.0f, + 1.0f + }, + { // RG + 1.0f, 0.0f, + 0.0f, 1.0f, + 0.0f, 0.0f, + 1.0f, 1.0f + }, + { // RGB + 1.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 1.0f, + 1.0f, 1.0f, 0.0f + }, + { // RGBA + 1.0f, 0.0f, 0.0f, 1.0f, + 0.0f, 1.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 1.0f, 1.0f, + 1.0f, 1.0f, 0.0f, 1.0f + }, + }; + + GLenum imageFormats[] = + { + GL_R32F, + GL_RG32F, + GL_RGB32F, + GL_RGBA32F, + }; + + GLenum sourceUnsizedFormats[] = + { + GL_RED, + GL_RG, + GL_RGB, + GL_RGBA, + }; + + GLuint textures[2]; + + glGenTextures(2, textures); + + GLfloat *imageData = sourceImageData[sourceImageChannels - 1]; + GLenum sourceImageFormat = imageFormats[sourceImageChannels - 1]; + GLenum sourceUnsizedFormat = sourceUnsizedFormats[sourceImageChannels - 1]; + GLenum destImageFormat = imageFormats[destImageChannels - 1]; + + glBindTexture(GL_TEXTURE_2D, textures[0]); + glTexStorage2DEXT(GL_TEXTURE_2D, 1, sourceImageFormat, 2, 2); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 2, 2, sourceUnsizedFormat, GL_FLOAT, imageData); + + if (sourceImageChannels < 3 && !extensionEnabled("GL_EXT_texture_rg")) + { + // This is not supported + ASSERT_GL_ERROR(GL_INVALID_OPERATION); + } + else + { + ASSERT_GL_NO_ERROR(); + } + + GLuint fbo; + glGenFramebuffers(1, &fbo); + glBindFramebuffer(GL_FRAMEBUFFER, fbo); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[0], 0); + + glBindTexture(GL_TEXTURE_2D, textures[1]); + glTexStorage2DEXT(GL_TEXTURE_2D, 1, destImageFormat, 2, 2); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 2, 2); + ASSERT_GL_NO_ERROR(); + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + drawQuad(mProgram, "position", 0.5f); + + int testImageChannels = std::min(sourceImageChannels, destImageChannels); + + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red); + if (testImageChannels > 1) + { + EXPECT_PIXEL_EQ(getWindowHeight() - 1, 0, 0, 255, 0, 255); + EXPECT_PIXEL_EQ(getWindowHeight() - 1, getWindowWidth() - 1, 255, 255, 0, 255); + if (testImageChannels > 2) + { + EXPECT_PIXEL_EQ(0, getWindowWidth() - 1, 0, 0, 255, 255); + } + } + + glDeleteFramebuffers(1, &fbo); + glDeleteTextures(2, textures); + + ASSERT_GL_NO_ERROR(); + } + + GLuint mTexture2D; + GLint mTexture2DUniformLocation; +}; + +class Texture2DTestES3 : public Texture2DTest +{ + protected: + Texture2DTestES3() : Texture2DTest() {} + + std::string getVertexShaderSource() override + { + return std::string( + "#version 300 es\n" + "out vec2 texcoord;\n" + "in vec4 position;\n" + "void main()\n" + "{\n" + " gl_Position = vec4(position.xy, 0.0, 1.0);\n" + " texcoord = (position.xy * 0.5) + 0.5;\n" + "}\n"); + } + + std::string getFragmentShaderSource() override + { + return std::string( + "#version 300 es\n" + "precision highp float;\n" + "uniform highp sampler2D tex;\n" + "in vec2 texcoord;\n" + "out vec4 fragColor;\n" + "void main()\n" + "{\n" + " fragColor = texture(tex, texcoord);\n" + "}\n"); + } + + void SetUp() override + { + Texture2DTest::SetUp(); + setUpProgram(); + } +}; + +class Texture2DIntegerAlpha1TestES3 : public Texture2DTest +{ + protected: + Texture2DIntegerAlpha1TestES3() : Texture2DTest() {} + + std::string getVertexShaderSource() override + { + return std::string( + "#version 300 es\n" + "out vec2 texcoord;\n" + "in vec4 position;\n" + "void main()\n" + "{\n" + " gl_Position = vec4(position.xy, 0.0, 1.0);\n" + " texcoord = (position.xy * 0.5) + 0.5;\n" + "}\n"); + } + + std::string getFragmentShaderSource() override + { + return std::string( + "#version 300 es\n" + "precision highp float;\n" + "uniform highp isampler2D tex;\n" + "in vec2 texcoord;\n" + "out vec4 fragColor;\n" + "void main()\n" + "{\n" + " vec4 green = vec4(0, 1, 0, 1);\n" + " vec4 black = vec4(0, 0, 0, 0);\n" + " fragColor = (texture(tex, texcoord).a == 1) ? green : black;\n" + "}\n"); + } + + void SetUp() override + { + Texture2DTest::SetUp(); + setUpProgram(); + } +}; + +class Texture2DUnsignedIntegerAlpha1TestES3 : public Texture2DTest +{ + protected: + Texture2DUnsignedIntegerAlpha1TestES3() : Texture2DTest() {} + + std::string getVertexShaderSource() override + { + return std::string( + "#version 300 es\n" + "out vec2 texcoord;\n" + "in vec4 position;\n" + "void main()\n" + "{\n" + " gl_Position = vec4(position.xy, 0.0, 1.0);\n" + " texcoord = (position.xy * 0.5) + 0.5;\n" + "}\n"); + } + + std::string getFragmentShaderSource() override + { + return std::string( + "#version 300 es\n" + "precision highp float;\n" + "uniform highp usampler2D tex;\n" + "in vec2 texcoord;\n" + "out vec4 fragColor;\n" + "void main()\n" + "{\n" + " vec4 green = vec4(0, 1, 0, 1);\n" + " vec4 black = vec4(0, 0, 0, 0);\n" + " fragColor = (texture(tex, texcoord).a == 1u) ? green : black;\n" + "}\n"); + } + + void SetUp() override + { + Texture2DTest::SetUp(); + setUpProgram(); + } +}; + +class Texture2DTestWithDrawScale : public Texture2DTest +{ + protected: + Texture2DTestWithDrawScale() : Texture2DTest(), mDrawScaleUniformLocation(-1) {} + + std::string getVertexShaderSource() override + { + return std::string(SHADER_SOURCE + ( + precision highp float; + attribute vec4 position; + varying vec2 texcoord; + + uniform vec2 drawScale; + + void main() + { + gl_Position = vec4(position.xy * drawScale, 0.0, 1.0); + texcoord = (position.xy * 0.5) + 0.5; + } + ) + ); + } + + void SetUp() override + { + Texture2DTest::SetUp(); + + setUpProgram(); + + mDrawScaleUniformLocation = glGetUniformLocation(mProgram, "drawScale"); + ASSERT_NE(-1, mDrawScaleUniformLocation); + + glUseProgram(mProgram); + glUniform2f(mDrawScaleUniformLocation, 1.0f, 1.0f); + glUseProgram(0); + ASSERT_GL_NO_ERROR(); + } + + GLint mDrawScaleUniformLocation; +}; + +class Sampler2DAsFunctionParameterTest : public Texture2DTest +{ + protected: + Sampler2DAsFunctionParameterTest() : Texture2DTest() {} + + std::string getFragmentShaderSource() override + { + return std::string(SHADER_SOURCE + ( + precision highp float; + uniform sampler2D tex; + varying vec2 texcoord; + + vec4 computeFragColor(sampler2D aTex) + { + return texture2D(aTex, texcoord); + } + + void main() + { + gl_FragColor = computeFragColor(tex); + } + ) + ); + } + + void SetUp() override + { + Texture2DTest::SetUp(); + setUpProgram(); + } +}; + +class TextureCubeTest : public TexCoordDrawTest +{ + protected: + TextureCubeTest() + : TexCoordDrawTest(), + mTexture2D(0), + mTextureCube(0), + mTexture2DUniformLocation(-1), + mTextureCubeUniformLocation(-1) + { + } + + std::string getFragmentShaderSource() override + { + return std::string(SHADER_SOURCE + ( + precision highp float; + uniform sampler2D tex2D; + uniform samplerCube texCube; + varying vec2 texcoord; + + void main() + { + gl_FragColor = texture2D(tex2D, texcoord); + gl_FragColor += textureCube(texCube, vec3(texcoord, 0)); + } + ) + ); + } + + void SetUp() override + { + TexCoordDrawTest::SetUp(); + + glGenTextures(1, &mTextureCube); + glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCube); + glTexStorage2DEXT(GL_TEXTURE_CUBE_MAP, 1, GL_RGBA8, 1, 1); + EXPECT_GL_NO_ERROR(); + + mTexture2D = create2DTexture(); + + setUpProgram(); + + mTexture2DUniformLocation = glGetUniformLocation(mProgram, "tex2D"); + ASSERT_NE(-1, mTexture2DUniformLocation); + mTextureCubeUniformLocation = glGetUniformLocation(mProgram, "texCube"); + ASSERT_NE(-1, mTextureCubeUniformLocation); + } + + void TearDown() override + { + glDeleteTextures(1, &mTextureCube); + TexCoordDrawTest::TearDown(); + } + + GLuint mTexture2D; + GLuint mTextureCube; + GLint mTexture2DUniformLocation; + GLint mTextureCubeUniformLocation; +}; + +class SamplerArrayTest : public TexCoordDrawTest +{ + protected: + SamplerArrayTest() + : TexCoordDrawTest(), + mTexture2DA(0), + mTexture2DB(0), + mTexture0UniformLocation(-1), + mTexture1UniformLocation(-1) + { + } + + std::string getFragmentShaderSource() override + { + return std::string(SHADER_SOURCE + ( + precision mediump float; + uniform highp sampler2D tex2DArray[2]; + varying vec2 texcoord; + void main() + { + gl_FragColor = texture2D(tex2DArray[0], texcoord); + gl_FragColor += texture2D(tex2DArray[1], texcoord); + } + ) + ); + } + + void SetUp() override + { + TexCoordDrawTest::SetUp(); + + setUpProgram(); + + mTexture0UniformLocation = glGetUniformLocation(mProgram, "tex2DArray[0]"); + ASSERT_NE(-1, mTexture0UniformLocation); + mTexture1UniformLocation = glGetUniformLocation(mProgram, "tex2DArray[1]"); + ASSERT_NE(-1, mTexture1UniformLocation); + + mTexture2DA = create2DTexture(); + mTexture2DB = create2DTexture(); + ASSERT_GL_NO_ERROR(); + } + + void TearDown() override + { + glDeleteTextures(1, &mTexture2DA); + glDeleteTextures(1, &mTexture2DB); + TexCoordDrawTest::TearDown(); + } + + void testSamplerArrayDraw() + { + GLubyte texData[4]; + texData[0] = 0; + texData[1] = 60; + texData[2] = 0; + texData[3] = 255; + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2DA); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, texData); + + texData[1] = 120; + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_2D, mTexture2DB); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, texData); + EXPECT_GL_ERROR(GL_NO_ERROR); + + glUseProgram(mProgram); + glUniform1i(mTexture0UniformLocation, 0); + glUniform1i(mTexture1UniformLocation, 1); + drawQuad(mProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + + EXPECT_PIXEL_NEAR(0, 0, 0, 180, 0, 255, 2); + } + + GLuint mTexture2DA; + GLuint mTexture2DB; + GLint mTexture0UniformLocation; + GLint mTexture1UniformLocation; +}; + + +class SamplerArrayAsFunctionParameterTest : public SamplerArrayTest +{ + protected: + SamplerArrayAsFunctionParameterTest() : SamplerArrayTest() {} + + std::string getFragmentShaderSource() override + { + return std::string(SHADER_SOURCE + ( + precision mediump float; + uniform highp sampler2D tex2DArray[2]; + varying vec2 texcoord; + + vec4 computeFragColor(highp sampler2D aTex2DArray[2]) + { + return texture2D(aTex2DArray[0], texcoord) + texture2D(aTex2DArray[1], texcoord); + } + + void main() + { + gl_FragColor = computeFragColor(tex2DArray); + } + ) + ); + } +}; + +class Texture2DArrayTestES3 : public TexCoordDrawTest +{ + protected: + Texture2DArrayTestES3() : TexCoordDrawTest(), m2DArrayTexture(0), mTextureArrayLocation(-1) {} + + std::string getVertexShaderSource() override + { + return std::string( + "#version 300 es\n" + "out vec2 texcoord;\n" + "in vec4 position;\n" + "void main()\n" + "{\n" + " gl_Position = vec4(position.xy, 0.0, 1.0);\n" + " texcoord = (position.xy * 0.5) + 0.5;\n" + "}\n"); + } + + std::string getFragmentShaderSource() override + { + return std::string( + "#version 300 es\n" + "precision highp float;\n" + "uniform highp sampler2DArray tex2DArray;\n" + "in vec2 texcoord;\n" + "out vec4 fragColor;\n" + "void main()\n" + "{\n" + " fragColor = texture(tex2DArray, vec3(texcoord.x, texcoord.y, 0.0));\n" + "}\n"); + } + + void SetUp() override + { + TexCoordDrawTest::SetUp(); + + setUpProgram(); + + mTextureArrayLocation = glGetUniformLocation(mProgram, "tex2DArray"); + ASSERT_NE(-1, mTextureArrayLocation); + + glGenTextures(1, &m2DArrayTexture); + ASSERT_GL_NO_ERROR(); + } + + void TearDown() override + { + glDeleteTextures(1, &m2DArrayTexture); + TexCoordDrawTest::TearDown(); + } + + GLuint m2DArrayTexture; + GLint mTextureArrayLocation; +}; + +class TextureSizeTextureArrayTest : public TexCoordDrawTest +{ + protected: + TextureSizeTextureArrayTest() + : TexCoordDrawTest(), + mTexture2DA(0), + mTexture2DB(0), + mTexture0Location(-1), + mTexture1Location(-1) + { + } + + std::string getVertexShaderSource() override + { + return std::string( + "#version 300 es\n" + "in vec4 position;\n" + "void main()\n" + "{\n" + " gl_Position = vec4(position.xy, 0.0, 1.0);\n" + "}\n"); + } + + std::string getFragmentShaderSource() override + { + return std::string( + "#version 300 es\n" + "precision highp float;\n" + "uniform highp sampler2D tex2DArray[2];\n" + "out vec4 fragColor;\n" + "void main()\n" + "{\n" + " float red = float(textureSize(tex2DArray[0], 0).x) / 255.0;\n" + " float green = float(textureSize(tex2DArray[1], 0).x) / 255.0;\n" + " fragColor = vec4(red, green, 0.0, 1.0);\n" + "}\n"); + } + + void SetUp() override + { + TexCoordDrawTest::SetUp(); + + setUpProgram(); + + mTexture0Location = glGetUniformLocation(mProgram, "tex2DArray[0]"); + ASSERT_NE(-1, mTexture0Location); + mTexture1Location = glGetUniformLocation(mProgram, "tex2DArray[1]"); + ASSERT_NE(-1, mTexture1Location); + + mTexture2DA = create2DTexture(); + mTexture2DB = create2DTexture(); + ASSERT_GL_NO_ERROR(); + } + + void TearDown() override + { + glDeleteTextures(1, &mTexture2DA); + glDeleteTextures(1, &mTexture2DB); + TexCoordDrawTest::TearDown(); + } + + GLuint mTexture2DA; + GLuint mTexture2DB; + GLint mTexture0Location; + GLint mTexture1Location; +}; + +class Texture3DTestES3 : public TexCoordDrawTest +{ + protected: + Texture3DTestES3() : TexCoordDrawTest(), mTexture3D(0), mTexture3DUniformLocation(-1) {} + + std::string getVertexShaderSource() override + { + return std::string( + "#version 300 es\n" + "out vec2 texcoord;\n" + "in vec4 position;\n" + "void main()\n" + "{\n" + " gl_Position = vec4(position.xy, 0.0, 1.0);\n" + " texcoord = (position.xy * 0.5) + 0.5;\n" + "}\n"); + } + + std::string getFragmentShaderSource() override + { + return std::string( + "#version 300 es\n" + "precision highp float;\n" + "uniform highp sampler3D tex3D;\n" + "in vec2 texcoord;\n" + "out vec4 fragColor;\n" + "void main()\n" + "{\n" + " fragColor = texture(tex3D, vec3(texcoord, 0.0));\n" + "}\n"); + } + + void SetUp() override + { + TexCoordDrawTest::SetUp(); + + glGenTextures(1, &mTexture3D); + + setUpProgram(); + + mTexture3DUniformLocation = glGetUniformLocation(mProgram, "tex3D"); + ASSERT_NE(-1, mTexture3DUniformLocation); + } + + void TearDown() override + { + glDeleteTextures(1, &mTexture3D); + TexCoordDrawTest::TearDown(); + } + + GLuint mTexture3D; + GLint mTexture3DUniformLocation; +}; + +class ShadowSamplerPlusSampler3DTestES3 : public TexCoordDrawTest +{ + protected: + ShadowSamplerPlusSampler3DTestES3() + : TexCoordDrawTest(), + mTextureShadow(0), + mTexture3D(0), + mTextureShadowUniformLocation(-1), + mTexture3DUniformLocation(-1), + mDepthRefUniformLocation(-1) + { + } + + std::string getVertexShaderSource() override + { + return std::string( + "#version 300 es\n" + "out vec2 texcoord;\n" + "in vec4 position;\n" + "void main()\n" + "{\n" + " gl_Position = vec4(position.xy, 0.0, 1.0);\n" + " texcoord = (position.xy * 0.5) + 0.5;\n" + "}\n"); + } + + std::string getFragmentShaderSource() override + { + return std::string( + "#version 300 es\n" + "precision highp float;\n" + "uniform highp sampler2DShadow tex2DShadow;\n" + "uniform highp sampler3D tex3D;\n" + "in vec2 texcoord;\n" + "uniform float depthRef;\n" + "out vec4 fragColor;\n" + "void main()\n" + "{\n" + " fragColor = vec4(texture(tex2DShadow, vec3(texcoord, depthRef)) * 0.5);\n" + " fragColor += texture(tex3D, vec3(texcoord, 0.0));\n" + "}\n"); + } + + void SetUp() override + { + TexCoordDrawTest::SetUp(); + + glGenTextures(1, &mTexture3D); + + glGenTextures(1, &mTextureShadow); + glBindTexture(GL_TEXTURE_2D, mTextureShadow); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE); + + setUpProgram(); + + mTextureShadowUniformLocation = glGetUniformLocation(mProgram, "tex2DShadow"); + ASSERT_NE(-1, mTextureShadowUniformLocation); + mTexture3DUniformLocation = glGetUniformLocation(mProgram, "tex3D"); + ASSERT_NE(-1, mTexture3DUniformLocation); + mDepthRefUniformLocation = glGetUniformLocation(mProgram, "depthRef"); + ASSERT_NE(-1, mDepthRefUniformLocation); + } + + void TearDown() override + { + glDeleteTextures(1, &mTextureShadow); + glDeleteTextures(1, &mTexture3D); + TexCoordDrawTest::TearDown(); + } + + GLuint mTextureShadow; + GLuint mTexture3D; + GLint mTextureShadowUniformLocation; + GLint mTexture3DUniformLocation; + GLint mDepthRefUniformLocation; +}; + +class SamplerTypeMixTestES3 : public TexCoordDrawTest +{ + protected: + SamplerTypeMixTestES3() + : TexCoordDrawTest(), + mTexture2D(0), + mTextureCube(0), + mTexture2DShadow(0), + mTextureCubeShadow(0), + mTexture2DUniformLocation(-1), + mTextureCubeUniformLocation(-1), + mTexture2DShadowUniformLocation(-1), + mTextureCubeShadowUniformLocation(-1), + mDepthRefUniformLocation(-1) + { + } + + std::string getVertexShaderSource() override + { + return std::string( + "#version 300 es\n" + "out vec2 texcoord;\n" + "in vec4 position;\n" + "void main()\n" + "{\n" + " gl_Position = vec4(position.xy, 0.0, 1.0);\n" + " texcoord = (position.xy * 0.5) + 0.5;\n" + "}\n"); + } + + std::string getFragmentShaderSource() override + { + return std::string( + "#version 300 es\n" + "precision highp float;\n" + "uniform highp sampler2D tex2D;\n" + "uniform highp samplerCube texCube;\n" + "uniform highp sampler2DShadow tex2DShadow;\n" + "uniform highp samplerCubeShadow texCubeShadow;\n" + "in vec2 texcoord;\n" + "uniform float depthRef;\n" + "out vec4 fragColor;\n" + "void main()\n" + "{\n" + " fragColor = texture(tex2D, texcoord);\n" + " fragColor += texture(texCube, vec3(1.0, 0.0, 0.0));\n" + " fragColor += vec4(texture(tex2DShadow, vec3(texcoord, depthRef)) * 0.25);\n" + " fragColor += vec4(texture(texCubeShadow, vec4(1.0, 0.0, 0.0, depthRef)) * " + "0.125);\n" + "}\n"); + } + + void SetUp() override + { + TexCoordDrawTest::SetUp(); + + glGenTextures(1, &mTexture2D); + glGenTextures(1, &mTextureCube); + + glGenTextures(1, &mTexture2DShadow); + glBindTexture(GL_TEXTURE_2D, mTexture2DShadow); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE); + + glGenTextures(1, &mTextureCubeShadow); + glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCubeShadow); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE); + + setUpProgram(); + + mTexture2DUniformLocation = glGetUniformLocation(mProgram, "tex2D"); + ASSERT_NE(-1, mTexture2DUniformLocation); + mTextureCubeUniformLocation = glGetUniformLocation(mProgram, "texCube"); + ASSERT_NE(-1, mTextureCubeUniformLocation); + mTexture2DShadowUniformLocation = glGetUniformLocation(mProgram, "tex2DShadow"); + ASSERT_NE(-1, mTexture2DShadowUniformLocation); + mTextureCubeShadowUniformLocation = glGetUniformLocation(mProgram, "texCubeShadow"); + ASSERT_NE(-1, mTextureCubeShadowUniformLocation); + mDepthRefUniformLocation = glGetUniformLocation(mProgram, "depthRef"); + ASSERT_NE(-1, mDepthRefUniformLocation); + + ASSERT_GL_NO_ERROR(); + } + + void TearDown() override + { + glDeleteTextures(1, &mTexture2D); + glDeleteTextures(1, &mTextureCube); + glDeleteTextures(1, &mTexture2DShadow); + glDeleteTextures(1, &mTextureCubeShadow); + TexCoordDrawTest::TearDown(); + } + + GLuint mTexture2D; + GLuint mTextureCube; + GLuint mTexture2DShadow; + GLuint mTextureCubeShadow; + GLint mTexture2DUniformLocation; + GLint mTextureCubeUniformLocation; + GLint mTexture2DShadowUniformLocation; + GLint mTextureCubeShadowUniformLocation; + GLint mDepthRefUniformLocation; +}; + +class SamplerInStructTest : public Texture2DTest +{ + protected: + SamplerInStructTest() : Texture2DTest() {} + + const char *getTextureUniformName() override { return "us.tex"; } + + std::string getFragmentShaderSource() override + { + return std::string( + "precision highp float;\n" + "struct S\n" + "{\n" + " vec4 a;\n" + " highp sampler2D tex;\n" + "};\n" + "uniform S us;\n" + "varying vec2 texcoord;\n" + "void main()\n" + "{\n" + " gl_FragColor = texture2D(us.tex, texcoord + us.a.x);\n" + "}\n"); + } + + void runSamplerInStructTest() + { + setUpProgram(); + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2D); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, + &GLColor::green); + drawQuad(mProgram, "position", 0.5f); + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); + } +}; + +class SamplerInStructAsFunctionParameterTest : public SamplerInStructTest +{ + protected: + SamplerInStructAsFunctionParameterTest() : SamplerInStructTest() {} + + std::string getFragmentShaderSource() override + { + return std::string( + "precision highp float;\n" + "struct S\n" + "{\n" + " vec4 a;\n" + " highp sampler2D tex;\n" + "};\n" + "uniform S us;\n" + "varying vec2 texcoord;\n" + "vec4 sampleFrom(S s) {\n" + " return texture2D(s.tex, texcoord + s.a.x);\n" + "}\n" + "void main()\n" + "{\n" + " gl_FragColor = sampleFrom(us);\n" + "}\n"); + } +}; + +class SamplerInStructArrayAsFunctionParameterTest : public SamplerInStructTest +{ + protected: + SamplerInStructArrayAsFunctionParameterTest() : SamplerInStructTest() {} + + const char *getTextureUniformName() override { return "us[0].tex"; } + + std::string getFragmentShaderSource() override + { + return std::string( + "precision highp float;\n" + "struct S\n" + "{\n" + " vec4 a;\n" + " highp sampler2D tex;\n" + "};\n" + "uniform S us[1];\n" + "varying vec2 texcoord;\n" + "vec4 sampleFrom(S s) {\n" + " return texture2D(s.tex, texcoord + s.a.x);\n" + "}\n" + "void main()\n" + "{\n" + " gl_FragColor = sampleFrom(us[0]);\n" + "}\n"); + } +}; + +class SamplerInNestedStructAsFunctionParameterTest : public SamplerInStructTest +{ + protected: + SamplerInNestedStructAsFunctionParameterTest() : SamplerInStructTest() {} + + const char *getTextureUniformName() override { return "us[0].sub.tex"; } + + std::string getFragmentShaderSource() override + { + return std::string( + "precision highp float;\n" + "struct SUB\n" + "{\n" + " vec4 a;\n" + " highp sampler2D tex;\n" + "};\n" + "struct S\n" + "{\n" + " SUB sub;\n" + "};\n" + "uniform S us[1];\n" + "varying vec2 texcoord;\n" + "vec4 sampleFrom(SUB s) {\n" + " return texture2D(s.tex, texcoord + s.a.x);\n" + "}\n" + "void main()\n" + "{\n" + " gl_FragColor = sampleFrom(us[0].sub);\n" + "}\n"); + } +}; + +class SamplerInStructAndOtherVariableTest : public SamplerInStructTest +{ + protected: + SamplerInStructAndOtherVariableTest() : SamplerInStructTest() {} + + std::string getFragmentShaderSource() override + { + return std::string( + "precision highp float;\n" + "struct S\n" + "{\n" + " vec4 a;\n" + " highp sampler2D tex;\n" + "};\n" + "uniform S us;\n" + "uniform float us_tex;\n" + "varying vec2 texcoord;\n" + "void main()\n" + "{\n" + " gl_FragColor = texture2D(us.tex, texcoord + us.a.x + us_tex);\n" + "}\n"); + } +}; + +TEST_P(Texture2DTest, NegativeAPISubImage) +{ + glBindTexture(GL_TEXTURE_2D, mTexture2D); + EXPECT_GL_ERROR(GL_NO_ERROR); + + setUpProgram(); + + const GLubyte *pixels[20] = { 0 }; + glTexSubImage2D(GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + if (extensionEnabled("GL_EXT_texture_storage")) + { + // Create a 1-level immutable texture. + glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2); + + // Try calling sub image on the second level. + glTexSubImage2D(GL_TEXTURE_2D, 1, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + } +} + +// Test that querying GL_TEXTURE_BINDING* doesn't cause an unexpected error. +TEST_P(Texture2DTest, QueryBinding) +{ + glBindTexture(GL_TEXTURE_2D, 0); + EXPECT_GL_ERROR(GL_NO_ERROR); + + GLint textureBinding; + glGetIntegerv(GL_TEXTURE_BINDING_2D, &textureBinding); + EXPECT_GL_NO_ERROR(); + EXPECT_EQ(0, textureBinding); + + glGetIntegerv(GL_TEXTURE_BINDING_EXTERNAL_OES, &textureBinding); + if (extensionEnabled("GL_OES_EGL_image_external") || + extensionEnabled("GL_NV_EGL_stream_consumer_external")) + { + EXPECT_GL_NO_ERROR(); + EXPECT_EQ(0, textureBinding); + } + else + { + EXPECT_GL_ERROR(GL_INVALID_ENUM); + } +} + +TEST_P(Texture2DTest, ZeroSizedUploads) +{ + glBindTexture(GL_TEXTURE_2D, mTexture2D); + EXPECT_GL_ERROR(GL_NO_ERROR); + + setUpProgram(); + + // Use the texture first to make sure it's in video memory + glUseProgram(mProgram); + glUniform1i(mTexture2DUniformLocation, 0); + drawQuad(mProgram, "position", 0.5f); + + const GLubyte *pixel[4] = { 0 }; + + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixel); + EXPECT_GL_NO_ERROR(); + + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixel); + EXPECT_GL_NO_ERROR(); + + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixel); + EXPECT_GL_NO_ERROR(); +} + +// Test drawing with two texture types, to trigger an ANGLE bug in validation +TEST_P(TextureCubeTest, CubeMapBug) +{ + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2D); + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCube); + EXPECT_GL_ERROR(GL_NO_ERROR); + + glUseProgram(mProgram); + glUniform1i(mTexture2DUniformLocation, 0); + glUniform1i(mTextureCubeUniformLocation, 1); + drawQuad(mProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); +} + +// Test drawing with two texture types accessed from the same shader and check that the result of +// drawing is correct. +TEST_P(TextureCubeTest, CubeMapDraw) +{ + GLubyte texData[4]; + texData[0] = 0; + texData[1] = 60; + texData[2] = 0; + texData[3] = 255; + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2D); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, texData); + + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCube); + texData[1] = 120; + glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, + texData); + EXPECT_GL_ERROR(GL_NO_ERROR); + + glUseProgram(mProgram); + glUniform1i(mTexture2DUniformLocation, 0); + glUniform1i(mTextureCubeUniformLocation, 1); + drawQuad(mProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + + int px = getWindowWidth() - 1; + int py = 0; + EXPECT_PIXEL_NEAR(px, py, 0, 180, 0, 255, 2); +} + +TEST_P(Sampler2DAsFunctionParameterTest, Sampler2DAsFunctionParameter) +{ + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2D); + GLubyte texData[4]; + texData[0] = 0; + texData[1] = 128; + texData[2] = 0; + texData[3] = 255; + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, texData); + glUseProgram(mProgram); + glUniform1i(mTexture2DUniformLocation, 0); + drawQuad(mProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + + EXPECT_PIXEL_NEAR(0, 0, 0, 128, 0, 255, 2); +} + +// Test drawing with two textures passed to the shader in a sampler array. +TEST_P(SamplerArrayTest, SamplerArrayDraw) +{ + testSamplerArrayDraw(); +} + +// Test drawing with two textures passed to the shader in a sampler array which is passed to a +// user-defined function in the shader. +TEST_P(SamplerArrayAsFunctionParameterTest, SamplerArrayAsFunctionParameter) +{ + testSamplerArrayDraw(); +} + +// Copy of a test in conformance/textures/texture-mips, to test generate mipmaps +TEST_P(Texture2DTestWithDrawScale, MipmapsTwice) +{ + int px = getWindowWidth() / 2; + int py = getWindowHeight() / 2; + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2D); + + std::vector<GLColor> pixelsRed(16u * 16u, GLColor::red); + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelsRed.data()); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glGenerateMipmap(GL_TEXTURE_2D); + + glUseProgram(mProgram); + glUniform1i(mTexture2DUniformLocation, 0); + glUniform2f(mDrawScaleUniformLocation, 0.0625f, 0.0625f); + drawQuad(mProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + EXPECT_PIXEL_COLOR_EQ(px, py, GLColor::red); + + std::vector<GLColor> pixelsBlue(16u * 16u, GLColor::blue); + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, + pixelsBlue.data()); + glGenerateMipmap(GL_TEXTURE_2D); + + std::vector<GLColor> pixelsGreen(16u * 16u, GLColor::green); + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, + pixelsGreen.data()); + glGenerateMipmap(GL_TEXTURE_2D); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_GL_NO_ERROR(); + EXPECT_PIXEL_COLOR_EQ(px, py, GLColor::green); +} + +// Test creating a FBO with a cube map render target, to test an ANGLE bug +// https://code.google.com/p/angleproject/issues/detail?id=849 +TEST_P(TextureCubeTest, CubeMapFBO) +{ + GLuint fbo; + glGenFramebuffers(1, &fbo); + glBindFramebuffer(GL_FRAMEBUFFER, fbo); + + glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCube); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_Y, mTextureCube, 0); + + EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); + + glDeleteFramebuffers(1, &fbo); + + EXPECT_GL_NO_ERROR(); +} + +// Test that glTexSubImage2D works properly when glTexStorage2DEXT has initialized the image with a default color. +TEST_P(Texture2DTest, TexStorage) +{ + int width = getWindowWidth(); + int height = getWindowHeight(); + + GLuint tex2D; + glGenTextures(1, &tex2D); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, tex2D); + + // Fill with red + std::vector<GLubyte> pixels(3 * 16 * 16); + for (size_t pixelId = 0; pixelId < 16 * 16; ++pixelId) + { + pixels[pixelId * 3 + 0] = 255; + pixels[pixelId * 3 + 1] = 0; + pixels[pixelId * 3 + 2] = 0; + } + + // ANGLE internally uses RGBA as the DirectX format for RGB images + // therefore glTexStorage2DEXT initializes the image to a default color to get a consistent alpha color. + // The data is kept in a CPU-side image and the image is marked as dirty. + glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGB8, 16, 16); + + // Initializes the color of the upper-left 8x8 pixels, leaves the other pixels untouched. + // glTexSubImage2D should take into account that the image is dirty. + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 8, 8, GL_RGB, GL_UNSIGNED_BYTE, pixels.data()); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + setUpProgram(); + + glUseProgram(mProgram); + glUniform1i(mTexture2DUniformLocation, 0); + drawQuad(mProgram, "position", 0.5f); + glDeleteTextures(1, &tex2D); + EXPECT_GL_NO_ERROR(); + EXPECT_PIXEL_EQ(width / 4, height / 4, 255, 0, 0, 255); + + // Validate that the region of the texture without data has an alpha of 1.0 + GLubyte pixel[4]; + glReadPixels(3 * width / 4, 3 * height / 4, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixel); + EXPECT_EQ(pixel[3], 255); +} + +// Test that glTexSubImage2D combined with a PBO works properly when glTexStorage2DEXT has initialized the image with a default color. +TEST_P(Texture2DTest, TexStorageWithPBO) +{ + if (extensionEnabled("NV_pixel_buffer_object")) + { + int width = getWindowWidth(); + int height = getWindowHeight(); + + GLuint tex2D; + glGenTextures(1, &tex2D); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, tex2D); + + // Fill with red + std::vector<GLubyte> pixels(3 * 16 * 16); + for (size_t pixelId = 0; pixelId < 16 * 16; ++pixelId) + { + pixels[pixelId * 3 + 0] = 255; + pixels[pixelId * 3 + 1] = 0; + pixels[pixelId * 3 + 2] = 0; + } + + // Read 16x16 region from red backbuffer to PBO + GLuint pbo; + glGenBuffers(1, &pbo); + glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo); + glBufferData(GL_PIXEL_UNPACK_BUFFER, 3 * 16 * 16, pixels.data(), GL_STATIC_DRAW); + + // ANGLE internally uses RGBA as the DirectX format for RGB images + // therefore glTexStorage2DEXT initializes the image to a default color to get a consistent alpha color. + // The data is kept in a CPU-side image and the image is marked as dirty. + glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGB8, 16, 16); + + // Initializes the color of the upper-left 8x8 pixels, leaves the other pixels untouched. + // glTexSubImage2D should take into account that the image is dirty. + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 8, 8, GL_RGB, GL_UNSIGNED_BYTE, NULL); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + setUpProgram(); + + glUseProgram(mProgram); + glUniform1i(mTexture2DUniformLocation, 0); + drawQuad(mProgram, "position", 0.5f); + glDeleteTextures(1, &tex2D); + glDeleteBuffers(1, &pbo); + EXPECT_GL_NO_ERROR(); + EXPECT_PIXEL_EQ(3 * width / 4, 3 * height / 4, 0, 0, 0, 255); + EXPECT_PIXEL_EQ(width / 4, height / 4, 255, 0, 0, 255); + } +} + +// See description on testFloatCopySubImage +TEST_P(Texture2DTest, CopySubImageFloat_R_R) +{ + testFloatCopySubImage(1, 1); +} + +TEST_P(Texture2DTest, CopySubImageFloat_RG_R) +{ + testFloatCopySubImage(2, 1); +} + +TEST_P(Texture2DTest, CopySubImageFloat_RG_RG) +{ + testFloatCopySubImage(2, 2); +} + +TEST_P(Texture2DTest, CopySubImageFloat_RGB_R) +{ + if (IsIntel() && IsLinux()) + { + // TODO(cwallez): Fix on Linux Intel drivers (http://anglebug.com/1346) + std::cout << "Test disabled on Linux Intel OpenGL." << std::endl; + return; + } + + testFloatCopySubImage(3, 1); +} + +TEST_P(Texture2DTest, CopySubImageFloat_RGB_RG) +{ + if (IsIntel() && IsLinux()) + { + // TODO(cwallez): Fix on Linux Intel drivers (http://anglebug.com/1346) + std::cout << "Test disabled on Linux Intel OpenGL." << std::endl; + return; + } + + testFloatCopySubImage(3, 2); +} + +TEST_P(Texture2DTest, CopySubImageFloat_RGB_RGB) +{ + if (IsIntel() && IsLinux()) + { + // TODO(cwallez): Fix on Linux Intel drivers (http://anglebug.com/1346) + std::cout << "Test disabled on Linux Intel OpenGL." << std::endl; + return; + } + + // TODO (bug 1284): Investigate RGBA32f D3D SDK Layers messages on D3D11_FL9_3 + if (IsD3D11_FL93()) + { + std::cout << "Test skipped on Feature Level 9_3." << std::endl; + return; + } + + testFloatCopySubImage(3, 3); +} + +TEST_P(Texture2DTest, CopySubImageFloat_RGBA_R) +{ + testFloatCopySubImage(4, 1); +} + +TEST_P(Texture2DTest, CopySubImageFloat_RGBA_RG) +{ + testFloatCopySubImage(4, 2); +} + +TEST_P(Texture2DTest, CopySubImageFloat_RGBA_RGB) +{ + // TODO (bug 1284): Investigate RGBA32f D3D SDK Layers messages on D3D11_FL9_3 + if (IsD3D11_FL93()) + { + std::cout << "Test skipped on Feature Level 9_3." << std::endl; + return; + } + + testFloatCopySubImage(4, 3); +} + +TEST_P(Texture2DTest, CopySubImageFloat_RGBA_RGBA) +{ + // TODO (bug 1284): Investigate RGBA32f D3D SDK Layers messages on D3D11_FL9_3 + if (IsD3D11_FL93()) + { + std::cout << "Test skipped on Feature Level 9_3." << std::endl; + return; + } + + testFloatCopySubImage(4, 4); +} + +// Port of https://www.khronos.org/registry/webgl/conformance-suites/1.0.3/conformance/textures/texture-npot.html +// Run against GL_ALPHA/UNSIGNED_BYTE format, to ensure that D3D11 Feature Level 9_3 correctly handles GL_ALPHA +TEST_P(Texture2DTest, TextureNPOT_GL_ALPHA_UBYTE) +{ + const int npotTexSize = 5; + const int potTexSize = 4; // Should be less than npotTexSize + GLuint tex2D; + + if (extensionEnabled("GL_OES_texture_npot")) + { + // This test isn't applicable if texture_npot is enabled + return; + } + + setUpProgram(); + + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + + // Default unpack alignment is 4. The values of 'pixels' below needs it to be 1. + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + + glActiveTexture(GL_TEXTURE0); + glGenTextures(1, &tex2D); + glBindTexture(GL_TEXTURE_2D, tex2D); + + std::vector<GLubyte> pixels(1 * npotTexSize * npotTexSize); + for (size_t pixelId = 0; pixelId < npotTexSize * npotTexSize; ++pixelId) + { + pixels[pixelId] = 64; + } + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + // Check that an NPOT texture not on level 0 generates INVALID_VALUE + glTexImage2D(GL_TEXTURE_2D, 1, GL_ALPHA, npotTexSize, npotTexSize, 0, GL_ALPHA, GL_UNSIGNED_BYTE, pixels.data()); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + // Check that an NPOT texture on level 0 succeeds + glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, npotTexSize, npotTexSize, 0, GL_ALPHA, GL_UNSIGNED_BYTE, pixels.data()); + EXPECT_GL_NO_ERROR(); + + // Check that generateMipmap fails on NPOT + glGenerateMipmap(GL_TEXTURE_2D); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + // Check that nothing is drawn if filtering is not correct for NPOT + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + glClear(GL_COLOR_BUFFER_BIT); + drawQuad(mProgram, "position", 1.0f); + EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 0, 0, 0, 255); + + // NPOT texture with TEXTURE_MIN_FILTER not NEAREST or LINEAR should draw with 0,0,0,255 + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR); + glClear(GL_COLOR_BUFFER_BIT); + drawQuad(mProgram, "position", 1.0f); + EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 0, 0, 0, 255); + + // NPOT texture with TEXTURE_MIN_FILTER set to LINEAR should draw + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glClear(GL_COLOR_BUFFER_BIT); + drawQuad(mProgram, "position", 1.0f); + EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 0, 0, 0, 64); + + // Check that glTexImage2D for POT texture succeeds + glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, potTexSize, potTexSize, 0, GL_ALPHA, GL_UNSIGNED_BYTE, pixels.data()); + EXPECT_GL_NO_ERROR(); + + // Check that generateMipmap for an POT texture succeeds + glGenerateMipmap(GL_TEXTURE_2D); + EXPECT_GL_NO_ERROR(); + + // POT texture with TEXTURE_MIN_FILTER set to LINEAR_MIPMAP_LINEAR should draw + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + glClear(GL_COLOR_BUFFER_BIT); + drawQuad(mProgram, "position", 1.0f); + EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 0, 0, 0, 64); + EXPECT_GL_NO_ERROR(); +} + +// Test to ensure that glTexSubImage2D always accepts data for non-power-of-two subregions. +// ANGLE previously rejected this if GL_OES_texture_npot wasn't active, which is incorrect. +TEST_P(Texture2DTest, NPOTSubImageParameters) +{ + // TODO(geofflang): Allow the GL backend to accept SubImage calls with a null data ptr. (bug + // 1278) + if (getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE || + getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE) + { + std::cout << "Test disabled on OpenGL." << std::endl; + return; + } + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2D); + + // Create an 8x8 (i.e. power-of-two) texture. + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glGenerateMipmap(GL_TEXTURE_2D); + + // Supply a 3x3 (i.e. non-power-of-two) subimage to the texture. + // This should always work, even if GL_OES_texture_npot isn't active. + glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, 3, 3, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + + EXPECT_GL_NO_ERROR(); +} + +// Test to check that texture completeness is determined correctly when the texture base level is +// greater than 0, and also that level 0 is not sampled when base level is greater than 0. +TEST_P(Texture2DTestES3, DrawWithBaseLevel1) +{ + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2D); + + std::vector<GLColor> texDataRed(4u * 4u, GLColor::red); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, texDataRed.data()); + std::vector<GLColor> texDataGreen(2u * 2u, GLColor::green); + glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, + texDataGreen.data()); + glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, + texDataGreen.data()); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1); + + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); +} + +// Test that drawing works correctly when levels outside the BASE_LEVEL/MAX_LEVEL range do not +// have images defined. +TEST_P(Texture2DTestES3, DrawWithLevelsOutsideRangeUndefined) +{ + if (IsAMD() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + // Observed crashing on AMD. Oddly the crash only happens with 2D textures, not 3D or array. + std::cout << "Test skipped on AMD OpenGL." << std::endl; + return; + } + if (IsOSX()) + { + // Observed incorrect rendering on OSX. + std::cout << "Test skipped on OSX." << std::endl; + return; + } + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2D); + std::vector<GLColor> texDataGreen(2u * 2u, GLColor::green); + glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, + texDataGreen.data()); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1); + + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); +} + +// Test that drawing works correctly when level 0 is undefined and base level is 1. +TEST_P(Texture2DTestES3, DrawWithLevelZeroUndefined) +{ + if (IsAMD() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + // Observed crashing on AMD. Oddly the crash only happens with 2D textures, not 3D or array. + std::cout << "Test skipped on AMD OpenGL." << std::endl; + return; + } + if (IsOSX()) + { + // Observed incorrect rendering on OSX. + std::cout << "Test skipped on OSX." << std::endl; + return; + } + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2D); + std::vector<GLColor> texDataGreen(2u * 2u, GLColor::green); + glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, + texDataGreen.data()); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 2); + + EXPECT_GL_NO_ERROR(); + + // Texture is incomplete. + drawQuad(mProgram, "position", 0.5f); + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black); + + glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, + texDataGreen.data()); + + // Texture is now complete. + drawQuad(mProgram, "position", 0.5f); + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); +} + +// Test that drawing works correctly when levels outside the BASE_LEVEL/MAX_LEVEL range have +// dimensions that don't fit the images inside the range. +// GLES 3.0.4 section 3.8.13 Texture completeness +TEST_P(Texture2DTestES3, DrawWithLevelsOutsideRangeWithInconsistentDimensions) +{ + if (IsOSX()) + { + // Observed incorrect rendering on OSX. + std::cout << "Test skipped on OSX." << std::endl; + return; + } + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2D); + std::vector<GLColor> texDataRed(8u * 8u, GLColor::red); + std::vector<GLColor> texDataGreen(2u * 2u, GLColor::green); + std::vector<GLColor> texDataCyan(2u * 2u, GLColor::cyan); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + + // Two levels that are initially unused. + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, texDataRed.data()); + glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, + texDataCyan.data()); + + // One level that is used - only this level should affect completeness. + glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, + texDataGreen.data()); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1); + + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); + + if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + // Intel was observed drawing color 0,0,0,0 instead of the texture color after the base + // level was changed. + std::cout << "Test partially skipped on Intel OpenGL." << std::endl; + return; + } + + // Switch the level that is being used to the cyan level 2. + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 2); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 2); + + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::cyan); +} + +// Test that drawing works correctly when levels outside the BASE_LEVEL/MAX_LEVEL range do not +// have images defined. +TEST_P(Texture3DTestES3, DrawWithLevelsOutsideRangeUndefined) +{ + if (IsOSX()) + { + // Observed incorrect rendering on OSX. + std::cout << "Test skipped on OSX." << std::endl; + return; + } + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_3D, mTexture3D); + std::vector<GLColor> texDataGreen(2u * 2u * 2u, GLColor::green); + glTexImage3D(GL_TEXTURE_3D, 1, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, + texDataGreen.data()); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 1); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 1); + + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); +} + +// Test that drawing works correctly when levels outside the BASE_LEVEL/MAX_LEVEL range have +// dimensions that don't fit the images inside the range. +// GLES 3.0.4 section 3.8.13 Texture completeness +TEST_P(Texture3DTestES3, DrawWithLevelsOutsideRangeWithInconsistentDimensions) +{ + if (IsOSX()) + { + // Observed incorrect rendering on OSX. + std::cout << "Test skipped on OSX." << std::endl; + return; + } + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_3D, mTexture3D); + std::vector<GLColor> texDataRed(8u * 8u * 8u, GLColor::red); + std::vector<GLColor> texDataGreen(2u * 2u * 2u, GLColor::green); + std::vector<GLColor> texDataCyan(2u * 2u * 2u, GLColor::cyan); + + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + + // Two levels that are initially unused. + glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 8, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, + texDataRed.data()); + glTexImage3D(GL_TEXTURE_3D, 2, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, + texDataCyan.data()); + + // One level that is used - only this level should affect completeness. + glTexImage3D(GL_TEXTURE_3D, 1, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, + texDataGreen.data()); + + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 1); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 1); + + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); + + if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + // Intel was observed drawing color 0,0,0,0 instead of the texture color after the base + // level was changed. + std::cout << "Test partially skipped on Intel OpenGL." << std::endl; + return; + } + + // Switch the level that is being used to the cyan level 2. + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 2); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 2); + + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::cyan); +} + +// Test that drawing works correctly when levels outside the BASE_LEVEL/MAX_LEVEL range do not +// have images defined. +TEST_P(Texture2DArrayTestES3, DrawWithLevelsOutsideRangeUndefined) +{ + if (IsOSX()) + { + // Observed incorrect rendering on OSX. + std::cout << "Test skipped on OSX." << std::endl; + return; + } + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D_ARRAY, m2DArrayTexture); + std::vector<GLColor> texDataGreen(2u * 2u * 2u, GLColor::green); + glTexImage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, + texDataGreen.data()); + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 1); + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 1); + + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); +} + +// Test that drawing works correctly when levels outside the BASE_LEVEL/MAX_LEVEL range have +// dimensions that don't fit the images inside the range. +// GLES 3.0.4 section 3.8.13 Texture completeness +TEST_P(Texture2DArrayTestES3, DrawWithLevelsOutsideRangeWithInconsistentDimensions) +{ + if (IsOSX()) + { + // Observed incorrect rendering on OSX. + std::cout << "Test skipped on OSX." << std::endl; + return; + } + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_3D, m2DArrayTexture); + std::vector<GLColor> texDataRed(8u * 8u * 8u, GLColor::red); + std::vector<GLColor> texDataGreen(2u * 2u * 2u, GLColor::green); + std::vector<GLColor> texDataCyan(2u * 2u * 2u, GLColor::cyan); + + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + + // Two levels that are initially unused. + glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, 8, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, + texDataRed.data()); + glTexImage3D(GL_TEXTURE_2D_ARRAY, 2, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, + texDataCyan.data()); + + // One level that is used - only this level should affect completeness. + glTexImage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, + texDataGreen.data()); + + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 1); + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 1); + + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); + + if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + // Intel was observed drawing color 0,0,0,0 instead of the texture color after the base + // level was changed. + std::cout << "Test partially skipped on Intel OpenGL." << std::endl; + return; + } + if (IsNVIDIA() && (getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE || + getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE)) + { + // NVIDIA was observed drawing color 0,0,0,0 instead of the texture color after the base + // level was changed. + std::cout << "Test partially skipped on NVIDIA OpenGL." << std::endl; + return; + } + + // Switch the level that is being used to the cyan level 2. + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 2); + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 2); + + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::cyan); +} + +// Test that texture completeness is updated if texture max level changes. +// GLES 3.0.4 section 3.8.13 Texture completeness +TEST_P(Texture2DTestES3, TextureCompletenessChangesWithMaxLevel) +{ + if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + // Intel was observed having wrong behavior after the texture is made incomplete by changing + // the base level. + std::cout << "Test skipped on Intel OpenGL." << std::endl; + return; + } + if (IsOSX()) + { + // Observed incorrect rendering on OSX. + std::cout << "Test skipped on OSX." << std::endl; + return; + } + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2D); + std::vector<GLColor> texDataGreen(8u * 8u, GLColor::green); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + + // A level that is initially unused. + glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, + texDataGreen.data()); + + // One level that is initially used - only this level should affect completeness. + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, + texDataGreen.data()); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); + + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); + + // Switch the max level to level 1. The levels within the used range now have inconsistent + // dimensions and the texture should be incomplete. + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1); + + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black); +} + +// Test that 3D texture completeness is updated if texture max level changes. +// GLES 3.0.4 section 3.8.13 Texture completeness +TEST_P(Texture3DTestES3, Texture3DCompletenessChangesWithMaxLevel) +{ + if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + // Intel was observed having wrong behavior after the texture is made incomplete by changing + // the base level. + std::cout << "Test skipped on Intel OpenGL." << std::endl; + return; + } + if (IsOSX()) + { + // Observed incorrect rendering on OSX. + std::cout << "Test skipped on OSX." << std::endl; + return; + } + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_3D, mTexture3D); + std::vector<GLColor> texDataGreen(2u * 2u * 2u, GLColor::green); + + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + + // A level that is initially unused. + glTexImage3D(GL_TEXTURE_3D, 1, GL_RGBA8, 1, 1, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, + texDataGreen.data()); + + // One level that is initially used - only this level should affect completeness. + glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, + texDataGreen.data()); + + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 0); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0); + + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); + + // Switch the max level to level 1. The levels within the used range now have inconsistent + // dimensions and the texture should be incomplete. + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 1); + + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black); +} + +// Test that texture completeness is updated if texture base level changes. +// GLES 3.0.4 section 3.8.13 Texture completeness +TEST_P(Texture2DTestES3, TextureCompletenessChangesWithBaseLevel) +{ + if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + // Intel was observed having wrong behavior after the texture is made incomplete by changing + // the base level. + std::cout << "Test skipped on Intel OpenGL." << std::endl; + return; + } + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2D); + std::vector<GLColor> texDataGreen(8u * 8u, GLColor::green); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + + // Two levels that are initially unused. + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, + texDataGreen.data()); + glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, + texDataGreen.data()); + + // One level that is initially used - only this level should affect completeness. + glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, + texDataGreen.data()); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 2); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 2); + + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); + + // Switch the base level to level 1. The levels within the used range now have inconsistent + // dimensions and the texture should be incomplete. + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1); + + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black); +} + +// Test that texture is not complete if base level is greater than max level. +// GLES 3.0.4 section 3.8.13 Texture completeness +TEST_P(Texture2DTestES3, TextureBaseLevelGreaterThanMaxLevel) +{ + if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + // Intel Windows OpenGL driver crashes if the base level of a non-immutable texture is out + // of range. + std::cout << "Test skipped on Intel OpenGL." << std::endl; + return; + } + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2D); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::green); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 10000); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); + + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + // Texture should be incomplete. + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black); +} + +// Test that immutable texture base level and max level are clamped. +// GLES 3.0.4 section 3.8.10 subsection Mipmapping +TEST_P(Texture2DTestES3, ImmutableTextureBaseLevelOutOfRange) +{ + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2D); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + + glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1); + + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::green); + + // For immutable-format textures, base level should be clamped to [0, levels - 1], and max level + // should be clamped to [base_level, levels - 1]. + // GLES 3.0.4 section 3.8.10 subsection Mipmapping + // In the case of this test, those rules make the effective base level and max level 0. + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 10000); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 10000); + + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + // Texture should be complete. + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); +} + +// Test that changing base level works when it affects the format of the texture. +TEST_P(Texture2DTestES3, TextureFormatChangesWithBaseLevel) +{ + if (IsNVIDIA() && IsOpenGL()) + { + // Observed rendering corruption on NVIDIA OpenGL. + std::cout << "Test skipped on NVIDIA OpenGL." << std::endl; + return; + } + if (IsIntel() && IsDesktopOpenGL()) + { + // Observed incorrect rendering on Intel OpenGL. + std::cout << "Test skipped on Intel OpenGL." << std::endl; + return; + } + if (IsAMD() && IsDesktopOpenGL()) + { + // Observed incorrect rendering on AMD OpenGL. + std::cout << "Test skipped on AMD OpenGL." << std::endl; + return; + } + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2D); + std::vector<GLColor> texDataCyan(4u * 4u, GLColor::cyan); + std::vector<GLColor> texDataGreen(4u * 4u, GLColor::green); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + + // RGBA8 level that's initially unused. + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, + texDataCyan.data()); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1); + + // RG8 level that's initially used, with consistent dimensions with level 0 but a different + // format. It reads green channel data from the green and alpha channels of texDataGreen + // (this is a bit hacky but works). + glTexImage2D(GL_TEXTURE_2D, 1, GL_RG8, 2, 2, 0, GL_RG, GL_UNSIGNED_BYTE, texDataGreen.data()); + + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); + + // Switch the texture to use the cyan level 0 with the RGBA format. + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); + + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::cyan); +} + +// Test that setting a texture image works when base level is out of range. +TEST_P(Texture2DTestES3, SetImageWhenBaseLevelOutOfRange) +{ + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2D); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 10000); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 10000); + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::green); + + EXPECT_GL_NO_ERROR(); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); + + drawQuad(mProgram, "position", 0.5f); + + // Texture should be complete. + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); +} + +// In the D3D11 renderer, we need to initialize some texture formats, to fill empty channels. EG RBA->RGBA8, with 1.0 +// in the alpha channel. This test covers a bug where redefining array textures with these formats does not work as +// expected. +TEST_P(Texture2DArrayTestES3, RedefineInittableArray) +{ + std::vector<GLubyte> pixelData; + for (size_t count = 0; count < 5000; count++) + { + pixelData.push_back(0u); + pixelData.push_back(255u); + pixelData.push_back(0u); + } + + glBindTexture(GL_TEXTURE_2D_ARRAY, m2DArrayTexture); + glUseProgram(mProgram); + glUniform1i(mTextureArrayLocation, 0); + + // The first draw worked correctly. + glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGB, 4, 4, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, &pixelData[0]); + + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_REPEAT); + drawQuad(mProgram, "position", 1.0f); + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); + + // The dimension of the respecification must match the original exactly to trigger the bug. + glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGB, 4, 4, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, &pixelData[0]); + drawQuad(mProgram, "position", 1.0f); + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); + + ASSERT_GL_NO_ERROR(); +} + +// Test shadow sampler and regular non-shadow sampler coexisting in the same shader. +// This test is needed especially to confirm that sampler registers get assigned correctly on +// the HLSL backend even when there's a mix of different HLSL sampler and texture types. +TEST_P(ShadowSamplerPlusSampler3DTestES3, ShadowSamplerPlusSampler3DDraw) +{ + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_3D, mTexture3D); + GLubyte texData[4]; + texData[0] = 0; + texData[1] = 60; + texData[2] = 0; + texData[3] = 255; + glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, texData); + + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_2D, mTextureShadow); + GLfloat depthTexData[1]; + depthTexData[0] = 0.5f; + glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, 1, 1, 0, GL_DEPTH_COMPONENT, GL_FLOAT, + depthTexData); + + glUseProgram(mProgram); + glUniform1f(mDepthRefUniformLocation, 0.3f); + glUniform1i(mTexture3DUniformLocation, 0); + glUniform1i(mTextureShadowUniformLocation, 1); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL); + drawQuad(mProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + // The shader writes 0.5 * <comparison result (1.0)> + <texture color> + EXPECT_PIXEL_NEAR(0, 0, 128, 188, 128, 255, 2); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_GREATER); + drawQuad(mProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + // The shader writes 0.5 * <comparison result (0.0)> + <texture color> + EXPECT_PIXEL_NEAR(0, 0, 0, 60, 0, 255, 2); +} + +// Test multiple different sampler types in the same shader. +// This test makes sure that even if sampler / texture registers get grouped together based on type +// or otherwise get shuffled around in the HLSL backend of the shader translator, the D3D renderer +// still has the right register index information for each ESSL sampler. +// The tested ESSL samplers have the following types in D3D11 HLSL: +// sampler2D: Texture2D + SamplerState +// samplerCube: TextureCube + SamplerState +// sampler2DShadow: Texture2D + SamplerComparisonState +// samplerCubeShadow: TextureCube + SamplerComparisonState +TEST_P(SamplerTypeMixTestES3, SamplerTypeMixDraw) +{ + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2D); + GLubyte texData[4]; + texData[0] = 0; + texData[1] = 0; + texData[2] = 120; + texData[3] = 255; + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, texData); + + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCube); + texData[0] = 0; + texData[1] = 90; + texData[2] = 0; + texData[3] = 255; + glTexStorage2D(GL_TEXTURE_CUBE_MAP, 1, GL_RGBA8, 1, 1); + glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, + texData); + + glActiveTexture(GL_TEXTURE2); + glBindTexture(GL_TEXTURE_2D, mTexture2DShadow); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL); + GLfloat depthTexData[1]; + depthTexData[0] = 0.5f; + glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, 1, 1, 0, GL_DEPTH_COMPONENT, GL_FLOAT, + depthTexData); + + glActiveTexture(GL_TEXTURE3); + glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCubeShadow); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL); + depthTexData[0] = 0.2f; + glTexStorage2D(GL_TEXTURE_CUBE_MAP, 1, GL_DEPTH_COMPONENT32F, 1, 1); + glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, 0, 0, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, + depthTexData); + + EXPECT_GL_NO_ERROR(); + + glUseProgram(mProgram); + glUniform1f(mDepthRefUniformLocation, 0.3f); + glUniform1i(mTexture2DUniformLocation, 0); + glUniform1i(mTextureCubeUniformLocation, 1); + glUniform1i(mTexture2DShadowUniformLocation, 2); + glUniform1i(mTextureCubeShadowUniformLocation, 3); + + drawQuad(mProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + // The shader writes: + // <texture 2d color> + + // <cube map color> + + // 0.25 * <comparison result (1.0)> + + // 0.125 * <comparison result (0.0)> + EXPECT_PIXEL_NEAR(0, 0, 64, 154, 184, 255, 2); +} + +// Test different base levels on textures accessed through the same sampler array. +// Calling textureSize() on the samplers hits the D3D sampler metadata workaround. +TEST_P(TextureSizeTextureArrayTest, BaseLevelVariesInTextureArray) +{ + if ((IsAMD() || IsIntel()) && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE) + { + std::cout << "Test skipped on Intel and AMD D3D." << std::endl; + return; + } + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2DA); + GLsizei size = 64; + for (GLint level = 0; level < 7; ++level) + { + ASSERT_LT(0, size); + glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE, + nullptr); + size = size / 2; + } + ASSERT_EQ(0, size); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1); + + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_2D, mTexture2DB); + size = 128; + for (GLint level = 0; level < 8; ++level) + { + ASSERT_LT(0, size); + glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE, + nullptr); + size = size / 2; + } + ASSERT_EQ(0, size); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 3); + EXPECT_GL_NO_ERROR(); + + glUseProgram(mProgram); + glUniform1i(mTexture0Location, 0); + glUniform1i(mTexture1Location, 1); + + drawQuad(mProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + // Red channel: width of level 1 of texture A: 32. + // Green channel: width of level 3 of texture B: 16. + EXPECT_PIXEL_NEAR(0, 0, 32, 16, 0, 255, 2); +} + +// When sampling a texture without an alpha channel, "1" is returned as the alpha value. +// ES 3.0.4 table 3.24 +TEST_P(Texture2DTestES3, TextureRGBImplicitAlpha1) +{ + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2D); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr); + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_ALPHA_EQ(0, 0, 255); +} + +// When sampling a texture without an alpha channel, "1" is returned as the alpha value. +// ES 3.0.4 table 3.24 +TEST_P(Texture2DTestES3, TextureLuminanceImplicitAlpha1) +{ + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2D); + glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, nullptr); + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_ALPHA_EQ(0, 0, 255); +} + +// When sampling a texture without an alpha channel, "1" is returned as the alpha value. +// ES 3.0.4 table 3.24 +TEST_P(Texture2DTestES3, TextureLuminance32ImplicitAlpha1) +{ + if (extensionEnabled("GL_OES_texture_float")) + { + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2D); + glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_FLOAT, nullptr); + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_ALPHA_EQ(0, 0, 255); + } +} + +// When sampling a texture without an alpha channel, "1" is returned as the alpha value. +// ES 3.0.4 table 3.24 +TEST_P(Texture2DTestES3, TextureLuminance16ImplicitAlpha1) +{ + if (extensionEnabled("GL_OES_texture_half_float")) + { + if (IsNVIDIA() && IsOpenGLES()) + { + std::cout << "Test skipped on NVIDIA" << std::endl; + return; + } + // TODO(ynovikov): re-enable once root cause of http://anglebug.com/1420 is fixed + if (IsAndroid() && IsAdreno() && IsOpenGLES()) + { + std::cout << "Test skipped on Adreno OpenGLES on Android." << std::endl; + return; + } + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2D); + glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_HALF_FLOAT_OES, + nullptr); + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_ALPHA_EQ(0, 0, 255); + } +} + +// When sampling a texture without an alpha channel, "1" is returned as the alpha value. +// ES 3.0.4 table 3.24 +TEST_P(Texture2DUnsignedIntegerAlpha1TestES3, TextureRGB8UIImplicitAlpha1) +{ + if (IsIntel()) + { + std::cout << "Test disabled on Intel." << std::endl; + return; + } + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2D); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8UI, 1, 1, 0, GL_RGB_INTEGER, GL_UNSIGNED_BYTE, nullptr); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_ALPHA_EQ(0, 0, 255); +} + +// When sampling a texture without an alpha channel, "1" is returned as the alpha value. +// ES 3.0.4 table 3.24 +TEST_P(Texture2DIntegerAlpha1TestES3, TextureRGB8IImplicitAlpha1) +{ + if (IsIntel()) + { + std::cout << "Test disabled on Intel." << std::endl; + return; + } + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2D); + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8I, 1, 1, 0, GL_RGB_INTEGER, GL_BYTE, nullptr); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_ALPHA_EQ(0, 0, 255); +} + +// When sampling a texture without an alpha channel, "1" is returned as the alpha value. +// ES 3.0.4 table 3.24 +TEST_P(Texture2DUnsignedIntegerAlpha1TestES3, TextureRGB16UIImplicitAlpha1) +{ + if (IsIntel()) + { + std::cout << "Test disabled on Intel." << std::endl; + return; + } + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2D); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16UI, 1, 1, 0, GL_RGB_INTEGER, GL_UNSIGNED_SHORT, nullptr); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_ALPHA_EQ(0, 0, 255); +} + +// When sampling a texture without an alpha channel, "1" is returned as the alpha value. +// ES 3.0.4 table 3.24 +TEST_P(Texture2DIntegerAlpha1TestES3, TextureRGB16IImplicitAlpha1) +{ + if (IsIntel()) + { + std::cout << "Test disabled on Intel." << std::endl; + return; + } + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2D); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16I, 1, 1, 0, GL_RGB_INTEGER, GL_SHORT, nullptr); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_ALPHA_EQ(0, 0, 255); +} + +// When sampling a texture without an alpha channel, "1" is returned as the alpha value. +// ES 3.0.4 table 3.24 +TEST_P(Texture2DUnsignedIntegerAlpha1TestES3, TextureRGB32UIImplicitAlpha1) +{ + if (IsIntel()) + { + std::cout << "Test disabled on Intel." << std::endl; + return; + } + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2D); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32UI, 1, 1, 0, GL_RGB_INTEGER, GL_UNSIGNED_INT, nullptr); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_ALPHA_EQ(0, 0, 255); +} + +// When sampling a texture without an alpha channel, "1" is returned as the alpha value. +// ES 3.0.4 table 3.24 +TEST_P(Texture2DIntegerAlpha1TestES3, TextureRGB32IImplicitAlpha1) +{ + if (IsIntel()) + { + std::cout << "Test disabled on Intel." << std::endl; + return; + } + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2D); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32I, 1, 1, 0, GL_RGB_INTEGER, GL_INT, nullptr); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_ALPHA_EQ(0, 0, 255); +} + +// When sampling a texture without an alpha channel, "1" is returned as the alpha value. +// ES 3.0.4 table 3.24 +TEST_P(Texture2DTestES3, TextureRGBSNORMImplicitAlpha1) +{ + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2D); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8_SNORM, 1, 1, 0, GL_RGB, GL_BYTE, nullptr); + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_ALPHA_EQ(0, 0, 255); +} + +// When sampling a texture without an alpha channel, "1" is returned as the alpha value. +// ES 3.0.4 table 3.24 +TEST_P(Texture2DTestES3, TextureRGB9E5ImplicitAlpha1) +{ + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2D); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB9_E5, 1, 1, 0, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV, + nullptr); + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_ALPHA_EQ(0, 0, 255); +} + +// When sampling a texture without an alpha channel, "1" is returned as the alpha value. +// ES 3.0.4 table 3.24 +TEST_P(Texture2DTestES3, TextureCOMPRESSEDRGB8ETC2ImplicitAlpha1) +{ + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2D); + glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB8_ETC2, 1, 1, 0, 8, nullptr); + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_ALPHA_EQ(0, 0, 255); +} + +// When sampling a texture without an alpha channel, "1" is returned as the alpha value. +// ES 3.0.4 table 3.24 +TEST_P(Texture2DTestES3, TextureCOMPRESSEDSRGB8ETC2ImplicitAlpha1) +{ + if (IsIntel() && IsLinux()) + { + // TODO(cwallez): Fix on Linux Intel drivers (http://anglebug.com/1346) + std::cout << "Test disabled on Linux Intel OpenGL." << std::endl; + return; + } + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2D); + glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_SRGB8_ETC2, 1, 1, 0, 8, nullptr); + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_ALPHA_EQ(0, 0, 255); +} + +// Use a sampler in a uniform struct. +TEST_P(SamplerInStructTest, SamplerInStruct) +{ + runSamplerInStructTest(); +} + +// Use a sampler in a uniform struct that's passed as a function parameter. +TEST_P(SamplerInStructAsFunctionParameterTest, SamplerInStructAsFunctionParameter) +{ + // TODO(ynovikov): re-enable once root cause of http://anglebug.com/1427 is fixed + if (IsAndroid() && IsAdreno() && IsOpenGLES()) + { + std::cout << "Test skipped on Adreno OpenGLES on Android." << std::endl; + return; + } + + if (IsWindows() && IsIntel() && IsOpenGL()) + { + std::cout << "Test skipped on Windows OpenGL on Intel." << std::endl; + return; + } + + runSamplerInStructTest(); +} + +// Use a sampler in a uniform struct array with a struct from the array passed as a function +// parameter. +TEST_P(SamplerInStructArrayAsFunctionParameterTest, SamplerInStructArrayAsFunctionParameter) +{ + if (IsIntel() && GetParam().getRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + std::cout << "Test skipped on Intel OpenGL." << std::endl; + return; + } + // TODO(ynovikov): re-enable once root cause of http://anglebug.com/1427 is fixed + if (IsAndroid() && IsAdreno() && IsOpenGLES()) + { + std::cout << "Test skipped on Adreno OpenGLES on Android." << std::endl; + return; + } + runSamplerInStructTest(); +} + +// Use a sampler in a struct inside a uniform struct with the nested struct passed as a function +// parameter. +TEST_P(SamplerInNestedStructAsFunctionParameterTest, SamplerInNestedStructAsFunctionParameter) +{ + if (IsIntel() && GetParam().getRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + std::cout << "Test skipped on Intel OpenGL." << std::endl; + return; + } + // TODO(ynovikov): re-enable once root cause of http://anglebug.com/1427 is fixed + if (IsAndroid() && IsAdreno() && IsOpenGLES()) + { + std::cout << "Test skipped on Adreno OpenGLES on Android." << std::endl; + return; + } + runSamplerInStructTest(); +} + +// Make sure that there isn't a name conflict between sampler extracted from a struct and a +// similarly named uniform. +TEST_P(SamplerInStructAndOtherVariableTest, SamplerInStructAndOtherVariable) +{ + runSamplerInStructTest(); +} + +class TextureLimitsTest : public ANGLETest +{ + protected: + struct RGBA8 + { + uint8_t R, G, B, A; + }; + + TextureLimitsTest() + : mProgram(0), mMaxVertexTextures(0), mMaxFragmentTextures(0), mMaxCombinedTextures(0) + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + ~TextureLimitsTest() + { + if (mProgram != 0) + { + glDeleteProgram(mProgram); + mProgram = 0; + + if (!mTextures.empty()) + { + glDeleteTextures(static_cast<GLsizei>(mTextures.size()), &mTextures[0]); + } + } + } + + void SetUp() override + { + ANGLETest::SetUp(); + + glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &mMaxVertexTextures); + glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &mMaxFragmentTextures); + glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &mMaxCombinedTextures); + + ASSERT_GL_NO_ERROR(); + } + + void compileProgramWithTextureCounts(const std::string &vertexPrefix, + GLint vertexTextureCount, + GLint vertexActiveTextureCount, + const std::string &fragPrefix, + GLint fragmentTextureCount, + GLint fragmentActiveTextureCount) + { + std::stringstream vertexShaderStr; + vertexShaderStr << "attribute vec2 position;\n" + << "varying vec4 color;\n" + << "varying vec2 texCoord;\n"; + + for (GLint textureIndex = 0; textureIndex < vertexTextureCount; ++textureIndex) + { + vertexShaderStr << "uniform sampler2D " << vertexPrefix << textureIndex << ";\n"; + } + + vertexShaderStr << "void main() {\n" + << " gl_Position = vec4(position, 0, 1);\n" + << " texCoord = (position * 0.5) + 0.5;\n" + << " color = vec4(0);\n"; + + for (GLint textureIndex = 0; textureIndex < vertexActiveTextureCount; ++textureIndex) + { + vertexShaderStr << " color += texture2D(" << vertexPrefix << textureIndex + << ", texCoord);\n"; + } + + vertexShaderStr << "}"; + + std::stringstream fragmentShaderStr; + fragmentShaderStr << "varying mediump vec4 color;\n" + << "varying mediump vec2 texCoord;\n"; + + for (GLint textureIndex = 0; textureIndex < fragmentTextureCount; ++textureIndex) + { + fragmentShaderStr << "uniform sampler2D " << fragPrefix << textureIndex << ";\n"; + } + + fragmentShaderStr << "void main() {\n" + << " gl_FragColor = color;\n"; + + for (GLint textureIndex = 0; textureIndex < fragmentActiveTextureCount; ++textureIndex) + { + fragmentShaderStr << " gl_FragColor += texture2D(" << fragPrefix << textureIndex + << ", texCoord);\n"; + } + + fragmentShaderStr << "}"; + + const std::string &vertexShaderSource = vertexShaderStr.str(); + const std::string &fragmentShaderSource = fragmentShaderStr.str(); + + mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource); + } + + RGBA8 getPixel(GLint texIndex) + { + RGBA8 pixel = {static_cast<uint8_t>(texIndex & 0x7u), static_cast<uint8_t>(texIndex >> 3), + 0, 255u}; + return pixel; + } + + void initTextures(GLint tex2DCount, GLint texCubeCount) + { + GLint totalCount = tex2DCount + texCubeCount; + mTextures.assign(totalCount, 0); + glGenTextures(totalCount, &mTextures[0]); + ASSERT_GL_NO_ERROR(); + + std::vector<RGBA8> texData(16 * 16); + + GLint texIndex = 0; + for (; texIndex < tex2DCount; ++texIndex) + { + texData.assign(texData.size(), getPixel(texIndex)); + glActiveTexture(GL_TEXTURE0 + texIndex); + glBindTexture(GL_TEXTURE_2D, mTextures[texIndex]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, + &texData[0]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + } + + ASSERT_GL_NO_ERROR(); + + for (; texIndex < texCubeCount; ++texIndex) + { + texData.assign(texData.size(), getPixel(texIndex)); + glActiveTexture(GL_TEXTURE0 + texIndex); + glBindTexture(GL_TEXTURE_CUBE_MAP, mTextures[texIndex]); + glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA, 16, 16, 0, GL_RGBA, + GL_UNSIGNED_BYTE, &texData[0]); + glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGBA, 16, 16, 0, GL_RGBA, + GL_UNSIGNED_BYTE, &texData[0]); + glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGBA, 16, 16, 0, GL_RGBA, + GL_UNSIGNED_BYTE, &texData[0]); + glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA, 16, 16, 0, GL_RGBA, + GL_UNSIGNED_BYTE, &texData[0]); + glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA, 16, 16, 0, GL_RGBA, + GL_UNSIGNED_BYTE, &texData[0]); + glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGBA, 16, 16, 0, GL_RGBA, + GL_UNSIGNED_BYTE, &texData[0]); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + } + + ASSERT_GL_NO_ERROR(); + } + + void testWithTextures(GLint vertexTextureCount, + const std::string &vertexTexturePrefix, + GLint fragmentTextureCount, + const std::string &fragmentTexturePrefix) + { + // Generate textures + initTextures(vertexTextureCount + fragmentTextureCount, 0); + + glUseProgram(mProgram); + RGBA8 expectedSum = {0}; + for (GLint texIndex = 0; texIndex < vertexTextureCount; ++texIndex) + { + std::stringstream uniformNameStr; + uniformNameStr << vertexTexturePrefix << texIndex; + const std::string &uniformName = uniformNameStr.str(); + GLint location = glGetUniformLocation(mProgram, uniformName.c_str()); + ASSERT_NE(-1, location); + + glUniform1i(location, texIndex); + RGBA8 contribution = getPixel(texIndex); + expectedSum.R += contribution.R; + expectedSum.G += contribution.G; + } + + for (GLint texIndex = 0; texIndex < fragmentTextureCount; ++texIndex) + { + std::stringstream uniformNameStr; + uniformNameStr << fragmentTexturePrefix << texIndex; + const std::string &uniformName = uniformNameStr.str(); + GLint location = glGetUniformLocation(mProgram, uniformName.c_str()); + ASSERT_NE(-1, location); + + glUniform1i(location, texIndex + vertexTextureCount); + RGBA8 contribution = getPixel(texIndex + vertexTextureCount); + expectedSum.R += contribution.R; + expectedSum.G += contribution.G; + } + + ASSERT_GE(256u, expectedSum.G); + + drawQuad(mProgram, "position", 0.5f); + ASSERT_GL_NO_ERROR(); + EXPECT_PIXEL_EQ(0, 0, expectedSum.R, expectedSum.G, 0, 255); + } + + GLuint mProgram; + std::vector<GLuint> mTextures; + GLint mMaxVertexTextures; + GLint mMaxFragmentTextures; + GLint mMaxCombinedTextures; +}; + +// Test rendering with the maximum vertex texture units. +TEST_P(TextureLimitsTest, MaxVertexTextures) +{ + // TODO(jmadill): Figure out why this fails on Intel. + if (IsIntel() && GetParam().getRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + std::cout << "Test skipped on Intel." << std::endl; + return; + } + + compileProgramWithTextureCounts("tex", mMaxVertexTextures, mMaxVertexTextures, "tex", 0, 0); + ASSERT_NE(0u, mProgram); + ASSERT_GL_NO_ERROR(); + + testWithTextures(mMaxVertexTextures, "tex", 0, "tex"); +} + +// Test rendering with the maximum fragment texture units. +TEST_P(TextureLimitsTest, MaxFragmentTextures) +{ + // TODO(jmadill): Figure out why this fails on Intel. + if (IsIntel() && GetParam().getRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + std::cout << "Test skipped on Intel." << std::endl; + return; + } + + compileProgramWithTextureCounts("tex", 0, 0, "tex", mMaxFragmentTextures, mMaxFragmentTextures); + ASSERT_NE(0u, mProgram); + ASSERT_GL_NO_ERROR(); + + testWithTextures(mMaxFragmentTextures, "tex", 0, "tex"); +} + +// Test rendering with maximum combined texture units. +TEST_P(TextureLimitsTest, MaxCombinedTextures) +{ + // TODO(jmadill): Investigate workaround. + if (IsIntel() && GetParam() == ES2_OPENGL()) + { + std::cout << "Test skipped on Intel." << std::endl; + return; + } + + GLint vertexTextures = mMaxVertexTextures; + + if (vertexTextures + mMaxFragmentTextures > mMaxCombinedTextures) + { + vertexTextures = mMaxCombinedTextures - mMaxFragmentTextures; + } + + compileProgramWithTextureCounts("vtex", vertexTextures, vertexTextures, "ftex", + mMaxFragmentTextures, mMaxFragmentTextures); + ASSERT_NE(0u, mProgram); + ASSERT_GL_NO_ERROR(); + + testWithTextures(vertexTextures, "vtex", mMaxFragmentTextures, "ftex"); +} + +// Negative test for exceeding the number of vertex textures +TEST_P(TextureLimitsTest, ExcessiveVertexTextures) +{ + compileProgramWithTextureCounts("tex", mMaxVertexTextures + 1, mMaxVertexTextures + 1, "tex", 0, + 0); + ASSERT_EQ(0u, mProgram); +} + +// Negative test for exceeding the number of fragment textures +TEST_P(TextureLimitsTest, ExcessiveFragmentTextures) +{ + compileProgramWithTextureCounts("tex", 0, 0, "tex", mMaxFragmentTextures + 1, + mMaxFragmentTextures + 1); + ASSERT_EQ(0u, mProgram); +} + +// Test active vertex textures under the limit, but excessive textures specified. +TEST_P(TextureLimitsTest, MaxActiveVertexTextures) +{ + // TODO(jmadill): Figure out why this fails on Intel. + if (IsIntel() && GetParam().getRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + std::cout << "Test skipped on Intel." << std::endl; + return; + } + + compileProgramWithTextureCounts("tex", mMaxVertexTextures + 4, mMaxVertexTextures, "tex", 0, 0); + ASSERT_NE(0u, mProgram); + ASSERT_GL_NO_ERROR(); + + testWithTextures(mMaxVertexTextures, "tex", 0, "tex"); +} + +// Test active fragment textures under the limit, but excessive textures specified. +TEST_P(TextureLimitsTest, MaxActiveFragmentTextures) +{ + // TODO(jmadill): Figure out why this fails on Intel. + if (IsIntel() && GetParam().getRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + std::cout << "Test skipped on Intel." << std::endl; + return; + } + + compileProgramWithTextureCounts("tex", 0, 0, "tex", mMaxFragmentTextures + 4, + mMaxFragmentTextures); + ASSERT_NE(0u, mProgram); + ASSERT_GL_NO_ERROR(); + + testWithTextures(0, "tex", mMaxFragmentTextures, "tex"); +} + +// Negative test for pointing two sampler uniforms of different types to the same texture. +// GLES 2.0.25 section 2.10.4 page 39. +TEST_P(TextureLimitsTest, TextureTypeConflict) +{ + const std::string &vertexShader = + "attribute vec2 position;\n" + "varying float color;\n" + "uniform sampler2D tex2D;\n" + "uniform samplerCube texCube;\n" + "void main() {\n" + " gl_Position = vec4(position, 0, 1);\n" + " vec2 texCoord = (position * 0.5) + 0.5;\n" + " color = texture2D(tex2D, texCoord).x;\n" + " color += textureCube(texCube, vec3(texCoord, 0)).x;\n" + "}"; + const std::string &fragmentShader = + "varying mediump float color;\n" + "void main() {\n" + " gl_FragColor = vec4(color, 0, 0, 1);\n" + "}"; + + mProgram = CompileProgram(vertexShader, fragmentShader); + ASSERT_NE(0u, mProgram); + + initTextures(1, 0); + + glUseProgram(mProgram); + GLint tex2DLocation = glGetUniformLocation(mProgram, "tex2D"); + ASSERT_NE(-1, tex2DLocation); + GLint texCubeLocation = glGetUniformLocation(mProgram, "texCube"); + ASSERT_NE(-1, texCubeLocation); + + glUniform1i(tex2DLocation, 0); + glUniform1i(texCubeLocation, 0); + ASSERT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); +} + +// Negative test for rendering with texture outside the valid range. +// TODO(jmadill): Possibly adjust the test according to the spec: +// GLES 3.0.4 section 2.12.7 mentions that specifying an out-of-range sampler uniform value +// generates an INVALID_VALUE error - GLES 2.0 doesn't yet have this mention. +TEST_P(TextureLimitsTest, DrawWithTexturePastMaximum) +{ + const std::string &vertexShader = + "attribute vec2 position;\n" + "varying float color;\n" + "uniform sampler2D tex2D;\n" + "void main() {\n" + " gl_Position = vec4(position, 0, 1);\n" + " vec2 texCoord = (position * 0.5) + 0.5;\n" + " color = texture2D(tex2D, texCoord).x;\n" + "}"; + const std::string &fragmentShader = + "varying mediump float color;\n" + "void main() {\n" + " gl_FragColor = vec4(color, 0, 0, 1);\n" + "}"; + + mProgram = CompileProgram(vertexShader, fragmentShader); + ASSERT_NE(0u, mProgram); + + glUseProgram(mProgram); + GLint tex2DLocation = glGetUniformLocation(mProgram, "tex2D"); + ASSERT_NE(-1, tex2DLocation); + + glUniform1i(tex2DLocation, mMaxCombinedTextures); + ASSERT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); +} + +class Texture2DNorm16TestES3 : public Texture2DTestES3 +{ + protected: + Texture2DNorm16TestES3() : Texture2DTestES3(), mTextures{0, 0, 0}, mFBO(0), mRenderbuffer(0) {} + + void SetUp() override + { + Texture2DTestES3::SetUp(); + + glActiveTexture(GL_TEXTURE0); + glGenTextures(3, mTextures); + glGenFramebuffers(1, &mFBO); + glGenRenderbuffers(1, &mRenderbuffer); + + for (size_t textureIndex = 0; textureIndex < 3; textureIndex++) + { + glBindTexture(GL_TEXTURE_2D, mTextures[textureIndex]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + } + + glBindTexture(GL_TEXTURE_2D, 0); + + ASSERT_GL_NO_ERROR(); + } + + void TearDown() override + { + glDeleteTextures(3, mTextures); + glDeleteFramebuffers(1, &mFBO); + glDeleteRenderbuffers(1, &mRenderbuffer); + + Texture2DTestES3::TearDown(); + } + + void testNorm16Texture(GLint internalformat, GLenum format, GLenum type) + { + GLushort pixelValue = (type == GL_SHORT) ? 0x7FFF : 0x6A35; + GLushort imageData[] = {pixelValue, pixelValue, pixelValue, pixelValue}; + + setUpProgram(); + + glBindFramebuffer(GL_FRAMEBUFFER, mFBO); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[0], + 0); + + glBindTexture(GL_TEXTURE_2D, mTextures[0]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16_EXT, 1, 1, 0, GL_RGBA, GL_UNSIGNED_SHORT, nullptr); + + glBindTexture(GL_TEXTURE_2D, mTextures[1]); + glTexImage2D(GL_TEXTURE_2D, 0, internalformat, 1, 1, 0, format, type, imageData); + + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + GLubyte expectedValue = (type == GL_SHORT) ? 0xFF : static_cast<GLubyte>(pixelValue >> 8); + + EXPECT_PIXEL_COLOR_EQ( + 0, 0, SliceFormatColor( + format, GLColor(expectedValue, expectedValue, expectedValue, expectedValue))); + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + ASSERT_GL_NO_ERROR(); + } + + void testNorm16Render(GLint internalformat, GLenum format, GLenum type) + { + GLushort pixelValue = 0x6A35; + GLushort imageData[] = {pixelValue, pixelValue, pixelValue, pixelValue}; + + setUpProgram(); + + glBindTexture(GL_TEXTURE_2D, mTextures[1]); + glTexImage2D(GL_TEXTURE_2D, 0, internalformat, 1, 1, 0, format, type, nullptr); + + glBindFramebuffer(GL_FRAMEBUFFER, mFBO); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[1], + 0); + + glBindTexture(GL_TEXTURE_2D, mTextures[2]); + glTexImage2D(GL_TEXTURE_2D, 0, internalformat, 1, 1, 0, format, type, imageData); + + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + GLubyte expectedValue = static_cast<GLubyte>(pixelValue >> 8); + EXPECT_PIXEL_COLOR_EQ( + 0, 0, SliceFormatColor( + format, GLColor(expectedValue, expectedValue, expectedValue, expectedValue))); + + glBindRenderbuffer(GL_RENDERBUFFER, mRenderbuffer); + glRenderbufferStorage(GL_RENDERBUFFER, internalformat, 1, 1); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, + mRenderbuffer); + glBindRenderbuffer(GL_RENDERBUFFER, 0); + EXPECT_GL_NO_ERROR(); + + glClearColor(1.0f, 1.0f, 1.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1); + + EXPECT_PIXEL_COLOR_EQ(0, 0, SliceFormatColor(format, GLColor::white)); + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + ASSERT_GL_NO_ERROR(); + } + + GLuint mTextures[3]; + GLuint mFBO; + GLuint mRenderbuffer; +}; + +// Test texture formats enabled by the GL_EXT_texture_norm16 extension. +TEST_P(Texture2DNorm16TestES3, TextureNorm16Test) +{ + if (!extensionEnabled("GL_EXT_texture_norm16")) + { + std::cout << "Test skipped due to missing GL_EXT_texture_norm16." << std::endl; + return; + } + + testNorm16Texture(GL_R16_EXT, GL_RED, GL_UNSIGNED_SHORT); + testNorm16Texture(GL_RG16_EXT, GL_RG, GL_UNSIGNED_SHORT); + testNorm16Texture(GL_RGB16_EXT, GL_RGB, GL_UNSIGNED_SHORT); + testNorm16Texture(GL_RGBA16_EXT, GL_RGBA, GL_UNSIGNED_SHORT); + testNorm16Texture(GL_R16_SNORM_EXT, GL_RED, GL_SHORT); + testNorm16Texture(GL_RG16_SNORM_EXT, GL_RG, GL_SHORT); + testNorm16Texture(GL_RGB16_SNORM_EXT, GL_RGB, GL_SHORT); + testNorm16Texture(GL_RGBA16_SNORM_EXT, GL_RGBA, GL_SHORT); + + testNorm16Render(GL_R16_EXT, GL_RED, GL_UNSIGNED_SHORT); + testNorm16Render(GL_RG16_EXT, GL_RG, GL_UNSIGNED_SHORT); + testNorm16Render(GL_RGBA16_EXT, GL_RGBA, GL_UNSIGNED_SHORT); +} + +// Test that UNPACK_SKIP_IMAGES doesn't have an effect on 2D texture uploads. +// GLES 3.0.4 section 3.8.3. +TEST_P(Texture2DTestES3, UnpackSkipImages2D) +{ + if (IsIntel() && IsDesktopOpenGL()) + { + std::cout << "Test skipped on Intel OpenGL." << std::endl; + return; + } + // TODO(ynovikov): re-enable once root cause of http://anglebug.com/1429 is fixed + if (IsAndroid() && IsAdreno() && IsOpenGLES()) + { + std::cout << "Test skipped on Adreno OpenGLES on Android." << std::endl; + return; + } + + glBindTexture(GL_TEXTURE_2D, mTexture2D); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + ASSERT_GL_NO_ERROR(); + + // SKIP_IMAGES should not have an effect on uploading 2D textures + glPixelStorei(GL_UNPACK_SKIP_IMAGES, 1000); + ASSERT_GL_NO_ERROR(); + + std::vector<GLColor> pixelsGreen(128u * 128u, GLColor::green); + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 128, 128, 0, GL_RGBA, GL_UNSIGNED_BYTE, + pixelsGreen.data()); + ASSERT_GL_NO_ERROR(); + + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 128, 128, GL_RGBA, GL_UNSIGNED_BYTE, + pixelsGreen.data()); + ASSERT_GL_NO_ERROR(); + + glUseProgram(mProgram); + drawQuad(mProgram, "position", 0.5f); + ASSERT_GL_NO_ERROR(); + + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); +} + +// Test that skip defined in unpack parameters is taken into account when determining whether +// unpacking source extends outside unpack buffer bounds. +TEST_P(Texture2DTestES3, UnpackSkipPixelsOutOfBounds) +{ + glBindTexture(GL_TEXTURE_2D, mTexture2D); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + ASSERT_GL_NO_ERROR(); + + GLBuffer buf; + glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buf.get()); + std::vector<GLColor> pixelsGreen(128u * 128u, GLColor::green); + glBufferData(GL_PIXEL_UNPACK_BUFFER, pixelsGreen.size() * 4u, pixelsGreen.data(), + GL_DYNAMIC_COPY); + ASSERT_GL_NO_ERROR(); + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 128, 128, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + ASSERT_GL_NO_ERROR(); + + glPixelStorei(GL_UNPACK_SKIP_PIXELS, 1); + ASSERT_GL_NO_ERROR(); + + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 128, 128, GL_RGBA, GL_UNSIGNED_BYTE, 0); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); + glPixelStorei(GL_UNPACK_SKIP_ROWS, 1); + ASSERT_GL_NO_ERROR(); + + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 128, 128, GL_RGBA, GL_UNSIGNED_BYTE, 0); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); +} + +// Test that unpacking rows that overlap in a pixel unpack buffer works as expected. +TEST_P(Texture2DTestES3, UnpackOverlappingRowsFromUnpackBuffer) +{ + if (IsD3D11()) + { + std::cout << "Test skipped on D3D." << std::endl; + return; + } + if (IsOSX() && IsAMD()) + { + // Incorrect rendering results seen on OSX AMD. + std::cout << "Test skipped on OSX AMD." << std::endl; + return; + } + + const GLuint width = 8u; + const GLuint height = 8u; + const GLuint unpackRowLength = 5u; + const GLuint unpackSkipPixels = 1u; + + setWindowWidth(width); + setWindowHeight(height); + + glBindTexture(GL_TEXTURE_2D, mTexture2D); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + ASSERT_GL_NO_ERROR(); + + GLBuffer buf; + glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buf.get()); + std::vector<GLColor> pixelsGreen((height - 1u) * unpackRowLength + width + unpackSkipPixels, + GLColor::green); + + for (GLuint skippedPixel = 0u; skippedPixel < unpackSkipPixels; ++skippedPixel) + { + pixelsGreen[skippedPixel] = GLColor(255, 0, 0, 255); + } + + glBufferData(GL_PIXEL_UNPACK_BUFFER, pixelsGreen.size() * 4u, pixelsGreen.data(), + GL_DYNAMIC_COPY); + ASSERT_GL_NO_ERROR(); + + glPixelStorei(GL_UNPACK_ROW_LENGTH, unpackRowLength); + glPixelStorei(GL_UNPACK_SKIP_PIXELS, unpackSkipPixels); + ASSERT_GL_NO_ERROR(); + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + ASSERT_GL_NO_ERROR(); + + glUseProgram(mProgram); + drawQuad(mProgram, "position", 0.5f); + ASSERT_GL_NO_ERROR(); + + GLuint windowPixelCount = getWindowWidth() * getWindowHeight(); + std::vector<GLColor> actual(windowPixelCount, GLColor::black); + glReadPixels(0, 0, getWindowWidth(), getWindowHeight(), GL_RGBA, GL_UNSIGNED_BYTE, + actual.data()); + std::vector<GLColor> expected(windowPixelCount, GLColor::green); + EXPECT_EQ(expected, actual); +} + +template <typename T> +T UNorm(double value) +{ + return static_cast<T>(value * static_cast<double>(std::numeric_limits<T>::max())); +} + +// Test rendering a depth texture with mipmaps. +TEST_P(Texture2DTestES3, DepthTexturesWithMipmaps) +{ + //TODO(cwallez) this is failing on Intel Win7 OpenGL + if (IsIntel() && IsWindows() && IsOpenGL()) + { + std::cout << "Test skipped on Intel OpenGL." << std::endl; + return; + } + + const int size = getWindowWidth(); + + auto dim = [size](int level) { return size >> level; }; + int levels = gl::log2(size); + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture2D); + glTexStorage2D(GL_TEXTURE_2D, levels, GL_DEPTH_COMPONENT24, size, size); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + ASSERT_GL_NO_ERROR(); + + glUseProgram(mProgram); + glUniform1i(mTexture2DUniformLocation, 0); + + std::vector<unsigned char> expected; + + for (int level = 0; level < levels; ++level) + { + double value = (static_cast<double>(level) / static_cast<double>(levels - 1)); + expected.push_back(UNorm<unsigned char>(value)); + + int levelDim = dim(level); + + ASSERT_GT(levelDim, 0); + + std::vector<unsigned int> initData(levelDim * levelDim, UNorm<unsigned int>(value)); + glTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, levelDim, levelDim, GL_DEPTH_COMPONENT, + GL_UNSIGNED_INT, initData.data()); + } + ASSERT_GL_NO_ERROR(); + + for (int level = 0; level < levels; ++level) + { + glViewport(0, 0, dim(level), dim(level)); + drawQuad(mProgram, "position", 0.5f); + GLColor actual = ReadColor(0, 0); + EXPECT_NEAR(expected[level], actual.R, 10u); + } + + ASSERT_GL_NO_ERROR(); +} + +// Tests unpacking into the unsized GL_ALPHA format. +TEST_P(Texture2DTestES3, UnsizedAlphaUnpackBuffer) +{ + // TODO(jmadill): Figure out why this fails on OSX. + ANGLE_SKIP_TEST_IF(IsOSX()); + + // Initialize the texure. + glBindTexture(GL_TEXTURE_2D, mTexture2D); + glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, getWindowWidth(), getWindowHeight(), 0, GL_ALPHA, + GL_UNSIGNED_BYTE, nullptr); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + std::vector<GLubyte> bufferData(getWindowWidth() * getWindowHeight(), 127); + + // Pull in the color data from the unpack buffer. + GLBuffer unpackBuffer; + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + glBindBuffer(GL_PIXEL_UNPACK_BUFFER, unpackBuffer.get()); + glBufferData(GL_PIXEL_UNPACK_BUFFER, getWindowWidth() * getWindowHeight(), bufferData.data(), + GL_STATIC_DRAW); + + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, getWindowWidth(), getWindowHeight(), GL_ALPHA, + GL_UNSIGNED_BYTE, nullptr); + + // Clear to a weird color to make sure we're drawing something. + glClearColor(0.5f, 0.8f, 1.0f, 0.2f); + glClear(GL_COLOR_BUFFER_BIT); + + // Draw with the alpha texture and verify. + drawQuad(mProgram, "position", 0.5f); + + ASSERT_GL_NO_ERROR(); + EXPECT_PIXEL_NEAR(0, 0, 0, 0, 0, 127, 1); +} + +// Ensure stale unpack data doesn't propagate in D3D11. +TEST_P(Texture2DTestES3, StaleUnpackData) +{ + // Init unpack buffer. + GLsizei pixelCount = getWindowWidth() * getWindowHeight() / 2; + std::vector<GLColor> pixels(pixelCount, GLColor::red); + + GLBuffer unpackBuffer; + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + glBindBuffer(GL_PIXEL_UNPACK_BUFFER, unpackBuffer.get()); + GLsizei bufferSize = pixelCount * sizeof(GLColor); + glBufferData(GL_PIXEL_UNPACK_BUFFER, bufferSize, pixels.data(), GL_STATIC_DRAW); + + // Create from unpack buffer. + glBindTexture(GL_TEXTURE_2D, mTexture2D); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, getWindowWidth() / 2, getWindowHeight() / 2, 0, + GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + drawQuad(mProgram, "position", 0.5f); + + ASSERT_GL_NO_ERROR(); + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red); + + // Fill unpack with green, recreating buffer. + pixels.assign(getWindowWidth() * getWindowHeight(), GLColor::green); + GLsizei size2 = getWindowWidth() * getWindowHeight() * sizeof(GLColor); + glBufferData(GL_PIXEL_UNPACK_BUFFER, size2, pixels.data(), GL_STATIC_DRAW); + + // Reinit texture with green. + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, getWindowWidth() / 2, getWindowHeight() / 2, GL_RGBA, + GL_UNSIGNED_BYTE, nullptr); + + drawQuad(mProgram, "position", 0.5f); + + ASSERT_GL_NO_ERROR(); + EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); +} + +// This test covers a D3D format redefinition bug for 3D textures. The base level format was not +// being properly checked, and the texture storage of the previous texture format was persisting. +// This would result in an ASSERT in debug and incorrect rendering in release. +// See http://anglebug.com/1609 and WebGL 2 test conformance2/misc/views-with-offsets.html. +TEST_P(Texture3DTestES3, FormatRedefinitionBug) +{ + GLTexture tex; + glBindTexture(GL_TEXTURE_3D, tex.get()); + glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + + GLFramebuffer framebuffer; + glBindFramebuffer(GL_FRAMEBUFFER, framebuffer.get()); + glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex.get(), 0, 0); + + glCheckFramebufferStatus(GL_FRAMEBUFFER); + + std::vector<uint8_t> pixelData(100, 0); + + glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB565, 1, 1, 1, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, nullptr); + glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 1, 1, 1, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, + pixelData.data()); + + ASSERT_GL_NO_ERROR(); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +// TODO(oetuaho): Enable all below tests on OpenGL. Requires a fix for ANGLE bug 1278. +ANGLE_INSTANTIATE_TEST(Texture2DTest, + ES2_D3D9(), + ES2_D3D11(), + ES2_D3D11_FL9_3(), + ES2_OPENGL(), + ES2_OPENGLES()); +ANGLE_INSTANTIATE_TEST(TextureCubeTest, + ES2_D3D9(), + ES2_D3D11(), + ES2_D3D11_FL9_3(), + ES2_OPENGL(), + ES2_OPENGLES()); +ANGLE_INSTANTIATE_TEST(Texture2DTestWithDrawScale, + ES2_D3D9(), + ES2_D3D11(), + ES2_D3D11_FL9_3(), + ES2_OPENGL(), + ES2_OPENGLES()); +ANGLE_INSTANTIATE_TEST(Sampler2DAsFunctionParameterTest, + ES2_D3D9(), + ES2_D3D11(), + ES2_D3D11_FL9_3(), + ES2_OPENGL(), + ES2_OPENGLES()); +ANGLE_INSTANTIATE_TEST(SamplerArrayTest, + ES2_D3D9(), + ES2_D3D11(), + ES2_D3D11_FL9_3(), + ES2_OPENGL(), + ES2_OPENGLES()); +ANGLE_INSTANTIATE_TEST(SamplerArrayAsFunctionParameterTest, + ES2_D3D9(), + ES2_D3D11(), + ES2_D3D11_FL9_3(), + ES2_OPENGL(), + ES2_OPENGLES()); +ANGLE_INSTANTIATE_TEST(Texture2DTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); +ANGLE_INSTANTIATE_TEST(Texture3DTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); +ANGLE_INSTANTIATE_TEST(Texture2DIntegerAlpha1TestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); +ANGLE_INSTANTIATE_TEST(Texture2DUnsignedIntegerAlpha1TestES3, + ES3_D3D11(), + ES3_OPENGL(), + ES3_OPENGLES()); +ANGLE_INSTANTIATE_TEST(ShadowSamplerPlusSampler3DTestES3, + ES3_D3D11(), + ES3_OPENGL(), + ES3_OPENGLES()); +ANGLE_INSTANTIATE_TEST(SamplerTypeMixTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); +ANGLE_INSTANTIATE_TEST(Texture2DArrayTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); +ANGLE_INSTANTIATE_TEST(TextureSizeTextureArrayTest, ES3_D3D11(), ES3_OPENGL()); +ANGLE_INSTANTIATE_TEST(SamplerInStructTest, + ES2_D3D11(), + ES2_D3D11_FL9_3(), + ES2_D3D9(), + ES2_OPENGL(), + ES2_OPENGLES()); +ANGLE_INSTANTIATE_TEST(SamplerInStructAsFunctionParameterTest, + ES2_D3D11(), + ES2_D3D11_FL9_3(), + ES2_D3D9(), + ES2_OPENGL(), + ES2_OPENGLES()); +ANGLE_INSTANTIATE_TEST(SamplerInStructArrayAsFunctionParameterTest, + ES2_D3D11(), + ES2_D3D11_FL9_3(), + ES2_D3D9(), + ES2_OPENGL(), + ES2_OPENGLES()); +ANGLE_INSTANTIATE_TEST(SamplerInNestedStructAsFunctionParameterTest, + ES2_D3D11(), + ES2_D3D11_FL9_3(), + ES2_D3D9(), + ES2_OPENGL(), + ES2_OPENGLES()); +ANGLE_INSTANTIATE_TEST(SamplerInStructAndOtherVariableTest, + ES2_D3D11(), + ES2_D3D11_FL9_3(), + ES2_D3D9(), + ES2_OPENGL(), + ES2_OPENGLES()); +ANGLE_INSTANTIATE_TEST(TextureLimitsTest, ES2_D3D11(), ES2_OPENGL(), ES2_OPENGLES()); +ANGLE_INSTANTIATE_TEST(Texture2DNorm16TestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); + +} // anonymous namespace diff --git a/gfx/angle/src/tests/gl_tests/TimerQueriesTest.cpp b/gfx/angle/src/tests/gl_tests/TimerQueriesTest.cpp new file mode 100755 index 000000000..8f3725ec0 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/TimerQueriesTest.cpp @@ -0,0 +1,590 @@ +// +// Copyright 2016 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// TimerQueriesTest.cpp +// Various tests for EXT_disjoint_timer_query functionality and validation +// + +#include "system_utils.h" +#include "test_utils/ANGLETest.h" +#include "random_utils.h" + +using namespace angle; + +class TimerQueriesTest : public ANGLETest +{ + protected: + TimerQueriesTest() : mProgram(0), mProgramCostly(0) + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + setConfigDepthBits(24); + } + + virtual void SetUp() + { + ANGLETest::SetUp(); + + const std::string passthroughVS = + "attribute highp vec4 position; void main(void)\n" + "{\n" + " gl_Position = position;\n" + "}\n"; + + const std::string passthroughPS = + "precision highp float; void main(void)\n" + "{\n" + " gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);\n" + "}\n"; + + const std::string costlyVS = + "attribute highp vec4 position; varying highp vec4 testPos; void main(void)\n" + "{\n" + " testPos = position;\n" + " gl_Position = position;\n" + "}\n"; + + const std::string costlyPS = + "precision highp float; varying highp vec4 testPos; void main(void)\n" + "{\n" + " vec4 test = testPos;\n" + " for (int i = 0; i < 500; i++)\n" + " {\n" + " test = sqrt(test);\n" + " }\n" + " gl_FragColor = test;\n" + "}\n"; + + mProgram = CompileProgram(passthroughVS, passthroughPS); + ASSERT_NE(0u, mProgram) << "shader compilation failed."; + + mProgramCostly = CompileProgram(costlyVS, costlyPS); + ASSERT_NE(0u, mProgramCostly) << "shader compilation failed."; + } + + virtual void TearDown() + { + glDeleteProgram(mProgram); + glDeleteProgram(mProgramCostly); + ANGLETest::TearDown(); + } + + GLuint mProgram; + GLuint mProgramCostly; +}; + +// Test that all proc addresses are loadable +TEST_P(TimerQueriesTest, ProcAddresses) +{ + if (!extensionEnabled("GL_EXT_disjoint_timer_query")) + { + std::cout << "Test skipped because GL_EXT_disjoint_timer_query is not available." + << std::endl; + return; + } + + ASSERT_NE(nullptr, eglGetProcAddress("glGenQueriesEXT")); + ASSERT_NE(nullptr, eglGetProcAddress("glDeleteQueriesEXT")); + ASSERT_NE(nullptr, eglGetProcAddress("glIsQueryEXT")); + ASSERT_NE(nullptr, eglGetProcAddress("glBeginQueryEXT")); + ASSERT_NE(nullptr, eglGetProcAddress("glEndQueryEXT")); + ASSERT_NE(nullptr, eglGetProcAddress("glQueryCounterEXT")); + ASSERT_NE(nullptr, eglGetProcAddress("glGetQueryivEXT")); + ASSERT_NE(nullptr, eglGetProcAddress("glGetQueryObjectivEXT")); + ASSERT_NE(nullptr, eglGetProcAddress("glGetQueryObjectuivEXT")); + ASSERT_NE(nullptr, eglGetProcAddress("glGetQueryObjecti64vEXT")); + ASSERT_NE(nullptr, eglGetProcAddress("glGetQueryObjectui64vEXT")); +} + +// Tests the time elapsed query +TEST_P(TimerQueriesTest, TimeElapsed) +{ + if (!extensionEnabled("GL_EXT_disjoint_timer_query")) + { + std::cout << "Test skipped because GL_EXT_disjoint_timer_query is not available." + << std::endl; + return; + } + + GLint queryTimeElapsedBits = 0; + glGetQueryivEXT(GL_TIME_ELAPSED_EXT, GL_QUERY_COUNTER_BITS_EXT, &queryTimeElapsedBits); + ASSERT_GL_NO_ERROR(); + + std::cout << "Time elapsed counter bits: " << queryTimeElapsedBits << std::endl; + + // Skip test if the number of bits is 0 + if (queryTimeElapsedBits == 0) + { + std::cout << "Test skipped because of 0 counter bits" << std::endl; + return; + } + + glDepthMask(GL_TRUE); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + GLuint query1 = 0; + GLuint query2 = 0; + glGenQueriesEXT(1, &query1); + glGenQueriesEXT(1, &query2); + + // Test time elapsed for a single quad + glBeginQueryEXT(GL_TIME_ELAPSED_EXT, query1); + drawQuad(mProgram, "position", 0.8f); + glEndQueryEXT(GL_TIME_ELAPSED_EXT); + ASSERT_GL_NO_ERROR(); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + // Test time elapsed for costly quad + glBeginQueryEXT(GL_TIME_ELAPSED_EXT, query2); + drawQuad(mProgramCostly, "position", 0.8f); + glEndQueryEXT(GL_TIME_ELAPSED_EXT); + ASSERT_GL_NO_ERROR(); + + swapBuffers(); + + int timeout = 200000; + GLuint ready = GL_FALSE; + while (ready == GL_FALSE && timeout > 0) + { + angle::Sleep(0); + glGetQueryObjectuivEXT(query1, GL_QUERY_RESULT_AVAILABLE_EXT, &ready); + timeout--; + } + ready = GL_FALSE; + while (ready == GL_FALSE && timeout > 0) + { + angle::Sleep(0); + glGetQueryObjectuivEXT(query2, GL_QUERY_RESULT_AVAILABLE_EXT, &ready); + timeout--; + } + ASSERT_LT(0, timeout) << "Query result available timed out" << std::endl; + + GLuint64 result1 = 0; + GLuint64 result2 = 0; + glGetQueryObjectui64vEXT(query1, GL_QUERY_RESULT_EXT, &result1); + glGetQueryObjectui64vEXT(query2, GL_QUERY_RESULT_EXT, &result2); + ASSERT_GL_NO_ERROR(); + + glDeleteQueriesEXT(1, &query1); + glDeleteQueriesEXT(1, &query2); + ASSERT_GL_NO_ERROR(); + + std::cout << "Elapsed time: " << result1 << " cheap quad" << std::endl; + std::cout << "Elapsed time: " << result2 << " costly quad" << std::endl; + + // The time elapsed should be nonzero + EXPECT_LT(0ul, result1); + EXPECT_LT(0ul, result2); + + // The costly quad should take longer than the cheap quad + EXPECT_LT(result1, result2); +} + +// Tests time elapsed for a non draw call (texture upload) +TEST_P(TimerQueriesTest, TimeElapsedTextureTest) +{ + // OSX drivers don't seem to properly time non-draw calls so we skip the test on Mac + if (IsOSX()) + { + std::cout << "Test skipped on OSX" << std::endl; + return; + } + + if (!extensionEnabled("GL_EXT_disjoint_timer_query")) + { + std::cout << "Test skipped because GL_EXT_disjoint_timer_query is not available." + << std::endl; + return; + } + + GLint queryTimeElapsedBits = 0; + glGetQueryivEXT(GL_TIME_ELAPSED_EXT, GL_QUERY_COUNTER_BITS_EXT, &queryTimeElapsedBits); + ASSERT_GL_NO_ERROR(); + + std::cout << "Time elapsed counter bits: " << queryTimeElapsedBits << std::endl; + + // Skip test if the number of bits is 0 + if (queryTimeElapsedBits == 0) + { + std::cout << "Test skipped because of 0 counter bits" << std::endl; + return; + } + + GLubyte pixels[] = {0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 0, 0}; + + // Query and texture initialization + GLuint texture; + GLuint query = 0; + glGenQueriesEXT(1, &query); + glGenTextures(1, &texture); + + // Upload a texture inside the query + glBeginQueryEXT(GL_TIME_ELAPSED_EXT, query); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + glBindTexture(GL_TEXTURE_2D, texture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, pixels); + glGenerateMipmap(GL_TEXTURE_2D); + glFinish(); + glEndQueryEXT(GL_TIME_ELAPSED_EXT); + ASSERT_GL_NO_ERROR(); + + int timeout = 200000; + GLuint ready = GL_FALSE; + while (ready == GL_FALSE && timeout > 0) + { + angle::Sleep(0); + glGetQueryObjectuivEXT(query, GL_QUERY_RESULT_AVAILABLE_EXT, &ready); + timeout--; + } + ASSERT_LT(0, timeout) << "Query result available timed out" << std::endl; + + GLuint64 result = 0; + glGetQueryObjectui64vEXT(query, GL_QUERY_RESULT_EXT, &result); + ASSERT_GL_NO_ERROR(); + + glDeleteTextures(1, &texture); + glDeleteQueriesEXT(1, &query); + + std::cout << "Elapsed time: " << result << std::endl; + EXPECT_LT(0ul, result); +} + +// Tests validation of query functions with respect to elapsed time query +TEST_P(TimerQueriesTest, TimeElapsedValidationTest) +{ + if (!extensionEnabled("GL_EXT_disjoint_timer_query")) + { + std::cout << "Test skipped because GL_EXT_disjoint_timer_query is not available." + << std::endl; + return; + } + + GLint queryTimeElapsedBits = 0; + glGetQueryivEXT(GL_TIME_ELAPSED_EXT, GL_QUERY_COUNTER_BITS_EXT, &queryTimeElapsedBits); + ASSERT_GL_NO_ERROR(); + + std::cout << "Time elapsed counter bits: " << queryTimeElapsedBits << std::endl; + + // Skip test if the number of bits is 0 + if (queryTimeElapsedBits == 0) + { + std::cout << "Test skipped because of 0 counter bits" << std::endl; + return; + } + + GLuint query = 0; + glGenQueriesEXT(-1, &query); + EXPECT_GL_ERROR(GL_INVALID_VALUE); + + glGenQueriesEXT(1, &query); + EXPECT_GL_NO_ERROR(); + + glBeginQueryEXT(GL_TIMESTAMP_EXT, query); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + glBeginQueryEXT(GL_TIME_ELAPSED_EXT, 0); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + glEndQueryEXT(GL_TIME_ELAPSED_EXT); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + glBeginQueryEXT(GL_TIME_ELAPSED_EXT, query); + EXPECT_GL_NO_ERROR(); + + glBeginQueryEXT(GL_TIME_ELAPSED_EXT, query); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + glEndQueryEXT(GL_TIME_ELAPSED_EXT); + EXPECT_GL_NO_ERROR(); + + glEndQueryEXT(GL_TIME_ELAPSED_EXT); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); +} + +// Tests timer queries operating under multiple EGL contexts with mid-query switching +TEST_P(TimerQueriesTest, TimeElapsedMulticontextTest) +{ + if (IsAMD() && IsOpenGL() && IsWindows() && IsDebug()) + { + // TODO(jmadill): Figure out why this test is flaky on Win/AMD/OpenGL/Debug. + std::cout << "Test skipped on Windows AMD OpenGL Debug." << std::endl; + return; + } + + if (!extensionEnabled("GL_EXT_disjoint_timer_query")) + { + std::cout << "Test skipped because GL_EXT_disjoint_timer_query is not available." + << std::endl; + return; + } + + GLint queryTimeElapsedBits = 0; + glGetQueryivEXT(GL_TIME_ELAPSED_EXT, GL_QUERY_COUNTER_BITS_EXT, &queryTimeElapsedBits); + ASSERT_GL_NO_ERROR(); + + std::cout << "Time elapsed counter bits: " << queryTimeElapsedBits << std::endl; + + // Skip test if the number of bits is 0 + if (queryTimeElapsedBits == 0) + { + std::cout << "Test skipped because of 0 counter bits" << std::endl; + return; + } + + // Without a glClear, the first draw call on GL takes a huge amount of time when run after the + // D3D test on certain NVIDIA drivers + glDepthMask(GL_TRUE); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + EGLint contextAttributes[] = { + EGL_CONTEXT_MAJOR_VERSION_KHR, + GetParam().majorVersion, + EGL_CONTEXT_MINOR_VERSION_KHR, + GetParam().minorVersion, + EGL_NONE, + }; + + EGLWindow *window = getEGLWindow(); + + EGLDisplay display = window->getDisplay(); + EGLConfig config = window->getConfig(); + EGLSurface surface = window->getSurface(); + + struct ContextInfo + { + EGLContext context; + GLuint program; + GLuint query; + EGLDisplay display; + + ContextInfo() : context(EGL_NO_CONTEXT), program(0), query(0), display(EGL_NO_DISPLAY) {} + + ~ContextInfo() + { + if (context != EGL_NO_CONTEXT && display != EGL_NO_DISPLAY) + { + eglDestroyContext(display, context); + } + } + }; + ContextInfo contexts[2]; + + // Shaders + const std::string cheapVS = + "attribute highp vec4 position; void main(void)\n" + "{\n" + " gl_Position = position;\n" + "}\n"; + + const std::string cheapPS = + "precision highp float; void main(void)\n" + "{\n" + " gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);\n" + "}\n"; + + const std::string costlyVS = + "attribute highp vec4 position; varying highp vec4 testPos; void main(void)\n" + "{\n" + " testPos = position;\n" + " gl_Position = position;\n" + "}\n"; + + const std::string costlyPS = + "precision highp float; varying highp vec4 testPos; void main(void)\n" + "{\n" + " vec4 test = testPos;\n" + " for (int i = 0; i < 500; i++)\n" + " {\n" + " test = sqrt(test);\n" + " }\n" + " gl_FragColor = test;\n" + "}\n"; + + // Setup the first context with a cheap shader + contexts[0].context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttributes); + contexts[0].display = display; + ASSERT_NE(contexts[0].context, EGL_NO_CONTEXT); + eglMakeCurrent(display, surface, surface, contexts[0].context); + contexts[0].program = CompileProgram(cheapVS, cheapPS); + glGenQueriesEXT(1, &contexts[0].query); + ASSERT_GL_NO_ERROR(); + + // Setup the second context with an expensive shader + contexts[1].context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttributes); + contexts[1].display = display; + ASSERT_NE(contexts[1].context, EGL_NO_CONTEXT); + eglMakeCurrent(display, surface, surface, contexts[1].context); + contexts[1].program = CompileProgram(costlyVS, costlyPS); + glGenQueriesEXT(1, &contexts[1].query); + ASSERT_GL_NO_ERROR(); + + // Start the query and draw a quad on the first context without ending the query + eglMakeCurrent(display, surface, surface, contexts[0].context); + glBeginQueryEXT(GL_TIME_ELAPSED_EXT, contexts[0].query); + drawQuad(contexts[0].program, "position", 0.8f); + ASSERT_GL_NO_ERROR(); + + // Switch contexts, draw the expensive quad and end its query + eglMakeCurrent(display, surface, surface, contexts[1].context); + glBeginQueryEXT(GL_TIME_ELAPSED_EXT, contexts[1].query); + drawQuad(contexts[1].program, "position", 0.8f); + glEndQueryEXT(GL_TIME_ELAPSED_EXT); + ASSERT_GL_NO_ERROR(); + + // Go back to the first context, end its query, and get the result + eglMakeCurrent(display, surface, surface, contexts[0].context); + glEndQueryEXT(GL_TIME_ELAPSED_EXT); + + GLuint64 result1 = 0; + GLuint64 result2 = 0; + glGetQueryObjectui64vEXT(contexts[0].query, GL_QUERY_RESULT_EXT, &result1); + glDeleteQueriesEXT(1, &contexts[0].query); + glDeleteProgram(contexts[0].program); + ASSERT_GL_NO_ERROR(); + + // Get the 2nd context's results + eglMakeCurrent(display, surface, surface, contexts[1].context); + glGetQueryObjectui64vEXT(contexts[1].query, GL_QUERY_RESULT_EXT, &result2); + glDeleteQueriesEXT(1, &contexts[1].query); + glDeleteProgram(contexts[1].program); + ASSERT_GL_NO_ERROR(); + + // Switch back to main context + eglMakeCurrent(display, surface, surface, window->getContext()); + + // Compare the results. The cheap quad should be smaller than the expensive one if + // virtualization is working correctly + std::cout << "Elapsed time: " << result1 << " cheap quad" << std::endl; + std::cout << "Elapsed time: " << result2 << " costly quad" << std::endl; + EXPECT_LT(0ul, result1); + EXPECT_LT(0ul, result2); + EXPECT_LT(result1, result2); +} + +// Tests GPU timestamp functionality +TEST_P(TimerQueriesTest, Timestamp) +{ + if (!extensionEnabled("GL_EXT_disjoint_timer_query")) + { + std::cout << "Test skipped because GL_EXT_disjoint_timer_query is not available." + << std::endl; + return; + } + + GLint queryTimestampBits = 0; + glGetQueryivEXT(GL_TIMESTAMP_EXT, GL_QUERY_COUNTER_BITS_EXT, &queryTimestampBits); + ASSERT_GL_NO_ERROR(); + + std::cout << "Timestamp counter bits: " << queryTimestampBits << std::endl; + + // Macs for some reason return 0 bits so skip the test for now if either are 0 + if (queryTimestampBits == 0) + { + std::cout << "Test skipped because of 0 counter bits" << std::endl; + return; + } + + glDepthMask(GL_TRUE); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + GLuint query1 = 0; + GLuint query2 = 0; + glGenQueriesEXT(1, &query1); + glGenQueriesEXT(1, &query2); + glQueryCounterEXT(query1, GL_TIMESTAMP_EXT); + drawQuad(mProgram, "position", 0.8f); + glQueryCounterEXT(query2, GL_TIMESTAMP_EXT); + + ASSERT_GL_NO_ERROR(); + + swapBuffers(); + + int timeout = 200000; + GLuint ready = GL_FALSE; + while (ready == GL_FALSE && timeout > 0) + { + angle::Sleep(0); + glGetQueryObjectuivEXT(query1, GL_QUERY_RESULT_AVAILABLE_EXT, &ready); + timeout--; + } + ready = GL_FALSE; + while (ready == GL_FALSE && timeout > 0) + { + angle::Sleep(0); + glGetQueryObjectuivEXT(query2, GL_QUERY_RESULT_AVAILABLE_EXT, &ready); + timeout--; + } + ASSERT_LT(0, timeout) << "Query result available timed out" << std::endl; + + GLuint64 result1 = 0; + GLuint64 result2 = 0; + glGetQueryObjectui64vEXT(query1, GL_QUERY_RESULT_EXT, &result1); + glGetQueryObjectui64vEXT(query2, GL_QUERY_RESULT_EXT, &result2); + + ASSERT_GL_NO_ERROR(); + + glDeleteQueriesEXT(1, &query1); + glDeleteQueriesEXT(1, &query2); + + std::cout << "Timestamps: " << result1 << " " << result2 << std::endl; + EXPECT_LT(0ul, result1); + EXPECT_LT(0ul, result2); + EXPECT_LT(result1, result2); +} + +class TimerQueriesTestES3 : public TimerQueriesTest +{ +}; + +// Tests getting timestamps via glGetInteger64v +TEST_P(TimerQueriesTestES3, TimestampGetInteger64) +{ + if (!extensionEnabled("GL_EXT_disjoint_timer_query")) + { + std::cout << "Test skipped because GL_EXT_disjoint_timer_query is not available." + << std::endl; + return; + } + + GLint queryTimestampBits = 0; + glGetQueryivEXT(GL_TIMESTAMP_EXT, GL_QUERY_COUNTER_BITS_EXT, &queryTimestampBits); + ASSERT_GL_NO_ERROR(); + + std::cout << "Timestamp counter bits: " << queryTimestampBits << std::endl; + + if (queryTimestampBits == 0) + { + std::cout << "Test skipped because of 0 counter bits" << std::endl; + return; + } + + glDepthMask(GL_TRUE); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + GLint64 result1 = 0; + GLint64 result2 = 0; + glGetInteger64v(GL_TIMESTAMP_EXT, &result1); + drawQuad(mProgram, "position", 0.8f); + glGetInteger64v(GL_TIMESTAMP_EXT, &result2); + ASSERT_GL_NO_ERROR(); + std::cout << "Timestamps (getInteger64v): " << result1 << " " << result2 << std::endl; + EXPECT_LT(0l, result1); + EXPECT_LT(0l, result2); + EXPECT_LT(result1, result2); +} + +ANGLE_INSTANTIATE_TEST(TimerQueriesTest, + ES2_D3D9(), + ES2_D3D11(), + ES3_D3D11(), + ES2_OPENGL(), + ES3_OPENGL()); + +ANGLE_INSTANTIATE_TEST(TimerQueriesTestES3, ES3_D3D11(), ES3_OPENGL());
\ No newline at end of file diff --git a/gfx/angle/src/tests/gl_tests/TransformFeedbackTest.cpp b/gfx/angle/src/tests/gl_tests/TransformFeedbackTest.cpp new file mode 100755 index 000000000..73c8a20d5 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/TransformFeedbackTest.cpp @@ -0,0 +1,980 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "test_utils/ANGLETest.h" +#include "random_utils.h" +#include "Vector.h" + +using namespace angle; + +namespace +{ + +class TransformFeedbackTest : public ANGLETest +{ + protected: + TransformFeedbackTest() + : mProgram(0), + mTransformFeedbackBuffer(0), + mTransformFeedback(0) + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + glGenBuffers(1, &mTransformFeedbackBuffer); + glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, mTransformFeedbackBuffer); + glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, mTransformFeedbackBufferSize, NULL, + GL_STATIC_DRAW); + + glGenTransformFeedbacks(1, &mTransformFeedback); + + ASSERT_GL_NO_ERROR(); + } + + void TearDown() override + { + if (mProgram != 0) + { + glDeleteProgram(mProgram); + mProgram = 0; + } + + if (mTransformFeedbackBuffer != 0) + { + glDeleteBuffers(1, &mTransformFeedbackBuffer); + mTransformFeedbackBuffer = 0; + } + + if (mTransformFeedback != 0) + { + glDeleteTransformFeedbacks(1, &mTransformFeedback); + mTransformFeedback = 0; + } + + ANGLETest::TearDown(); + } + + void compileDefaultProgram(const std::vector<std::string> &tfVaryings, GLenum bufferMode) + { + ASSERT_EQ(0u, mProgram); + + const std::string vertexShaderSource = SHADER_SOURCE + ( + precision highp float; + attribute vec4 position; + + void main() + { + gl_Position = position; + } + ); + + const std::string fragmentShaderSource = SHADER_SOURCE + ( + precision highp float; + + void main() + { + gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); + } + ); + + mProgram = CompileProgramWithTransformFeedback(vertexShaderSource, fragmentShaderSource, + tfVaryings, bufferMode); + ASSERT_NE(0u, mProgram); + } + + GLuint mProgram; + + static const size_t mTransformFeedbackBufferSize = 1 << 24; + GLuint mTransformFeedbackBuffer; + GLuint mTransformFeedback; +}; + +TEST_P(TransformFeedbackTest, ZeroSizedViewport) +{ + // Set the program's transform feedback varyings (just gl_Position) + std::vector<std::string> tfVaryings; + tfVaryings.push_back("gl_Position"); + compileDefaultProgram(tfVaryings, GL_INTERLEAVED_ATTRIBS); + + glUseProgram(mProgram); + + // Bind the buffer for transform feedback output and start transform feedback + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, mTransformFeedbackBuffer); + glBeginTransformFeedback(GL_TRIANGLES); + + // Create a query to check how many primitives were written + GLuint primitivesWrittenQuery = 0; + glGenQueries(1, &primitivesWrittenQuery); + glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, primitivesWrittenQuery); + + // Set a viewport that would result in no pixels being written to the framebuffer and draw + // a quad + glViewport(0, 0, 0, 0); + + drawQuad(mProgram, "position", 0.5f); + + // End the query and transform feedkback + glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN); + glEndTransformFeedback(); + + glUseProgram(0); + + // Check how many primitives were written and verify that some were written even if + // no pixels were rendered + GLuint primitivesWritten = 0; + glGetQueryObjectuiv(primitivesWrittenQuery, GL_QUERY_RESULT_EXT, &primitivesWritten); + EXPECT_GL_NO_ERROR(); + + EXPECT_EQ(2u, primitivesWritten); +} + +// Test that rebinding a buffer with the same offset resets the offset (no longer appending from the +// old position) +TEST_P(TransformFeedbackTest, BufferRebinding) +{ + glDisable(GL_DEPTH_TEST); + + // Set the program's transform feedback varyings (just gl_Position) + std::vector<std::string> tfVaryings; + tfVaryings.push_back("gl_Position"); + compileDefaultProgram(tfVaryings, GL_INTERLEAVED_ATTRIBS); + + glUseProgram(mProgram); + + // Make sure the buffer has zero'd data + std::vector<float> data(mTransformFeedbackBufferSize / sizeof(float), 0.0f); + glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, mTransformFeedbackBuffer); + glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, mTransformFeedbackBufferSize, data.data(), + GL_STATIC_DRAW); + + + // Create a query to check how many primitives were written + GLuint primitivesWrittenQuery = 0; + glGenQueries(1, &primitivesWrittenQuery); + glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, primitivesWrittenQuery); + + const float finalZ = 0.95f; + + RNG rng; + + const size_t loopCount = 64; + for (size_t loopIdx = 0; loopIdx < loopCount; loopIdx++) + { + // Bind the buffer for transform feedback output and start transform feedback + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, mTransformFeedbackBuffer); + glBeginTransformFeedback(GL_TRIANGLES); + + float z = (loopIdx + 1 == loopCount) ? finalZ : rng.randomFloatBetween(0.1f, 0.5f); + drawQuad(mProgram, "position", z); + + glEndTransformFeedback(); + } + + // End the query and transform feedback + glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN); + + glUseProgram(0); + + // Check how many primitives were written and verify that some were written even if + // no pixels were rendered + GLuint primitivesWritten = 0; + glGetQueryObjectuiv(primitivesWrittenQuery, GL_QUERY_RESULT_EXT, &primitivesWritten); + EXPECT_GL_NO_ERROR(); + + EXPECT_EQ(loopCount * 2, primitivesWritten); + + // Check the buffer data + const float *bufferData = static_cast<float *>(glMapBufferRange( + GL_TRANSFORM_FEEDBACK_BUFFER, 0, mTransformFeedbackBufferSize, GL_MAP_READ_BIT)); + + for (size_t vertexIdx = 0; vertexIdx < 6; vertexIdx++) + { + // Check the third (Z) component of each vertex written and make sure it has the final + // value + EXPECT_NEAR(finalZ, bufferData[vertexIdx * 4 + 2], 0.0001); + } + + for (size_t dataIdx = 24; dataIdx < mTransformFeedbackBufferSize / sizeof(float); dataIdx++) + { + EXPECT_EQ(data[dataIdx], bufferData[dataIdx]) << "Buffer overrun detected."; + } + + glUnmapBuffer(GL_TRANSFORM_FEEDBACK_BUFFER); + + EXPECT_GL_NO_ERROR(); +} + +// Test that XFB can write back vertices to a buffer and that we can draw from this buffer afterward. +TEST_P(TransformFeedbackTest, RecordAndDraw) +{ + // TODO(jmadill): Figure out why this fails on Intel. + if (IsIntel() && GetParam().getRenderer() == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE) + { + std::cout << "Test skipped on Intel." << std::endl; + return; + } + + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + glClear(GL_COLOR_BUFFER_BIT); + + // Set the program's transform feedback varyings (just gl_Position) + std::vector<std::string> tfVaryings; + tfVaryings.push_back("gl_Position"); + compileDefaultProgram(tfVaryings, GL_INTERLEAVED_ATTRIBS); + + glUseProgram(mProgram); + + GLint positionLocation = glGetAttribLocation(mProgram, "position"); + + // First pass: draw 6 points to the XFB buffer + glEnable(GL_RASTERIZER_DISCARD); + + const GLfloat vertices[] = + { + -1.0f, 1.0f, 0.5f, + -1.0f, -1.0f, 0.5f, + 1.0f, -1.0f, 0.5f, + + -1.0f, 1.0f, 0.5f, + 1.0f, -1.0f, 0.5f, + 1.0f, 1.0f, 0.5f, + }; + + glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, vertices); + glEnableVertexAttribArray(positionLocation); + + // Bind the buffer for transform feedback output and start transform feedback + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, mTransformFeedbackBuffer); + glBeginTransformFeedback(GL_POINTS); + + // Create a query to check how many primitives were written + GLuint primitivesWrittenQuery = 0; + glGenQueries(1, &primitivesWrittenQuery); + glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, primitivesWrittenQuery); + + glDrawArrays(GL_POINTS, 0, 6); + + glDisableVertexAttribArray(positionLocation); + glVertexAttribPointer(positionLocation, 4, GL_FLOAT, GL_FALSE, 0, NULL); + // End the query and transform feedkback + glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN); + glEndTransformFeedback(); + + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, 0); + + glDisable(GL_RASTERIZER_DISCARD); + + // Check how many primitives were written and verify that some were written even if + // no pixels were rendered + GLuint primitivesWritten = 0; + glGetQueryObjectuiv(primitivesWrittenQuery, GL_QUERY_RESULT_EXT, &primitivesWritten); + EXPECT_GL_NO_ERROR(); + + EXPECT_EQ(6u, primitivesWritten); + + // Nothing should have been drawn to the framebuffer + EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 0, 0, 0, 0); + + // Second pass: draw from the feedback buffer + + glBindBuffer(GL_ARRAY_BUFFER, mTransformFeedbackBuffer); + glVertexAttribPointer(positionLocation, 4, GL_FLOAT, GL_FALSE, 0, 0); + glEnableVertexAttribArray(positionLocation); + + glDrawArrays(GL_TRIANGLES, 0, 6); + + EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 255, 0, 0, 255); + EXPECT_GL_NO_ERROR(); +} + +// Test that buffer binding happens only on the current transform feedback object +TEST_P(TransformFeedbackTest, BufferBinding) +{ + // Reset any state + glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0); + glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, 0); + + // Generate a new buffer + GLuint scratchBuffer = 0; + glGenBuffers(1, &scratchBuffer); + + EXPECT_GL_NO_ERROR(); + + // Bind TF 0 and a buffer + glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0); + glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, mTransformFeedbackBuffer); + + EXPECT_GL_NO_ERROR(); + + // Check that the buffer ID matches the one that was just bound + GLint currentBufferBinding = 0; + glGetIntegerv(GL_TRANSFORM_FEEDBACK_BUFFER_BINDING, ¤tBufferBinding); + EXPECT_EQ(static_cast<GLuint>(currentBufferBinding), mTransformFeedbackBuffer); + + EXPECT_GL_NO_ERROR(); + + // Check that the buffer ID for the newly bound transform feedback is zero + glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, mTransformFeedback); + + glGetIntegerv(GL_TRANSFORM_FEEDBACK_BUFFER_BINDING, ¤tBufferBinding); + EXPECT_EQ(0, currentBufferBinding); + + EXPECT_GL_NO_ERROR(); + + // Bind a buffer to this TF + glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, scratchBuffer, 0, 32); + + glGetIntegeri_v(GL_TRANSFORM_FEEDBACK_BUFFER_BINDING, 0, ¤tBufferBinding); + EXPECT_EQ(static_cast<GLuint>(currentBufferBinding), scratchBuffer); + + EXPECT_GL_NO_ERROR(); + + // Rebind the original TF and check it's bindings + glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0); + + glGetIntegeri_v(GL_TRANSFORM_FEEDBACK_BUFFER_BINDING, 0, ¤tBufferBinding); + EXPECT_EQ(0, currentBufferBinding); + + EXPECT_GL_NO_ERROR(); + + // Clean up + glDeleteBuffers(1, &scratchBuffer); +} + +// Test that we can capture varyings only used in the vertex shader. +TEST_P(TransformFeedbackTest, VertexOnly) +{ + const std::string &vertexShaderSource = + "#version 300 es\n" + "in vec2 position;\n" + "in float attrib;\n" + "out float varyingAttrib;\n" + "void main() {\n" + " gl_Position = vec4(position, 0, 1);\n" + " varyingAttrib = attrib;\n" + "}"; + + const std::string &fragmentShaderSource = + "#version 300 es\n" + "out mediump vec4 color;\n" + "void main() {\n" + " color = vec4(0.0, 1.0, 0.0, 1.0);\n" + "}"; + + std::vector<std::string> tfVaryings; + tfVaryings.push_back("varyingAttrib"); + + mProgram = CompileProgramWithTransformFeedback(vertexShaderSource, fragmentShaderSource, + tfVaryings, GL_INTERLEAVED_ATTRIBS); + ASSERT_NE(0u, mProgram); + + glUseProgram(mProgram); + + glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, mTransformFeedback); + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, mTransformFeedbackBuffer); + + std::vector<float> attribData; + for (unsigned int cnt = 0; cnt < 100; ++cnt) + { + attribData.push_back(static_cast<float>(cnt)); + } + + GLint attribLocation = glGetAttribLocation(mProgram, "attrib"); + ASSERT_NE(-1, attribLocation); + + glVertexAttribPointer(attribLocation, 1, GL_FLOAT, GL_FALSE, 4, &attribData[0]); + glEnableVertexAttribArray(attribLocation); + + glBeginTransformFeedback(GL_TRIANGLES); + drawQuad(mProgram, "position", 0.5f); + glEndTransformFeedback(); + ASSERT_GL_NO_ERROR(); + + glUseProgram(0); + + GLvoid *mappedBuffer = + glMapBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, sizeof(float) * 6, GL_MAP_READ_BIT); + ASSERT_NE(nullptr, mappedBuffer); + + float *mappedFloats = static_cast<float *>(mappedBuffer); + for (unsigned int cnt = 0; cnt < 6; ++cnt) + { + EXPECT_EQ(attribData[cnt], mappedFloats[cnt]); + } + + EXPECT_GL_NO_ERROR(); +} + +// Test that multiple paused transform feedbacks do not generate errors or crash +TEST_P(TransformFeedbackTest, MultiplePaused) +{ + const size_t drawSize = 1024; + std::vector<float> transformFeedbackData(drawSize); + for (size_t i = 0; i < drawSize; i++) + { + transformFeedbackData[i] = static_cast<float>(i + 1); + } + + // Initialize the buffers to zero + size_t bufferSize = drawSize; + std::vector<float> bufferInitialData(bufferSize, 0); + + const size_t transformFeedbackCount = 8; + + // clang-format off + const std::string vertexShaderSource = SHADER_SOURCE + ( #version 300 es\n + in highp vec4 position; + in float transformFeedbackInput; + out float transformFeedbackOutput; + void main(void) + { + gl_Position = position; + transformFeedbackOutput = transformFeedbackInput; + } + ); + + const std::string fragmentShaderSource = SHADER_SOURCE + ( #version 300 es\n + out mediump vec4 color; + void main(void) + { + color = vec4(1.0, 1.0, 1.0, 1.0); + } + ); + // clang-format on + + std::vector<std::string> tfVaryings; + tfVaryings.push_back("transformFeedbackOutput"); + + mProgram = CompileProgramWithTransformFeedback(vertexShaderSource, fragmentShaderSource, + tfVaryings, GL_INTERLEAVED_ATTRIBS); + ASSERT_NE(0u, mProgram); + glUseProgram(mProgram); + + GLint positionLocation = glGetAttribLocation(mProgram, "position"); + glDisableVertexAttribArray(positionLocation); + glVertexAttrib4f(positionLocation, 0.0f, 0.0f, 0.0f, 1.0f); + + GLint tfInputLocation = glGetAttribLocation(mProgram, "transformFeedbackInput"); + glEnableVertexAttribArray(tfInputLocation); + glVertexAttribPointer(tfInputLocation, 1, GL_FLOAT, false, 0, &transformFeedbackData[0]); + + glDepthMask(GL_FALSE); + glEnable(GL_DEPTH_TEST); + ASSERT_GL_NO_ERROR(); + + GLuint transformFeedbacks[transformFeedbackCount]; + glGenTransformFeedbacks(transformFeedbackCount, transformFeedbacks); + + GLuint buffers[transformFeedbackCount]; + glGenBuffers(transformFeedbackCount, buffers); + + for (size_t i = 0; i < transformFeedbackCount; i++) + { + glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, transformFeedbacks[i]); + + glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buffers[i]); + glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, bufferSize * sizeof(GLfloat), + &bufferInitialData[0], GL_DYNAMIC_DRAW); + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buffers[i]); + ASSERT_GL_NO_ERROR(); + + glBeginTransformFeedback(GL_POINTS); + + glDrawArrays(GL_POINTS, 0, static_cast<GLsizei>(drawSize)); + + glPauseTransformFeedback(); + + EXPECT_GL_NO_ERROR(); + } + + for (size_t i = 0; i < transformFeedbackCount; i++) + { + glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, transformFeedbacks[i]); + glEndTransformFeedback(); + glDeleteTransformFeedbacks(1, &transformFeedbacks[i]); + + EXPECT_GL_NO_ERROR(); + } +} +// Test that running multiple simultaneous queries and transform feedbacks from multiple EGL +// contexts returns the correct results. Helps expose bugs in ANGLE's virtual contexts. +TEST_P(TransformFeedbackTest, MultiContext) +{ +#if defined(ANGLE_PLATFORM_APPLE) + if ((IsNVIDIA() || IsAMD()) && GetParam() == ES3_OPENGL()) + { + std::cout << "Test skipped on NVidia and AMD OpenGL on OSX." << std::endl; + return; + } +#endif + +#if defined(ANGLE_PLATFORM_LINUX) + if (IsAMD() && GetParam() == ES3_OPENGL()) + { + std::cout << "Test skipped on AMD OpenGL on Linux." << std::endl; + return; + } +#endif + + EGLint contextAttributes[] = { + EGL_CONTEXT_MAJOR_VERSION_KHR, + GetParam().majorVersion, + EGL_CONTEXT_MINOR_VERSION_KHR, + GetParam().minorVersion, + EGL_NONE, + }; + + EGLWindow *window = getEGLWindow(); + + EGLDisplay display = window->getDisplay(); + EGLConfig config = window->getConfig(); + EGLSurface surface = window->getSurface(); + + const size_t passCount = 5; + struct ContextInfo + { + EGLContext context; + GLuint program; + GLuint query; + GLuint buffer; + size_t primitiveCounts[passCount]; + }; + ContextInfo contexts[32]; + + const size_t maxDrawSize = 1024; + + std::vector<float> transformFeedbackData(maxDrawSize); + for (size_t i = 0; i < maxDrawSize; i++) + { + transformFeedbackData[i] = static_cast<float>(i + 1); + } + + // Initialize the buffers to zero + size_t bufferSize = maxDrawSize * passCount; + std::vector<float> bufferInitialData(bufferSize, 0); + + for (auto &context : contexts) + { + context.context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttributes); + ASSERT_NE(context.context, EGL_NO_CONTEXT); + + eglMakeCurrent(display, surface, surface, context.context); + + // clang-format off + const std::string vertexShaderSource = SHADER_SOURCE + ( #version 300 es\n + in highp vec4 position; + in float transformFeedbackInput; + out float transformFeedbackOutput; + void main(void) + { + gl_Position = position; + transformFeedbackOutput = transformFeedbackInput; + } + ); + + const std::string fragmentShaderSource = SHADER_SOURCE + ( #version 300 es\n + out mediump vec4 color; + void main(void) + { + color = vec4(1.0, 1.0, 1.0, 1.0); + } + ); + // clang-format on + + std::vector<std::string> tfVaryings; + tfVaryings.push_back("transformFeedbackOutput"); + + context.program = CompileProgramWithTransformFeedback( + vertexShaderSource, fragmentShaderSource, tfVaryings, GL_INTERLEAVED_ATTRIBS); + ASSERT_NE(context.program, 0u); + glUseProgram(context.program); + + GLint positionLocation = glGetAttribLocation(context.program, "position"); + glDisableVertexAttribArray(positionLocation); + glVertexAttrib4f(positionLocation, 0.0f, 0.0f, 0.0f, 1.0f); + + GLint tfInputLocation = glGetAttribLocation(context.program, "transformFeedbackInput"); + glEnableVertexAttribArray(tfInputLocation); + glVertexAttribPointer(tfInputLocation, 1, GL_FLOAT, false, 0, &transformFeedbackData[0]); + + glDepthMask(GL_FALSE); + glEnable(GL_DEPTH_TEST); + glGenQueriesEXT(1, &context.query); + glBeginQueryEXT(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, context.query); + + ASSERT_GL_NO_ERROR(); + + glGenBuffers(1, &context.buffer); + glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, context.buffer); + glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, bufferSize * sizeof(GLfloat), + &bufferInitialData[0], GL_DYNAMIC_DRAW); + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, context.buffer); + + ASSERT_GL_NO_ERROR(); + + // For each pass, draw between 0 and maxDrawSize primitives + for (auto &primCount : context.primitiveCounts) + { + primCount = rand() % maxDrawSize; + } + + glBeginTransformFeedback(GL_POINTS); + } + + for (size_t pass = 0; pass < passCount; pass++) + { + for (const auto &context : contexts) + { + eglMakeCurrent(display, surface, surface, context.context); + + glDrawArrays(GL_POINTS, 0, static_cast<GLsizei>(context.primitiveCounts[pass])); + } + } + + for (const auto &context : contexts) + { + eglMakeCurrent(display, surface, surface, context.context); + + glEndTransformFeedback(); + + glEndQueryEXT(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN); + + GLuint result = 0; + glGetQueryObjectuivEXT(context.query, GL_QUERY_RESULT_EXT, &result); + + EXPECT_GL_NO_ERROR(); + + size_t totalPrimCount = 0; + for (const auto &primCount : context.primitiveCounts) + { + totalPrimCount += primCount; + } + EXPECT_EQ(static_cast<GLuint>(totalPrimCount), result); + + const float *bufferData = reinterpret_cast<float *>(glMapBufferRange( + GL_TRANSFORM_FEEDBACK_BUFFER, 0, bufferSize * sizeof(GLfloat), GL_MAP_READ_BIT)); + + size_t curBufferIndex = 0; + for (const auto &primCount : context.primitiveCounts) + { + for (size_t prim = 0; prim < primCount; prim++) + { + EXPECT_EQ(bufferData[curBufferIndex], prim + 1); + curBufferIndex++; + } + } + + while (curBufferIndex < bufferSize) + { + EXPECT_EQ(bufferData[curBufferIndex], 0.0f); + curBufferIndex++; + } + + glUnmapBuffer(GL_TRANSFORM_FEEDBACK_BUFFER); + } + + eglMakeCurrent(display, surface, surface, window->getContext()); + + for (auto &context : contexts) + { + eglDestroyContext(display, context.context); + context.context = EGL_NO_CONTEXT; + } +} + +// Test that when two vec2s are packed into the same register, we can still capture both of them. +TEST_P(TransformFeedbackTest, PackingBug) +{ + // TODO(jmadill): With points and rasterizer discard? + const std::string &vertexShaderSource = + "#version 300 es\n" + "in vec2 inAttrib1;\n" + "in vec2 inAttrib2;\n" + "out vec2 outAttrib1;\n" + "out vec2 outAttrib2;\n" + "in vec2 position;\n" + "void main() {" + " outAttrib1 = inAttrib1;\n" + " outAttrib2 = inAttrib2;\n" + " gl_Position = vec4(position, 0, 1);\n" + "}"; + + const std::string &fragmentShaderSource = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 color;\n" + "void main() {\n" + " color = vec4(0);\n" + "}"; + + std::vector<std::string> tfVaryings; + tfVaryings.push_back("outAttrib1"); + tfVaryings.push_back("outAttrib2"); + + mProgram = CompileProgramWithTransformFeedback(vertexShaderSource, fragmentShaderSource, + tfVaryings, GL_INTERLEAVED_ATTRIBS); + ASSERT_NE(0u, mProgram); + + glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, mTransformFeedbackBuffer); + glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, sizeof(Vector2) * 2 * 6, nullptr, GL_STREAM_DRAW); + + glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, mTransformFeedback); + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, mTransformFeedbackBuffer); + + GLint attrib1Loc = glGetAttribLocation(mProgram, "inAttrib1"); + GLint attrib2Loc = glGetAttribLocation(mProgram, "inAttrib2"); + + std::vector<Vector2> attrib1Data; + std::vector<Vector2> attrib2Data; + int counter = 0; + for (size_t i = 0; i < 6; i++) { + attrib1Data.push_back(Vector2(counter + 0.0f, counter + 1.0f)); + attrib2Data.push_back(Vector2(counter + 2.0f, counter + 3.0f)); + counter += 4; + } + + glEnableVertexAttribArray(attrib1Loc); + glEnableVertexAttribArray(attrib2Loc); + + glVertexAttribPointer(attrib1Loc, 2, GL_FLOAT, GL_FALSE, 0, attrib1Data.data()); + glVertexAttribPointer(attrib2Loc, 2, GL_FLOAT, GL_FALSE, 0, attrib2Data.data()); + + glUseProgram(mProgram); + glBeginTransformFeedback(GL_TRIANGLES); + drawQuad(mProgram, "position", 0.5f); + glEndTransformFeedback(); + glUseProgram(0); + ASSERT_GL_NO_ERROR(); + + const GLvoid *mapPointer = + glMapBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, sizeof(Vector2) * 2 * 6, GL_MAP_READ_BIT); + ASSERT_NE(nullptr, mapPointer); + + const Vector2 *vecPointer = static_cast<const Vector2 *>(mapPointer); + for (unsigned int vectorIndex = 0; vectorIndex < 3; ++vectorIndex) + { + unsigned int stream1Index = vectorIndex * 2; + unsigned int stream2Index = vectorIndex * 2 + 1; + EXPECT_EQ(attrib1Data[vectorIndex], vecPointer[stream1Index]); + EXPECT_EQ(attrib2Data[vectorIndex], vecPointer[stream2Index]); + } + + ASSERT_GL_NO_ERROR(); +} + +// Test that transform feedback varyings that can be optimized out yet do not cause program +// compilation to fail +TEST_P(TransformFeedbackTest, OptimizedVaryings) +{ + const std::string &vertexShaderSource = + "#version 300 es\n" + "in vec4 a_vertex;\n" + "in vec3 a_normal; \n" + "\n" + "uniform Transform\n" + "{\n" + " mat4 u_modelViewMatrix;\n" + " mat4 u_projectionMatrix;\n" + " mat3 u_normalMatrix;\n" + "};\n" + "\n" + "out vec3 normal;\n" + "out vec4 ecPosition;\n" + "\n" + "void main()\n" + "{\n" + " normal = normalize(u_normalMatrix * a_normal);\n" + " ecPosition = u_modelViewMatrix * a_vertex;\n" + " gl_Position = u_projectionMatrix * ecPosition;\n" + "}\n"; + + const std::string &fragmentShaderSource = + "#version 300 es\n" + "precision mediump float;\n" + "\n" + "in vec3 normal;\n" + "in vec4 ecPosition;\n" + "\n" + "out vec4 fragColor;\n" + "\n" + "void main()\n" + "{\n" + " fragColor = vec4(normal/2.0+vec3(0.5), 1);\n" + "}\n"; + + std::vector<std::string> tfVaryings; + tfVaryings.push_back("normal"); + tfVaryings.push_back("ecPosition"); + + mProgram = CompileProgramWithTransformFeedback(vertexShaderSource, fragmentShaderSource, + tfVaryings, GL_INTERLEAVED_ATTRIBS); + ASSERT_NE(0u, mProgram); +} + +// Test an edge case where two varyings are unreferenced in the frag shader. +TEST_P(TransformFeedbackTest, TwoUnreferencedInFragShader) +{ + // TODO(jmadill): With points and rasterizer discard? + const std::string &vertexShaderSource = + "#version 300 es\n" + "in vec3 position;\n" + "out vec3 outAttrib1;\n" + "out vec3 outAttrib2;\n" + "void main() {" + " outAttrib1 = position;\n" + " outAttrib2 = position;\n" + " gl_Position = vec4(position, 1);\n" + "}"; + + const std::string &fragmentShaderSource = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 color;\n" + "in vec3 outAttrib1;\n" + "in vec3 outAttrib2;\n" + "void main() {\n" + " color = vec4(0);\n" + "}"; + + std::vector<std::string> tfVaryings; + tfVaryings.push_back("outAttrib1"); + tfVaryings.push_back("outAttrib2"); + + mProgram = CompileProgramWithTransformFeedback(vertexShaderSource, fragmentShaderSource, + tfVaryings, GL_INTERLEAVED_ATTRIBS); + ASSERT_NE(0u, mProgram); + + glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, mTransformFeedbackBuffer); + glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, sizeof(Vector3) * 2 * 6, nullptr, GL_STREAM_DRAW); + + glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, mTransformFeedback); + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, mTransformFeedbackBuffer); + + glUseProgram(mProgram); + glBeginTransformFeedback(GL_TRIANGLES); + drawQuad(mProgram, "position", 0.5f); + glEndTransformFeedback(); + glUseProgram(0); + ASSERT_GL_NO_ERROR(); + + const GLvoid *mapPointer = + glMapBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, sizeof(Vector2) * 2 * 6, GL_MAP_READ_BIT); + ASSERT_NE(nullptr, mapPointer); + + const auto &quadVertices = GetQuadVertices(); + + const Vector3 *vecPointer = static_cast<const Vector3 *>(mapPointer); + for (unsigned int vectorIndex = 0; vectorIndex < 3; ++vectorIndex) + { + unsigned int stream1Index = vectorIndex * 2; + unsigned int stream2Index = vectorIndex * 2 + 1; + EXPECT_EQ(quadVertices[vectorIndex], vecPointer[stream1Index]); + EXPECT_EQ(quadVertices[vectorIndex], vecPointer[stream2Index]); + } + + ASSERT_GL_NO_ERROR(); +} +class TransformFeedbackLifetimeTest : public TransformFeedbackTest +{ + protected: + TransformFeedbackLifetimeTest() : mVertexArray(0) {} + + void SetUp() override + { + ANGLETest::SetUp(); + + glGenVertexArrays(1, &mVertexArray); + glBindVertexArray(mVertexArray); + + std::vector<std::string> tfVaryings; + tfVaryings.push_back("gl_Position"); + compileDefaultProgram(tfVaryings, GL_SEPARATE_ATTRIBS); + + glGenBuffers(1, &mTransformFeedbackBuffer); + glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, mTransformFeedbackBuffer); + glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, mTransformFeedbackBufferSize, NULL, + GL_DYNAMIC_DRAW); + glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, 0); + + glGenTransformFeedbacks(1, &mTransformFeedback); + + ASSERT_GL_NO_ERROR(); + } + + void TearDown() override + { + glDeleteVertexArrays(1, &mVertexArray); + TransformFeedbackTest::TearDown(); + } + + GLuint mVertexArray; +}; + +// Tests a bug with state syncing and deleted transform feedback buffers. +TEST_P(TransformFeedbackLifetimeTest, DeletedBuffer) +{ + // First stream vertex data to mTransformFeedbackBuffer. + glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, mTransformFeedback); + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, mTransformFeedbackBuffer); + + glUseProgram(mProgram); + + glBeginTransformFeedback(GL_TRIANGLES); + drawQuad(mProgram, "position", 0.5f, 1.0f, true); + glEndTransformFeedback(); + + glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0); + + // TODO(jmadill): Remove this when http://anglebug.com/1351 is fixed. + glBindVertexArray(0); + drawQuad(mProgram, "position", 0.5f); + glBindVertexArray(1); + + // Next, draw vertices with mTransformFeedbackBuffer. This will link to mVertexArray. + glBindBuffer(GL_ARRAY_BUFFER, mTransformFeedbackBuffer); + GLint loc = glGetAttribLocation(mProgram, "position"); + ASSERT_NE(-1, loc); + glVertexAttribPointer(loc, 1, GL_FLOAT, GL_FALSE, 4, nullptr); + glEnableVertexAttribArray(loc); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glDrawArrays(GL_TRIANGLES, 0, 3); + + // Delete resources, making a stranded pointer to mVertexArray in mTransformFeedbackBuffer. + glDeleteBuffers(1, &mTransformFeedbackBuffer); + mTransformFeedbackBuffer = 0; + glDeleteVertexArrays(1, &mVertexArray); + mVertexArray = 0; + + // Then draw again with transform feedback, dereferencing the stranded pointer. + glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, mTransformFeedback); + glBeginTransformFeedback(GL_TRIANGLES); + drawQuad(mProgram, "position", 0.5f, 1.0f, true); + glEndTransformFeedback(); + glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0); + + ASSERT_GL_NO_ERROR(); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(TransformFeedbackTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); +ANGLE_INSTANTIATE_TEST(TransformFeedbackLifetimeTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); + +} // anonymous namespace diff --git a/gfx/angle/src/tests/gl_tests/UniformBufferTest.cpp b/gfx/angle/src/tests/gl_tests/UniformBufferTest.cpp new file mode 100755 index 000000000..b3577bf30 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/UniformBufferTest.cpp @@ -0,0 +1,573 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "test_utils/ANGLETest.h" +#include "test_utils/gl_raii.h" + +using namespace angle; + +namespace +{ + +class UniformBufferTest : public ANGLETest +{ + protected: + UniformBufferTest() + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + const std::string vertexShaderSource = SHADER_SOURCE + ( #version 300 es\n + in vec4 position; + void main() + { + gl_Position = position; + } + ); + const std::string fragmentShaderSource = SHADER_SOURCE + ( #version 300 es\n + precision highp float; + uniform uni { + vec4 color; + }; + + out vec4 fragColor; + + void main() + { + fragColor = color; + } + ); + + mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource); + ASSERT_NE(mProgram, 0u); + + mUniformBufferIndex = glGetUniformBlockIndex(mProgram, "uni"); + ASSERT_NE(mUniformBufferIndex, -1); + + glGenBuffers(1, &mUniformBuffer); + + ASSERT_GL_NO_ERROR(); + } + + void TearDown() override + { + glDeleteBuffers(1, &mUniformBuffer); + glDeleteProgram(mProgram); + ANGLETest::TearDown(); + } + + GLuint mProgram; + GLint mUniformBufferIndex; + GLuint mUniformBuffer; +}; + +// Basic UBO functionality. +TEST_P(UniformBufferTest, Simple) +{ + glClear(GL_COLOR_BUFFER_BIT); + float floatData[4] = {0.5f, 0.75f, 0.25f, 1.0f}; + + glBindBuffer(GL_UNIFORM_BUFFER, mUniformBuffer); + glBufferData(GL_UNIFORM_BUFFER, sizeof(float) * 4, floatData, GL_STATIC_DRAW); + + glBindBufferBase(GL_UNIFORM_BUFFER, 0, mUniformBuffer); + + glUniformBlockBinding(mProgram, mUniformBufferIndex, 0); + drawQuad(mProgram, "position", 0.5f); + + ASSERT_GL_NO_ERROR(); + EXPECT_PIXEL_NEAR(0, 0, 128, 191, 64, 255, 1); +} + +// Test that using a UBO with a non-zero offset and size actually works. +// The first step of this test renders a color from a UBO with a zero offset. +// The second step renders a color from a UBO with a non-zero offset. +TEST_P(UniformBufferTest, UniformBufferRange) +{ + int px = getWindowWidth() / 2; + int py = getWindowHeight() / 2; + + // Query the uniform buffer alignment requirement + GLint alignment; + glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &alignment); + + GLint64 maxUniformBlockSize; + glGetInteger64v(GL_MAX_UNIFORM_BLOCK_SIZE, &maxUniformBlockSize); + if (alignment >= maxUniformBlockSize) + { + // ANGLE doesn't implement UBO offsets for this platform. + // Ignore the test case. + return; + } + + ASSERT_GL_NO_ERROR(); + + // Let's create a buffer which contains two vec4. + GLuint vec4Size = 4 * sizeof(float); + GLuint stride = 0; + do + { + stride += alignment; + } + while (stride < vec4Size); + + std::vector<char> v(2 * stride); + float *first = reinterpret_cast<float*>(v.data()); + float *second = reinterpret_cast<float*>(v.data() + stride); + + first[0] = 10.f / 255.f; + first[1] = 20.f / 255.f; + first[2] = 30.f / 255.f; + first[3] = 40.f / 255.f; + + second[0] = 110.f / 255.f; + second[1] = 120.f / 255.f; + second[2] = 130.f / 255.f; + second[3] = 140.f / 255.f; + + glBindBuffer(GL_UNIFORM_BUFFER, mUniformBuffer); + // We use on purpose a size which is not a multiple of the alignment. + glBufferData(GL_UNIFORM_BUFFER, stride + vec4Size, v.data(), GL_STATIC_DRAW); + + glUniformBlockBinding(mProgram, mUniformBufferIndex, 0); + + EXPECT_GL_NO_ERROR(); + + // Bind the first part of the uniform buffer and draw + // Use a size which is smaller than the alignment to check + // to check that this case is handle correctly in the conversion to 11.1. + glBindBufferRange(GL_UNIFORM_BUFFER, 0, mUniformBuffer, 0, vec4Size); + drawQuad(mProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + EXPECT_PIXEL_EQ(px, py, 10, 20, 30, 40); + + // Bind the second part of the uniform buffer and draw + // Furthermore the D3D11.1 backend will internally round the vec4Size (16 bytes) to a stride (256 bytes) + // hence it will try to map the range [stride, 2 * stride] which is + // out-of-bound of the buffer bufferSize = stride + vec4Size < 2 * stride. + // Ensure that this behaviour works. + glBindBufferRange(GL_UNIFORM_BUFFER, 0, mUniformBuffer, stride, vec4Size); + drawQuad(mProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + EXPECT_PIXEL_EQ(px, py, 110, 120, 130, 140); +} + +// Test uniform block bindings. +TEST_P(UniformBufferTest, UniformBufferBindings) +{ + int px = getWindowWidth() / 2; + int py = getWindowHeight() / 2; + + ASSERT_GL_NO_ERROR(); + + // Let's create a buffer which contains one vec4. + GLuint vec4Size = 4 * sizeof(float); + std::vector<char> v(vec4Size); + float *first = reinterpret_cast<float*>(v.data()); + + first[0] = 10.f / 255.f; + first[1] = 20.f / 255.f; + first[2] = 30.f / 255.f; + first[3] = 40.f / 255.f; + + glBindBuffer(GL_UNIFORM_BUFFER, mUniformBuffer); + glBufferData(GL_UNIFORM_BUFFER, vec4Size, v.data(), GL_STATIC_DRAW); + + EXPECT_GL_NO_ERROR(); + + // Try to bind the buffer to binding point 2 + glUniformBlockBinding(mProgram, mUniformBufferIndex, 2); + glBindBufferBase(GL_UNIFORM_BUFFER, 2, mUniformBuffer); + drawQuad(mProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + EXPECT_PIXEL_EQ(px, py, 10, 20, 30, 40); + + // Clear the framebuffer + glClearColor(0.0, 0.0, 0.0, 0.0); + glClear(GL_COLOR_BUFFER_BIT); + EXPECT_PIXEL_EQ(px, py, 0, 0, 0, 0); + + // Try to bind the buffer to another binding point + glUniformBlockBinding(mProgram, mUniformBufferIndex, 5); + glBindBufferBase(GL_UNIFORM_BUFFER, 5, mUniformBuffer); + drawQuad(mProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + EXPECT_PIXEL_EQ(px, py, 10, 20, 30, 40); +} + +// Test that ANGLE handles used but unbound UBO. +// TODO: A test case shouldn't depend on the error code of an undefined behaviour. Move this to unit tests of the validation layer. +TEST_P(UniformBufferTest, UnboundUniformBuffer) +{ + glUniformBlockBinding(mProgram, mUniformBufferIndex, 0); + glBindBufferBase(GL_UNIFORM_BUFFER, 0, 0); + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); +} + +// Update a UBO many time and verify that ANGLE uses the latest version of the data. +// https://code.google.com/p/angleproject/issues/detail?id=965 +TEST_P(UniformBufferTest, UniformBufferManyUpdates) +{ + // TODO(jmadill): Figure out why this fails on Intel OpenGL. + if (IsIntel() && IsOpenGL()) + { + std::cout << "Test skipped on Intel OpenGL." << std::endl; + return; + } + + int px = getWindowWidth() / 2; + int py = getWindowHeight() / 2; + + ASSERT_GL_NO_ERROR(); + + float data[4]; + + glBindBuffer(GL_UNIFORM_BUFFER, mUniformBuffer); + glBufferData(GL_UNIFORM_BUFFER, sizeof(data), NULL, GL_DYNAMIC_DRAW); + glUniformBlockBinding(mProgram, mUniformBufferIndex, 0); + glBindBufferBase(GL_UNIFORM_BUFFER, 0, mUniformBuffer); + + EXPECT_GL_NO_ERROR(); + + // Repeteadly update the data and draw + for (size_t i = 0; i < 10; ++i) + { + data[0] = (i + 10.f) / 255.f; + data[1] = (i + 20.f) / 255.f; + data[2] = (i + 30.f) / 255.f; + data[3] = (i + 40.f) / 255.f; + + glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(data), data); + + drawQuad(mProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + EXPECT_PIXEL_EQ(px, py, i + 10, i + 20, i + 30, i + 40); + } +} + +// Use a large number of buffer ranges (compared to the actual size of the UBO) +TEST_P(UniformBufferTest, ManyUniformBufferRange) +{ + int px = getWindowWidth() / 2; + int py = getWindowHeight() / 2; + + // Query the uniform buffer alignment requirement + GLint alignment; + glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &alignment); + + GLint64 maxUniformBlockSize; + glGetInteger64v(GL_MAX_UNIFORM_BLOCK_SIZE, &maxUniformBlockSize); + if (alignment >= maxUniformBlockSize) + { + // ANGLE doesn't implement UBO offsets for this platform. + // Ignore the test case. + return; + } + + ASSERT_GL_NO_ERROR(); + + // Let's create a buffer which contains eight vec4. + GLuint vec4Size = 4 * sizeof(float); + GLuint stride = 0; + do + { + stride += alignment; + } + while (stride < vec4Size); + + std::vector<char> v(8 * stride); + + for (size_t i = 0; i < 8; ++i) + { + float *data = reinterpret_cast<float*>(v.data() + i * stride); + + data[0] = (i + 10.f) / 255.f; + data[1] = (i + 20.f) / 255.f; + data[2] = (i + 30.f) / 255.f; + data[3] = (i + 40.f) / 255.f; + } + + glBindBuffer(GL_UNIFORM_BUFFER, mUniformBuffer); + glBufferData(GL_UNIFORM_BUFFER, v.size(), v.data(), GL_STATIC_DRAW); + + glUniformBlockBinding(mProgram, mUniformBufferIndex, 0); + + EXPECT_GL_NO_ERROR(); + + // Bind each possible offset + for (size_t i = 0; i < 8; ++i) + { + glBindBufferRange(GL_UNIFORM_BUFFER, 0, mUniformBuffer, i * stride, stride); + drawQuad(mProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + EXPECT_PIXEL_EQ(px, py, 10 + i, 20 + i, 30 + i, 40 + i); + } + + // Try to bind larger range + for (size_t i = 0; i < 7; ++i) + { + glBindBufferRange(GL_UNIFORM_BUFFER, 0, mUniformBuffer, i * stride, 2 * stride); + drawQuad(mProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + EXPECT_PIXEL_EQ(px, py, 10 + i, 20 + i, 30 + i, 40 + i); + } + + // Try to bind even larger range + for (size_t i = 0; i < 5; ++i) + { + glBindBufferRange(GL_UNIFORM_BUFFER, 0, mUniformBuffer, i * stride, 4 * stride); + drawQuad(mProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + EXPECT_PIXEL_EQ(px, py, 10 + i, 20 + i, 30 + i, 40 + i); + } +} + +// Tests that active uniforms have the right names. +TEST_P(UniformBufferTest, ActiveUniformNames) +{ + const std::string &vertexShaderSource = + "#version 300 es\n" + "in vec2 position;\n" + "out vec2 v;\n" + "uniform blockName1 {\n" + " float f1;\n" + "} instanceName1;\n" + "uniform blockName2 {\n" + " float f2;\n" + "} instanceName2[1];\n" + "void main() {\n" + " v = vec2(instanceName1.f1, instanceName2[0].f2);\n" + " gl_Position = vec4(position, 0, 1);\n" + "}"; + + const std::string &fragmentShaderSource = + "#version 300 es\n" + "precision highp float;\n" + "in vec2 v;\n" + "out vec4 color;\n" + "void main() {\n" + " color = vec4(v, 0, 1);\n" + "}"; + + GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource); + ASSERT_NE(0u, program); + + GLint activeUniformBlocks; + glGetProgramiv(program, GL_ACTIVE_UNIFORM_BLOCKS, &activeUniformBlocks); + ASSERT_EQ(2, activeUniformBlocks); + + GLint maxLength; + GLsizei length; + glGetProgramiv(program, GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH, &maxLength); + std::vector<GLchar> strBlockNameBuffer(maxLength + 1, 0); + glGetActiveUniformBlockName(program, 0, maxLength, &length, &strBlockNameBuffer[0]); + ASSERT_GL_NO_ERROR(); + EXPECT_EQ("blockName1", std::string(&strBlockNameBuffer[0])); + + glGetActiveUniformBlockName(program, 1, maxLength, &length, &strBlockNameBuffer[0]); + ASSERT_GL_NO_ERROR(); + EXPECT_EQ("blockName2[0]", std::string(&strBlockNameBuffer[0])); + + GLint activeUniforms; + glGetProgramiv(program, GL_ACTIVE_UNIFORMS, &activeUniforms); + + ASSERT_EQ(2, activeUniforms); + + GLint size; + GLenum type; + glGetProgramiv(program, GL_ACTIVE_UNIFORM_MAX_LENGTH, &maxLength); + std::vector<GLchar> strUniformNameBuffer(maxLength + 1, 0); + glGetActiveUniform(program, 0, maxLength, &length, &size, &type, &strUniformNameBuffer[0]); + + ASSERT_GL_NO_ERROR(); + EXPECT_EQ(1, size); + EXPECT_GLENUM_EQ(GL_FLOAT, type); + EXPECT_EQ("blockName1.f1", std::string(&strUniformNameBuffer[0])); + + glGetActiveUniform(program, 1, maxLength, &length, &size, &type, &strUniformNameBuffer[0]); + + ASSERT_GL_NO_ERROR(); + EXPECT_EQ(1, size); + EXPECT_GLENUM_EQ(GL_FLOAT, type); + EXPECT_EQ("blockName2.f2", std::string(&strUniformNameBuffer[0])); +} + +// Tests active uniforms and blocks when the layout is std140, shared and packed. +TEST_P(UniformBufferTest, ActiveUniformNumberAndName) +{ + // TODO(Jiajia): Figure out why this fails on Intel on Mac. + // This case can pass on Intel Mac-10.11/10.12. But it fails on Intel Mac-10.10. + if (IsIntel() && IsOSX()) + { + std::cout << "Test skipped on Intel on Mac." << std::endl; + return; + } + + // This case fails on all AMD platforms (Mac, Linux, Win). + // TODO(zmo): This actually passes on certain AMD cards, but we don't have + // a way to do device specific handling yet. + if (IsAMD()) + { + std::cout << "Test skipped on AMD." << std::endl; + return; + } + + const std::string &vertexShaderSource = + "#version 300 es\n" + "in vec2 position;\n" + "out float v;\n" + "struct S {\n" + " highp ivec3 a;\n" + " mediump ivec2 b[4];\n" + "};\n" + "layout(std140) uniform blockName0 {\n" + " S s0;\n" + " lowp vec2 v0;\n" + " S s1[2];\n" + " highp uint u0;\n" + "};\n" + "layout(std140) uniform blockName1 {\n" + " float f1;\n" + " bool b1;\n" + "} instanceName1;\n" + "layout(shared) uniform blockName2 {\n" + " float f2;\n" + "};\n" + "layout(packed) uniform blockName3 {\n" + " float f3;\n" + "};\n" + "void main() {\n" + " v = instanceName1.f1;\n" + " gl_Position = vec4(position, 0, 1);\n" + "}"; + + const std::string &fragmentShaderSource = + "#version 300 es\n" + "precision highp float;\n" + "in float v;\n" + "out vec4 color;\n" + "void main() {\n" + " color = vec4(v, 0, 0, 1);\n" + "}"; + + ANGLE_GL_PROGRAM(program, vertexShaderSource, fragmentShaderSource); + + // Note that the packed |blockName3| might (or might not) be optimized out. + GLint activeUniforms; + glGetProgramiv(program.get(), GL_ACTIVE_UNIFORMS, &activeUniforms); + EXPECT_GE(activeUniforms, 11); + + GLint activeUniformBlocks; + glGetProgramiv(program.get(), GL_ACTIVE_UNIFORM_BLOCKS, &activeUniformBlocks); + EXPECT_GE(activeUniformBlocks, 3); + + GLint maxLength, size; + GLenum type; + GLsizei length; + glGetProgramiv(program.get(), GL_ACTIVE_UNIFORM_MAX_LENGTH, &maxLength); + std::vector<GLchar> strBuffer(maxLength + 1, 0); + + glGetActiveUniform(program.get(), 0, maxLength, &length, &size, &type, &strBuffer[0]); + ASSERT_GL_NO_ERROR(); + EXPECT_EQ(1, size); + EXPECT_EQ("s0.a", std::string(&strBuffer[0])); + + glGetActiveUniform(program.get(), 1, maxLength, &length, &size, &type, &strBuffer[0]); + ASSERT_GL_NO_ERROR(); + EXPECT_EQ(4, size); + EXPECT_EQ("s0.b[0]", std::string(&strBuffer[0])); + + glGetActiveUniform(program.get(), 2, maxLength, &length, &size, &type, &strBuffer[0]); + ASSERT_GL_NO_ERROR(); + EXPECT_EQ(1, size); + EXPECT_EQ("v0", std::string(&strBuffer[0])); + + glGetActiveUniform(program.get(), 3, maxLength, &length, &size, &type, &strBuffer[0]); + ASSERT_GL_NO_ERROR(); + EXPECT_EQ(1, size); + EXPECT_EQ("s1[0].a", std::string(&strBuffer[0])); + + glGetActiveUniform(program.get(), 4, maxLength, &length, &size, &type, &strBuffer[0]); + ASSERT_GL_NO_ERROR(); + EXPECT_EQ(4, size); + EXPECT_EQ("s1[0].b[0]", std::string(&strBuffer[0])); + + glGetActiveUniform(program.get(), 5, maxLength, &length, &size, &type, &strBuffer[0]); + ASSERT_GL_NO_ERROR(); + EXPECT_EQ(1, size); + EXPECT_EQ("s1[1].a", std::string(&strBuffer[0])); + + glGetActiveUniform(program.get(), 6, maxLength, &length, &size, &type, &strBuffer[0]); + ASSERT_GL_NO_ERROR(); + EXPECT_EQ(4, size); + EXPECT_EQ("s1[1].b[0]", std::string(&strBuffer[0])); + + glGetActiveUniform(program.get(), 7, maxLength, &length, &size, &type, &strBuffer[0]); + ASSERT_GL_NO_ERROR(); + EXPECT_EQ(1, size); + EXPECT_EQ("u0", std::string(&strBuffer[0])); + + glGetActiveUniform(program.get(), 8, maxLength, &length, &size, &type, &strBuffer[0]); + ASSERT_GL_NO_ERROR(); + EXPECT_EQ(1, size); + EXPECT_EQ("blockName1.f1", std::string(&strBuffer[0])); + + glGetActiveUniform(program.get(), 9, maxLength, &length, &size, &type, &strBuffer[0]); + ASSERT_GL_NO_ERROR(); + EXPECT_EQ(1, size); + EXPECT_EQ("blockName1.b1", std::string(&strBuffer[0])); + + glGetActiveUniform(program.get(), 10, maxLength, &length, &size, &type, &strBuffer[0]); + ASSERT_GL_NO_ERROR(); + EXPECT_EQ(1, size); + EXPECT_EQ("f2", std::string(&strBuffer[0])); +} + +// Test that using a very large buffer to back a small uniform block works OK. +TEST_P(UniformBufferTest, VeryLarge) +{ + glClear(GL_COLOR_BUFFER_BIT); + float floatData[4] = {0.5f, 0.75f, 0.25f, 1.0f}; + + GLsizei bigSize = 4096 * 64; + std::vector<GLubyte> zero(bigSize, 0); + + glBindBuffer(GL_UNIFORM_BUFFER, mUniformBuffer); + glBufferData(GL_UNIFORM_BUFFER, bigSize, zero.data(), GL_STATIC_DRAW); + glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(float) * 4, floatData); + + glBindBufferBase(GL_UNIFORM_BUFFER, 0, mUniformBuffer); + + glUniformBlockBinding(mProgram, mUniformBufferIndex, 0); + drawQuad(mProgram, "position", 0.5f); + + ASSERT_GL_NO_ERROR(); + EXPECT_PIXEL_NEAR(0, 0, 128, 191, 64, 255, 1); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(UniformBufferTest, + ES3_D3D11(), + ES3_D3D11_FL11_1(), + ES3_D3D11_FL11_1_REFERENCE(), + ES3_OPENGL(), + ES3_OPENGLES()); + +} // namespace diff --git a/gfx/angle/src/tests/gl_tests/UniformTest.cpp b/gfx/angle/src/tests/gl_tests/UniformTest.cpp new file mode 100755 index 000000000..4dd2738ef --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/UniformTest.cpp @@ -0,0 +1,682 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "test_utils/ANGLETest.h" + +#include <array> +#include <cmath> + +using namespace angle; + +namespace +{ + +class UniformTest : public ANGLETest +{ + protected: + UniformTest() : mProgram(0), mUniformFLocation(-1), mUniformILocation(-1), mUniformBLocation(-1) + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + const std::string &vertexShader = "void main() { gl_Position = vec4(1); }"; + const std::string &fragShader = + "precision mediump float;\n" + "uniform float uniF;\n" + "uniform int uniI;\n" + "uniform bool uniB;\n" + "uniform bool uniBArr[4];\n" + "void main() {\n" + " gl_FragColor = vec4(uniF + float(uniI));\n" + " gl_FragColor += vec4(uniB ? 1.0 : 0.0);\n" + " gl_FragColor += vec4(uniBArr[0] ? 1.0 : 0.0);\n" + "}"; + + mProgram = CompileProgram(vertexShader, fragShader); + ASSERT_NE(mProgram, 0u); + + mUniformFLocation = glGetUniformLocation(mProgram, "uniF"); + ASSERT_NE(mUniformFLocation, -1); + + mUniformILocation = glGetUniformLocation(mProgram, "uniI"); + ASSERT_NE(mUniformILocation, -1); + + mUniformBLocation = glGetUniformLocation(mProgram, "uniB"); + ASSERT_NE(mUniformBLocation, -1); + + ASSERT_GL_NO_ERROR(); + } + + void TearDown() override + { + glDeleteProgram(mProgram); + ANGLETest::TearDown(); + } + + GLuint mProgram; + GLint mUniformFLocation; + GLint mUniformILocation; + GLint mUniformBLocation; +}; + +TEST_P(UniformTest, GetUniformNoCurrentProgram) +{ + glUseProgram(mProgram); + glUniform1f(mUniformFLocation, 1.0f); + glUniform1i(mUniformILocation, 1); + glUseProgram(0); + + GLfloat f; + glGetnUniformfvEXT(mProgram, mUniformFLocation, 4, &f); + ASSERT_GL_NO_ERROR(); + EXPECT_EQ(1.0f, f); + + glGetUniformfv(mProgram, mUniformFLocation, &f); + ASSERT_GL_NO_ERROR(); + EXPECT_EQ(1.0f, f); + + GLint i; + glGetnUniformivEXT(mProgram, mUniformILocation, 4, &i); + ASSERT_GL_NO_ERROR(); + EXPECT_EQ(1, i); + + glGetUniformiv(mProgram, mUniformILocation, &i); + ASSERT_GL_NO_ERROR(); + EXPECT_EQ(1, i); +} + +TEST_P(UniformTest, UniformArrayLocations) +{ + // TODO(geofflang): Figure out why this is broken on Intel OpenGL + if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + std::cout << "Test skipped on Intel OpenGL." << std::endl; + return; + } + + const std::string vertexShader = SHADER_SOURCE + ( + precision mediump float; + uniform float uPosition[4]; + void main(void) + { + gl_Position = vec4(uPosition[0], uPosition[1], uPosition[2], uPosition[3]); + } + ); + + const std::string fragShader = SHADER_SOURCE + ( + precision mediump float; + uniform float uColor[4]; + void main(void) + { + gl_FragColor = vec4(uColor[0], uColor[1], uColor[2], uColor[3]); + } + ); + + GLuint program = CompileProgram(vertexShader, fragShader); + ASSERT_NE(program, 0u); + + // Array index zero should be equivalent to the un-indexed uniform + EXPECT_NE(-1, glGetUniformLocation(program, "uPosition")); + EXPECT_EQ(glGetUniformLocation(program, "uPosition"), glGetUniformLocation(program, "uPosition[0]")); + + EXPECT_NE(-1, glGetUniformLocation(program, "uColor")); + EXPECT_EQ(glGetUniformLocation(program, "uColor"), glGetUniformLocation(program, "uColor[0]")); + + // All array uniform locations should be unique + GLint positionLocations[4] = + { + glGetUniformLocation(program, "uPosition[0]"), + glGetUniformLocation(program, "uPosition[1]"), + glGetUniformLocation(program, "uPosition[2]"), + glGetUniformLocation(program, "uPosition[3]"), + }; + + GLint colorLocations[4] = + { + glGetUniformLocation(program, "uColor[0]"), + glGetUniformLocation(program, "uColor[1]"), + glGetUniformLocation(program, "uColor[2]"), + glGetUniformLocation(program, "uColor[3]"), + }; + + for (size_t i = 0; i < 4; i++) + { + EXPECT_NE(-1, positionLocations[i]); + EXPECT_NE(-1, colorLocations[i]); + + for (size_t j = i + 1; j < 4; j++) + { + EXPECT_NE(positionLocations[i], positionLocations[j]); + EXPECT_NE(colorLocations[i], colorLocations[j]); + } + } + + glDeleteProgram(program); +} + +// Test that float to integer GetUniform rounds values correctly. +TEST_P(UniformTest, FloatUniformStateQuery) +{ + std::vector<double> inValues; + std::vector<GLfloat> expectedFValues; + std::vector<GLint> expectedIValues; + + double intMaxD = static_cast<double>(std::numeric_limits<GLint>::max()); + double intMinD = static_cast<double>(std::numeric_limits<GLint>::min()); + + // TODO(jmadill): Investigate rounding of .5 + inValues.push_back(-1.0); + inValues.push_back(-0.6); + // inValues.push_back(-0.5); // undefined behaviour? + inValues.push_back(-0.4); + inValues.push_back(0.0); + inValues.push_back(0.4); + // inValues.push_back(0.5); // undefined behaviour? + inValues.push_back(0.6); + inValues.push_back(1.0); + inValues.push_back(999999.2); + inValues.push_back(intMaxD * 2.0); + inValues.push_back(intMaxD + 1.0); + inValues.push_back(intMinD * 2.0); + inValues.push_back(intMinD - 1.0); + + for (double value : inValues) + { + expectedFValues.push_back(static_cast<GLfloat>(value)); + + double clampedValue = std::max(intMinD, std::min(intMaxD, value)); + double rounded = round(clampedValue); + expectedIValues.push_back(static_cast<GLint>(rounded)); + } + + glUseProgram(mProgram); + ASSERT_GL_NO_ERROR(); + + for (size_t index = 0; index < inValues.size(); ++index) + { + GLfloat inValue = static_cast<GLfloat>(inValues[index]); + GLfloat expectedValue = expectedFValues[index]; + + glUniform1f(mUniformFLocation, inValue); + GLfloat testValue; + glGetUniformfv(mProgram, mUniformFLocation, &testValue); + ASSERT_GL_NO_ERROR(); + EXPECT_EQ(expectedValue, testValue); + } + + for (size_t index = 0; index < inValues.size(); ++index) + { + GLfloat inValue = static_cast<GLfloat>(inValues[index]); + GLint expectedValue = expectedIValues[index]; + + glUniform1f(mUniformFLocation, inValue); + GLint testValue; + glGetUniformiv(mProgram, mUniformFLocation, &testValue); + ASSERT_GL_NO_ERROR(); + EXPECT_EQ(expectedValue, testValue); + } +} + +// Test that integer to float GetUniform rounds values correctly. +TEST_P(UniformTest, IntUniformStateQuery) +{ + std::vector<GLint> inValues; + std::vector<GLint> expectedIValues; + std::vector<GLfloat> expectedFValues; + + GLint intMax = std::numeric_limits<GLint>::max(); + GLint intMin = std::numeric_limits<GLint>::min(); + + inValues.push_back(-1); + inValues.push_back(0); + inValues.push_back(1); + inValues.push_back(999999); + inValues.push_back(intMax); + inValues.push_back(intMax - 1); + inValues.push_back(intMin); + inValues.push_back(intMin + 1); + + for (GLint value : inValues) + { + expectedIValues.push_back(value); + expectedFValues.push_back(static_cast<GLfloat>(value)); + } + + glUseProgram(mProgram); + ASSERT_GL_NO_ERROR(); + + for (size_t index = 0; index < inValues.size(); ++index) + { + GLint inValue = inValues[index]; + GLint expectedValue = expectedIValues[index]; + + glUniform1i(mUniformILocation, inValue); + GLint testValue; + glGetUniformiv(mProgram, mUniformILocation, &testValue); + ASSERT_GL_NO_ERROR(); + EXPECT_EQ(expectedValue, testValue); + } + + for (size_t index = 0; index < inValues.size(); ++index) + { + GLint inValue = inValues[index]; + GLfloat expectedValue = expectedFValues[index]; + + glUniform1i(mUniformILocation, inValue); + GLfloat testValue; + glGetUniformfv(mProgram, mUniformILocation, &testValue); + ASSERT_GL_NO_ERROR(); + EXPECT_EQ(expectedValue, testValue); + } +} + +// Test that queries of boolean uniforms round correctly. +TEST_P(UniformTest, BooleanUniformStateQuery) +{ + glUseProgram(mProgram); + GLint intValue = 0; + GLfloat floatValue = 0.0f; + + // Calling Uniform1i + glUniform1i(mUniformBLocation, GL_FALSE); + + glGetUniformiv(mProgram, mUniformBLocation, &intValue); + EXPECT_EQ(0, intValue); + + glGetUniformfv(mProgram, mUniformBLocation, &floatValue); + EXPECT_EQ(0.0f, floatValue); + + glUniform1i(mUniformBLocation, GL_TRUE); + + glGetUniformiv(mProgram, mUniformBLocation, &intValue); + EXPECT_EQ(1, intValue); + + glGetUniformfv(mProgram, mUniformBLocation, &floatValue); + EXPECT_EQ(1.0f, floatValue); + + // Calling Uniform1f + glUniform1f(mUniformBLocation, 0.0f); + + glGetUniformiv(mProgram, mUniformBLocation, &intValue); + EXPECT_EQ(0, intValue); + + glGetUniformfv(mProgram, mUniformBLocation, &floatValue); + EXPECT_EQ(0.0f, floatValue); + + glUniform1f(mUniformBLocation, 1.0f); + + glGetUniformiv(mProgram, mUniformBLocation, &intValue); + EXPECT_EQ(1, intValue); + + glGetUniformfv(mProgram, mUniformBLocation, &floatValue); + EXPECT_EQ(1.0f, floatValue); + + ASSERT_GL_NO_ERROR(); +} + +// Test queries for arrays of boolean uniforms. +TEST_P(UniformTest, BooleanArrayUniformStateQuery) +{ + glUseProgram(mProgram); + GLint boolValuesi[4] = {0, 1, 0, 1}; + GLfloat boolValuesf[4] = {0, 1, 0, 1}; + + GLint locations[4] = { + glGetUniformLocation(mProgram, "uniBArr"), + glGetUniformLocation(mProgram, "uniBArr[1]"), + glGetUniformLocation(mProgram, "uniBArr[2]"), + glGetUniformLocation(mProgram, "uniBArr[3]"), + }; + + // Calling Uniform1iv + glUniform1iv(locations[0], 4, boolValuesi); + + for (unsigned int idx = 0; idx < 4; ++idx) + { + int value = -1; + glGetUniformiv(mProgram, locations[idx], &value); + EXPECT_EQ(boolValuesi[idx], value); + } + + for (unsigned int idx = 0; idx < 4; ++idx) + { + float value = -1.0f; + glGetUniformfv(mProgram, locations[idx], &value); + EXPECT_EQ(boolValuesf[idx], value); + } + + // Calling Uniform1fv + glUniform1fv(locations[0], 4, boolValuesf); + + for (unsigned int idx = 0; idx < 4; ++idx) + { + int value = -1; + glGetUniformiv(mProgram, locations[idx], &value); + EXPECT_EQ(boolValuesi[idx], value); + } + + for (unsigned int idx = 0; idx < 4; ++idx) + { + float value = -1.0f; + glGetUniformfv(mProgram, locations[idx], &value); + EXPECT_EQ(boolValuesf[idx], value); + } + + ASSERT_GL_NO_ERROR(); +} + +class UniformTestES3 : public ANGLETest +{ + protected: + UniformTestES3() : mProgram(0) {} + + void SetUp() override + { + ANGLETest::SetUp(); + } + + void TearDown() override + { + if (mProgram != 0) + { + glDeleteProgram(mProgram); + mProgram = 0; + } + } + + GLuint mProgram; +}; + +// Test queries for transposed arrays of non-square matrix uniforms. +TEST_P(UniformTestES3, TranposedMatrixArrayUniformStateQuery) +{ + const std::string &vertexShader = + "#version 300 es\n" + "void main() { gl_Position = vec4(1); }"; + const std::string &fragShader = + "#version 300 es\n" + "precision mediump float;\n" + "uniform mat3x2 uniMat3x2[5];\n" + "out vec4 color;\n" + "void main() {\n" + " color = vec4(uniMat3x2[0][0][0]);\n" + "}"; + + mProgram = CompileProgram(vertexShader, fragShader); + ASSERT_NE(mProgram, 0u); + + glUseProgram(mProgram); + + std::vector<GLfloat> transposedValues; + + for (size_t arrayElement = 0; arrayElement < 5; ++arrayElement) + { + transposedValues.push_back(1.0f + arrayElement); + transposedValues.push_back(3.0f + arrayElement); + transposedValues.push_back(5.0f + arrayElement); + transposedValues.push_back(2.0f + arrayElement); + transposedValues.push_back(4.0f + arrayElement); + transposedValues.push_back(6.0f + arrayElement); + } + + // Setting as a clump + GLint baseLocation = glGetUniformLocation(mProgram, "uniMat3x2"); + ASSERT_NE(-1, baseLocation); + + glUniformMatrix3x2fv(baseLocation, 5, GL_TRUE, &transposedValues[0]); + + for (size_t arrayElement = 0; arrayElement < 5; ++arrayElement) + { + std::stringstream nameStr; + nameStr << "uniMat3x2[" << arrayElement << "]"; + std::string name = nameStr.str(); + GLint location = glGetUniformLocation(mProgram, name.c_str()); + ASSERT_NE(-1, location); + + std::vector<GLfloat> sequentialValues(6, 0); + glGetUniformfv(mProgram, location, &sequentialValues[0]); + + ASSERT_GL_NO_ERROR(); + + for (size_t comp = 0; comp < 6; ++comp) + { + EXPECT_EQ(static_cast<GLfloat>(comp + 1 + arrayElement), sequentialValues[comp]); + } + } +} + +// Check that trying setting too many elements of an array doesn't overflow +TEST_P(UniformTestES3, OverflowArray) +{ + const std::string &vertexShader = + "#version 300 es\n" + "void main() { gl_Position = vec4(1); }"; + const std::string &fragShader = + "#version 300 es\n" + "precision mediump float;\n" + "uniform float uniF[5];\n" + "uniform mat3x2 uniMat3x2[5];\n" + "out vec4 color;\n" + "void main() {\n" + " color = vec4(uniMat3x2[0][0][0] + uniF[0]);\n" + "}"; + + mProgram = CompileProgram(vertexShader, fragShader); + ASSERT_NE(mProgram, 0u); + + glUseProgram(mProgram); + + const size_t kOverflowSize = 10000; + std::vector<GLfloat> values(10000 * 6); + + // Setting as a clump + GLint floatLocation = glGetUniformLocation(mProgram, "uniF"); + ASSERT_NE(-1, floatLocation); + GLint matLocation = glGetUniformLocation(mProgram, "uniMat3x2"); + ASSERT_NE(-1, matLocation); + + // Set too many float uniforms + glUniform1fv(floatLocation, kOverflowSize, &values[0]); + + // Set too many matrix uniforms, transposed or not + glUniformMatrix3x2fv(matLocation, kOverflowSize, GL_FALSE, &values[0]); + glUniformMatrix3x2fv(matLocation, kOverflowSize, GL_TRUE, &values[0]); + + // Same checks but with offsets + GLint floatLocationOffset = glGetUniformLocation(mProgram, "uniF[3]"); + ASSERT_NE(-1, floatLocationOffset); + GLint matLocationOffset = glGetUniformLocation(mProgram, "uniMat3x2[3]"); + ASSERT_NE(-1, matLocationOffset); + + glUniform1fv(floatLocationOffset, kOverflowSize, &values[0]); + glUniformMatrix3x2fv(matLocationOffset, kOverflowSize, GL_FALSE, &values[0]); + glUniformMatrix3x2fv(matLocationOffset, kOverflowSize, GL_TRUE, &values[0]); +} + +// Check that sampler uniforms only show up one time in the list +TEST_P(UniformTest, SamplerUniformsAppearOnce) +{ + int maxVertexTextureImageUnits = 0; + glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &maxVertexTextureImageUnits); + + if (maxVertexTextureImageUnits == 0) + { + std::cout << "Renderer doesn't support vertex texture fetch, skipping test" << std::endl; + return; + } + + const std::string &vertShader = + "attribute vec2 position;\n" + "uniform sampler2D tex2D;\n" + "varying vec4 color;\n" + "void main() {\n" + " gl_Position = vec4(position, 0, 1);\n" + " color = texture2D(tex2D, vec2(0));\n" + "}"; + + const std::string &fragShader = + "precision mediump float;\n" + "varying vec4 color;\n" + "uniform sampler2D tex2D;\n" + "void main() {\n" + " gl_FragColor = texture2D(tex2D, vec2(0)) + color;\n" + "}"; + + GLuint program = CompileProgram(vertShader, fragShader); + ASSERT_NE(0u, program); + + GLint activeUniformsCount = 0; + glGetProgramiv(program, GL_ACTIVE_UNIFORMS, &activeUniformsCount); + ASSERT_EQ(1, activeUniformsCount); + + GLint size = 0; + GLenum type = GL_NONE; + GLchar name[120] = {0}; + glGetActiveUniform(program, 0, 100, nullptr, &size, &type, name); + EXPECT_EQ(1, size); + EXPECT_GLENUM_EQ(GL_SAMPLER_2D, type); + EXPECT_STREQ("tex2D", name); + + EXPECT_GL_NO_ERROR(); + + glDeleteProgram(program); +} + +template <typename T, typename GetUniformV> +void CheckOneElement(GetUniformV getUniformv, + GLuint program, + const std::string &name, + int components, + T canary) +{ + // The buffer getting the results has three chunks + // - A chunk to see underflows + // - A chunk that will hold the result + // - A chunk to see overflows for when components = kChunkSize + static const size_t kChunkSize = 4; + std::array<T, 3 * kChunkSize> buffer; + buffer.fill(canary); + + GLint location = glGetUniformLocation(program, name.c_str()); + ASSERT_NE(location, -1); + + getUniformv(program, location, &buffer[kChunkSize]); + for (size_t i = 0; i < kChunkSize; i++) + { + ASSERT_EQ(canary, buffer[i]); + } + for (size_t i = kChunkSize + components; i < buffer.size(); i++) + { + ASSERT_EQ(canary, buffer[i]); + } +} + +// Check that getting an element array doesn't return the whole array. +TEST_P(UniformTestES3, ReturnsOnlyOneArrayElement) +{ + static const size_t kArraySize = 4; + struct UniformArrayInfo + { + UniformArrayInfo(std::string type, std::string name, int components) + : type(type), name(name), components(components) + { + } + std::string type; + std::string name; + int components; + }; + + // Check for various number of components and types + std::vector<UniformArrayInfo> uniformArrays; + uniformArrays.emplace_back("bool", "uBool", 1); + uniformArrays.emplace_back("vec2", "uFloat", 2); + uniformArrays.emplace_back("ivec3", "uInt", 3); + uniformArrays.emplace_back("uvec4", "uUint", 4); + + std::ostringstream uniformStream; + std::ostringstream additionStream; + for (const auto &array : uniformArrays) + { + uniformStream << "uniform " << array.type << " " << array.name << "[" + << ToString(kArraySize) << "];\n"; + + // We need to make use of the uniforms or they get compiled out. + for (int i = 0; i < 4; i++) + { + if (array.components == 1) + { + additionStream << " + float(" << array.name << "[" << i << "])"; + } + else + { + for (int component = 0; component < array.components; component++) + { + additionStream << " + float(" << array.name << "[" << i << "][" << component + << "])"; + } + } + } + } + + const std::string &vertexShader = + "#version 300 es\n" + + uniformStream.str() + + "void main()\n" + "{\n" + " gl_Position = vec4(1.0" + additionStream.str() + ");\n" + "}"; + + const std::string &fragmentShader = + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 color;\n" + "void main ()\n" + "{\n" + " color = vec4(1, 0, 0, 1);\n" + "}"; + + mProgram = CompileProgram(vertexShader, fragmentShader); + ASSERT_NE(0u, mProgram); + + glUseProgram(mProgram); + + for (const auto &uniformArray : uniformArrays) + { + for (size_t index = 0; index < kArraySize; index++) + { + std::string strIndex = "[" + ToString(index) + "]"; + // Check all the different glGetUniformv functions + CheckOneElement<float>(glGetUniformfv, mProgram, uniformArray.name + strIndex, + uniformArray.components, 42.4242f); + CheckOneElement<int>(glGetUniformiv, mProgram, uniformArray.name + strIndex, + uniformArray.components, 0x7BADBED5); + CheckOneElement<unsigned int>(glGetUniformuiv, mProgram, uniformArray.name + strIndex, + uniformArray.components, 0xDEADBEEF); + } + } +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(UniformTest, + ES2_D3D9(), + ES2_D3D11(), + ES2_D3D11_FL9_3(), + ES2_OPENGL(), + ES2_OPENGLES()); +ANGLE_INSTANTIATE_TEST(UniformTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); + +} // namespace diff --git a/gfx/angle/src/tests/gl_tests/UnpackAlignmentTest.cpp b/gfx/angle/src/tests/gl_tests/UnpackAlignmentTest.cpp new file mode 100755 index 000000000..2a3f76bc6 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/UnpackAlignmentTest.cpp @@ -0,0 +1,325 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "test_utils/ANGLETest.h" + +using namespace angle; + +namespace +{ + +class UnpackAlignmentTest : public ANGLETest +{ + protected: + UnpackAlignmentTest() + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + setConfigDepthBits(24); + + mProgram = 0; + } + + void SetUp() override + { + ANGLETest::SetUp(); + + const std::string vertexShaderSource = SHADER_SOURCE + ( + precision highp float; + attribute vec4 position; + + void main() + { + gl_Position = position; + } + ); + + const std::string fragmentShaderSource = SHADER_SOURCE + ( + uniform sampler2D tex; + + void main() + { + gl_FragColor = texture2D(tex, vec2(0.0, 1.0)); + } + ); + + mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource); + if (mProgram == 0) + { + FAIL() << "shader compilation failed."; + } + } + + void TearDown() override + { + glDeleteProgram(mProgram); + + ANGLETest::TearDown(); + } + + void getPixelSize(GLenum format, GLenum type, unsigned int* size) + { + switch (type) + { + case GL_UNSIGNED_SHORT_5_5_5_1: + case GL_UNSIGNED_SHORT_5_6_5: + case GL_UNSIGNED_SHORT_4_4_4_4: + *size = sizeof(GLushort); + break; + + case GL_UNSIGNED_BYTE: + { + unsigned int compCount = 0; + switch (format) + { + case GL_RGBA: compCount = 4; break; + case GL_RGB: compCount = 3; break; + case GL_LUMINANCE_ALPHA: compCount = 2; break; + case GL_LUMINANCE: compCount = 1; break; + case GL_ALPHA: compCount = 1; break; + default: FAIL() << "unknown pixel format."; + } + *size = sizeof(GLubyte) * compCount; + } + break; + default: + FAIL() << "unknown pixel type."; + } + } + + bool formatHasRGB(GLenum format) + { + return (format != GL_ALPHA); + } + + void testAlignment(int alignment, unsigned int offset, GLenum format, GLenum type) + { + static const unsigned int width = 7; + static const unsigned int height = 2; + + glPixelStorei(GL_UNPACK_ALIGNMENT, alignment); + + GLint readbackAlignment; + glGetIntegerv(GL_UNPACK_ALIGNMENT, &readbackAlignment); + EXPECT_EQ(alignment, readbackAlignment); + + GLubyte buf[1024]; + memset(buf, 0, sizeof(buf)); + + unsigned int pixelSize; + getPixelSize(format, type, &pixelSize); + for (unsigned int i = 0; i < pixelSize; i++) + { + buf[offset+i] = 0xFF; + } + + GLuint tex; + glGenTextures(1, &tex); + glBindTexture(GL_TEXTURE_2D, tex); + + glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, type, &buf[0]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + drawQuad(mProgram, "position", 0.5f); + + GLubyte expectedRGB = formatHasRGB(format) ? 255 : 0; + EXPECT_PIXEL_EQ(0, 0, expectedRGB, expectedRGB, expectedRGB, 255); + + glDeleteTextures(1, &tex); + } + + GLuint mProgram; +}; + +TEST_P(UnpackAlignmentTest, DefaultAlignment) +{ + GLint defaultAlignment; + glGetIntegerv(GL_UNPACK_ALIGNMENT, &defaultAlignment); + EXPECT_EQ(defaultAlignment, 4); +} + + +TEST_P(UnpackAlignmentTest, Alignment1RGBAUByte) +{ + testAlignment(1, 7 * 4, GL_RGBA, GL_UNSIGNED_BYTE); +} + +TEST_P(UnpackAlignmentTest, Alignment1RGBUByte) +{ + testAlignment(1, 7 * 3, GL_RGB, GL_UNSIGNED_BYTE); +} + +TEST_P(UnpackAlignmentTest, Alignment1RGBAUShort4444) +{ + testAlignment(1, 7 * 2, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4); +} + +TEST_P(UnpackAlignmentTest, Alignment1RGBAUShort5551) +{ + testAlignment(1, 7 * 2, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1); +} + +TEST_P(UnpackAlignmentTest, Alignment1RGBAUShort565) +{ + testAlignment(1, 7 * 2, GL_RGB, GL_UNSIGNED_SHORT_5_6_5); +} + +TEST_P(UnpackAlignmentTest, Alignment1LAUByte) +{ + testAlignment(1, 7 * 2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE); +} + +TEST_P(UnpackAlignmentTest, Alignment1LUByte) +{ + testAlignment(1, 7, GL_LUMINANCE, GL_UNSIGNED_BYTE); +} + +TEST_P(UnpackAlignmentTest, Alignment1AUByte) +{ + testAlignment(1, 7, GL_ALPHA, GL_UNSIGNED_BYTE); +} + + +TEST_P(UnpackAlignmentTest, Alignment2RGBAUByte) +{ + testAlignment(2, 7 * 4, GL_RGBA, GL_UNSIGNED_BYTE); +} + +TEST_P(UnpackAlignmentTest, Alignment2RGBUByte) +{ + testAlignment(2, 7 * 3 + 1, GL_RGB, GL_UNSIGNED_BYTE); +} + +TEST_P(UnpackAlignmentTest, Alignment2RGBAUShort4444) +{ + testAlignment(2, 7 * 2, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4); +} + +TEST_P(UnpackAlignmentTest, Alignment2RGBAUShort5551) +{ + testAlignment(2, 7 * 2, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1); +} + +TEST_P(UnpackAlignmentTest, Alignment2RGBAUShort565) +{ + testAlignment(2, 7 * 2, GL_RGB, GL_UNSIGNED_SHORT_5_6_5); +} + +TEST_P(UnpackAlignmentTest, Alignment2LAUByte) +{ + testAlignment(2, 7 * 2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE); +} + +TEST_P(UnpackAlignmentTest, Alignment2LAByte) +{ + testAlignment(2, 7 + 1, GL_LUMINANCE, GL_UNSIGNED_BYTE); +} + +TEST_P(UnpackAlignmentTest, Alignment2AUByte) +{ + testAlignment(2, 7 + 1, GL_ALPHA, GL_UNSIGNED_BYTE); +} + + +TEST_P(UnpackAlignmentTest, Alignment4RGBAUByte) +{ + testAlignment(4, 7 * 4, GL_RGBA, GL_UNSIGNED_BYTE); +} + +TEST_P(UnpackAlignmentTest, Alignment4RGBUByte) +{ + testAlignment(4, 7 * 3 + 3, GL_RGB, GL_UNSIGNED_BYTE); +} + +TEST_P(UnpackAlignmentTest, Alignment4RGBAUShort4444) +{ + testAlignment(4, 7 * 2 + 2, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4); +} + +TEST_P(UnpackAlignmentTest, Alignment4RGBAUShort5551) +{ + testAlignment(4, 7 * 2 + 2, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1); +} + +TEST_P(UnpackAlignmentTest, Alignment4RGBAUShort565) +{ + testAlignment(4, 7 * 2 + 2, GL_RGB, GL_UNSIGNED_SHORT_5_6_5); +} + +TEST_P(UnpackAlignmentTest, Alignment4LAUByte) +{ + testAlignment(4, 7 * 2 + 2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE); +} + +TEST_P(UnpackAlignmentTest, Alignment4LUByte) +{ + testAlignment(4, 7 + 1, GL_LUMINANCE, GL_UNSIGNED_BYTE); +} + +TEST_P(UnpackAlignmentTest, Alignment4AUByte) +{ + testAlignment(4, 7 + 1, GL_ALPHA, GL_UNSIGNED_BYTE); +} + + +TEST_P(UnpackAlignmentTest, Alignment8RGBAUByte) +{ + testAlignment(8, 7 * 4 + 4, GL_RGBA, GL_UNSIGNED_BYTE); +} + +TEST_P(UnpackAlignmentTest, Alignment8RGBUByte) +{ + testAlignment(8, 7 * 3 + 3, GL_RGB, GL_UNSIGNED_BYTE); +} + +TEST_P(UnpackAlignmentTest, Alignment8RGBAUShort4444) +{ + testAlignment(8, 7 * 2 + 2, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4); +} + +TEST_P(UnpackAlignmentTest, Alignment8RGBAUShort5551) +{ + testAlignment(8, 7 * 2 + 2, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1); +} + +TEST_P(UnpackAlignmentTest, Alignment8RGBAUShort565) +{ + testAlignment(8, 7 * 2 + 2, GL_RGB, GL_UNSIGNED_SHORT_5_6_5); +} + +TEST_P(UnpackAlignmentTest, Alignment8LAUByte) +{ + testAlignment(8, 7 * 2 + 2, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE); +} + +TEST_P(UnpackAlignmentTest, Alignment8LUByte) +{ + testAlignment(8, 7 + 1, GL_LUMINANCE, GL_UNSIGNED_BYTE); +} + +TEST_P(UnpackAlignmentTest, Alignment8AUByte) +{ + testAlignment(8, 7 + 1, GL_ALPHA, GL_UNSIGNED_BYTE); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(UnpackAlignmentTest, + ES2_D3D9(), + ES2_D3D11(), + ES2_OPENGL(), + ES3_OPENGL(), + ES2_OPENGLES(), + ES3_OPENGLES()); + +} // namespace diff --git a/gfx/angle/src/tests/gl_tests/UnpackRowLength.cpp b/gfx/angle/src/tests/gl_tests/UnpackRowLength.cpp new file mode 100755 index 000000000..05ad59526 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/UnpackRowLength.cpp @@ -0,0 +1,130 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "test_utils/ANGLETest.h" + +using namespace angle; + +namespace +{ + +class UnpackRowLengthTest : public ANGLETest +{ + protected: + UnpackRowLengthTest() + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + setConfigDepthBits(24); + + mProgram = 0; + } + + void SetUp() override + { + ANGLETest::SetUp(); + + const std::string vertexShaderSource = SHADER_SOURCE + ( + precision highp float; + attribute vec4 position; + + void main() + { + gl_Position = position; + } + ); + + const std::string fragmentShaderSource = SHADER_SOURCE + ( + uniform sampler2D tex; + + void main() + { + gl_FragColor = texture2D(tex, vec2(0.0, 1.0)); + } + ); + + mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource); + if (mProgram == 0) + { + FAIL() << "shader compilation failed."; + } + } + + void TearDown() override + { + glDeleteProgram(mProgram); + + ANGLETest::TearDown(); + } + + void testRowLength(int texSize, int rowLength) + { + glPixelStorei(GL_UNPACK_ROW_LENGTH, rowLength); + + if ((getClientMajorVersion() == 3) || extensionEnabled("GL_EXT_unpack_subimage")) + { + // Only texSize * texSize region is filled as WHITE, other parts are BLACK. + // If the UNPACK_ROW_LENGTH is implemented correctly, all texels inside this texture are WHITE. + std::vector<GLubyte> buf(rowLength * texSize * 4); + for (int y = 0; y < texSize; y++) + { + std::vector<GLubyte>::iterator rowIter = buf.begin() + y * rowLength * 4; + std::fill(rowIter, rowIter + texSize * 4, static_cast<GLubyte>(255u)); + std::fill(rowIter + texSize * 4, rowIter + rowLength * 4, static_cast<GLubyte>(0u)); + } + + GLuint tex; + glGenTextures(1, &tex); + glBindTexture(GL_TEXTURE_2D, tex); + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texSize, texSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, &buf[0]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_EQ(0, 0, 255, 255, 255, 255); + EXPECT_PIXEL_EQ(1, 0, 255, 255, 255, 255); + + glDeleteTextures(1, &tex); + } + else + { + EXPECT_GL_ERROR(GL_INVALID_ENUM); + } + } + + GLuint mProgram; +}; + +TEST_P(UnpackRowLengthTest, RowLength128) +{ + testRowLength(128, 128); +} + +TEST_P(UnpackRowLengthTest, RowLength1024) +{ + testRowLength(128, 1024); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +ANGLE_INSTANTIATE_TEST(UnpackRowLengthTest, + ES3_D3D11(), + ES2_D3D11(), + ES2_D3D9(), + ES2_OPENGL(), + ES3_OPENGL(), + ES2_OPENGLES(), + ES3_OPENGLES()); + +} // namespace diff --git a/gfx/angle/src/tests/gl_tests/VertexAttributeTest.cpp b/gfx/angle/src/tests/gl_tests/VertexAttributeTest.cpp new file mode 100755 index 000000000..b1b9dcd1f --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/VertexAttributeTest.cpp @@ -0,0 +1,894 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "test_utils/ANGLETest.h" + +using namespace angle; + +namespace +{ + +GLsizei TypeStride(GLenum attribType) +{ + switch (attribType) + { + case GL_UNSIGNED_BYTE: + case GL_BYTE: + return 1; + case GL_UNSIGNED_SHORT: + case GL_SHORT: + return 2; + case GL_UNSIGNED_INT: + case GL_INT: + case GL_FLOAT: + return 4; + default: + UNREACHABLE(); + return 0; + } +} + +template <typename T> +GLfloat Normalize(T value) +{ + static_assert(std::is_integral<T>::value, "Integer required."); + if (std::is_signed<T>::value) + { + typedef typename std::make_unsigned<T>::type unsigned_type; + return (2.0f * static_cast<GLfloat>(value) + 1.0f) / + static_cast<GLfloat>(std::numeric_limits<unsigned_type>::max()); + } + else + { + return static_cast<GLfloat>(value) / static_cast<GLfloat>(std::numeric_limits<T>::max()); + } +} + +class VertexAttributeTest : public ANGLETest +{ + protected: + VertexAttributeTest() + : mProgram(0), mTestAttrib(-1), mExpectedAttrib(-1), mBuffer(0), mQuadBuffer(0) + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + setConfigDepthBits(24); + } + + enum class Source + { + BUFFER, + IMMEDIATE, + }; + + struct TestData final : angle::NonCopyable + { + TestData(GLenum typeIn, + GLboolean normalizedIn, + Source sourceIn, + const void *inputDataIn, + const GLfloat *expectedDataIn) + : type(typeIn), + normalized(normalizedIn), + bufferOffset(0), + source(sourceIn), + inputData(inputDataIn), + expectedData(expectedDataIn) + { + } + + GLenum type; + GLboolean normalized; + size_t bufferOffset; + Source source; + + const void *inputData; + const GLfloat *expectedData; + }; + + void setupTest(const TestData &test, GLint typeSize) + { + if (mProgram == 0) + { + initBasicProgram(); + } + + if (test.source == Source::BUFFER) + { + GLsizei dataSize = mVertexCount * TypeStride(test.type); + glBindBuffer(GL_ARRAY_BUFFER, mBuffer); + glBufferData(GL_ARRAY_BUFFER, dataSize, test.inputData, GL_STATIC_DRAW); + glVertexAttribPointer(mTestAttrib, typeSize, test.type, test.normalized, 0, + reinterpret_cast<GLvoid *>(test.bufferOffset)); + glBindBuffer(GL_ARRAY_BUFFER, 0); + } + else + { + ASSERT_EQ(Source::IMMEDIATE, test.source); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glVertexAttribPointer(mTestAttrib, typeSize, test.type, test.normalized, 0, + test.inputData); + } + + glVertexAttribPointer(mExpectedAttrib, typeSize, GL_FLOAT, GL_FALSE, 0, test.expectedData); + + glEnableVertexAttribArray(mTestAttrib); + glEnableVertexAttribArray(mExpectedAttrib); + } + + void checkPixels() + { + GLint viewportSize[4]; + glGetIntegerv(GL_VIEWPORT, viewportSize); + + GLint midPixelX = (viewportSize[0] + viewportSize[2]) / 2; + GLint midPixelY = (viewportSize[1] + viewportSize[3]) / 2; + + // We need to offset our checks from triangle edges to ensure we don't fall on a single tri + // Avoid making assumptions of drawQuad with four checks to check the four possible tri + // regions + EXPECT_PIXEL_EQ((midPixelX + viewportSize[0]) / 2, midPixelY, 255, 255, 255, 255); + EXPECT_PIXEL_EQ((midPixelX + viewportSize[2]) / 2, midPixelY, 255, 255, 255, 255); + EXPECT_PIXEL_EQ(midPixelX, (midPixelY + viewportSize[1]) / 2, 255, 255, 255, 255); + EXPECT_PIXEL_EQ(midPixelX, (midPixelY + viewportSize[3]) / 2, 255, 255, 255, 255); + } + + void runTest(const TestData &test) + { + // TODO(geofflang): Figure out why this is broken on AMD OpenGL + if (IsAMD() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + std::cout << "Test skipped on AMD OpenGL." << std::endl; + return; + } + + for (GLint i = 0; i < 4; i++) + { + GLint typeSize = i + 1; + setupTest(test, typeSize); + + drawQuad(mProgram, "position", 0.5f); + + glDisableVertexAttribArray(mTestAttrib); + glDisableVertexAttribArray(mExpectedAttrib); + + checkPixels(); + } + } + + void SetUp() override + { + ANGLETest::SetUp(); + + glClearColor(0, 0, 0, 0); + glClearDepthf(0.0); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glDisable(GL_DEPTH_TEST); + + glGenBuffers(1, &mBuffer); + } + + void TearDown() override + { + glDeleteProgram(mProgram); + glDeleteBuffers(1, &mBuffer); + glDeleteBuffers(1, &mQuadBuffer); + + ANGLETest::TearDown(); + } + + GLuint compileMultiAttribProgram(GLint attribCount) + { + std::stringstream shaderStream; + + shaderStream << "attribute mediump vec4 position;" << std::endl; + for (GLint attribIndex = 0; attribIndex < attribCount; ++attribIndex) + { + shaderStream << "attribute float a" << attribIndex << ";" << std::endl; + } + shaderStream << "varying mediump float color;" << std::endl + << "void main() {" << std::endl + << " gl_Position = position;" << std::endl + << " color = 0.0;" << std::endl; + for (GLint attribIndex = 0; attribIndex < attribCount; ++attribIndex) + { + shaderStream << " color += a" << attribIndex << ";" << std::endl; + } + shaderStream << "}" << std::endl; + + const std::string testFragmentShaderSource = + SHADER_SOURCE(varying mediump float color; void main(void) + { + gl_FragColor = vec4(color, 0.0, 0.0, 1.0); + }); + + return CompileProgram(shaderStream.str(), testFragmentShaderSource); + } + + void setupMultiAttribs(GLuint program, GLint attribCount, GLfloat value) + { + glUseProgram(program); + for (GLint attribIndex = 0; attribIndex < attribCount; ++attribIndex) + { + std::stringstream attribStream; + attribStream << "a" << attribIndex; + GLint location = glGetAttribLocation(program, attribStream.str().c_str()); + ASSERT_NE(-1, location); + glVertexAttrib1f(location, value); + glDisableVertexAttribArray(location); + } + } + + void initBasicProgram() + { + const std::string testVertexShaderSource = + "attribute mediump vec4 position;\n" + "attribute mediump vec4 test;\n" + "attribute mediump vec4 expected;\n" + "varying mediump vec4 color;\n" + "void main(void)\n" + "{\n" + " gl_Position = position;\n" + " vec4 threshold = max(abs(expected) * 0.01, 1.0 / 64.0);\n" + " color = vec4(lessThanEqual(abs(test - expected), threshold));\n" + "}\n"; + + const std::string testFragmentShaderSource = + "varying mediump vec4 color;\n" + "void main(void)\n" + "{\n" + " gl_FragColor = color;\n" + "}\n"; + + mProgram = CompileProgram(testVertexShaderSource, testFragmentShaderSource); + ASSERT_NE(0u, mProgram); + + mTestAttrib = glGetAttribLocation(mProgram, "test"); + ASSERT_NE(-1, mTestAttrib); + mExpectedAttrib = glGetAttribLocation(mProgram, "expected"); + ASSERT_NE(-1, mExpectedAttrib); + + glUseProgram(mProgram); + } + + static const size_t mVertexCount = 24; + + GLuint mProgram; + GLint mTestAttrib; + GLint mExpectedAttrib; + GLuint mBuffer; + GLuint mQuadBuffer; +}; + +TEST_P(VertexAttributeTest, UnsignedByteUnnormalized) +{ + GLubyte inputData[mVertexCount] = { 0, 1, 2, 3, 4, 5, 6, 7, 125, 126, 127, 128, 129, 250, 251, 252, 253, 254, 255 }; + GLfloat expectedData[mVertexCount]; + for (size_t i = 0; i < mVertexCount; i++) + { + expectedData[i] = inputData[i]; + } + + TestData data(GL_UNSIGNED_BYTE, GL_FALSE, Source::IMMEDIATE, inputData, expectedData); + runTest(data); +} + +TEST_P(VertexAttributeTest, UnsignedByteNormalized) +{ + GLubyte inputData[mVertexCount] = { 0, 1, 2, 3, 4, 5, 6, 7, 125, 126, 127, 128, 129, 250, 251, 252, 253, 254, 255 }; + GLfloat expectedData[mVertexCount]; + for (size_t i = 0; i < mVertexCount; i++) + { + expectedData[i] = Normalize(inputData[i]); + } + + TestData data(GL_UNSIGNED_BYTE, GL_TRUE, Source::IMMEDIATE, inputData, expectedData); + runTest(data); +} + +TEST_P(VertexAttributeTest, ByteUnnormalized) +{ + GLbyte inputData[mVertexCount] = { 0, 1, 2, 3, 4, -1, -2, -3, -4, 125, 126, 127, -128, -127, -126 }; + GLfloat expectedData[mVertexCount]; + for (size_t i = 0; i < mVertexCount; i++) + { + expectedData[i] = inputData[i]; + } + + TestData data(GL_BYTE, GL_FALSE, Source::IMMEDIATE, inputData, expectedData); + runTest(data); +} + +TEST_P(VertexAttributeTest, ByteNormalized) +{ + GLbyte inputData[mVertexCount] = { 0, 1, 2, 3, 4, -1, -2, -3, -4, 125, 126, 127, -128, -127, -126 }; + GLfloat expectedData[mVertexCount]; + for (size_t i = 0; i < mVertexCount; i++) + { + expectedData[i] = Normalize(inputData[i]); + } + + TestData data(GL_BYTE, GL_TRUE, Source::IMMEDIATE, inputData, expectedData); + runTest(data); +} + +TEST_P(VertexAttributeTest, UnsignedShortUnnormalized) +{ + GLushort inputData[mVertexCount] = { 0, 1, 2, 3, 254, 255, 256, 32766, 32767, 32768, 65533, 65534, 65535 }; + GLfloat expectedData[mVertexCount]; + for (size_t i = 0; i < mVertexCount; i++) + { + expectedData[i] = inputData[i]; + } + + TestData data(GL_UNSIGNED_SHORT, GL_FALSE, Source::IMMEDIATE, inputData, expectedData); + runTest(data); +} + +TEST_P(VertexAttributeTest, UnsignedShortNormalized) +{ + GLushort inputData[mVertexCount] = { 0, 1, 2, 3, 254, 255, 256, 32766, 32767, 32768, 65533, 65534, 65535 }; + GLfloat expectedData[mVertexCount]; + for (size_t i = 0; i < mVertexCount; i++) + { + expectedData[i] = Normalize(inputData[i]); + } + + TestData data(GL_UNSIGNED_SHORT, GL_TRUE, Source::IMMEDIATE, inputData, expectedData); + runTest(data); +} + +TEST_P(VertexAttributeTest, ShortUnnormalized) +{ + GLshort inputData[mVertexCount] = { 0, 1, 2, 3, -1, -2, -3, -4, 32766, 32767, -32768, -32767, -32766 }; + GLfloat expectedData[mVertexCount]; + for (size_t i = 0; i < mVertexCount; i++) + { + expectedData[i] = inputData[i]; + } + + TestData data(GL_SHORT, GL_FALSE, Source::IMMEDIATE, inputData, expectedData); + runTest(data); +} + +TEST_P(VertexAttributeTest, ShortNormalized) +{ + GLshort inputData[mVertexCount] = { 0, 1, 2, 3, -1, -2, -3, -4, 32766, 32767, -32768, -32767, -32766 }; + GLfloat expectedData[mVertexCount]; + for (size_t i = 0; i < mVertexCount; i++) + { + expectedData[i] = Normalize(inputData[i]); + } + + TestData data(GL_SHORT, GL_TRUE, Source::IMMEDIATE, inputData, expectedData); + runTest(data); +} + +class VertexAttributeTestES3 : public VertexAttributeTest +{ + protected: + VertexAttributeTestES3() {} +}; + +TEST_P(VertexAttributeTestES3, IntUnnormalized) +{ + GLint lo = std::numeric_limits<GLint>::min(); + GLint hi = std::numeric_limits<GLint>::max(); + GLint inputData[mVertexCount] = {0, 1, 2, 3, -1, -2, -3, -4, -1, hi, hi - 1, lo, lo + 1}; + GLfloat expectedData[mVertexCount]; + for (size_t i = 0; i < mVertexCount; i++) + { + expectedData[i] = static_cast<GLfloat>(inputData[i]); + } + + TestData data(GL_INT, GL_FALSE, Source::BUFFER, inputData, expectedData); + runTest(data); +} + +TEST_P(VertexAttributeTestES3, IntNormalized) +{ + GLint lo = std::numeric_limits<GLint>::min(); + GLint hi = std::numeric_limits<GLint>::max(); + GLint inputData[mVertexCount] = {0, 1, 2, 3, -1, -2, -3, -4, -1, hi, hi - 1, lo, lo + 1}; + GLfloat expectedData[mVertexCount]; + for (size_t i = 0; i < mVertexCount; i++) + { + expectedData[i] = Normalize(inputData[i]); + } + + TestData data(GL_INT, GL_TRUE, Source::BUFFER, inputData, expectedData); + runTest(data); +} + +TEST_P(VertexAttributeTestES3, UnsignedIntUnnormalized) +{ + GLuint mid = std::numeric_limits<GLuint>::max() >> 1; + GLuint hi = std::numeric_limits<GLuint>::max(); + GLuint inputData[mVertexCount] = {0, 1, 2, 3, 254, 255, 256, + mid - 1, mid, mid + 1, hi - 2, hi - 1, hi}; + GLfloat expectedData[mVertexCount]; + for (size_t i = 0; i < mVertexCount; i++) + { + expectedData[i] = static_cast<GLfloat>(inputData[i]); + } + + TestData data(GL_UNSIGNED_INT, GL_FALSE, Source::BUFFER, inputData, expectedData); + runTest(data); +} + +TEST_P(VertexAttributeTestES3, UnsignedIntNormalized) +{ + GLuint mid = std::numeric_limits<GLuint>::max() >> 1; + GLuint hi = std::numeric_limits<GLuint>::max(); + GLuint inputData[mVertexCount] = {0, 1, 2, 3, 254, 255, 256, + mid - 1, mid, mid + 1, hi - 2, hi - 1, hi}; + GLfloat expectedData[mVertexCount]; + for (size_t i = 0; i < mVertexCount; i++) + { + expectedData[i] = Normalize(inputData[i]); + } + + TestData data(GL_UNSIGNED_INT, GL_TRUE, Source::BUFFER, inputData, expectedData); + runTest(data); +} + +// Validate that we can support GL_MAX_ATTRIBS attribs +TEST_P(VertexAttributeTest, MaxAttribs) +{ + // TODO(jmadill): Figure out why we get this error on AMD/OpenGL and Intel. + if ((IsIntel() || IsAMD()) && GetParam().getRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + std::cout << "Test skipped on Intel and AMD." << std::endl; + return; + } + + GLint maxAttribs; + glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxAttribs); + ASSERT_GL_NO_ERROR(); + + // Reserve one attrib for position + GLint drawAttribs = maxAttribs - 1; + + GLuint program = compileMultiAttribProgram(drawAttribs); + ASSERT_NE(0u, program); + + setupMultiAttribs(program, drawAttribs, 0.5f / static_cast<float>(drawAttribs)); + drawQuad(program, "position", 0.5f); + + EXPECT_GL_NO_ERROR(); + EXPECT_PIXEL_NEAR(0, 0, 128, 0, 0, 255, 1); +} + +// Validate that we cannot support GL_MAX_ATTRIBS+1 attribs +TEST_P(VertexAttributeTest, MaxAttribsPlusOne) +{ + // TODO(jmadill): Figure out why we get this error on AMD/ES2/OpenGL + if (IsAMD() && GetParam() == ES2_OPENGL()) + { + std::cout << "Test disabled on AMD/ES2/OpenGL" << std::endl; + return; + } + + GLint maxAttribs; + glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxAttribs); + ASSERT_GL_NO_ERROR(); + + // Exceed attrib count by one (counting position) + GLint drawAttribs = maxAttribs; + + GLuint program = compileMultiAttribProgram(drawAttribs); + ASSERT_EQ(0u, program); +} + +// Simple test for when we use glBindAttribLocation +TEST_P(VertexAttributeTest, SimpleBindAttribLocation) +{ + // TODO(jmadill): Figure out why this fails on Intel. + if (IsIntel() && GetParam().getRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + std::cout << "Test skipped on Intel." << std::endl; + return; + } + + // Re-use the multi-attrib program, binding attribute 0 + GLuint program = compileMultiAttribProgram(1); + glBindAttribLocation(program, 2, "position"); + glBindAttribLocation(program, 3, "a0"); + glLinkProgram(program); + + // Setup and draw the quad + setupMultiAttribs(program, 1, 0.5f); + drawQuad(program, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + EXPECT_PIXEL_NEAR(0, 0, 128, 0, 0, 255, 1); +} + +// Verify that drawing with a large out-of-range offset generates INVALID_OPERATION. +TEST_P(VertexAttributeTest, DrawArraysBufferTooSmall) +{ + GLfloat inputData[mVertexCount]; + GLfloat expectedData[mVertexCount]; + for (size_t count = 0; count < mVertexCount; ++count) + { + inputData[count] = static_cast<GLfloat>(count); + expectedData[count] = inputData[count]; + } + + TestData data(GL_FLOAT, GL_FALSE, Source::BUFFER, inputData, expectedData); + data.bufferOffset = mVertexCount * TypeStride(GL_FLOAT); + + setupTest(data, 1); + drawQuad(mProgram, "position", 0.5f); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); +} + +// Verify that index draw with an out-of-range offset generates INVALID_OPERATION. +TEST_P(VertexAttributeTest, DrawElementsBufferTooSmall) +{ + GLfloat inputData[mVertexCount]; + GLfloat expectedData[mVertexCount]; + for (size_t count = 0; count < mVertexCount; ++count) + { + inputData[count] = static_cast<GLfloat>(count); + expectedData[count] = inputData[count]; + } + + TestData data(GL_FLOAT, GL_FALSE, Source::BUFFER, inputData, expectedData); + data.bufferOffset = (mVertexCount - 3) * TypeStride(GL_FLOAT); + + setupTest(data, 1); + drawIndexedQuad(mProgram, "position", 0.5f); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); +} + +// Verify that using a different start vertex doesn't mess up the draw. +TEST_P(VertexAttributeTest, DrawArraysWithBufferOffset) +{ + // TODO(jmadill): Diagnose this failure. + if (IsD3D11_FL93()) + { + std::cout << "Test disabled on D3D11 FL 9_3" << std::endl; + return; + } + + // TODO(geofflang): Figure out why this is broken on AMD OpenGL + if (IsAMD() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE) + { + std::cout << "Test skipped on AMD OpenGL." << std::endl; + return; + } + + initBasicProgram(); + glUseProgram(mProgram); + + GLfloat inputData[mVertexCount]; + GLfloat expectedData[mVertexCount]; + for (size_t count = 0; count < mVertexCount; ++count) + { + inputData[count] = static_cast<GLfloat>(count); + expectedData[count] = inputData[count]; + } + + auto quadVertices = GetQuadVertices(); + GLsizei quadVerticesSize = static_cast<GLsizei>(quadVertices.size() * sizeof(quadVertices[0])); + + glGenBuffers(1, &mQuadBuffer); + glBindBuffer(GL_ARRAY_BUFFER, mQuadBuffer); + glBufferData(GL_ARRAY_BUFFER, quadVerticesSize + sizeof(Vector3), nullptr, GL_STATIC_DRAW); + glBufferSubData(GL_ARRAY_BUFFER, 0, quadVerticesSize, quadVertices.data()); + + GLint positionLocation = glGetAttribLocation(mProgram, "position"); + ASSERT_NE(-1, positionLocation); + glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, nullptr); + glEnableVertexAttribArray(positionLocation); + + GLsizei dataSize = mVertexCount * TypeStride(GL_FLOAT); + glBindBuffer(GL_ARRAY_BUFFER, mBuffer); + glBufferData(GL_ARRAY_BUFFER, dataSize + TypeStride(GL_FLOAT), nullptr, GL_STATIC_DRAW); + glBufferSubData(GL_ARRAY_BUFFER, 0, dataSize, inputData); + glVertexAttribPointer(mTestAttrib, 1, GL_FLOAT, GL_FALSE, 0, nullptr); + glEnableVertexAttribArray(mTestAttrib); + + glBindBuffer(GL_ARRAY_BUFFER, 0); + glVertexAttribPointer(mExpectedAttrib, 1, GL_FLOAT, GL_FALSE, 0, expectedData); + glEnableVertexAttribArray(mExpectedAttrib); + + // Vertex draw with no start vertex offset (second argument is zero). + glDrawArrays(GL_TRIANGLES, 0, 6); + checkPixels(); + + // Draw offset by one vertex. + glDrawArrays(GL_TRIANGLES, 1, 6); + checkPixels(); + + EXPECT_GL_NO_ERROR(); +} + +class VertexAttributeCachingTest : public VertexAttributeTest +{ + protected: + VertexAttributeCachingTest() {} + + void SetUp() override; + + template <typename DestT> + static std::vector<GLfloat> GetExpectedData(const std::vector<GLubyte> &srcData, + GLenum attribType, + GLboolean normalized); + + void initDoubleAttribProgram() + { + const std::string testVertexShaderSource = + "attribute mediump vec4 position;\n" + "attribute mediump vec4 test;\n" + "attribute mediump vec4 expected;\n" + "attribute mediump vec4 test2;\n" + "attribute mediump vec4 expected2;\n" + "varying mediump vec4 color;\n" + "void main(void)\n" + "{\n" + " gl_Position = position;\n" + " vec4 threshold = max(abs(expected) * 0.01, 1.0 / 64.0);\n" + " color = vec4(lessThanEqual(abs(test - expected), threshold));\n" + " vec4 threshold2 = max(abs(expected2) * 0.01, 1.0 / 64.0);\n" + " color += vec4(lessThanEqual(abs(test2 - expected2), threshold2));\n" + "}\n"; + + const std::string testFragmentShaderSource = + "varying mediump vec4 color;\n" + "void main(void)\n" + "{\n" + " gl_FragColor = color;\n" + "}\n"; + + mProgram = CompileProgram(testVertexShaderSource, testFragmentShaderSource); + ASSERT_NE(0u, mProgram); + + mTestAttrib = glGetAttribLocation(mProgram, "test"); + ASSERT_NE(-1, mTestAttrib); + mExpectedAttrib = glGetAttribLocation(mProgram, "expected"); + ASSERT_NE(-1, mExpectedAttrib); + + glUseProgram(mProgram); + } + + struct AttribData + { + AttribData(GLenum typeIn, GLint sizeIn, GLboolean normalizedIn, GLsizei strideIn); + + GLenum type; + GLint size; + GLboolean normalized; + GLsizei stride; + }; + + std::vector<AttribData> mTestData; + std::map<GLenum, std::vector<GLfloat>> mExpectedData; + std::map<GLenum, std::vector<GLfloat>> mNormExpectedData; +}; + +VertexAttributeCachingTest::AttribData::AttribData(GLenum typeIn, + GLint sizeIn, + GLboolean normalizedIn, + GLsizei strideIn) + : type(typeIn), size(sizeIn), normalized(normalizedIn), stride(strideIn) +{ +} + +// static +template <typename DestT> +std::vector<GLfloat> VertexAttributeCachingTest::GetExpectedData( + const std::vector<GLubyte> &srcData, + GLenum attribType, + GLboolean normalized) +{ + std::vector<GLfloat> expectedData; + + const DestT *typedSrcPtr = reinterpret_cast<const DestT *>(srcData.data()); + size_t iterations = srcData.size() / TypeStride(attribType); + + if (normalized) + { + for (size_t index = 0; index < iterations; ++index) + { + expectedData.push_back(Normalize(typedSrcPtr[index])); + } + } + else + { + for (size_t index = 0; index < iterations; ++index) + { + expectedData.push_back(static_cast<GLfloat>(typedSrcPtr[index])); + } + } + + return expectedData; +} + +void VertexAttributeCachingTest::SetUp() +{ + VertexAttributeTest::SetUp(); + + glBindBuffer(GL_ARRAY_BUFFER, mBuffer); + + std::vector<GLubyte> srcData; + for (size_t count = 0; count < 4; ++count) + { + for (GLubyte i = 0; i < std::numeric_limits<GLubyte>::max(); ++i) + { + srcData.push_back(i); + } + } + + glBufferData(GL_ARRAY_BUFFER, srcData.size(), srcData.data(), GL_STATIC_DRAW); + + GLint viewportSize[4]; + glGetIntegerv(GL_VIEWPORT, viewportSize); + + std::vector<GLenum> attribTypes; + attribTypes.push_back(GL_BYTE); + attribTypes.push_back(GL_UNSIGNED_BYTE); + attribTypes.push_back(GL_SHORT); + attribTypes.push_back(GL_UNSIGNED_SHORT); + + if (getClientMajorVersion() >= 3) + { + attribTypes.push_back(GL_INT); + attribTypes.push_back(GL_UNSIGNED_INT); + } + + const GLint maxSize = 4; + const GLsizei maxStride = 4; + + for (GLenum attribType : attribTypes) + { + for (GLint attribSize = 1; attribSize <= maxSize; ++attribSize) + { + for (GLsizei stride = 1; stride <= maxStride; ++stride) + { + mTestData.push_back(AttribData(attribType, attribSize, GL_FALSE, stride)); + if (attribType != GL_FLOAT) + { + mTestData.push_back(AttribData(attribType, attribSize, GL_TRUE, stride)); + } + } + } + } + + mExpectedData[GL_BYTE] = GetExpectedData<GLbyte>(srcData, GL_BYTE, GL_FALSE); + mExpectedData[GL_UNSIGNED_BYTE] = GetExpectedData<GLubyte>(srcData, GL_UNSIGNED_BYTE, GL_FALSE); + mExpectedData[GL_SHORT] = GetExpectedData<GLshort>(srcData, GL_SHORT, GL_FALSE); + mExpectedData[GL_UNSIGNED_SHORT] = + GetExpectedData<GLushort>(srcData, GL_UNSIGNED_SHORT, GL_FALSE); + mExpectedData[GL_INT] = GetExpectedData<GLint>(srcData, GL_INT, GL_FALSE); + mExpectedData[GL_UNSIGNED_INT] = GetExpectedData<GLuint>(srcData, GL_UNSIGNED_INT, GL_FALSE); + + mNormExpectedData[GL_BYTE] = GetExpectedData<GLbyte>(srcData, GL_BYTE, GL_TRUE); + mNormExpectedData[GL_UNSIGNED_BYTE] = + GetExpectedData<GLubyte>(srcData, GL_UNSIGNED_BYTE, GL_TRUE); + mNormExpectedData[GL_SHORT] = GetExpectedData<GLshort>(srcData, GL_SHORT, GL_TRUE); + mNormExpectedData[GL_UNSIGNED_SHORT] = + GetExpectedData<GLushort>(srcData, GL_UNSIGNED_SHORT, GL_TRUE); + mNormExpectedData[GL_INT] = GetExpectedData<GLint>(srcData, GL_INT, GL_TRUE); + mNormExpectedData[GL_UNSIGNED_INT] = GetExpectedData<GLuint>(srcData, GL_UNSIGNED_INT, GL_TRUE); +} + +// In D3D11, we must sometimes translate buffer data into static attribute caches. We also use a +// cache management scheme which garbage collects old attributes after we start using too much +// cache data. This test tries to make as many attribute caches from a single buffer as possible +// to stress-test the caching code. +TEST_P(VertexAttributeCachingTest, BufferMulticaching) +{ + if (IsAMD() && IsDesktopOpenGL()) + { + std::cout << "Test skipped on AMD OpenGL." << std::endl; + return; + } + + initBasicProgram(); + + glEnableVertexAttribArray(mTestAttrib); + glEnableVertexAttribArray(mExpectedAttrib); + + ASSERT_GL_NO_ERROR(); + + for (const auto &data : mTestData) + { + const auto &expected = + (data.normalized) ? mNormExpectedData[data.type] : mExpectedData[data.type]; + + GLsizei baseStride = static_cast<GLsizei>(data.size) * data.stride; + GLsizei stride = TypeStride(data.type) * baseStride; + + glBindBuffer(GL_ARRAY_BUFFER, mBuffer); + glVertexAttribPointer(mTestAttrib, data.size, data.type, data.normalized, stride, nullptr); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glVertexAttribPointer(mExpectedAttrib, data.size, GL_FLOAT, GL_FALSE, + sizeof(GLfloat) * baseStride, expected.data()); + drawQuad(mProgram, "position", 0.5f); + ASSERT_GL_NO_ERROR(); + EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 255, 255, 255, 255); + } +} + +// With D3D11 dirty bits for VertxArray11, we can leave vertex state unchanged if there aren't any +// GL calls that affect it. This test targets leaving one vertex attribute unchanged between draw +// calls while changing another vertex attribute enough that it clears the static buffer cache +// after enough iterations. It validates the unchanged attributes don't get deleted incidentally. +TEST_P(VertexAttributeCachingTest, BufferMulticachingWithOneUnchangedAttrib) +{ + if (IsAMD() && IsDesktopOpenGL()) + { + std::cout << "Test skipped on AMD OpenGL." << std::endl; + return; + } + + initDoubleAttribProgram(); + + GLint testAttrib2Location = glGetAttribLocation(mProgram, "test2"); + ASSERT_NE(-1, testAttrib2Location); + GLint expectedAttrib2Location = glGetAttribLocation(mProgram, "expected2"); + ASSERT_NE(-1, expectedAttrib2Location); + + glEnableVertexAttribArray(mTestAttrib); + glEnableVertexAttribArray(mExpectedAttrib); + glEnableVertexAttribArray(testAttrib2Location); + glEnableVertexAttribArray(expectedAttrib2Location); + + ASSERT_GL_NO_ERROR(); + + // Use an attribute that we know must be converted. This is a bit sensitive. + glBindBuffer(GL_ARRAY_BUFFER, mBuffer); + glVertexAttribPointer(testAttrib2Location, 3, GL_UNSIGNED_SHORT, GL_FALSE, 6, nullptr); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glVertexAttribPointer(expectedAttrib2Location, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, + mExpectedData[GL_UNSIGNED_SHORT].data()); + + for (const auto &data : mTestData) + { + const auto &expected = + (data.normalized) ? mNormExpectedData[data.type] : mExpectedData[data.type]; + + GLsizei baseStride = static_cast<GLsizei>(data.size) * data.stride; + GLsizei stride = TypeStride(data.type) * baseStride; + + glBindBuffer(GL_ARRAY_BUFFER, mBuffer); + glVertexAttribPointer(mTestAttrib, data.size, data.type, data.normalized, stride, nullptr); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glVertexAttribPointer(mExpectedAttrib, data.size, GL_FLOAT, GL_FALSE, + sizeof(GLfloat) * baseStride, expected.data()); + drawQuad(mProgram, "position", 0.5f); + + ASSERT_GL_NO_ERROR(); + EXPECT_PIXEL_EQ(getWindowWidth() / 2, getWindowHeight() / 2, 255, 255, 255, 255); + } +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +// D3D11 Feature Level 9_3 uses different D3D formats for vertex attribs compared to Feature Levels 10_0+, so we should test them separately. +ANGLE_INSTANTIATE_TEST(VertexAttributeTest, + ES2_D3D9(), + ES2_D3D11(), + ES2_D3D11_FL9_3(), + ES2_OPENGL(), + ES3_OPENGL(), + ES2_OPENGLES(), + ES3_OPENGLES()); + +ANGLE_INSTANTIATE_TEST(VertexAttributeTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); + +ANGLE_INSTANTIATE_TEST(VertexAttributeCachingTest, + ES2_D3D9(), + ES2_D3D11(), + ES3_D3D11(), + ES3_OPENGL()); + +} // anonymous namespace diff --git a/gfx/angle/src/tests/gl_tests/ViewportTest.cpp b/gfx/angle/src/tests/gl_tests/ViewportTest.cpp new file mode 100755 index 000000000..8cd9cd3df --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/ViewportTest.cpp @@ -0,0 +1,272 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "test_utils/ANGLETest.h" + +using namespace angle; + +namespace +{ + +class ViewportTest : public ANGLETest +{ + protected: + ViewportTest() + { + setWindowWidth(512); + setWindowHeight(512); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + setConfigDepthBits(24); + + mProgram = 0; + } + + void runNonScissoredTest() + { + glClearColor(0, 0, 0, 1); + glClear(GL_COLOR_BUFFER_BIT); + + runTest(); + } + + void runScissoredTest() + { + glClearColor(0, 0, 0, 1); + glClear(GL_COLOR_BUFFER_BIT); + + glEnable(GL_SCISSOR_TEST); + glScissor(0, getWindowHeight() / 2, getWindowWidth(), getWindowHeight() / 2); + + runTest(); + } + + void runTest() + { + // Firstly ensure that no errors have been hit. + EXPECT_GL_NO_ERROR(); + + GLint viewportSize[4]; + glGetIntegerv(GL_VIEWPORT, viewportSize); + + // Clear to green. Might be a scissored clear, if scissorSize != window size + glClearColor(0, 1, 0, 1); + glClear(GL_COLOR_BUFFER_BIT); + + // Draw a red quad centered in the middle of the viewport, with dimensions 25% of the size of the viewport. + drawQuad(mProgram, "position", 0.5f, 0.25f); + + GLint centerViewportX = viewportSize[0] + (viewportSize[2] / 2); + GLint centerViewportY = viewportSize[1] + (viewportSize[3] / 2); + + GLint redQuadLeftSideX = viewportSize[0] + viewportSize[2] * 3 / 8; + GLint redQuadRightSideX = viewportSize[0] + viewportSize[2] * 5 / 8; + GLint redQuadTopSideY = viewportSize[1] + viewportSize[3] * 3 / 8; + GLint redQuadBottomSideY = viewportSize[1] + viewportSize[3] * 5 / 8; + + // The midpoint of the viewport should be red. + checkPixel(centerViewportX, centerViewportY, true); + + // Pixels just inside the red quad should be red. + checkPixel(redQuadLeftSideX, redQuadTopSideY, true); + checkPixel(redQuadLeftSideX, redQuadBottomSideY - 1, true); + checkPixel(redQuadRightSideX - 1, redQuadTopSideY, true); + checkPixel(redQuadRightSideX - 1, redQuadBottomSideY - 1, true); + + // Pixels just outside the red quad shouldn't be red. + checkPixel(redQuadLeftSideX - 1, redQuadTopSideY - 1, false); + checkPixel(redQuadLeftSideX - 1, redQuadBottomSideY, false); + checkPixel(redQuadRightSideX, redQuadTopSideY - 1, false); + checkPixel(redQuadRightSideX, redQuadBottomSideY, false); + + // Pixels just within the viewport shouldn't be red. + checkPixel(viewportSize[0], viewportSize[1], false); + checkPixel(viewportSize[0], viewportSize[1] + viewportSize[3] - 1, false); + checkPixel(viewportSize[0] + viewportSize[2] - 1, viewportSize[1], false); + checkPixel(viewportSize[0] + viewportSize[2] - 1, viewportSize[1] + viewportSize[3] - 1, false); + } + + void checkPixel(GLint x, GLint y, GLboolean renderedRed) + { + // By default, expect the pixel to be black. + GLint expectedRedChannel = 0; + GLint expectedGreenChannel = 0; + + GLint scissorSize[4]; + glGetIntegerv(GL_SCISSOR_BOX, scissorSize); + + EXPECT_GL_NO_ERROR(); + + if (scissorSize[0] <= x && x < scissorSize[0] + scissorSize[2] + && scissorSize[1] <= y && y < scissorSize[1] + scissorSize[3]) + { + // If the pixel lies within the scissor rect, then it should have been cleared to green. + // If we rendered a red square on top of it, then the pixel should be red (the green channel will have been reset to 0). + expectedRedChannel = renderedRed ? 255 : 0; + expectedGreenChannel = renderedRed ? 0 : 255; + } + + // If the pixel is within the bounds of the window, then we check it. Otherwise we skip it. + if (0 <= x && x < getWindowWidth() && 0 <= y && y < getWindowHeight()) + { + EXPECT_PIXEL_EQ(x, y, expectedRedChannel, expectedGreenChannel, 0, 255); + } + } + + void SetUp() override + { + ANGLETest::SetUp(); + + const std::string testVertexShaderSource = SHADER_SOURCE + ( + attribute highp vec4 position; + + void main(void) + { + gl_Position = position; + } + ); + + const std::string testFragmentShaderSource = SHADER_SOURCE + ( + void main(void) + { + gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); + } + ); + + mProgram = CompileProgram(testVertexShaderSource, testFragmentShaderSource); + if (mProgram == 0) + { + FAIL() << "shader compilation failed."; + } + + glUseProgram(mProgram); + + glClearColor(0, 0, 0, 1); + glClearDepthf(0.0); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + // Call glViewport and glScissor with default parameters. + glScissor(0, 0, getWindowWidth(), getWindowHeight()); + glViewport(0, 0, getWindowWidth(), getWindowHeight()); + + glDisable(GL_DEPTH_TEST); + } + + void TearDown() override + { + glDeleteProgram(mProgram); + + ANGLETest::TearDown(); + } + + GLuint mProgram; +}; + +TEST_P(ViewportTest, QuarterWindow) +{ + glViewport(0, 0, getWindowWidth() / 4, getWindowHeight() / 4); + + runNonScissoredTest(); + + runScissoredTest(); +} + +TEST_P(ViewportTest, QuarterWindowCentered) +{ + glViewport(getWindowWidth() * 3 / 8, getWindowHeight() * 3 / 8, getWindowWidth() / 4, getWindowHeight() / 4); + + runNonScissoredTest(); + + runScissoredTest(); +} + +TEST_P(ViewportTest, FullWindow) +{ + glViewport(0, 0, getWindowWidth(), getWindowHeight()); + + runNonScissoredTest(); + + runScissoredTest(); +} + +TEST_P(ViewportTest, FullWindowOffCenter) +{ + glViewport(-getWindowWidth() / 2, getWindowHeight() / 2, getWindowWidth(), getWindowHeight()); + + runNonScissoredTest(); + + runScissoredTest(); +} + +TEST_P(ViewportTest, DoubleWindow) +{ + glViewport(0, 0, getWindowWidth() * 2, getWindowHeight() * 2); + + runNonScissoredTest(); + + runScissoredTest(); +} + +TEST_P(ViewportTest, DoubleWindowCentered) +{ + glViewport(-getWindowWidth() / 2, -getWindowHeight() / 2, getWindowWidth() * 2, getWindowHeight() * 2); + + runNonScissoredTest(); + + runScissoredTest(); +} + +TEST_P(ViewportTest, DoubleWindowOffCenter) +{ + glViewport(-getWindowWidth() * 3 / 4, getWindowHeight() * 3 / 4, getWindowWidth(), getWindowHeight()); + + runNonScissoredTest(); + + runScissoredTest(); +} + +TEST_P(ViewportTest, TripleWindow) +{ + glViewport(0, 0, getWindowWidth() * 3, getWindowHeight() * 3); + + runNonScissoredTest(); + + runScissoredTest(); +} + +TEST_P(ViewportTest, TripleWindowCentered) +{ + glViewport(-getWindowWidth(), -getWindowHeight(), getWindowWidth() * 3, getWindowHeight() * 3); + + runNonScissoredTest(); + + runScissoredTest(); +} + +TEST_P(ViewportTest, TripleWindowOffCenter) +{ + glViewport(-getWindowWidth() * 3 / 2, -getWindowHeight() * 3 / 2, getWindowWidth() * 3, getWindowHeight() * 3); + + runNonScissoredTest(); + + runScissoredTest(); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +// D3D11 Feature Level 9 and D3D9 emulate large and negative viewports in the vertex shader. We should test both of these as well as D3D11 Feature Level 10_0+. +ANGLE_INSTANTIATE_TEST(ViewportTest, + ES2_D3D9(), + ES2_D3D11(EGL_EXPERIMENTAL_PRESENT_PATH_COPY_ANGLE), + ES2_D3D11(EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE), + ES2_D3D11_FL9_3(), + ES2_OPENGLES(), + ES3_OPENGLES()); + +} // namespace diff --git a/gfx/angle/src/tests/gl_tests/WebGLCompatibilityTest.cpp b/gfx/angle/src/tests/gl_tests/WebGLCompatibilityTest.cpp new file mode 100644 index 000000000..48a9d2bae --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/WebGLCompatibilityTest.cpp @@ -0,0 +1,154 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +// WebGLCompatibilityTest.cpp : Tests of the GL_ANGLE_webgl_compatibility extension. + +#include "test_utils/ANGLETest.h" + +#include "test_utils/gl_raii.h" + +namespace angle +{ + +class WebGLCompatibilityTest : public ANGLETest +{ + protected: + WebGLCompatibilityTest() + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + setWebGLCompatibilityEnabled(true); + } + + void SetUp() override + { + ANGLETest::SetUp(); + glEnableExtensionANGLE = reinterpret_cast<PFNGLENABLEEXTENSIONANGLEPROC>( + eglGetProcAddress("glEnableExtensionANGLE")); + } + + void TearDown() override { ANGLETest::TearDown(); } + + PFNGLENABLEEXTENSIONANGLEPROC glEnableExtensionANGLE = nullptr; +}; + +// Context creation would fail if EGL_ANGLE_create_context_webgl_compatibility was not available so +// the GL extension should always be present +TEST_P(WebGLCompatibilityTest, ExtensionStringExposed) +{ + EXPECT_TRUE(extensionEnabled("GL_ANGLE_webgl_compatibility")); +} + +// Verify that all extension entry points are available +TEST_P(WebGLCompatibilityTest, EntryPoints) +{ + if (extensionEnabled("GL_ANGLE_webgl_compatibility")) + { + EXPECT_NE(nullptr, eglGetProcAddress("glEnableExtensionANGLE")); + } +} + +// WebGL 1 allows GL_DEPTH_STENCIL_ATTACHMENT as a valid binding point. Make sure it is usable, +// even in ES2 contexts. +TEST_P(WebGLCompatibilityTest, DepthStencilBindingPoint) +{ + GLRenderbuffer renderbuffer; + glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer.get()); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 32, 32); + + GLFramebuffer framebuffer; + glBindFramebuffer(GL_FRAMEBUFFER, framebuffer.get()); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, + renderbuffer.get()); + + EXPECT_GL_NO_ERROR(); +} + +// Test that attempting to enable an extension that doesn't exist generates GL_INVALID_OPERATION +TEST_P(WebGLCompatibilityTest, EnableExtensionValidation) +{ + EXPECT_EQ(GL_FALSE, glEnableExtensionANGLE("invalid_extension_string")); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); +} + +// Test enabling the GL_OES_element_index_uint extension +TEST_P(WebGLCompatibilityTest, EnableExtensionUintIndices) +{ + if (getClientMajorVersion() != 2) + { + // This test only works on ES2 where uint indices are not available by default + return; + } + + EXPECT_FALSE(extensionEnabled("GL_OES_element_index_uint")); + + GLBuffer indexBuffer; + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer.get()); + + GLuint data[] = {0, 1, 2, 1, 3, 2}; + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW); + + ANGLE_GL_PROGRAM(program, "void main() { gl_Position = vec4(0, 0, 0, 1); }", + "void main() { gl_FragColor = vec4(0, 1, 0, 1); }") + glUseProgram(program.get()); + + glDrawElements(GL_TRIANGLES, 2, GL_UNSIGNED_INT, nullptr); + EXPECT_GL_ERROR(GL_INVALID_ENUM); + + if (glEnableExtensionANGLE("GL_OES_element_index_uint")) + { + EXPECT_GL_NO_ERROR(); + EXPECT_TRUE(extensionEnabled("GL_OES_element_index_uint")); + + glDrawElements(GL_TRIANGLES, 2, GL_UNSIGNED_INT, nullptr); + EXPECT_GL_NO_ERROR(); + } +} + +// Verify that shaders are of a compatible spec when the extension is enabled. +TEST_P(WebGLCompatibilityTest, ExtensionCompilerSpec) +{ + EXPECT_TRUE(extensionEnabled("GL_ANGLE_webgl_compatibility")); + + // Use of reserved _webgl prefix should fail when the shader specification is for WebGL. + const std::string &vert = + "struct Foo {\n" + " int _webgl_bar;\n" + "};\n" + "void main()\n" + "{\n" + " Foo foo = Foo(1);\n" + "}"; + + // Default fragement shader. + const std::string &frag = + "void main()\n" + "{\n" + " gl_FragColor = vec4(1.0,0.0,0.0,1.0);\n" + "}"; + + GLuint program = CompileProgram(vert, frag); + EXPECT_EQ(0u, program); + glDeleteProgram(program); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these +// tests should be run against. +ANGLE_INSTANTIATE_TEST(WebGLCompatibilityTest, + ES2_D3D9(), + ES2_D3D11(), + ES3_D3D11(), + ES2_D3D11_FL9_3(), + ES2_OPENGL(), + ES3_OPENGL(), + ES2_OPENGLES(), + ES3_OPENGLES()); + +} // namespace diff --git a/gfx/angle/src/tests/gl_tests/media/pixel.inl b/gfx/angle/src/tests/gl_tests/media/pixel.inl new file mode 100755 index 000000000..586e6942e --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/media/pixel.inl @@ -0,0 +1,11000 @@ +// Automatically generated header from pixel.dds, a 512x512 (10 mip levels) +// DXT1 texture using DDSToHeader.exe. +static const size_t pixel_width = 512; +static const size_t pixel_height = 512; +static const size_t pixel_levels = 10; + +static const size_t pixel_0_width = 512; +static const size_t pixel_0_height = 512; +static const size_t pixel_0_size = 131072; +static const unsigned char pixel_0_data[131072] = +{ + 0x46,0x62,0x63,0x41,0x8B,0x8B,0xFD,0x55,0xE5,0x51,0x22,0x39,0xAA,0xA8,0xFE,0xD5, + 0xC5,0x51,0x23,0x39,0x60,0x60,0xAE,0xAF,0xA5,0x49,0x02,0x39,0x0B,0x2D,0x97,0xFF, + 0x47,0x62,0x02,0x39,0x0A,0xAB,0x5F,0x7D,0xE5,0x51,0xC1,0x30,0x80,0xAA,0xDF,0xD5, + 0xA5,0x49,0x23,0x39,0x60,0xEF,0xE9,0x2D,0xC5,0x51,0xE2,0x30,0xAD,0xFD,0xFF,0x80, + 0x27,0x5A,0x43,0x39,0x0E,0xF5,0x55,0x7F,0xE5,0x49,0xC1,0x30,0xA8,0xFF,0xD5,0xF7, + 0xE5,0x49,0x23,0x39,0xEB,0xED,0xAF,0x2B,0xC9,0x6A,0x23,0x39,0x55,0x55,0xF7,0x82, + 0x06,0x52,0x03,0x31,0xFD,0x7D,0x6B,0xA8,0x84,0x41,0xE2,0x30,0xAE,0xD5,0xDF,0x7C, + 0xC5,0x49,0x43,0x39,0x5D,0xBF,0x09,0x29,0xA8,0x6A,0x42,0x39,0x55,0x5F,0xE2,0x82, + 0xE6,0x51,0x23,0x39,0x55,0x5E,0xEA,0xA8,0x84,0x41,0xE2,0x30,0xD5,0xD5,0xDE,0xD8, + 0xC5,0x49,0x43,0x41,0xFD,0x37,0x2F,0x3D,0xE9,0x72,0x43,0x41,0x55,0xEA,0x82,0xBB, + 0xC5,0x49,0xE2,0x38,0x7F,0xEA,0xE8,0xAA,0x44,0x41,0xC2,0x30,0x2D,0xB5,0xDE,0xF8, + 0xE5,0x51,0xE2,0x30,0xAB,0x2B,0xAB,0xB5,0x67,0x62,0x64,0x41,0x5B,0xC0,0x83,0xD7, + 0xA5,0x49,0x02,0x39,0x7B,0xFA,0x88,0xFE,0xA5,0x51,0x02,0x39,0x2D,0x3F,0xBE,0xAA, + 0x67,0x62,0x84,0x49,0x2A,0x2A,0xB7,0x7D,0x88,0x6A,0x64,0x49,0xA8,0xFA,0xFE,0x55, + 0x06,0x5A,0x64,0x49,0x68,0xE8,0xBB,0xFF,0xA5,0x51,0x02,0x39,0x37,0x97,0xDE,0x78, + 0x47,0x62,0x02,0x39,0x0A,0xAB,0xD7,0x55,0xA9,0x6A,0xC2,0x30,0xE8,0xFA,0xFF,0xD5, + 0xA5,0x49,0x23,0x39,0xE0,0xB7,0xB7,0xAF,0xA5,0x49,0x02,0x39,0x2D,0xD7,0xDA,0xFA, + 0x27,0x5A,0x03,0x39,0x0A,0xFF,0x55,0x55,0xA5,0x49,0x23,0x39,0x28,0x6F,0x7D,0xAD, + 0xC6,0x51,0x03,0x39,0x7E,0xFF,0xBD,0x0B,0xC5,0x51,0xE2,0x38,0xAD,0xD7,0xFE,0xE8, + 0x85,0x49,0xE2,0x30,0x0A,0xDF,0xD7,0x7E,0xA5,0x49,0x24,0x39,0xF8,0x7D,0xF9,0x0B, + 0x27,0x5A,0x43,0x39,0x55,0x7D,0xFF,0x82,0x85,0x49,0xC2,0x30,0xEF,0x7F,0xA8,0x02, + 0x85,0x49,0xC3,0x30,0xAB,0xBD,0x3F,0xFA,0xC6,0x51,0x23,0x39,0xD5,0xBF,0x02,0x02, + 0xE6,0x51,0x03,0x39,0x7F,0xEA,0xA0,0x80,0xC6,0x51,0x02,0x39,0x55,0x5E,0xEA,0x08, + 0xC5,0x51,0x23,0x39,0xBD,0x2D,0xA5,0xD5,0x47,0x5A,0x64,0x41,0x7F,0x8A,0x0B,0x8B, + 0xE6,0x51,0x43,0x41,0x5D,0xEE,0xB8,0xE0,0x85,0x49,0x03,0x39,0x57,0x76,0xF0,0xC0, + 0xC5,0x51,0xE3,0x30,0x2B,0x0B,0x2B,0xA5,0xC9,0x72,0xA4,0x49,0x5D,0x0A,0x8B,0xD5, + 0x88,0x6A,0xA5,0x51,0x5F,0x82,0x00,0x5F,0x06,0x5A,0x64,0x41,0x5B,0xB8,0xAE,0xBE, + 0xC5,0x51,0x63,0x41,0xAE,0x28,0xCA,0x5F,0xC6,0x51,0x43,0x39,0x00,0x80,0xAA,0xF7, + 0x06,0x52,0x23,0x39,0xFA,0x2A,0x3A,0x95,0x66,0x62,0x63,0x41,0xD5,0xAE,0x22,0x22, + 0x47,0x62,0xA4,0x49,0xDD,0xAB,0xA0,0x80,0x68,0x62,0xE5,0x51,0xAD,0x0B,0xAA,0x2A, + 0x67,0x6A,0xE5,0x51,0x56,0x28,0x2E,0x3B,0xC7,0x72,0x24,0x5A,0xD5,0xBF,0x2F,0x6E, + 0xA7,0x6A,0x05,0x5A,0xAE,0x82,0xA8,0x75,0x66,0x62,0xC4,0x51,0x08,0x2A,0xEA,0xFD, + 0x67,0x6A,0xE5,0x51,0x2C,0x8A,0x8A,0xA6,0x88,0x6A,0x47,0x62,0x77,0x5F,0xD7,0x99, + 0x87,0x6A,0x25,0x5A,0x68,0xAA,0xEB,0xFB,0xA7,0x6A,0xC5,0x51,0x7A,0xE8,0x8A,0x2A, + 0x46,0x5A,0x23,0x39,0x55,0x5E,0xDA,0xA0,0x85,0x49,0x23,0x39,0x0F,0xF5,0x35,0xD7, + 0x68,0x62,0x44,0x41,0x57,0x75,0x27,0x3D,0x88,0x62,0x64,0x41,0x55,0x55,0xDE,0xF0, + 0xA5,0x49,0x03,0x31,0xE7,0xFF,0x60,0x58,0xE6,0x51,0x43,0x39,0x55,0x35,0xB9,0xB5, + 0x0A,0x73,0x43,0x39,0x55,0xFB,0xE2,0x8B,0xC5,0x49,0x03,0x39,0x5F,0x7A,0xC8,0x80, + 0x64,0x41,0xE2,0x30,0x2A,0x09,0x2F,0xFE,0xA8,0x6A,0x84,0x41,0x7D,0x8B,0x29,0xD5, + 0x88,0x62,0x63,0x39,0x55,0xFE,0xF0,0xFA,0xA5,0x49,0x02,0x39,0xBD,0xB6,0xFC,0x78, + 0x68,0x62,0x02,0x39,0xFB,0x0A,0x8B,0xF5,0x88,0x62,0xC5,0x51,0x75,0xC0,0xFE,0x55, + 0x52,0xC5,0xC5,0x51,0x35,0xD5,0x55,0x55,0x55,0xE6,0x46,0x62,0x00,0x02,0x0D,0xB5, + 0xB6,0xEE,0x35,0xE6,0x88,0x20,0x22,0x8D,0xB6,0xEE,0x96,0xEE,0xDF,0x7F,0x6F,0x7F, + 0xB6,0xF6,0x96,0xEE,0xED,0xED,0xF9,0x97,0x96,0xF6,0xB6,0xEE,0xEE,0xFA,0x7F,0xBF, + 0xB6,0xF6,0x96,0xEE,0xAE,0xB9,0x3D,0x57,0x96,0xF6,0xB6,0xEE,0xFE,0x7E,0xF6,0xF7, + 0xF7,0xF6,0xB6,0xEE,0x75,0xB5,0xA5,0xAD,0xF7,0xF6,0x96,0xEE,0xAA,0xAA,0xA8,0x7F, + 0xD7,0xF6,0x96,0xEE,0xFA,0xFA,0xBA,0xDE,0xD6,0xF6,0xB6,0xEE,0xAF,0xAB,0x8F,0x2D, + 0xD6,0xF6,0x96,0xEE,0xE8,0xF0,0xE8,0x78,0xB6,0xEE,0x75,0xE6,0x57,0xBE,0x2E,0xBA, + 0xD6,0xF6,0x96,0xEE,0xF7,0xBF,0x2A,0x03,0xF7,0xF6,0x96,0xEE,0xF7,0xAA,0xBA,0xAC, + 0xD7,0xF6,0xB6,0xEE,0xC0,0x60,0x78,0x08,0xF7,0xF6,0xB7,0xEE,0xF5,0xBD,0xAF,0x8A, + 0xF7,0xF6,0xD7,0xF6,0xD5,0x35,0x0F,0x0A,0x18,0xFF,0xD7,0xF6,0xBF,0xAF,0xBB,0xAF, + 0x18,0xFF,0xF8,0xF6,0xAB,0x7A,0x6B,0xEE,0x18,0xFF,0xF8,0xF6,0xAF,0x8B,0x0B,0xAA, + 0x18,0xFF,0xF7,0xEE,0xA8,0xA8,0x80,0x08,0xF8,0xFE,0x18,0xF7,0x3F,0xAD,0xFD,0xF7, + 0x18,0xFF,0xD7,0xF6,0xFF,0xFB,0xBE,0xF0,0x18,0xF7,0xD7,0xF6,0xBF,0xEB,0x8E,0xBA, + 0x18,0xFF,0xF7,0xF6,0xBD,0xFF,0xD5,0xD5,0x37,0xF7,0xD8,0xF6,0xDF,0xBF,0xDF,0xF5, + 0xF8,0xF6,0xD7,0xF6,0x5F,0x20,0x00,0xB8,0xF7,0xF6,0xB6,0xEE,0xAB,0x7B,0x6C,0x8A, + 0xD7,0xF6,0x97,0xEE,0x00,0x08,0x9E,0x78,0xF8,0xF6,0xB7,0xEE,0xBF,0xF6,0xEA,0x3D, + 0xF7,0xF6,0xB7,0xEE,0x83,0xAF,0xE5,0x7B,0xF7,0xF6,0xB7,0xEE,0xAA,0x0A,0xAA,0xB5, + 0xF7,0xF6,0x96,0xEE,0x7F,0xEA,0x22,0x2A,0xD7,0xF6,0x75,0xE6,0x7E,0xFF,0xDE,0xB8, + 0x96,0xEE,0x55,0xE6,0x6A,0x6A,0xF8,0xEC,0x35,0xE6,0x10,0xBD,0xFC,0x78,0x78,0x70, + 0x34,0xE6,0x10,0xC5,0x00,0x03,0x0B,0x29,0x55,0xE6,0xF3,0xDD,0x7E,0xFE,0xFE,0xFC, + 0x14,0xDE,0xD3,0xDD,0xE2,0x62,0x80,0xA0,0x14,0xDE,0xD3,0xDD,0xB3,0xBA,0xBE,0xDE, + 0x14,0xDE,0xD2,0xDD,0xA3,0xA0,0x88,0xBB,0x14,0xDE,0xB2,0xD5,0xE8,0xA2,0xA2,0x88, + 0xF3,0xDD,0xD3,0xD5,0x27,0x0E,0xB6,0x8A,0x14,0xDE,0xD3,0xDD,0xEA,0xC2,0xC8,0xD2, + 0x87,0x6A,0x63,0x49,0xF5,0x3D,0xB7,0xDD,0x29,0x7B,0x05,0x5A,0x55,0xA0,0x88,0xBD, + 0x88,0x62,0x64,0x49,0x77,0x7E,0xF8,0xF8,0xC6,0x51,0x63,0x41,0xF5,0x7B,0xA8,0x6B, + 0xA5,0x49,0x43,0x41,0xE8,0xA8,0x20,0xDE,0xE6,0x51,0x23,0x39,0x55,0x5F,0xEA,0xCB, + 0xE6,0x51,0xE2,0x30,0x2A,0x0B,0xAB,0x57,0x88,0x6A,0x02,0x31,0x80,0x0A,0xFB,0x55, + 0xE6,0x51,0x02,0x31,0xA8,0xA0,0xFE,0x57,0xA5,0x49,0x02,0x31,0x5E,0x68,0xCB,0xCB, + 0xA5,0x49,0x02,0x31,0x02,0x29,0x55,0x57,0xA9,0x6A,0xC1,0x28,0x02,0xAB,0xFF,0xD5, + 0x27,0x5A,0x02,0x31,0xA8,0xFA,0xF7,0x5F,0xC5,0x49,0xE2,0x30,0x78,0x6E,0xEB,0xE2, + 0x85,0x49,0xE2,0x30,0x0B,0xBF,0x77,0x6A,0x06,0x5A,0xE2,0x30,0x02,0xB7,0xD5,0x75, + 0xC5,0x49,0x23,0x39,0xAC,0x5F,0x5D,0xBB,0x05,0x52,0x02,0x31,0x5F,0xB7,0xBD,0x00, + 0xA5,0x41,0x02,0x39,0xFF,0x55,0x6E,0x88,0x84,0x49,0xE2,0x30,0x30,0xD5,0x97,0xDF, + 0xC5,0x49,0x23,0x39,0x75,0x55,0xBF,0x23,0x87,0x62,0x22,0x39,0x55,0x55,0xDF,0xC2, + 0x85,0x49,0xE2,0x30,0x55,0x77,0xEA,0x80,0x23,0x39,0xE2,0x30,0x2D,0x35,0x97,0x58, + 0xA5,0x51,0xC2,0x30,0xFD,0xBE,0x2A,0x2B,0x27,0x62,0x63,0x41,0x75,0x7D,0xEA,0xA0, + 0xA5,0x51,0x64,0x49,0xCD,0x95,0xFF,0xA0,0xA5,0x51,0x44,0x49,0xEF,0x9A,0xBA,0x3A, + 0x07,0x62,0x64,0x49,0xFD,0x2D,0x3F,0xFF,0x48,0x6A,0x64,0x41,0x5F,0xE0,0x80,0xEA, + 0xC5,0x51,0x23,0x39,0x57,0x7F,0xFA,0xAC,0x85,0x49,0xE3,0x30,0xA5,0x2F,0xBE,0x5F, + 0xE6,0x59,0x23,0x39,0xAA,0x22,0xAA,0xF5,0x68,0x62,0x44,0x41,0x5F,0xF0,0xEA,0x5D, + 0x85,0x49,0x23,0x39,0xFF,0xA8,0xA8,0xF5,0x85,0x49,0xE3,0x30,0x0D,0x2D,0xD7,0x7F, + 0xA9,0x6A,0x44,0x41,0x0F,0x2F,0xF5,0x55,0x89,0x6A,0x03,0x31,0xFA,0xB0,0xFE,0x55, + 0xC6,0x51,0x23,0x39,0x7A,0x62,0xEA,0xF5,0xE6,0x51,0xC2,0x30,0x0F,0xA7,0xF7,0xFE, + 0x68,0x62,0x44,0x39,0x82,0xAF,0x55,0x55,0xE6,0x51,0xC2,0x30,0x88,0xA8,0xFF,0xD7, + 0x85,0x49,0xC2,0x30,0x7C,0xE8,0xAE,0x23,0xC5,0x49,0xE2,0x38,0x2B,0xB5,0xF7,0x20, + 0xE6,0x59,0x02,0x31,0x00,0xFE,0x7F,0xEE,0xE6,0x51,0xE2,0x30,0xA8,0xFF,0xF5,0xFF, + 0x26,0x5A,0x43,0x41,0x55,0x5F,0xAF,0x0B,0x88,0x62,0x22,0x39,0xFD,0x55,0xFF,0xA0, + 0xE5,0x51,0x03,0x39,0xB8,0x7F,0x7F,0xAA,0xA5,0x49,0x02,0x39,0xCE,0xBD,0x25,0xB7, + 0xA8,0x6A,0x23,0x39,0x55,0x5D,0xAF,0x2F,0xA8,0x6A,0x43,0x41,0x55,0xFF,0xAE,0x00, + 0x88,0x6A,0x64,0x41,0x55,0x55,0xFE,0xF8,0x06,0x5A,0x43,0x41,0x55,0xFF,0xAA,0xA0, + 0x06,0x5A,0x43,0x41,0x55,0xF7,0x2E,0x0A,0x27,0x5A,0x44,0x41,0xF5,0xAF,0xAC,0xA8, + 0xE6,0x51,0x64,0x49,0xF5,0x2E,0xAA,0x82,0x47,0x62,0xC6,0x51,0x03,0xAB,0x75,0xD5, + 0x89,0x6A,0xE6,0x51,0xFA,0x8A,0xE1,0xED,0x88,0x6A,0x27,0x5A,0xF7,0xDD,0xED,0xAD, + 0x88,0x6A,0xE6,0x59,0xBA,0x27,0x2C,0xBA,0x87,0x6A,0x05,0x5A,0x60,0xE0,0x42,0xA0, + 0xE5,0x51,0x23,0x41,0x2E,0xDF,0x56,0x5C,0x87,0x6A,0x63,0x41,0xAF,0x2A,0xBD,0xD5, + 0x47,0x62,0x84,0x49,0xBA,0xE0,0xB8,0x55,0x47,0x62,0x64,0x49,0x22,0x2A,0x2E,0x95, + 0x87,0x6A,0x26,0x62,0xA8,0xE2,0x2E,0x59,0x87,0x6A,0x26,0x5A,0x88,0x82,0xAB,0xD5, + 0x87,0x62,0x26,0x5A,0xE3,0xC0,0xEA,0x75,0x06,0x5A,0x03,0x39,0x7E,0x78,0xE0,0xE0, + 0xE6,0x51,0x23,0x39,0x2D,0xBD,0x55,0x55,0x68,0x62,0x23,0x39,0xA0,0xEA,0x55,0xDD, + 0x47,0x62,0x44,0x39,0x7F,0x57,0x5D,0x8B,0x85,0x49,0x02,0x31,0xB7,0xD7,0xDF,0x80, + 0x06,0x52,0x23,0x39,0x0B,0xF5,0xFF,0xBF,0xC5,0x49,0x23,0x39,0xA8,0xD7,0xFF,0xBA, + 0xA5,0x49,0x03,0x31,0x5E,0x5F,0xAA,0xA0,0x64,0x41,0x23,0x39,0xBD,0xF5,0xE2,0x40, + 0x84,0x41,0x23,0x39,0xAA,0xFF,0x3F,0xAD,0xE6,0x51,0x43,0x39,0x55,0x77,0xEB,0x0B, + 0xE6,0x51,0xE2,0x30,0xBF,0x5F,0x7E,0xE8,0xA5,0x49,0x02,0x39,0x00,0x8B,0xAD,0xB5, + 0xA5,0x49,0x64,0x49,0xBE,0xB6,0x8A,0x68,0xA8,0x72,0x84,0x49,0x3D,0xF5,0xD5,0x55, + 0x75,0xEE,0xC5,0x51,0x02,0x2D,0xB5,0xD5,0x96,0xEE,0x8F,0xAC,0x00,0x00,0x00,0x09, + 0xB6,0xF6,0x96,0xEE,0xB7,0x3F,0xB5,0x7D,0xB6,0xF6,0x96,0xEE,0x62,0xC0,0xCB,0x4A, + 0xB6,0xEE,0x96,0xEE,0xBD,0xAD,0xAA,0x2B,0xD7,0xF6,0x96,0xEE,0xBF,0x2F,0x0A,0x0A, + 0xD7,0xF6,0x75,0xEE,0x00,0x88,0xA8,0x78,0xB6,0xEE,0x75,0xE6,0xA8,0xBE,0xBF,0xBF, + 0xB6,0xEE,0x96,0xEE,0xBB,0xD9,0xEC,0x75,0xD7,0xF6,0x96,0xEE,0x07,0x0F,0xAF,0xAD, + 0xD6,0xF6,0x96,0xEE,0x7A,0xFA,0xEA,0x6B,0xD7,0xF6,0x54,0xE6,0xA2,0xA8,0xAA,0x97, + 0xF7,0xF6,0x96,0xEE,0x8A,0x2A,0xFA,0xF7,0xF7,0xF6,0xB6,0xEE,0x8A,0x28,0xEB,0xFF, + 0xF7,0xF6,0xB7,0xF6,0x08,0x2E,0xBF,0x7E,0xF7,0xF6,0x96,0xEE,0x00,0x00,0x2B,0xDF, + 0xF7,0xF6,0x96,0xEE,0x00,0x00,0x00,0x3D,0x18,0xFF,0xF7,0xF6,0x55,0x57,0x7F,0x55, + 0x18,0xFF,0xD7,0xF6,0xEA,0xFE,0xFB,0xFE,0x18,0xF7,0xD7,0xF6,0x2A,0xAE,0xF7,0xFF, + 0x18,0xF7,0xF7,0xF6,0x2B,0xA7,0x55,0x55,0x18,0xF7,0xD7,0xF6,0x22,0x0A,0x2E,0xFF, + 0x18,0xF7,0xD8,0xF6,0xA8,0x88,0x2A,0xA9,0x18,0xFF,0xF8,0xF6,0x57,0xF6,0xBF,0xAF, + 0x18,0xF7,0xF7,0xF6,0x55,0x62,0x88,0x00,0x18,0xF7,0xD7,0xEE,0xDF,0xF7,0xAE,0xA8, + 0x18,0xF7,0xD7,0xF6,0x77,0xFF,0xAE,0xAA,0x18,0xF7,0xD7,0xF6,0xFF,0x7F,0x6E,0x7A, + 0xF7,0xF6,0xB7,0xEE,0x78,0xEE,0xBF,0xEB,0xD7,0xF6,0x75,0xE6,0xAE,0x7C,0xE0,0x02, + 0xD7,0xF6,0x96,0xEE,0x88,0x01,0x0D,0x37,0xD7,0xF6,0xB6,0xEE,0xA5,0xAD,0xAE,0x98, + 0xD7,0xF6,0x96,0xEE,0x02,0xA6,0xFE,0xFC,0xD7,0xF6,0x96,0xEE,0xE0,0x88,0x02,0xAE, + 0xD6,0xF6,0x34,0xE6,0x7A,0x7E,0x7E,0xF8,0x34,0xE6,0x71,0xCD,0x70,0x70,0x60,0x60, + 0xF3,0xDD,0x10,0xC5,0x2F,0x3D,0xB5,0xA5,0x34,0xE6,0xD3,0xD5,0xA0,0xA2,0x8B,0x09, + 0x14,0xDE,0xB2,0xD5,0xA8,0xAA,0x80,0xC8,0x13,0xDE,0xD2,0xD5,0xDA,0xEC,0xB8,0xBE, + 0x13,0xDE,0xD3,0xDD,0xBD,0x2F,0xAA,0x0A,0x34,0xE6,0xF3,0xDD,0xF7,0xEA,0x6A,0xFA, + 0xF3,0xDD,0xD3,0xD5,0x20,0x3A,0xA0,0x00,0x13,0xDE,0xD3,0xD5,0xA8,0xEF,0xFE,0xFA, + 0x84,0x49,0x03,0x39,0xEF,0xB5,0xA7,0x26,0x67,0x62,0x43,0x41,0x55,0xFD,0x0B,0x0F, + 0xEA,0x72,0x64,0x41,0x55,0xD5,0xA2,0x02,0xC8,0x72,0x43,0x39,0x75,0x57,0xFA,0x20, + 0xE6,0x72,0x62,0x41,0x55,0x55,0xFA,0xA0,0x06,0x52,0x64,0x41,0xE5,0xAF,0xFE,0xEC, + 0xC5,0x49,0xE2,0x30,0x5F,0x7A,0xAA,0x82,0x64,0x41,0xA1,0x28,0xF5,0xBF,0xFA,0xE8, + 0xE5,0x51,0x43,0x39,0x55,0xED,0x29,0xAD,0xE9,0x6A,0x43,0x39,0xF5,0xF3,0x82,0xEF, + 0xE5,0x51,0x43,0x39,0x7B,0xBA,0xA8,0xF8,0x85,0x41,0xE2,0x30,0xB5,0xDE,0xE8,0xEA, + 0xA5,0x49,0x02,0x31,0xA2,0x0A,0x2D,0x95,0xA8,0x6A,0x64,0x41,0xEB,0x03,0xAF,0x55, + 0xE6,0x51,0x02,0x31,0xEA,0xE8,0xF8,0xD7,0x85,0x41,0xE2,0x30,0x7B,0x70,0x7E,0x6B, + 0xA5,0x49,0x02,0x31,0x0B,0x09,0xB5,0x55,0xE8,0x6A,0x23,0x39,0x82,0xAB,0xF7,0x55, + 0x27,0x5A,0x02,0x31,0xBA,0xE8,0xFB,0x57,0x64,0x41,0xC2,0x28,0x5A,0xF8,0xF8,0xBB, + 0xE6,0x51,0xC1,0x28,0x2B,0xAD,0xD5,0xFF,0x87,0x62,0x23,0x39,0x82,0xFF,0x55,0x55, + 0x84,0x49,0xE2,0x30,0x00,0x08,0xFF,0xF5,0x64,0x41,0x02,0x39,0x5E,0xF0,0xE0,0x80, + 0x85,0x49,0xE2,0x30,0x2F,0x2D,0xBF,0x8A,0xE5,0x59,0x44,0x41,0xA8,0xFF,0x5D,0xDF, + 0xC5,0x51,0x64,0x49,0x7C,0xD5,0x75,0x3F,0xE5,0x59,0x44,0x49,0x7B,0xEB,0xBA,0xAA, + 0x47,0x6A,0x44,0x49,0x77,0x5F,0xFE,0xA2,0xA5,0x51,0x02,0x39,0xAA,0x6B,0xCB,0xAA, + 0x64,0x41,0xC1,0x30,0xEE,0x95,0xFF,0xFC,0xC5,0x51,0xE2,0x30,0x7D,0xEF,0x2B,0x0B, + 0xEA,0x72,0xE2,0x38,0x55,0xFF,0xFE,0x82,0xC6,0x51,0x23,0x39,0x55,0x5E,0xEA,0xA8, + 0x85,0x41,0xE2,0x30,0x95,0x35,0x1E,0x7A,0xA8,0x6A,0x44,0x41,0x55,0xBF,0x2D,0xB9, + 0x6A,0x83,0x23,0x39,0x55,0x7F,0xE2,0x82,0xA5,0x49,0x03,0x39,0x5F,0xFA,0xA0,0x80, + 0xA5,0x49,0xE2,0x30,0x25,0xA5,0xBE,0x7E,0x27,0x5A,0x84,0x41,0x27,0x0F,0x2B,0x75, + 0x68,0x62,0x84,0x41,0x77,0x7C,0xFA,0x7E,0xA5,0x49,0x03,0x39,0x56,0xE0,0x88,0xAE, + 0xE6,0x51,0x03,0x39,0xBD,0x37,0xB5,0x57,0x88,0x6A,0x23,0x39,0x8A,0xAA,0xEF,0x75, + 0x06,0x5A,0x63,0x41,0xFE,0xEC,0xFA,0xD5,0xA4,0x49,0x03,0x39,0x7C,0x7C,0xEA,0xAA, + 0x06,0x5A,0x02,0x31,0x09,0x0D,0xD5,0x55,0xC9,0x6A,0x22,0x39,0xE2,0x8A,0xDF,0xD5, + 0xC5,0x51,0x63,0x39,0xB8,0xE0,0x7A,0xBF,0xA5,0x49,0xE2,0x30,0xFC,0x52,0xEA,0x00, + 0x26,0x5A,0x03,0x31,0x2B,0xBD,0xFD,0xA2,0x88,0x6A,0x43,0x39,0x00,0xFF,0x75,0xFF, + 0x88,0x6A,0x43,0x41,0xA8,0xFF,0x55,0x7F,0xE6,0x51,0xE3,0x38,0x00,0xFA,0x55,0xF7, + 0x06,0x5A,0x44,0x41,0x88,0xFF,0xFD,0x2F,0x87,0x62,0xA4,0x49,0x5F,0x55,0xFD,0x00, + 0x46,0x5A,0x64,0x41,0x6F,0x57,0xFA,0xE0,0xC6,0x51,0x64,0x41,0xFE,0x7D,0xBB,0x82, + 0x26,0x5A,0x64,0x41,0x0B,0x2D,0xAF,0xBF,0x68,0x62,0xC5,0x51,0x82,0x8A,0xA8,0xE5, + 0x67,0x62,0x63,0x41,0x08,0xAA,0xFF,0xD5,0x67,0x6A,0xC5,0x51,0xA0,0xDF,0xBD,0x35, + 0x67,0x6A,0x43,0x41,0x7A,0x7A,0xEA,0xE8,0xC5,0x51,0xE2,0x38,0xB7,0xB7,0xFA,0xF0, + 0xE5,0x59,0x43,0x41,0xD7,0xF9,0x2B,0xA5,0x88,0x6A,0x64,0x49,0xD5,0xDF,0xC2,0xAA, + 0x26,0x62,0xA5,0x49,0x8A,0xEB,0xBA,0x5E,0xE5,0x51,0x03,0x39,0x8A,0xAE,0xDE,0xDE, + 0x26,0x5A,0x43,0x41,0xAF,0x3F,0x2F,0xF5,0x68,0x62,0x84,0x49,0x7F,0xFE,0xF8,0xDD, + 0xE6,0x51,0x43,0x41,0x5F,0x78,0x40,0x5B,0x64,0x41,0x03,0x39,0x03,0x3D,0x55,0x5E, + 0x0A,0x7B,0x23,0x39,0x8B,0xAF,0xFD,0x55,0x47,0x5A,0x23,0x39,0xBE,0xA8,0xFE,0x55, + 0xE5,0x51,0x03,0x39,0x8A,0xAA,0xFA,0x57,0xA5,0x49,0x03,0x39,0x00,0xAC,0xFF,0x55, + 0xA5,0x49,0x03,0x39,0x88,0xBE,0x76,0x55,0x85,0x49,0x03,0x39,0xE8,0xF8,0x55,0x55, + 0x43,0x39,0xE3,0x38,0x8E,0xAA,0xEA,0xFD,0xE6,0x51,0xE2,0x38,0x0A,0xBF,0xF5,0x5D, + 0xE6,0x51,0xE2,0x38,0xA8,0xFE,0x5F,0xF5,0x64,0x41,0x02,0x39,0xFC,0x7A,0x7B,0xFA, + 0x64,0x49,0x02,0x39,0xA8,0xFD,0x7D,0xFE,0x64,0x49,0x02,0x39,0x08,0xFF,0xAF,0xAD, + 0xA6,0x51,0x02,0x39,0x28,0xB9,0xBD,0x2F,0x54,0xE6,0x06,0x5A,0x29,0xB5,0xD5,0xD5, + 0x96,0xEE,0xCE,0xB4,0x00,0x00,0x03,0x09,0xB6,0xF6,0x96,0xEE,0xAA,0xEE,0xAA,0x0E, + 0xF7,0xF6,0x96,0xEE,0xF7,0xBF,0xBD,0x2B,0xD7,0xF6,0x96,0xEE,0x00,0xE0,0x68,0x70, + 0xB6,0xF6,0x76,0xEE,0x7A,0x7F,0xD6,0x75,0xB6,0xEE,0x76,0xEE,0xBD,0xAD,0x3D,0xAD, + 0xB6,0xEE,0x96,0xEE,0xDD,0xB5,0xE7,0x77,0xD7,0xF6,0x96,0xEE,0xEF,0xFB,0x69,0xE9, + 0x96,0xEE,0xF4,0xDD,0x80,0x80,0xF0,0x70,0x76,0xE6,0xF4,0xDD,0x3E,0xBD,0x3D,0xAD, + 0xB6,0xEE,0x55,0xE6,0x0A,0x2F,0xA9,0xB7,0xD7,0xF6,0x75,0xE6,0x0E,0x2B,0xFB,0xFF, + 0xD6,0xF6,0x96,0xEE,0x20,0x22,0xAF,0xFD,0xF8,0xFE,0x75,0xE6,0x5E,0xAA,0x82,0x0A, + 0xF8,0xF6,0x55,0xE6,0xFF,0x5F,0xE0,0xA0,0xD7,0xF6,0x34,0xDE,0x22,0xEF,0x5F,0xF8, + 0xD7,0xF6,0x34,0xDE,0x00,0x02,0xE7,0x55,0xF7,0xF6,0x54,0xE6,0x00,0x00,0x2A,0xB5, + 0x38,0xF7,0xD7,0xF6,0x57,0x7F,0xFF,0xB5,0xF7,0xF6,0xD7,0xF6,0xBF,0xAB,0xB0,0x20, + 0xF8,0xF6,0xD7,0xF6,0x75,0x4E,0x88,0x80,0x18,0xF7,0xD7,0xF6,0x27,0x5D,0x57,0xEB, + 0x18,0xF7,0xD7,0xF6,0x82,0xFF,0xD5,0xD7,0x18,0xF7,0xD7,0xEE,0x28,0xA8,0xEF,0xE7, + 0x18,0xF7,0xD7,0xF6,0x8A,0x02,0xA2,0x7B,0x18,0xF7,0xB7,0xF6,0xE0,0xAA,0xAA,0xA2, + 0xF8,0xFE,0xD7,0xEE,0x7A,0xEA,0xEA,0x7A,0xF7,0xF6,0xB7,0xEE,0xB7,0x7F,0xBF,0x82, + 0xD7,0xF6,0x96,0xEE,0x5E,0x62,0x8A,0x00,0xD7,0xF6,0x75,0xE6,0x22,0xA9,0x2F,0x9F, + 0xD7,0xF6,0xB7,0xEE,0x62,0x0B,0xA7,0xEB,0xD7,0xF6,0x76,0xEE,0xAE,0xBE,0xFE,0x78, + 0xD7,0xF6,0x75,0xE6,0x70,0x73,0xFF,0xEA,0x96,0xEE,0xD2,0xD5,0x7E,0x5A,0x7A,0x6A, + 0x92,0xCD,0x30,0xC5,0xA5,0xD6,0xBC,0xAC,0x34,0xE6,0x91,0xCD,0x09,0x2D,0xAD,0x35, + 0x14,0xE6,0xF3,0xD5,0xF8,0xFC,0x7E,0xFA,0x14,0xDE,0xD2,0xDD,0xAF,0xAB,0x8A,0x0A, + 0x34,0xE6,0xF3,0xDD,0x27,0x2F,0xAB,0x8A,0x33,0xE6,0xF3,0xDD,0x7A,0x7E,0x7E,0x7C, + 0x15,0xE6,0xF3,0xD5,0xFF,0xBF,0x9F,0xB7,0x14,0xDE,0xF3,0xDD,0x9F,0x9E,0xB8,0xB4, + 0x25,0x5A,0x43,0x41,0x55,0x5E,0x5E,0x68,0x27,0x5A,0x23,0x39,0x0B,0xAA,0xDD,0xF5, + 0xA9,0x6A,0x64,0x41,0x0A,0xEF,0x75,0x55,0x87,0x6A,0x43,0x41,0xA0,0xFB,0x55,0x77, + 0x45,0x5A,0x22,0x39,0x28,0xFF,0x5F,0x57,0xE5,0x51,0x43,0x39,0xA8,0xDF,0xD5,0xF5, + 0xA5,0x49,0x03,0x39,0x88,0xFC,0xDE,0xFA,0xA5,0x49,0x02,0x31,0x62,0x8B,0x0B,0x02, + 0xC5,0x49,0xE2,0x30,0xED,0xF7,0xAA,0xA0,0xA5,0x49,0x02,0x31,0x8F,0x5F,0x6A,0x2A, + 0x43,0x41,0xC1,0x28,0xAA,0xF5,0xB7,0xBC,0x84,0x41,0x23,0x39,0x05,0xA5,0x7A,0xA2, + 0xA9,0x6A,0xE2,0x30,0x55,0xFF,0xEA,0x02,0xC6,0x49,0x23,0x39,0x5D,0x7F,0xA9,0x80, + 0x64,0x41,0xC1,0x28,0x95,0x9F,0xBA,0xE8,0xC5,0x49,0x03,0x31,0xF7,0xAA,0x2B,0x0D, + 0xEA,0x72,0x43,0x39,0x55,0xFF,0x8B,0xAB,0x27,0x5A,0x43,0x41,0x55,0xF5,0xBE,0xE0, + 0xC5,0x49,0xE2,0x30,0xD5,0x56,0x7E,0x78,0x85,0x41,0xE2,0x30,0xAA,0x2B,0x09,0x2F, + 0xA9,0x6A,0x64,0x41,0x57,0x83,0x8B,0xF7,0xE6,0x51,0x23,0x39,0xF5,0xAE,0xA8,0xEE, + 0xA5,0x49,0xE2,0x30,0xD7,0x7A,0xE0,0xA2,0xA4,0x49,0xE2,0x30,0xAA,0x2B,0x2D,0xD5, + 0xA9,0x6A,0x44,0x41,0xAB,0x8B,0xEF,0x55,0xC6,0x51,0x43,0x49,0xFA,0xFC,0xFC,0xFF, + 0xA5,0x51,0x64,0x51,0x2E,0x2A,0x2B,0xC9,0xE6,0x61,0x84,0x51,0xFA,0xED,0xCF,0x82, + 0x27,0x6A,0xA4,0x59,0xC3,0xFD,0xD5,0xF5,0xA5,0x59,0x23,0x41,0xE8,0xF8,0x7C,0xF8, + 0x84,0x49,0xE2,0x38,0x7E,0x78,0xEA,0x20,0xA5,0x49,0xE2,0x30,0x01,0xAD,0xD7,0xBA, + 0x68,0x62,0x44,0x41,0x02,0xFF,0x5D,0xDD,0x48,0x62,0x23,0x39,0xFC,0x57,0x77,0xFF, + 0xA5,0x49,0xE2,0x30,0x7A,0xEE,0xAA,0x00,0xC6,0x51,0x03,0x31,0x0F,0x55,0xBF,0xAA, + 0x06,0x52,0x43,0x41,0x80,0xDD,0xBF,0xEE,0xC5,0x49,0x23,0x39,0xFA,0x7E,0xEA,0x0A, + 0xA5,0x49,0x02,0x31,0x7A,0xA2,0x02,0x00,0xC5,0x49,0x23,0x39,0xF5,0xBD,0x2A,0xAA, + 0xE6,0x51,0x43,0x39,0xF7,0xDB,0xA0,0xAA,0xC6,0x49,0x44,0x41,0x95,0xAF,0x2A,0xAA, + 0xC6,0x51,0x02,0x39,0x5E,0x70,0xE0,0xA8,0x84,0x49,0xE1,0x30,0xAD,0x2F,0x3F,0xF6, + 0x26,0x5A,0x44,0x41,0xBF,0x2B,0xBF,0xB5,0x87,0x62,0xA4,0x49,0x7D,0x82,0xA0,0xD5, + 0xE5,0x51,0x22,0x31,0x58,0xE8,0xEC,0xBE,0x85,0x41,0x23,0x39,0x2D,0xBD,0xD6,0x7E, + 0xE5,0x51,0x43,0x39,0x00,0x8A,0xAA,0xDD,0x06,0x52,0x84,0x41,0x00,0x0A,0x9F,0xF5, + 0x88,0x62,0x43,0x39,0x02,0x82,0xF7,0xD7,0x06,0x52,0x64,0x41,0xC0,0xB0,0xFF,0x55, + 0xE6,0x51,0x43,0x39,0x80,0xA8,0xBB,0xD7,0xA5,0x49,0x03,0x31,0x5C,0xF8,0x6A,0xFF, + 0xE5,0x51,0x03,0x31,0x2F,0xBD,0xF5,0x57,0x47,0x62,0x03,0x31,0x02,0xAB,0xFF,0x55, + 0x66,0x62,0x03,0x31,0xE8,0xFE,0xFF,0x55,0xA5,0x49,0xE2,0x30,0x00,0x88,0xEA,0x7D, + 0xC5,0x49,0xE2,0x30,0x22,0x8A,0xFF,0x55,0xC5,0x51,0x22,0x39,0x0A,0x2A,0xED,0xD5, + 0x46,0x5A,0xE2,0x30,0xF7,0x5E,0x7A,0xC2,0xE6,0x51,0xE2,0x30,0x02,0xBF,0xD5,0x57, + 0x46,0x62,0x02,0x39,0xA0,0xFF,0x55,0x55,0xC5,0x51,0x02,0x39,0x78,0xFA,0x95,0xB5, + 0xE6,0x59,0x02,0x39,0xF5,0x5F,0x5E,0x60,0xA5,0x51,0x02,0x39,0x00,0x7D,0x55,0xD7, + 0xA5,0x49,0x03,0x39,0xC8,0xDF,0xDD,0x2B,0x06,0x5A,0x43,0x41,0x75,0xE5,0x0F,0x0A, + 0x06,0x5A,0x03,0x39,0xF5,0xF7,0xFA,0xA0,0xA4,0x49,0x03,0x39,0xFF,0xFF,0xFD,0xA0, + 0xC5,0x51,0x02,0x39,0x75,0x75,0xFD,0x02,0xC5,0x51,0xE3,0x38,0x5F,0xDF,0xFF,0x00, + 0xE5,0x51,0xE2,0x30,0xFD,0xFD,0xB7,0x02,0x07,0x5A,0xE2,0x30,0x57,0x7D,0xEB,0x02, + 0x27,0x5A,0x23,0x39,0x55,0x55,0xDF,0x08,0x06,0x5A,0x02,0x39,0x55,0xD5,0xBA,0x00, + 0x06,0x62,0x03,0x39,0x55,0x7E,0xAA,0x00,0x67,0x62,0x03,0x39,0x75,0x7D,0xAA,0x88, + 0x06,0x5A,0x43,0x41,0x55,0xF5,0x20,0x20,0x47,0x62,0x43,0x41,0x55,0xF7,0xA2,0x80, + 0x47,0x62,0x23,0x39,0xD5,0xBF,0x00,0x02,0x27,0x62,0x44,0x41,0x55,0x8A,0x00,0x00, + 0x48,0x6A,0x64,0x49,0x55,0xEA,0xA0,0x2A,0x48,0x6A,0xA5,0x51,0x55,0xAA,0x0A,0x88, + 0x0A,0x83,0xC6,0x51,0xD5,0xBF,0xAF,0x2B,0x92,0xD5,0x47,0x62,0xD5,0xBF,0x2F,0x2B, + 0x75,0xEE,0x0F,0xC5,0x09,0x0B,0x02,0x02,0xD7,0xF6,0x96,0xF6,0xED,0xAF,0xBF,0x0B, + 0xD7,0xF6,0xB6,0xEE,0xC3,0xC2,0xE0,0xC0,0xB6,0xF6,0x76,0xEE,0xE0,0xE8,0xBA,0xB8, + 0x96,0xF6,0x75,0xE6,0xBE,0xDE,0xDA,0x6A,0x96,0xEE,0x55,0xEE,0x0B,0x0B,0xAB,0x6B, + 0x96,0xEE,0x34,0xE6,0x88,0xA8,0x7E,0xD7,0xB6,0xEE,0x55,0xE6,0x8B,0xFF,0xD5,0x55, + 0x76,0xEE,0xB3,0xD5,0xF0,0xF8,0x7E,0xFE,0x55,0xE6,0xF4,0xDD,0x29,0xED,0xB7,0x0F, + 0x75,0xE6,0xD3,0xD5,0x28,0xAE,0x7A,0xAA,0x75,0xEE,0x71,0xCD,0x00,0x0A,0xFF,0x7B, + 0x96,0xEE,0x51,0xC5,0x00,0x22,0xAA,0xDD,0x18,0xFF,0xF3,0xDD,0x0A,0x2A,0xBF,0xF5, + 0x18,0xFF,0x95,0xE6,0xE8,0x80,0xAB,0xFD,0xB7,0xF6,0xD6,0xEE,0xBA,0xAA,0xBB,0xAB, + 0xD7,0xF6,0x55,0xE6,0x5F,0xE0,0x82,0x8A,0xB6,0xEE,0x35,0xDE,0xD5,0xFF,0xEC,0xA0, + 0xD7,0xF6,0x35,0xDE,0x2B,0xD5,0x5F,0xEE,0x18,0xF7,0x35,0xE6,0x0A,0x2A,0xAF,0xD5, + 0x18,0xFF,0x96,0xEE,0x2A,0x20,0x0B,0xAD,0x18,0xFF,0xD7,0xF6,0xA8,0xEE,0x7A,0xE8, + 0x18,0xF7,0xD7,0xF6,0x8E,0x8A,0x8B,0xDF,0x18,0xFF,0xD7,0xF6,0xFE,0xEA,0xBA,0x7F, + 0x18,0xF7,0xD7,0xEE,0x5F,0x5E,0xF0,0xE2,0xD7,0xF6,0xF7,0xEE,0xA8,0xA8,0x02,0x22, + 0xD7,0xF6,0xB7,0xEE,0xC8,0xEC,0x8A,0x80,0xD7,0xF6,0xB7,0xEE,0x00,0x7E,0x6B,0xAA, + 0xF7,0xF6,0xB7,0xEE,0xEA,0xAF,0xBD,0xA7,0xF7,0xF6,0x55,0xE6,0xDA,0x60,0xE8,0xA2, + 0xD7,0xF6,0x55,0xE6,0x82,0x0B,0x09,0x35,0xD7,0xF6,0x55,0xE6,0x78,0xFA,0x78,0x68, + 0xB6,0xEE,0x55,0xE6,0x0B,0x0F,0xBF,0xF5,0x75,0xEE,0xD2,0xD5,0x68,0x68,0x60,0xC0, + 0xD3,0xDD,0x51,0xCD,0xD6,0xEE,0xBE,0xFC,0xF3,0xDD,0x71,0xCD,0x3F,0xBD,0xBD,0xBF, + 0x14,0xDE,0xF3,0xDD,0x34,0xF0,0xE2,0x81,0x14,0xDE,0xF3,0xDD,0xAF,0xEF,0xB7,0x03, + 0x34,0xE6,0xF4,0xDD,0x0B,0x83,0xAB,0xEA,0x34,0xE6,0xF3,0xDD,0x78,0x7A,0xFF,0xFF, + 0x14,0xDE,0xF3,0xDD,0xCF,0x5F,0xD7,0xF5,0x14,0xDE,0xD3,0xD5,0x8E,0xA7,0xAA,0x8A, + 0x25,0x5A,0x63,0x41,0x78,0xE2,0x80,0x8A,0xA4,0x49,0x02,0x39,0x3F,0xAF,0x2B,0x9E, + 0x68,0x62,0x63,0x41,0xBF,0x0F,0x2F,0xFD,0x88,0x62,0x43,0x41,0xBA,0x00,0x88,0x7F, + 0x27,0x5A,0x64,0x41,0x57,0xF8,0xE8,0x7F,0xC5,0x51,0x63,0x41,0xFF,0x83,0xA8,0x5F, + 0xC5,0x49,0x64,0x41,0x6A,0x0A,0x0A,0xD5,0xC5,0x49,0x43,0x39,0x2A,0xA8,0xE8,0x57, + 0xC5,0x49,0x23,0x39,0xA8,0x22,0xAB,0xF5,0xA5,0x49,0x02,0x31,0x2A,0xAA,0xFB,0x57, + 0xC5,0x49,0x02,0x31,0x7E,0xE3,0xA9,0x2D,0xA5,0x49,0x23,0x39,0x2B,0x35,0xF5,0xAB, + 0xA8,0x62,0x84,0x41,0xA9,0x55,0x55,0x0D,0xA8,0x62,0x43,0x39,0xFE,0x75,0x57,0xE0, + 0x84,0x41,0x02,0x31,0x78,0x7D,0x57,0x70,0xA5,0x41,0xE2,0x28,0xAD,0xF5,0xBF,0x2F, + 0xC5,0x49,0x23,0x39,0xE2,0xFD,0xBF,0xA8,0xA8,0x6A,0x43,0x39,0x7F,0xD5,0xAB,0x82, + 0xE6,0x51,0x23,0x31,0x76,0xDF,0xBE,0xF8,0xC6,0x51,0xC2,0x30,0xD7,0xD6,0xF8,0x68, + 0x84,0x49,0x23,0x39,0xDF,0xAF,0x03,0xAD,0x84,0x41,0x43,0x41,0xFB,0xCE,0x08,0x02, + 0x84,0x49,0x23,0x39,0xB5,0x3F,0x2F,0x8E,0xA5,0x49,0x03,0x39,0xD7,0xBA,0xA8,0xAE, + 0xA5,0x51,0x23,0x41,0xD5,0xFB,0xFA,0x9F,0x84,0x51,0x44,0x49,0xAD,0x9E,0x3A,0x95, + 0x06,0x62,0x43,0x49,0xAF,0x29,0x3F,0xBF,0xE5,0x69,0xC5,0x61,0xEF,0x6B,0x39,0x77, + 0xE5,0x61,0xA4,0x59,0xE8,0x60,0xE0,0xEC,0xC5,0x59,0x64,0x51,0xBB,0xB2,0xE2,0x7A, + 0xA5,0x51,0x44,0x49,0x22,0xBE,0x97,0x7F,0xA5,0x49,0x24,0x41,0xA8,0xBA,0xFE,0x55, + 0x85,0x49,0x24,0x41,0x02,0x3E,0x2F,0xF7,0xA5,0x49,0x44,0x41,0x82,0xEB,0xFF,0x95, + 0xA5,0x49,0x24,0x39,0x20,0xE2,0xCE,0x7F,0xA5,0x49,0x23,0x39,0x02,0xBA,0x2B,0x5F, + 0x85,0x41,0x03,0x39,0x00,0xA8,0xF8,0x77,0x85,0x49,0x03,0x39,0xA0,0x2A,0xAA,0x55, + 0xA5,0x49,0x03,0x39,0xA2,0xEF,0xEF,0x75,0x84,0x41,0xC2,0x30,0x00,0xA0,0xBA,0x57, + 0x84,0x49,0xE2,0x30,0x00,0x2A,0xAF,0x55,0xA5,0x49,0xE2,0x30,0x0A,0xAA,0xFB,0x55, + 0xA4,0x49,0xE2,0x30,0x0A,0xAA,0xF7,0x55,0x64,0x41,0xC2,0x30,0xF8,0x6B,0xEB,0x0B, + 0x84,0x41,0xE2,0x30,0x03,0xAD,0x55,0x55,0x63,0x41,0xC2,0x30,0x00,0xA8,0xD7,0xFD, + 0x64,0x41,0xC1,0x30,0x00,0xBF,0xDF,0xFF,0xC5,0x51,0x22,0x39,0x7F,0xFD,0xB5,0x05, + 0xA5,0x49,0x02,0x31,0xBF,0x55,0x57,0x5C,0x64,0x41,0x02,0x31,0x28,0x5D,0x55,0xFD, + 0x84,0x41,0x02,0x31,0x7F,0x55,0x5D,0x8F,0x64,0x41,0xC2,0x28,0xBA,0xF5,0xFF,0x28, + 0x64,0x41,0xE2,0x30,0xFB,0x5F,0x7F,0x02,0xE5,0x51,0x02,0x31,0xD5,0xB5,0xB5,0x0A, + 0x06,0x5A,0x02,0x31,0x5F,0x5E,0xF0,0x80,0xC6,0x51,0xC2,0x30,0x75,0xD5,0xBB,0x00, + 0xE7,0x59,0x03,0x31,0x55,0x55,0xFF,0x80,0xE6,0x59,0xE2,0x30,0x55,0x55,0xAF,0x00, + 0xE6,0x59,0x03,0x31,0x55,0x55,0x3B,0x00,0x26,0x5A,0x23,0x39,0x55,0xF5,0xAA,0x08, + 0x67,0x62,0xC5,0x51,0x43,0xE9,0xFD,0xBA,0x06,0x5A,0x03,0x39,0x57,0xFA,0x88,0x00, + 0x06,0x5A,0x24,0x41,0x55,0xBA,0x08,0x02,0x26,0x62,0x23,0x41,0xFD,0xAA,0x02,0x8A, + 0x27,0x62,0xC5,0x51,0x43,0x6A,0xA8,0xAA,0x27,0x62,0xA5,0x51,0x55,0xA3,0x28,0xA8, + 0x26,0x62,0xA4,0x51,0xBD,0xA8,0x22,0x8A,0x47,0x62,0xC5,0x51,0x7F,0xAE,0x2A,0xDF, + 0x26,0x62,0xA5,0x51,0x22,0x2A,0xA8,0xBD,0x26,0x62,0xC5,0x51,0xDA,0xA2,0xAA,0x6F, + 0x27,0x62,0xC5,0x51,0x2F,0xBE,0x2A,0xF6,0x27,0x62,0xA5,0x51,0xA8,0x08,0x0A,0x97, + 0x27,0x62,0xC4,0x51,0xEA,0xA2,0xFC,0xD7,0x47,0x62,0xA4,0x51,0x8B,0x8A,0xDF,0xBF, + 0xA8,0x72,0xC6,0x51,0xEF,0xEF,0x57,0x3B,0xA8,0x72,0x85,0x51,0xAA,0xFB,0xD7,0x00, + 0x29,0x83,0xE5,0x59,0x5D,0x55,0x55,0x0B,0x8B,0x8B,0xA4,0x51,0xF7,0x75,0xFD,0x00, + 0x4D,0xA4,0x05,0x5A,0x55,0x55,0x55,0x02,0xCF,0xB4,0xE5,0x59,0x55,0x55,0xDD,0x00, + 0x30,0xBD,0xE5,0x59,0x55,0x55,0xFF,0x00,0x71,0xC5,0x05,0x5A,0x55,0x55,0xEF,0x00, + 0xB3,0xD5,0x07,0x62,0x55,0x55,0xAB,0x00,0x14,0xDE,0x47,0x62,0x55,0x55,0xAA,0x00, + 0x34,0xE6,0x87,0x6A,0xD5,0xBD,0x22,0x00,0x55,0xE6,0x4D,0xAC,0xBD,0x2B,0x00,0x00, + 0xD7,0xF6,0x35,0xE6,0xAD,0xAD,0xAB,0x0B,0xF8,0xFE,0xB7,0xF6,0xBD,0xEF,0x6B,0x7A, + 0xD6,0xF6,0x96,0xEE,0xEC,0xF7,0xBF,0x7B,0xB6,0xF6,0x76,0xEE,0xFA,0xBA,0x7A,0x7E, + 0x96,0xEE,0x75,0xEE,0x58,0xFF,0xED,0x7F,0x76,0xEE,0xF3,0xDD,0xC2,0xE8,0x78,0x7A, + 0x34,0xE6,0xD3,0xD5,0x2E,0xBD,0xBD,0xA5,0x75,0xEE,0x14,0xDE,0xAF,0xEF,0xAD,0x2B, + 0x96,0xEE,0xF3,0xDD,0xF7,0x9F,0xBF,0x22,0x96,0xEE,0x34,0xE6,0x7D,0xFB,0xA2,0x80, + 0x75,0xEE,0x35,0xE6,0xE9,0x0B,0x02,0x0A,0x96,0xEE,0x14,0xDE,0x7F,0xA8,0x00,0x0A, + 0x96,0xEE,0x51,0xCD,0x57,0xA0,0x00,0x00,0x96,0xEE,0x10,0xC5,0xBD,0x57,0xE0,0x00, + 0x96,0xEE,0x71,0xC5,0x0A,0xBD,0xD5,0x5E,0xB6,0xEE,0x92,0xCD,0x00,0x0A,0xAF,0xFD, + 0xD7,0xF6,0x55,0xE6,0xAA,0xA2,0x0B,0xF5,0xD7,0xF6,0x96,0xEE,0x4B,0x2B,0x2B,0x2B, + 0xD7,0xF6,0x96,0xEE,0x55,0xBF,0x20,0x00,0xD7,0xF6,0xD3,0xD5,0xFA,0x78,0x60,0xA0, + 0xB6,0xEE,0x72,0xCD,0x02,0x0B,0xA5,0xD5,0x18,0xF7,0x55,0xE6,0x02,0x0A,0xBB,0xB5, + 0x18,0xFF,0xD8,0xF6,0xFE,0xEE,0xA2,0x0B,0x18,0xFF,0xD7,0xF6,0xFD,0xEF,0xBA,0xAA, + 0x18,0xF7,0xF7,0xF6,0xF9,0x77,0xFD,0xF7,0x18,0xF7,0xD7,0xEE,0xFA,0xBA,0xAF,0xBA, + 0xF7,0xF6,0xB6,0xEE,0xF2,0xFA,0xFC,0xE0,0xB7,0xF6,0xF7,0xEE,0xAF,0xEB,0xAA,0xAB, + 0xF7,0xF6,0x96,0xEE,0xFF,0xFE,0xFA,0x6A,0xD7,0xF6,0x96,0xEE,0xE0,0x8B,0xEB,0xEF, + 0xB6,0xEE,0x14,0xDE,0x2F,0x36,0xDE,0x7E,0xD7,0xF6,0x55,0xE6,0x78,0xEA,0xEA,0xEB, + 0x96,0xEE,0x34,0xE6,0x2D,0x8F,0xBE,0xB7,0x96,0xEE,0x14,0xDE,0x60,0x40,0x62,0xE8, + 0xF3,0xDD,0x72,0xCD,0xDE,0x7E,0x5C,0x5C,0xB2,0xD5,0x72,0xCD,0x3E,0xBF,0xF7,0xF5, + 0x14,0xDE,0xD3,0xD5,0x8B,0x0D,0xA9,0x29,0x34,0xE6,0xF4,0xDD,0xA7,0xBF,0xEA,0xAB, + 0x34,0xE6,0x14,0xDE,0x70,0x80,0x2E,0x2F,0x34,0xE6,0xF4,0xDD,0xDE,0xFA,0xF8,0xFF, + 0x14,0xDE,0xD3,0xD5,0xFE,0xBA,0x6E,0xF2,0x34,0xE6,0xF4,0xDD,0xF5,0xBD,0x2D,0x3F, + 0x46,0x62,0xC5,0x51,0x7F,0xF6,0xD6,0xFC,0x05,0x52,0x23,0x39,0xDE,0x7A,0x60,0x60, + 0xC5,0x49,0x22,0x39,0xEF,0xED,0xE9,0x35,0x27,0x62,0x43,0x41,0x55,0xBD,0x03,0x0B, + 0x88,0x6A,0x63,0x41,0x55,0xFF,0x80,0xEA,0xC5,0x49,0x43,0x41,0x55,0xAA,0xA8,0xE8, + 0xC4,0x49,0x42,0x39,0xFD,0x2A,0xAA,0xFB,0xA4,0x49,0x43,0x39,0xDA,0x28,0xAA,0xEF, + 0xA4,0x49,0x64,0x41,0xAE,0x28,0xFC,0x59,0xA5,0x49,0x43,0x39,0x6B,0xF0,0xFA,0x7B, + 0x84,0x41,0x23,0x39,0xBD,0xFA,0xCA,0xAA,0xA5,0x49,0x02,0x31,0x22,0x03,0x2D,0xE5, + 0xCA,0x8B,0xA4,0x49,0x0D,0xB5,0x55,0x55,0xEC,0x8B,0x63,0x41,0xE0,0xEA,0x57,0x55, + 0xA5,0x49,0x03,0x31,0x60,0xE0,0xC8,0xEE,0x44,0x31,0xA1,0x28,0x2B,0xFE,0xDE,0x5F, + 0x84,0x41,0xC1,0x28,0x28,0xAA,0xAB,0xAD,0x26,0x5A,0x02,0x31,0x02,0xFF,0xFF,0x75, + 0xC5,0x49,0x02,0x39,0xB8,0xFE,0xFB,0x55,0xE6,0x51,0x03,0x39,0x72,0xE3,0xEF,0x55, + 0x44,0x41,0xC1,0x30,0x0B,0x8F,0xF8,0x58,0xA4,0x49,0xE1,0x30,0xA2,0xBA,0xFF,0x55, + 0x84,0x49,0xE2,0x30,0x28,0xF8,0xFF,0x55,0x64,0x41,0xC1,0x30,0x00,0x82,0xFB,0x55, + 0x64,0x49,0xC1,0x30,0x00,0x00,0xFF,0x55,0x84,0x51,0x02,0x39,0x3A,0x0E,0x2D,0x05, + 0x26,0x6A,0x84,0x59,0xFD,0xBF,0x2B,0xAB,0x47,0x72,0xC5,0x61,0xF5,0xBF,0xF8,0xEA, + 0x26,0x72,0xE5,0x61,0x73,0x5C,0xBE,0xEA,0x05,0x6A,0x64,0x51,0x7E,0x7E,0x58,0x60, + 0x85,0x59,0x04,0x41,0xFA,0x7E,0x58,0x7A,0x04,0x41,0xA2,0x30,0x00,0xFA,0x5E,0x80, + 0x24,0x41,0xA2,0x30,0x3E,0x7F,0x7F,0x0B,0x24,0x41,0xA2,0x28,0xAC,0x7F,0x7F,0x02, + 0x44,0x41,0xA2,0x28,0xEB,0x5D,0xFB,0x20,0x85,0x49,0xC2,0x30,0x55,0x55,0xDD,0x20, + 0x85,0x49,0xC3,0x30,0x75,0x55,0xFF,0x00,0xA5,0x51,0xE2,0x30,0x55,0x55,0xF7,0x00, + 0x27,0x5A,0xE3,0x38,0x55,0xD5,0xF7,0xA8,0x07,0x5A,0xA2,0x28,0x55,0x5F,0xAE,0x02, + 0x07,0x5A,0xC2,0x30,0x55,0x7F,0xAB,0x20,0x06,0x5A,0xC2,0x30,0x55,0xFD,0xBA,0x00, + 0x27,0x5A,0xE2,0x30,0x55,0xFF,0xAA,0x02,0x06,0x5A,0x03,0x39,0xAD,0xAF,0x20,0x00, + 0x67,0x62,0x23,0x39,0x57,0xFF,0xAA,0xA2,0x27,0x5A,0x23,0x39,0x55,0xAB,0x08,0x80, + 0x06,0x5A,0x43,0x41,0xD5,0x2B,0x00,0x00,0x46,0x62,0xA4,0x49,0xD5,0xAF,0xAA,0xEA, + 0x27,0x62,0x84,0x49,0xD7,0x2A,0x00,0xA2,0x27,0x5A,0x84,0x49,0xF5,0x8A,0xA0,0xEA, + 0x06,0x5A,0xA5,0x49,0xF5,0x8A,0x00,0xA2,0x46,0x5A,0xA5,0x51,0xD7,0x2A,0xA0,0xBB, + 0x26,0x5A,0xA4,0x51,0xAB,0x80,0x20,0xD7,0x26,0x5A,0x84,0x49,0x22,0xA8,0xA8,0xF7, + 0x27,0x62,0x84,0x49,0xA8,0x82,0xAA,0xB5,0x07,0x5A,0xA5,0x51,0xC2,0x2F,0xE9,0xDE, + 0x28,0x62,0x85,0x51,0xA0,0x8A,0xF5,0xAE,0x48,0x6A,0x65,0x49,0xAA,0xEA,0x5F,0x2B, + 0x68,0x72,0x85,0x49,0xFB,0xFF,0x7F,0x8A,0x47,0x62,0xA5,0x51,0xBE,0xBF,0xF5,0x02, + 0x88,0x72,0x06,0x5A,0x7F,0x7F,0xF5,0x3B,0x6B,0x8B,0x84,0x49,0x5F,0x5D,0xFF,0x02, + 0x4E,0xAC,0xC5,0x51,0x55,0x55,0xD5,0x00,0xB0,0xB4,0xC5,0x51,0x55,0x55,0xFF,0x00, + 0x52,0xC5,0xC6,0x59,0x55,0x55,0xFF,0x00,0x93,0xCD,0xC5,0x59,0x55,0x55,0xAF,0x00, + 0xB3,0xD5,0xE6,0x59,0x55,0x55,0xAA,0x00,0xF5,0xDD,0x85,0x51,0x55,0xFF,0xAA,0x00, + 0x56,0xE6,0xA5,0x51,0x55,0xFF,0xAA,0x00,0x97,0xEE,0x26,0x62,0x55,0xFF,0xAA,0x00, + 0x15,0xDE,0x27,0x62,0x55,0xAB,0x20,0x00,0x36,0xE6,0x88,0x6A,0x55,0xAA,0x00,0x00, + 0x75,0xE6,0x29,0x83,0x55,0xAA,0x08,0x00,0x96,0xEE,0xCB,0x93,0x55,0xAA,0x00,0x00, + 0x96,0xEE,0x0D,0x9C,0xD5,0xAA,0x00,0x00,0x97,0xEE,0x90,0xAC,0xF5,0xA2,0x00,0x00, + 0x96,0xEE,0x11,0xBD,0xF5,0xAA,0x00,0x00,0xB6,0xEE,0x72,0xCD,0xD5,0xAA,0x00,0x00, + 0x96,0xEE,0xD3,0xD5,0xD5,0xAA,0x00,0x00,0xB6,0xEE,0xD3,0xD5,0xFD,0xAA,0x00,0x00, + 0xF6,0xF6,0x34,0xDE,0x55,0xFF,0xEB,0xAA,0xB6,0xEE,0x34,0xDE,0xF7,0xAA,0x82,0x00, + 0xB6,0xEE,0x55,0xE6,0xDD,0xAA,0x22,0x00,0xB6,0xEE,0x55,0xE6,0xED,0xAA,0x02,0x00, + 0xD6,0xF6,0x75,0xE6,0xDD,0xEB,0xAA,0x2A,0xF8,0xF6,0x96,0xEE,0x55,0xD7,0xAF,0xAB, + 0xF7,0xFE,0x96,0xEE,0xBD,0xAB,0xAA,0xB8,0xD6,0xF6,0x96,0xEE,0xF8,0xFE,0xFE,0xFA, + 0xB6,0xF6,0x96,0xEE,0xE8,0xBA,0xD2,0xF3,0x96,0xEE,0x55,0xEE,0xE0,0xE0,0x80,0x82, + 0x75,0xEE,0x34,0xE6,0x88,0xEA,0xA8,0x78,0x55,0xE6,0xF3,0xDD,0x7A,0x78,0x7E,0x7E, + 0x55,0xE6,0x92,0xD5,0xB7,0x97,0xAA,0x00,0xD7,0xF6,0x14,0xDE,0xBD,0xAD,0xAF,0x2B, + 0xF7,0xF6,0x96,0xEE,0xFD,0xAF,0x0A,0x8A,0xF7,0xF6,0x96,0xF6,0x6B,0x8A,0x80,0xA2, + 0xD7,0xF6,0x75,0xE6,0x57,0xDA,0xE8,0x28,0x96,0xEE,0x55,0xE6,0xAF,0xFA,0xFA,0xC8, + 0xB6,0xEE,0x75,0xE6,0xBF,0xD5,0x95,0x7F,0xB6,0xEE,0x55,0xE6,0x88,0xAA,0xBB,0xFF, + 0x96,0xEE,0xF3,0xD5,0x70,0x00,0x00,0x00,0x96,0xEE,0xB3,0xD5,0xD5,0xDE,0xE0,0x00, + 0x55,0xE6,0xF4,0xD5,0x2A,0x29,0xAD,0x98,0xB7,0xEE,0x35,0xE6,0x02,0xAF,0xB9,0xFD, + 0xF8,0xF6,0x75,0xE6,0x2A,0x2F,0xA5,0x75,0xF7,0xF6,0xB7,0xF6,0xFA,0xA0,0x8A,0x2D, + 0xF7,0xF6,0xD3,0xD5,0x5E,0xEA,0x20,0x00,0xF8,0xF6,0xB3,0xD5,0xBD,0xFF,0xE8,0x00, + 0xD7,0xF6,0x34,0xDE,0x0A,0x0B,0xB5,0xBA,0x18,0xFF,0x96,0xE6,0xA0,0x82,0x2F,0xAD, + 0x18,0xFF,0xF8,0xF6,0x95,0xDE,0xDF,0xBA,0x18,0xF7,0xF7,0xF6,0x7A,0xFF,0x5F,0x5D, + 0x18,0xFF,0xD7,0xF6,0x6F,0xFA,0xA2,0xE2,0xF7,0xF6,0xB6,0xEE,0xEA,0xBB,0xFC,0xF0, + 0xD7,0xF6,0xB6,0xEE,0xDA,0xFE,0xFC,0x54,0xB6,0xEE,0x96,0xEE,0xB2,0xB2,0x50,0xD0, + 0xB6,0xEE,0x13,0xDE,0x58,0xF8,0xE0,0xF8,0x96,0xEE,0x34,0xE6,0x83,0x0B,0x89,0xA5, + 0x75,0xEE,0x14,0xDE,0x36,0xBE,0xDC,0xFC,0x75,0xEE,0x55,0xE6,0x78,0x7B,0xED,0xFD, + 0x34,0xE6,0x92,0xCD,0x5E,0x5E,0x5C,0x58,0x92,0xCD,0x31,0xCD,0x2A,0x3A,0xA8,0x08, + 0x34,0xE6,0x92,0xCD,0xAB,0xAB,0x29,0x2B,0x55,0xE6,0xF3,0xDD,0xBD,0xF7,0xF5,0xAB, + 0x34,0xE6,0xF4,0xDD,0x8A,0xEC,0xCA,0xE2,0x35,0xE6,0xF4,0xDD,0xB7,0xFF,0xAF,0xEF, + 0x14,0xDE,0xF3,0xDD,0xFA,0x28,0xB0,0x7E,0x34,0xE6,0xF4,0xDD,0xF7,0xDF,0x77,0xEE, + 0x88,0x6A,0xA5,0x51,0x58,0x78,0xE0,0xF0,0xE6,0x59,0x84,0x41,0x7A,0xF2,0xAE,0xF0, + 0x84,0x49,0xE1,0x30,0x2F,0xFE,0x5C,0x58,0xC5,0x51,0xC1,0x30,0x0B,0xAB,0xBF,0xD5, + 0xE5,0x51,0x02,0x31,0xA0,0x8B,0xEA,0x57,0xC4,0x49,0xE1,0x28,0xA2,0x88,0xA8,0x5D, + 0xA5,0x49,0xC2,0x30,0x8A,0x08,0xEA,0xDF,0xC5,0x49,0xA1,0x28,0xAA,0x02,0xEA,0x7F, + 0x64,0x41,0xC1,0x28,0x00,0x00,0xBF,0xE9,0x64,0x41,0xE2,0x30,0x00,0x28,0x5F,0xFF, + 0xA5,0x49,0x02,0x31,0xE8,0xB7,0xB5,0x0D,0x64,0x41,0xC1,0x28,0xB6,0x5C,0xB8,0x80, + 0x43,0x39,0xC1,0x28,0x2A,0xDF,0xFF,0xEA,0x44,0x39,0xC2,0x28,0x28,0xD7,0x7F,0xEF, + 0x64,0x41,0xA1,0x28,0xFB,0xFD,0xFD,0x82,0x64,0x41,0xC2,0x28,0x57,0x5D,0xFF,0x2B, + 0x64,0x41,0xC1,0x28,0x75,0xD5,0xEF,0x02,0x85,0x49,0xC1,0x28,0x55,0xD5,0xFF,0x82, + 0xA6,0x49,0xE2,0x30,0x5D,0x55,0x5D,0x8A,0xC5,0x51,0xE2,0x30,0xF5,0x95,0x95,0x02, + 0xE6,0x51,0xE2,0x30,0x5E,0xFA,0xEA,0x00,0x06,0x52,0xC1,0x30,0x55,0xD5,0xEB,0x08, + 0x06,0x5A,0xC1,0x30,0x55,0x77,0xAA,0x0A,0x06,0x5A,0xC1,0x30,0x55,0xFD,0xAA,0x02, + 0x06,0x62,0xC1,0x30,0x55,0xFF,0xAA,0x00,0x06,0x62,0x02,0x41,0xB5,0xEF,0x2A,0xA0, + 0x27,0x72,0xA4,0x59,0x3D,0x2F,0x07,0xAF,0x26,0x72,0xE5,0x69,0x82,0x02,0xE8,0xFE, + 0x26,0x72,0xE5,0x69,0xFA,0x22,0xAF,0xDD,0x46,0x72,0xE6,0x69,0x5A,0xDC,0xA7,0xFD, + 0x26,0x6A,0x85,0x59,0x56,0xF8,0xA8,0xA2,0x06,0x62,0x64,0x49,0x7E,0xAA,0x0A,0x8C, + 0x06,0x62,0x64,0x49,0x75,0xA8,0xB0,0xBA,0x06,0x5A,0x84,0x49,0xF5,0x2A,0xAA,0xAA, + 0x27,0x5A,0xA5,0x51,0xDF,0x32,0xAB,0x57,0x07,0x5A,0x84,0x49,0xAE,0xA2,0x82,0x7B, + 0xE6,0x59,0x84,0x49,0x2A,0x02,0xA0,0x77,0x07,0x5A,0x84,0x49,0xA8,0x0A,0xAB,0xDF, + 0x27,0x62,0x84,0x49,0x8A,0xAB,0xFF,0xF5,0x27,0x62,0xA4,0x51,0x2A,0xEB,0x7E,0x57, + 0x46,0x62,0x84,0x49,0xBA,0xAB,0x7D,0x3D,0x47,0x62,0x44,0x49,0xAA,0xEA,0xFF,0x08, + 0xC8,0x72,0x83,0x49,0xFF,0xFF,0xF5,0x2A,0x2A,0x7B,0x84,0x51,0xFF,0x57,0x5D,0x02, + 0xAC,0x93,0xA5,0x51,0xD7,0x55,0xD5,0x22,0x0D,0xA4,0xC5,0x51,0x55,0x55,0x77,0x02, + 0x6F,0xAC,0x43,0x41,0xF7,0x55,0xBF,0x00,0xD1,0xBC,0xC5,0x51,0x55,0x55,0xFF,0x00, + 0x72,0xCD,0xE6,0x59,0x55,0x55,0xFF,0x00,0x93,0xCD,0xE5,0x59,0x55,0x55,0xBB,0x00, + 0xB3,0xD5,0x63,0x49,0x55,0xFF,0xAA,0x00,0xF4,0xDD,0xA4,0x51,0x55,0xFD,0xAA,0x00, + 0x56,0xEE,0xA4,0x51,0x55,0xFF,0x2A,0x00,0x76,0xEE,0x06,0x62,0x55,0xFF,0x2A,0x00, + 0xF4,0xDD,0xE5,0x59,0x55,0xAA,0x20,0x00,0x15,0xE6,0xA8,0x72,0x55,0xAA,0x00,0x00, + 0x55,0xE6,0x2B,0x83,0x55,0xAA,0x08,0x00,0x55,0xE6,0x8C,0x93,0xD5,0xAA,0x00,0x00, + 0x35,0xE6,0x2D,0xA4,0x55,0xAA,0xA0,0x80,0x52,0xCD,0xCC,0x9B,0x55,0xE8,0xE0,0x78, + 0xAC,0x93,0x46,0x6A,0xEA,0x60,0x58,0x56,0xAF,0xB4,0x06,0x62,0x2B,0x2F,0x25,0xB5, + 0x76,0xEE,0x10,0xBD,0xAF,0x2B,0x09,0x09,0xB7,0xF6,0xF4,0xDD,0x55,0xAA,0x22,0x02, + 0xB7,0xF6,0x15,0xDE,0xF5,0xEA,0x02,0x00,0xD7,0xF6,0x35,0xE6,0xF5,0xAB,0x2A,0x2A, + 0xD7,0xF6,0x55,0xE6,0x57,0xAE,0xA2,0x2A,0xD7,0xF6,0x76,0xEE,0x75,0xBE,0x2A,0x82, + 0xD7,0xF6,0x76,0xEE,0xFD,0xAA,0x28,0x08,0xD7,0xF6,0x96,0xEE,0x75,0xDE,0xAA,0xA8, + 0xD7,0xF6,0x76,0xEE,0xFD,0xBF,0xAA,0x28,0xD6,0xF6,0xB7,0xEE,0x75,0xFD,0x6A,0xFA, + 0xD7,0xF6,0x96,0xEE,0xBF,0xEF,0xAA,0xAA,0x96,0xF6,0xD7,0xEE,0xAE,0xBF,0xF7,0xFF, + 0xD7,0xF6,0x96,0xEE,0xD7,0xFF,0xAA,0x2A,0xD6,0xF6,0xB7,0xEE,0x77,0xFF,0xFA,0x6B, + 0xB7,0xF6,0xB6,0xEE,0xFF,0xFB,0xEF,0xFF,0xD7,0xF6,0xB6,0xEE,0xFD,0x6F,0xEB,0xEA, + 0xD6,0xF6,0xB6,0xEE,0xA9,0xB9,0xBF,0xFD,0xD7,0xF6,0xB6,0xEE,0xFF,0xEA,0x68,0xFA, + 0xD7,0xF6,0xB6,0xEE,0x55,0xBF,0x77,0xFF,0xB6,0xF6,0xD7,0xEE,0x8A,0xC8,0x82,0x22, + 0xD7,0xF6,0xB6,0xEE,0x7B,0x7B,0xFB,0xBB,0xD7,0xF6,0x96,0xEE,0xBA,0xBA,0xBE,0xFE, + 0xD7,0xF6,0xB7,0xEE,0x2B,0x32,0x28,0x2A,0xF7,0xF6,0xB6,0xF6,0x8E,0x83,0xA0,0x72, + 0xD6,0xF6,0x96,0xEE,0xA8,0xB8,0xFF,0xD7,0xB6,0xF6,0x96,0xEE,0xA2,0x60,0x7A,0xB7, + 0x96,0xEE,0x75,0xEE,0x00,0xBB,0x5F,0x5C,0xB7,0xF6,0x35,0xE6,0xA2,0xEA,0xEE,0x5F, + 0x55,0xE6,0x14,0xDE,0xA8,0xBA,0xA7,0xAF,0x96,0xEE,0xF3,0xDD,0xD7,0xBF,0xBF,0x2F, + 0xD7,0xF6,0x34,0xE6,0xF7,0xFF,0x0A,0x22,0xF7,0xF6,0x96,0xEE,0xBD,0x0B,0xA2,0x8A, + 0xF7,0xF6,0xD7,0xF6,0xA7,0xA7,0xA2,0xEB,0xF7,0xF6,0xD7,0xF6,0xEA,0x6A,0xFB,0xED, + 0xF7,0xF6,0xB6,0xEE,0xFA,0xFA,0xEA,0xA2,0xD7,0xF6,0x96,0xEE,0x5E,0xEE,0xCA,0x80, + 0xB6,0xEE,0x76,0xEE,0x7B,0xAB,0xAA,0x00,0xB6,0xEE,0x76,0xE6,0xD5,0xFE,0xFA,0xFC, + 0x96,0xEE,0x76,0xE6,0xEF,0xDE,0x6F,0xBA,0xB6,0xEE,0x56,0xE6,0x2A,0x2A,0x2B,0x0A, + 0xF7,0xF6,0x55,0xE6,0x5E,0x7A,0xEA,0xAA,0xD7,0xF6,0x34,0xDE,0xB5,0xFF,0xAA,0x80, + 0xB6,0xEE,0x75,0xE6,0x5D,0xAF,0xAB,0xA0,0xF7,0xF6,0x96,0xEE,0x2D,0xBD,0xE5,0xBF, + 0x18,0xFF,0xD7,0xF6,0xAA,0xBB,0xBD,0xB5,0x18,0xF7,0xD7,0xF6,0xFD,0xBA,0xEA,0xA8, + 0xF8,0xF6,0xD7,0xF6,0x56,0xF8,0x08,0xAC,0xF8,0xF6,0xB7,0xEE,0x55,0x7A,0xC0,0x00, + 0x18,0xFF,0x96,0xE6,0x82,0x0D,0xB7,0xFE,0x18,0xFF,0xD7,0xEE,0xAE,0xAE,0xAE,0xAD, + 0x18,0xFF,0xF7,0xF6,0xF7,0xD7,0xAF,0xBD,0x18,0xFF,0xD7,0xF6,0x5A,0x7E,0x7E,0x7A, + 0xD7,0xF6,0x96,0xEE,0xFE,0x72,0xEF,0xEB,0xB6,0xEE,0x75,0xE6,0xAA,0xBA,0x7E,0x7E, + 0x96,0xEE,0x14,0xDE,0xE0,0xE0,0xE8,0x7B,0x96,0xEE,0xF3,0xDD,0x2D,0xBD,0xB5,0xD5, + 0x75,0xEE,0xF3,0xDD,0xFC,0x78,0xF0,0xF8,0x55,0xE6,0x14,0xE6,0x8A,0xA3,0xA9,0xFD, + 0x34,0xE6,0x92,0xCD,0x78,0x78,0x70,0x68,0x92,0xCD,0x51,0xC5,0x3E,0xB5,0xD5,0x9E, + 0x14,0xE6,0x92,0xCD,0x0B,0x0B,0x29,0x0F,0x54,0xE6,0x14,0xDE,0xEB,0xDF,0x57,0xD7, + 0x34,0xE6,0xF4,0xDD,0xC2,0xAA,0xAE,0x6E,0x14,0xDE,0xB3,0xD5,0x0A,0xA8,0xAA,0x2B, + 0x14,0xDE,0xD3,0xD5,0x37,0x2F,0x2A,0x20,0x34,0xE6,0xF4,0xDD,0xEA,0x7E,0x5F,0x76, + 0x8B,0x8B,0x06,0x5A,0x7E,0x7E,0x78,0x78,0x06,0x5A,0xA5,0x49,0xDE,0xFA,0x58,0x60, + 0xA5,0x49,0xC1,0x30,0x68,0xE8,0x82,0x00,0xA5,0x49,0xA1,0x28,0xD5,0xFF,0xAA,0x08, + 0x47,0x62,0xE1,0x30,0x55,0xD5,0xAB,0x0A,0x88,0x6A,0xE1,0x30,0x55,0xFF,0x2A,0x00, + 0xE9,0x72,0x23,0x39,0x55,0xAB,0x0A,0x22,0xE9,0x72,0x84,0x41,0x55,0xFA,0xA0,0xA8, + 0x67,0x62,0x64,0x41,0xF5,0xAA,0x00,0xA0,0x87,0x62,0x64,0x41,0x55,0xFE,0xA8,0xAA, + 0x68,0x62,0x43,0x39,0xBD,0xAA,0x22,0xAA,0x27,0x5A,0x84,0x49,0x5E,0xA0,0xA8,0xAA, + 0x07,0x5A,0x84,0x41,0x55,0x20,0x00,0xA0,0x27,0x5A,0x84,0x49,0x55,0x08,0x00,0xFB, + 0x27,0x5A,0x84,0x49,0xBD,0xA0,0x88,0xEF,0x07,0x5A,0xA5,0x49,0xAD,0x28,0x26,0x77, + 0x27,0x5A,0x84,0x49,0xAA,0x00,0xAF,0x77,0x47,0x5A,0x85,0x49,0xEB,0xA2,0xFB,0x55, + 0x07,0x5A,0x64,0x49,0x2A,0x02,0xAA,0x55,0x27,0x62,0x84,0x49,0xAA,0xF0,0x7F,0x55, + 0x47,0x62,0x64,0x49,0x02,0xEA,0x7F,0x55,0x27,0x5A,0x65,0x49,0x00,0xA8,0x57,0xD5, + 0x27,0x62,0x85,0x49,0x0A,0x8A,0x55,0x55,0x06,0x5A,0x65,0x49,0x80,0xE3,0xDD,0x3A, + 0x47,0x6A,0x64,0x49,0xEA,0xFF,0x55,0x82,0x47,0x6A,0x84,0x51,0xFE,0x5F,0xD5,0xE8, + 0x06,0x6A,0xC5,0x61,0xBB,0x9F,0xA9,0xA5,0x06,0x72,0xE5,0x69,0xD4,0x5F,0x5F,0x5A, + 0x46,0x7A,0xE5,0x69,0xF5,0xFD,0xAF,0xF9,0x26,0x72,0xE5,0x69,0x6F,0xFF,0xA2,0x2A, + 0x88,0x82,0xE6,0x69,0x7F,0xAD,0x29,0x2B,0x4E,0xAC,0xA5,0x59,0x55,0x57,0xAF,0x0A, + 0x73,0xCD,0xE6,0x61,0x55,0x55,0xAB,0x08,0xB3,0xD5,0x84,0x51,0x55,0xDD,0xAA,0x00, + 0x14,0xDE,0x83,0x49,0x55,0xFF,0xAA,0x00,0x34,0xDE,0xE5,0x59,0x55,0xFF,0x2A,0x00, + 0x95,0xEE,0x26,0x62,0x55,0xFF,0x2A,0x00,0xF3,0xDD,0x46,0x62,0x55,0xAB,0x08,0x00, + 0x14,0xDE,0x88,0x6A,0x55,0xAA,0x00,0x00,0x34,0xDE,0x0A,0x7B,0x55,0xAA,0x00,0x00, + 0x55,0xE6,0x6B,0x8B,0x5D,0xAA,0x00,0x00,0x75,0xE6,0x2D,0x9C,0x55,0xAA,0x00,0x00, + 0x96,0xEE,0x6E,0xAC,0x55,0x2A,0x00,0x00,0x96,0xEE,0xF0,0xBC,0x55,0xAA,0x00,0x00, + 0xB6,0xEE,0x52,0xC5,0x75,0xAA,0x22,0x80,0xB6,0xEE,0x93,0xCD,0xD5,0xAA,0x00,0x00, + 0x96,0xEE,0xF4,0xDD,0x55,0xBB,0x00,0x00,0xB6,0xF6,0x14,0xDE,0x55,0xAE,0xAA,0x00, + 0xB6,0xF6,0x15,0xDE,0xF7,0xAA,0x28,0x00,0xB6,0xEE,0x35,0xE6,0x5D,0xAA,0x28,0x00, + 0xB6,0xEE,0x55,0xE6,0x7D,0xEA,0x22,0x00,0xB6,0xEE,0x55,0xE6,0xFD,0x2A,0x00,0x00, + 0xB6,0xEE,0x76,0xEE,0x57,0xBB,0x22,0x00,0xB6,0xF6,0x56,0xEE,0xF7,0xAF,0x0A,0x00, + 0xB6,0xF6,0x96,0xEE,0x75,0xED,0xB8,0x00,0xB6,0xF6,0x96,0xEE,0xF5,0xFE,0xFA,0x00, + 0x96,0xF6,0xB6,0xEE,0xA8,0xEE,0xEE,0xD5,0xB6,0xF6,0x14,0xE6,0xAA,0xE0,0x6A,0x60, + 0x34,0xE6,0x4E,0xAC,0xA0,0xE8,0x68,0x7A,0xAF,0xBC,0x06,0x62,0xE0,0xF8,0x7E,0x5E, + 0x66,0x72,0xE6,0x61,0xFC,0x7B,0x7E,0x5E,0xE9,0x82,0xC5,0x61,0x3D,0xBD,0xB7,0xD5, + 0x75,0xEE,0x8B,0x93,0x0B,0x29,0x0D,0x2D,0x18,0xFF,0x96,0xEE,0xF5,0xFF,0xAB,0x2B, + 0xF8,0xF6,0xB7,0xF6,0xD5,0xBF,0x2A,0x08,0xF7,0xF6,0xB7,0xEE,0xFD,0xAA,0x00,0x00, + 0x17,0xFF,0xD7,0xF6,0x7D,0xBF,0xEA,0xAA,0x18,0xF7,0xD7,0xF6,0xD5,0xBA,0x3B,0xAA, + 0xF7,0xF6,0xB6,0xEE,0xEA,0xE8,0xD0,0xE8,0xF7,0xF6,0xB6,0xEE,0xDB,0xBB,0xAA,0xAB, + 0xD7,0xF6,0xB6,0xEE,0xBA,0x28,0x0A,0x22,0xD7,0xF6,0xB7,0xEE,0x82,0x82,0x00,0x02, + 0xD7,0xF6,0xB7,0xEE,0xF0,0x3A,0x82,0x89,0xD7,0xF6,0xB7,0xEE,0x9C,0xBE,0xAB,0x82, + 0xD7,0xF6,0xB7,0xEE,0x3F,0xFB,0xAE,0x0E,0xD7,0xF6,0xB7,0xEE,0xEA,0xE2,0xAA,0xA8, + 0xD7,0xF6,0xB6,0xEE,0xEF,0xA2,0xA0,0xA0,0xD7,0xF6,0xB6,0xEE,0xF1,0xEB,0xA8,0xAA, + 0xD7,0xF6,0xB7,0xEE,0xBF,0xEB,0x4A,0xAA,0xD6,0xF6,0xB7,0xEE,0xD7,0xF5,0xAF,0x8A, + 0xD7,0xF6,0xB6,0xEE,0x7F,0xFB,0xFA,0xEA,0xD7,0xF6,0xB6,0xEE,0xE3,0x8A,0x7D,0x2F, + 0xD7,0xF6,0xB6,0xEE,0xEF,0x6A,0x2B,0x29,0xF7,0xF6,0xB6,0xEE,0x5D,0xFF,0xBF,0x2B, + 0xF7,0xF6,0xB6,0xF6,0x2B,0x8A,0xE2,0xF8,0xD7,0xF6,0x75,0xEE,0xF0,0xF8,0x7E,0xFE, + 0x96,0xEE,0x75,0xEE,0x26,0xBF,0x64,0x6D,0xB6,0xF6,0x75,0xEE,0xAB,0x7B,0x7F,0x55, + 0x96,0xEE,0x34,0xE6,0xC0,0xE8,0xEE,0x7A,0x55,0xE6,0xF3,0xDD,0xA0,0xA8,0xFA,0x7E, + 0x55,0xE6,0xF3,0xDD,0x2A,0x2A,0x2B,0x09,0xB7,0xF6,0x55,0xE6,0x2D,0x2B,0x0B,0x8B, + 0xD7,0xF6,0x96,0xEE,0x3A,0xE8,0xEA,0xFF,0xD7,0xF6,0x96,0xEE,0x02,0x3B,0xAB,0x2B, + 0x17,0xF7,0xB7,0xF6,0xFB,0xFF,0xFD,0x55,0xF7,0xF6,0xD7,0xF6,0xAD,0xAD,0x65,0x6D, + 0xF7,0xF6,0x97,0xEE,0x28,0x88,0xAA,0x8E,0xF7,0xF6,0xD7,0xF6,0xD6,0xF6,0x55,0x77, + 0xD7,0xF6,0xB7,0xEE,0x7E,0xB8,0xA8,0x08,0xD7,0xF6,0x96,0xEE,0xFB,0xFA,0xEA,0x08, + 0x96,0xF6,0xB7,0xEE,0xBB,0xDD,0x7D,0x55,0xB7,0xEE,0x96,0xEE,0xF5,0x7E,0x68,0x80, + 0xB6,0xEE,0x96,0xEE,0x03,0xB5,0xB6,0x2E,0xF7,0xF6,0xB6,0xEE,0x7F,0xAD,0x2D,0xAD, + 0xF7,0xF6,0xB6,0xEE,0x55,0x5A,0x6A,0x20,0xD7,0xF6,0xB7,0xEE,0xE5,0xED,0xEF,0x98, + 0x18,0xFF,0xB6,0xF6,0xBF,0xAD,0xBE,0xAB,0x38,0xFF,0xF8,0xF6,0xFF,0xAF,0xA9,0xAF, + 0x39,0xFF,0xF8,0xF6,0x57,0x5E,0x7A,0xFA,0x18,0xF7,0xD7,0xF6,0xFA,0x7B,0xFA,0xF8, + 0xF7,0xF6,0x96,0xEE,0x68,0x80,0x02,0x08,0xF7,0xF6,0xB6,0xEE,0x2D,0xB7,0xD6,0x7E, + 0xF7,0xF6,0xD7,0xF6,0x02,0x0A,0x20,0x29,0x38,0xFF,0xD7,0xF6,0x7F,0x7B,0xFF,0x7D, + 0xD7,0xF6,0x96,0xEE,0xFE,0xEC,0xFE,0xB8,0xB6,0xEE,0x55,0xE6,0xFA,0x78,0xF8,0x7A, + 0x75,0xE6,0x14,0xDE,0x6A,0x6A,0x6E,0x68,0x34,0xE6,0x92,0xCD,0xAE,0x3F,0x95,0xD5, + 0x55,0xE6,0x14,0xE6,0x72,0x62,0x42,0x63,0xF4,0xE5,0x34,0xDE,0x7F,0xFA,0xFA,0xFA, + 0x55,0xEE,0xB3,0xD5,0x60,0x68,0xE0,0xE2,0xB2,0xD5,0x51,0xC5,0x2F,0xB7,0xF6,0xF6, + 0x34,0xE6,0x92,0xCD,0x2F,0x0F,0xA9,0x29,0x34,0xE6,0x14,0xDE,0x02,0x88,0x0B,0xFA, + 0x35,0xE6,0xF4,0xDD,0xFA,0xFE,0x9E,0xB7,0x14,0xDE,0xD3,0xDD,0x3E,0xFC,0xEE,0xBA, + 0x14,0xDE,0xD3,0xDD,0x28,0xBA,0x9F,0xE7,0x14,0xDE,0x92,0xCD,0xA8,0xA8,0xEA,0x60, + 0x51,0xC5,0x87,0x6A,0x5E,0x78,0xE0,0x80,0xCB,0x93,0xC5,0x51,0x57,0x57,0x5E,0xE8, + 0xE5,0x59,0x63,0x49,0xAE,0xAF,0xF7,0xA0,0xE5,0x59,0x42,0x41,0x22,0x0A,0xFF,0xDF, + 0x47,0x62,0x43,0x41,0x00,0xAE,0xFF,0xE7,0x67,0x62,0x43,0x41,0x00,0xBA,0x7F,0xFA, + 0x88,0x6A,0x84,0x49,0x20,0xFF,0x55,0xFF,0x67,0x6A,0x84,0x49,0x8A,0x6F,0x75,0x20, + 0xC9,0x7A,0x84,0x49,0xFF,0x5D,0x55,0x02,0x6B,0x8B,0x84,0x49,0x7F,0x55,0x55,0x02, + 0xED,0x9B,0x84,0x49,0x55,0x55,0xFF,0x00,0x6E,0xAC,0xA5,0x49,0x55,0x55,0xFF,0x00, + 0xD0,0xB4,0xA5,0x51,0x55,0x55,0xFF,0x00,0x32,0xBD,0xA5,0x51,0x55,0x55,0xEF,0x00, + 0x32,0xC5,0xA5,0x51,0x55,0x55,0xAA,0x00,0x92,0xCD,0xA5,0x49,0x55,0xF5,0xAA,0x00, + 0xF3,0xDD,0x84,0x49,0x55,0xFF,0xAA,0x00,0x34,0xE6,0xA5,0x51,0x55,0xFF,0xAA,0x00, + 0x14,0xDE,0x06,0x5A,0x55,0xFF,0x8A,0x00,0xB3,0xD5,0xC5,0x51,0x55,0xAA,0x00,0x00, + 0xF4,0xDD,0x67,0x6A,0x55,0xAA,0x00,0x00,0x14,0xDE,0xE9,0x72,0x55,0xAA,0x00,0x00, + 0x35,0xDE,0x6B,0x8B,0x55,0xAA,0x08,0x00,0x35,0xE6,0xAD,0x93,0xF5,0xAA,0x00,0x00, + 0x35,0xE6,0x70,0xAC,0x55,0xAA,0x00,0x00,0x35,0xE6,0xA8,0x7A,0x7E,0xFA,0xE0,0xE0, + 0x87,0x7A,0x84,0x59,0xF7,0xF6,0x54,0x54,0xE5,0x69,0xA4,0x61,0x20,0x22,0x23,0x3D, + 0x05,0x72,0xC5,0x69,0xBE,0xBF,0x3E,0x37,0x26,0x72,0xE5,0x69,0xFA,0xBA,0xB8,0xD7, + 0x88,0x7A,0x06,0x72,0x2D,0xBD,0xB5,0xD5,0x6E,0xB4,0x67,0x72,0x0B,0x2D,0xB5,0xF5, + 0x35,0xE6,0x0C,0xAC,0x2A,0x0B,0x2F,0xAD,0x96,0xF6,0x35,0xE6,0xB5,0xAA,0xAB,0x09, + 0xB6,0xF6,0x55,0xE6,0xDD,0xFB,0xAB,0x2A,0xB6,0xF6,0x75,0xEE,0x55,0xFF,0xEA,0xAA, + 0x96,0xF6,0x75,0xE6,0x5F,0xAE,0x8B,0x08,0xB6,0xF6,0x75,0xE6,0xD7,0xEF,0x2A,0x22, + 0xB6,0xF6,0x96,0xE6,0x57,0xAB,0xAE,0xA2,0xB6,0xF6,0x75,0xEE,0xFD,0xEE,0xB0,0x3A, + 0xB7,0xF6,0x75,0xEE,0xBD,0xBB,0xAA,0xAA,0xB6,0xF6,0x96,0xEE,0x7E,0xCA,0x03,0x0F, + 0x96,0xF6,0xB6,0xEE,0x76,0x5F,0x77,0xFF,0xD7,0xF6,0x96,0xEE,0xD5,0xFF,0xFF,0xBC, + 0xB6,0xF6,0x95,0xEE,0xEF,0xAA,0x0A,0x0A,0x96,0xFE,0xB6,0xEE,0x7D,0xF7,0xDF,0xFF, + 0xB7,0xF6,0xB6,0xEE,0xFF,0xBE,0xEB,0xAA,0xD6,0xF6,0x95,0xEE,0xFB,0xAA,0x29,0xAF, + 0xD7,0xF6,0xB6,0xEE,0x7D,0xAA,0x00,0x02,0xF6,0xF6,0xD7,0xF6,0x55,0x57,0x7F,0xEB, + 0xF7,0xF6,0xB6,0xEE,0xD7,0xAB,0x82,0x00,0xF7,0xF6,0xB7,0xEE,0xF7,0x2A,0x22,0x80, + 0xF7,0xF6,0xB6,0xEE,0xFB,0xEA,0x8A,0x22,0xF7,0xF6,0xB6,0xEE,0xBF,0x2A,0x00,0x00, + 0xF7,0xF6,0xD7,0xF6,0x55,0x58,0xE2,0xA0,0xF8,0xFE,0xB6,0xF6,0xDD,0xAA,0x2B,0xEA, + 0xD7,0xF6,0x75,0xEE,0x88,0x80,0xE0,0x60,0xB6,0xF6,0xEF,0xBC,0xA0,0xE8,0xEA,0x7A, + 0x51,0xCD,0x87,0x7A,0xE0,0xE8,0x5A,0x5E,0xC8,0x7A,0x26,0x6A,0x7C,0xFF,0xF5,0xF5, + 0x46,0x72,0xE5,0x61,0x7C,0xC0,0x88,0x60,0x66,0x72,0xC5,0x61,0x15,0x95,0x9E,0xBF, + 0x75,0xEE,0x8A,0x93,0x2D,0x2D,0x2D,0x2D,0x18,0xFF,0x96,0xF6,0x29,0x2B,0xAB,0x8B, + 0xF8,0xFE,0x17,0xF7,0xAA,0xAA,0xAA,0xE2,0x18,0xFF,0xF7,0xF6,0xD7,0xD5,0xAF,0xBE, + 0x18,0xFF,0xF7,0xF6,0xAF,0xFF,0xEE,0xB9,0x18,0xFF,0xF7,0xF6,0x7E,0xAA,0xAA,0x6E, + 0xF7,0xF6,0xD7,0xF6,0x70,0xE8,0xE2,0xA8,0xF7,0xF6,0xD7,0xF6,0xDB,0xDA,0x5D,0xD5, + 0xF7,0xF6,0xD7,0xF6,0x55,0x5D,0x6B,0x7B,0xF6,0xF6,0xD7,0xF6,0x55,0x5F,0x7E,0x7F, + 0xB7,0xF6,0xD6,0xEE,0xBA,0xEA,0xAA,0xFB,0xD7,0xF6,0xB7,0xEE,0x8A,0x02,0x02,0xC8, + 0xD7,0xF6,0xB6,0xEE,0xAA,0x22,0x28,0x2F,0xD7,0xF6,0xB7,0xEE,0x82,0x02,0x28,0x2E, + 0xD7,0xF6,0xB7,0xEE,0x80,0xA8,0x3E,0xA3,0xD7,0xF6,0xF7,0xEE,0x00,0x0A,0x82,0x82, + 0xF7,0xF6,0xB6,0xEE,0xFF,0xDA,0xFE,0xBA,0xD7,0xF6,0xB6,0xEE,0x8B,0x8A,0xA2,0x28, + 0xD7,0xF6,0xB6,0xEE,0xE2,0xEA,0xBE,0xBE,0xF7,0xF6,0xB6,0xEE,0xF7,0xFF,0xEA,0xEA, + 0xF7,0xF6,0xD7,0xF6,0x55,0x5F,0xBD,0x2D,0x18,0xFF,0xD7,0xF6,0xAD,0xE9,0xFB,0x5E, + 0xF7,0xF6,0x96,0xEE,0xE8,0xFA,0xDE,0x7E,0xB6,0xF6,0x96,0xEE,0xDE,0x7D,0x77,0x7F, + 0x96,0xEE,0x75,0xEE,0x72,0xFA,0x5E,0x54,0x96,0xEE,0x14,0xE6,0xEA,0xF8,0x7A,0x5A, + 0x55,0xEE,0xF4,0xDD,0xA0,0xA2,0xEA,0xFF,0x14,0xDE,0x71,0xCD,0x80,0xE8,0x7C,0xD6, + 0x55,0xE6,0xB2,0xD5,0x03,0xAD,0xBD,0x8B,0x76,0xEE,0x14,0xDE,0x00,0xEB,0x55,0xF2, + 0x96,0xEE,0xB2,0xD5,0x00,0x2A,0xD7,0x5F,0x96,0xF6,0xD3,0xD5,0x00,0x00,0xAF,0xD5, + 0xB7,0xF6,0x14,0xDE,0x08,0x02,0xAA,0xF5,0xD7,0xF6,0x55,0xE6,0x00,0x88,0xEB,0xF7, + 0xD7,0xF6,0x96,0xEE,0x0A,0x0A,0x2D,0xD5,0xF7,0xF6,0xB6,0xF6,0xEE,0x0A,0x2B,0xBD, + 0xF7,0xF6,0xD7,0xF6,0x75,0xD6,0xB7,0x29,0xF8,0xF6,0xD7,0xF6,0x55,0xFD,0xDF,0xE7, + 0xD7,0xF6,0xB7,0xEE,0x5E,0x58,0xF8,0x70,0x97,0xF6,0xB6,0xEE,0xDF,0xFF,0xFF,0x5F, + 0xD7,0xF6,0x96,0xEE,0x2E,0xA3,0xFE,0xFA,0xD7,0xF6,0xB7,0xEE,0x08,0x2A,0xAF,0xF5, + 0xF7,0xF6,0xB7,0xEE,0x82,0xAA,0xAF,0x0B,0xF7,0xF6,0xD7,0xF6,0xEA,0x08,0x20,0x82, + 0x18,0xF7,0xD8,0xF6,0x3D,0xAF,0xBF,0xEB,0x38,0xFF,0xF7,0xF6,0xAB,0x2E,0xAB,0xAF, + 0x39,0xFF,0x18,0xF7,0x7F,0xEA,0xEA,0x22,0x38,0xFF,0xF8,0xF6,0x5F,0xDE,0xFF,0x68, + 0x18,0xF7,0xD7,0xF6,0xBF,0xFA,0xEA,0xFE,0xF7,0xF6,0xB7,0xEE,0xE8,0xA0,0xA2,0xFA, + 0xF7,0xF6,0xB6,0xEE,0x0D,0x25,0x17,0xD7,0xF7,0xF6,0x97,0xEE,0xA0,0x88,0xA8,0xEA, + 0xD7,0xF6,0x96,0xEE,0xEA,0xFA,0x60,0xE2,0x96,0xEE,0x55,0xE6,0xE0,0xE0,0xE0,0xE0, + 0x55,0xE6,0xD3,0xD5,0x60,0xEA,0xF2,0xF0,0xB3,0xD5,0x0F,0xBD,0x2E,0x2E,0x3E,0x16, + 0x55,0xE6,0xF3,0xDD,0xA3,0x0B,0x09,0xA9,0x14,0xDE,0xB3,0xDD,0x0A,0x0A,0xA8,0xBA, + 0x34,0xE6,0xF4,0xDD,0x82,0xEA,0xEB,0x8B,0xD3,0xD5,0x30,0xC5,0xD6,0xDC,0xDC,0x5C, + 0x14,0xE6,0x71,0xCD,0x2B,0x29,0x2D,0x0F,0x34,0xE6,0x14,0xDE,0xD4,0xF5,0x95,0x55, + 0x35,0xE6,0xF3,0xDD,0xEF,0xEE,0xDA,0xE0,0x14,0xDE,0xF3,0xDD,0xFA,0x00,0x28,0x54, + 0x14,0xDE,0xD3,0xDD,0xAA,0xBC,0xFE,0x3A,0xF3,0xDD,0x10,0xC5,0xC0,0x60,0x60,0x60, + 0xB6,0xEE,0x92,0xCD,0x7F,0xFA,0xA8,0x80,0x55,0xE6,0x2D,0xA4,0x5E,0xAA,0x20,0x00, + 0x14,0xDE,0x29,0x7B,0x55,0xAA,0x80,0x00,0xF4,0xDD,0xC8,0x72,0x55,0xAA,0x00,0x00, + 0x14,0xDE,0x09,0x7B,0x55,0xAA,0x02,0x00,0x15,0xDE,0x8B,0x8B,0x55,0xAA,0x00,0x00, + 0x35,0xE6,0x0D,0x9C,0x55,0xAA,0x00,0x00,0x55,0xE6,0x70,0xAC,0x55,0xAA,0x08,0x00, + 0x55,0xE6,0xF1,0xBC,0x55,0xAA,0x0A,0x00,0x76,0xE6,0x32,0xC5,0x57,0xAB,0x28,0x00, + 0x76,0xEE,0x72,0xCD,0xD5,0xBA,0x08,0x00,0x75,0xEE,0xD3,0xD5,0x55,0xBB,0x20,0x00, + 0x75,0xEE,0xD3,0xD5,0x55,0xEA,0x00,0x00,0x75,0xEE,0xD4,0xD5,0xDD,0xAA,0x82,0x00, + 0x76,0xEE,0xF4,0xDD,0x75,0x82,0x02,0x00,0x96,0xF6,0x14,0xDE,0x57,0xEE,0xAA,0x0A, + 0x95,0xEE,0x34,0xE6,0x55,0xBB,0xAA,0x00,0x96,0xEE,0x34,0xE6,0x7F,0xAE,0x8A,0x08, + 0x96,0xEE,0x34,0xE6,0xD7,0xEA,0xAA,0x88,0x96,0xEE,0x55,0xE6,0xFD,0xAF,0xA8,0xA8, + 0x96,0xEE,0x34,0xE6,0xFD,0xA8,0xA8,0x08,0xB7,0xF6,0x55,0xE6,0xDD,0xFF,0xBF,0x2B, + 0x96,0xEE,0x75,0xEE,0xFD,0x8B,0x23,0x00,0x96,0xEE,0x76,0xEE,0x55,0xF0,0x00,0x00, + 0xB6,0xF6,0x76,0xEE,0xF5,0xFD,0xBB,0xAD,0xB6,0xF6,0x4D,0xAC,0x78,0x6A,0x78,0x68, + 0xC8,0x82,0x83,0x61,0x54,0xD8,0x7C,0xFC,0xE5,0x69,0x84,0x61,0x3B,0x57,0xFF,0xBF, + 0x26,0x72,0x84,0x61,0x2F,0x27,0xBF,0xBF,0x26,0x72,0xE5,0x69,0xDF,0xF0,0xA8,0x02, + 0x27,0x72,0xA4,0x69,0x20,0x2B,0x2E,0x96,0xE8,0x82,0x26,0x72,0x3D,0xD5,0xD5,0x55, + 0x51,0xCD,0xA8,0x82,0x0B,0x2D,0xBD,0xB5,0x96,0xF6,0x31,0xCD,0x0A,0x0B,0x2F,0x3D, + 0x96,0xF6,0xB6,0xEE,0xA3,0xA8,0xA0,0x80,0xB6,0xF6,0x96,0xEE,0xEF,0x2B,0xBA,0xA8, + 0xB6,0xF6,0x96,0xEE,0x2F,0xE8,0x2B,0xA7,0xB6,0xF6,0x96,0xEE,0xBF,0xBF,0xFA,0xA8, + 0xB6,0xF6,0x96,0xEE,0xB8,0xEA,0xAA,0x2F,0xB6,0xF6,0x96,0xEE,0xF3,0xBB,0xFB,0xBA, + 0xB6,0xF6,0x96,0xEE,0xEA,0xFA,0xFE,0x9F,0xB7,0xF6,0x96,0xEE,0x07,0xBB,0xE8,0x8A, + 0xB6,0xF6,0x96,0xEE,0x88,0xAA,0xFF,0xAB,0xB6,0xF6,0x96,0xEE,0x0E,0x0F,0x82,0x82, + 0xB6,0xF6,0x96,0xEE,0xEA,0xAB,0xBA,0xA8,0xB6,0xF6,0x97,0xEE,0x8B,0xA0,0x0A,0x22, + 0xB6,0xF6,0xD7,0xEE,0x08,0xA0,0xA8,0xE8,0xD7,0xF6,0xB6,0xEE,0xDD,0x1D,0xAB,0x22, + 0xF7,0xF6,0xD7,0xF6,0xB5,0x25,0x23,0x0A,0xD7,0xFE,0xF7,0xF6,0xDD,0x77,0x5D,0xF5, + 0xF7,0xF6,0xD7,0xF6,0x88,0xAA,0xA2,0x08,0x17,0xFF,0xD7,0xF6,0x6E,0x6E,0xFB,0xEF, + 0x17,0xFF,0xD7,0xF6,0xED,0xAD,0xBF,0xBF,0xF7,0xFE,0xF7,0xF6,0xFF,0xDF,0x77,0xF7, + 0xD7,0xFE,0xF7,0xF6,0xF7,0xED,0xFF,0xAB,0xF7,0xFE,0xB6,0xF6,0xA8,0xAA,0xEA,0x7A, + 0xB7,0xF6,0x92,0xD5,0x80,0xE0,0xE8,0x7A,0xD2,0xDD,0xA7,0x82,0xA0,0xE8,0xE8,0x7A, + 0x8A,0x93,0x26,0x72,0x7C,0x5E,0xFF,0x7D,0xA7,0x82,0x26,0x72,0xF6,0xE7,0xBA,0xAA, + 0xA7,0x7A,0x05,0x6A,0x7F,0xFE,0xEA,0xCE,0x87,0x7A,0xE4,0x61,0xF7,0x95,0x37,0x37, + 0x75,0xEE,0xCC,0xA3,0x2D,0x2D,0x2D,0x29,0xF7,0xF6,0x96,0xF6,0x03,0x09,0x0B,0x02, + 0x18,0xFF,0xF7,0xF6,0xF7,0xE5,0xFF,0xB6,0x17,0xFF,0xF7,0xF6,0xEF,0xBD,0xED,0x9F, + 0xF8,0xFE,0x17,0xF7,0x7F,0x77,0xFF,0xFF,0x18,0xFF,0xF7,0xF6,0xF8,0x28,0xF0,0x4A, + 0x17,0xFF,0xD7,0xF6,0xFA,0xEA,0xAA,0x7A,0xF7,0xF6,0xD7,0xF6,0x77,0xDD,0x3D,0x2D, + 0xF7,0xF6,0xD7,0xF6,0xEF,0xDD,0xFD,0xFA,0xF7,0xF6,0xD7,0xF6,0xD6,0xFF,0xFB,0xBB, + 0xD7,0xF6,0xB6,0xEE,0x0A,0x00,0x88,0x20,0xD7,0xF6,0xF6,0xEE,0x02,0x20,0x28,0x28, + 0xF7,0xF6,0xB6,0xEE,0xBD,0xAA,0x2A,0xAE,0xD7,0xF6,0xB6,0xEE,0x08,0xA2,0x80,0x08, + 0xD7,0xF6,0xB7,0xEE,0x08,0xBE,0x20,0x80,0xD7,0xF6,0xD6,0xEE,0xA8,0xAA,0xAA,0xAA, + 0xD7,0xF6,0xB6,0xEE,0x20,0xA8,0xA8,0x20,0xD7,0xF6,0xF7,0xEE,0x20,0x20,0xE8,0xA0, + 0xF7,0xF6,0xB6,0xEE,0xBE,0xFA,0xAE,0xBE,0xF7,0xF6,0xD7,0xF6,0x55,0x55,0xF5,0x2D, + 0xF7,0xFE,0xD7,0xEE,0xAB,0x8A,0xE0,0x7A,0xF7,0xF6,0xB6,0xF6,0xE0,0x7A,0x5E,0x57, + 0xD6,0xF6,0x96,0xEE,0x5E,0xDE,0x5E,0x5F,0x75,0xF6,0x96,0xEE,0x55,0xF7,0xFD,0xE7, + 0x96,0xEE,0x34,0xE6,0xAA,0xBA,0xF0,0x7A,0x55,0xE6,0xF3,0xDD,0x7C,0x7C,0x7A,0x5E, + 0xF3,0xDD,0x92,0xD5,0xC2,0xFA,0x68,0xF2,0x34,0xE6,0x51,0xCD,0xF7,0x9D,0x27,0x0B, + 0xB6,0xF6,0x13,0xDE,0xAD,0x2B,0x0A,0x02,0xB6,0xF6,0x76,0xEE,0x7E,0x08,0x08,0x20, + 0x96,0xEE,0xF4,0xDD,0x7E,0xF8,0x80,0x00,0x55,0xEE,0xD3,0xD5,0x57,0xFA,0x8A,0x00, + 0x55,0xEE,0xF3,0xDD,0xFD,0xFD,0x2C,0x02,0x75,0xEE,0x14,0xDE,0xAB,0xB5,0xFA,0x0A, + 0x96,0xEE,0x34,0xE6,0x2B,0xBD,0xF5,0x7A,0xD6,0xF6,0x55,0xE6,0x0A,0xAF,0xED,0xF5, + 0xF8,0xF6,0x96,0xEE,0x0A,0xAB,0xBF,0xD5,0xF7,0xF6,0xB6,0xF6,0xA2,0xAA,0x2B,0xA7, + 0xF8,0xF6,0xB6,0xEE,0x7B,0xFA,0xE8,0xAA,0xD7,0xF6,0xB7,0xEE,0xE7,0xAF,0x22,0x02, + 0xD7,0xF6,0x96,0xEE,0xFE,0x6A,0xF0,0x20,0xD7,0xF6,0x96,0xEE,0x8D,0xAD,0xF7,0xBE, + 0xF7,0xF6,0xB7,0xEE,0x2F,0xBB,0xAB,0xAB,0x18,0xFF,0xD7,0xF6,0xFF,0xBF,0x2B,0xAE, + 0x18,0xF7,0xF8,0xF6,0xAD,0xD6,0xD6,0xEE,0x18,0xF7,0xF8,0xF6,0x27,0x95,0xD5,0xF7, + 0x39,0xFF,0xF7,0xF6,0x02,0x2B,0x0B,0xB7,0x38,0xFF,0xF8,0xF6,0xE0,0xA8,0x20,0x02, + 0x18,0xFF,0xD7,0xEE,0xFE,0xF8,0xFC,0x78,0xB7,0xF6,0xD7,0xEE,0xFD,0xDB,0xFF,0xBB, + 0xB6,0xEE,0x76,0xE6,0x28,0xB8,0x58,0x58,0xD7,0xF6,0x96,0xEE,0x80,0x8A,0x09,0x0D, + 0xD7,0xF6,0x96,0xEE,0xE2,0xE2,0x6A,0x7A,0xB6,0xEE,0x55,0xE6,0x62,0x6E,0xEE,0xEF, + 0x75,0xEE,0xD3,0xD5,0x6A,0x6A,0x7A,0x78,0x71,0xCD,0xEF,0xBC,0x3C,0x16,0x34,0xD4, + 0x55,0xEE,0xB2,0xD5,0x83,0x0B,0x09,0x0D,0x55,0xE6,0xF3,0xDD,0x57,0x5E,0x5C,0x5E, + 0x34,0xE6,0xF4,0xDD,0x89,0xBD,0xAF,0xBD,0x34,0xE6,0x30,0xC5,0x5E,0x5C,0x5A,0x58, + 0x75,0xEE,0x30,0xC5,0x2D,0x2D,0x2D,0xBD,0xB6,0xF6,0x14,0xDE,0x77,0x80,0x80,0x22, + 0x96,0xEE,0xF4,0xDD,0x7F,0xFA,0xA0,0x08,0x75,0xEE,0xF3,0xDD,0x57,0xFF,0xA8,0x00, + 0x55,0xE6,0xF3,0xDD,0x5F,0x77,0xFF,0xF8,0x14,0xDE,0x31,0xC5,0x62,0xC8,0x80,0x00, + 0x96,0xF6,0xB6,0xEE,0xA5,0xD7,0x75,0x75,0xB6,0xEE,0x76,0xEE,0x5D,0xEE,0xAA,0xA0, + 0x95,0xEE,0x55,0xE6,0xFE,0xBE,0x08,0x00,0xB6,0xEE,0x55,0xE6,0xDD,0xFF,0xAE,0x8B, + 0xB6,0xEE,0x55,0xE6,0x57,0xBF,0xAA,0x02,0xB6,0xEE,0x54,0xE6,0xF5,0xBA,0xAA,0xA0, + 0xB6,0xEE,0x55,0xE6,0x7F,0xBF,0xAA,0x88,0xB6,0xEE,0x55,0xE6,0xD7,0xFF,0xAA,0x00, + 0xB6,0xEE,0x75,0xE6,0xD5,0xBF,0xAF,0x80,0xB6,0xEE,0x75,0xE6,0x5D,0xFA,0xFA,0x8A, + 0xB6,0xEE,0x75,0xEE,0x5F,0xBA,0xAA,0x0A,0xB6,0xF6,0x75,0xE6,0xF7,0xAF,0x8A,0x20, + 0x96,0xEE,0x75,0xEE,0xFF,0x88,0x80,0x80,0x96,0xEE,0x75,0xEE,0xFE,0xC8,0x08,0x20, + 0x96,0xEE,0x75,0xEE,0xB7,0x8A,0x20,0x28,0xB6,0xEE,0x75,0xEE,0xDD,0xFA,0xFF,0xDE, + 0x96,0xEE,0x75,0xEE,0xA8,0xAE,0xFE,0x2E,0x76,0xF6,0x96,0xEE,0x7D,0x7F,0x7F,0xF9, + 0xB6,0xF6,0x96,0xEE,0x7F,0x72,0xC2,0x86,0xB6,0xF6,0x96,0xEE,0x79,0xAA,0x2A,0x02, + 0xB6,0xF6,0x96,0xEE,0xFF,0x0B,0x3E,0xA0,0xD6,0xF6,0x96,0xEE,0x9D,0xFF,0x08,0x2A, + 0xD6,0xF6,0x96,0xEE,0xFF,0xAA,0xAA,0x2A,0xD6,0xF6,0x96,0xEE,0xDF,0xF7,0xB3,0xBA, + 0xD6,0xF6,0x96,0xEE,0xF5,0x5B,0xFE,0xCA,0x34,0xE6,0xAA,0x9B,0x60,0x70,0x60,0x60, + 0x87,0x7A,0xA4,0x61,0x5C,0xFC,0xFE,0xFE,0xE5,0x69,0x84,0x61,0xFF,0x53,0xF8,0xAA, + 0xC5,0x69,0x64,0x61,0x0A,0x2D,0x8A,0x0A,0x48,0x7A,0xC5,0x69,0x2B,0x8D,0xDD,0x55, + 0x06,0x72,0xC6,0x69,0xBC,0xEE,0x88,0x00,0x88,0x82,0x06,0x72,0x15,0x55,0xD5,0xF5, + 0x4B,0x9B,0x06,0x6A,0x2F,0xBD,0xFD,0xFD,0xD3,0xDD,0xE9,0x82,0x0A,0x0B,0x2D,0xB5, + 0x96,0xF6,0xF3,0xDD,0x02,0x02,0x03,0x0D,0xB6,0xF6,0x96,0xEE,0xA8,0xA0,0xA2,0xAA, + 0xD6,0xF6,0x96,0xEE,0xFE,0xFF,0xFF,0x3F,0xD6,0xF6,0x97,0xEE,0xEF,0xAF,0xAB,0xEA, + 0xB7,0xF6,0xB5,0xEE,0xA8,0xAA,0xAA,0xAA,0xB6,0xF6,0x96,0xEE,0xEE,0xA2,0x20,0x88, + 0xB6,0xF6,0x96,0xEE,0xEF,0x2A,0xAA,0x2A,0xD7,0xF6,0x96,0xEE,0xEB,0xBB,0xBA,0xAA, + 0xB6,0xF6,0x96,0xEE,0x3C,0xBB,0xB8,0x08,0xB6,0xF6,0x96,0xEE,0x88,0xE2,0xA8,0x00, + 0xB6,0xF6,0x96,0xEE,0x80,0x02,0x00,0xC0,0xB6,0xF6,0xD8,0xEE,0x00,0xA2,0x08,0xA0, + 0xB6,0xF6,0xD6,0xEE,0xAA,0xE8,0xF8,0xB8,0xF7,0xF6,0xB6,0xEE,0x3F,0xBB,0xBF,0x2F, + 0xD7,0xFE,0xF7,0xF6,0x5D,0x57,0x5F,0xDF,0xF7,0xFE,0xF7,0xF6,0xD7,0xF7,0x5F,0xDF, + 0x17,0xFF,0xF7,0xF6,0x7D,0xFD,0xF5,0xF9,0xF6,0xFE,0xF7,0xF6,0x7D,0xF7,0xFF,0xDF, + 0xF7,0xF6,0xD6,0xF6,0x2A,0x2A,0x22,0x88,0xD7,0xFE,0xF7,0xF6,0xF5,0x57,0xF5,0x95, + 0xF7,0xFE,0xD7,0xF6,0xEB,0x8A,0xEA,0x5A,0xB6,0xF6,0xD3,0xDD,0x00,0x80,0xE0,0x70, + 0x35,0xEE,0x8B,0x9B,0xA0,0xE8,0x7A,0x7E,0x6F,0xB4,0x87,0x7A,0x78,0x5E,0x57,0x55, + 0x87,0x7A,0x47,0x7A,0x8A,0x80,0x0E,0xA7,0xA7,0x82,0x46,0x72,0xBD,0x6B,0x6A,0xAA, + 0x87,0x7A,0x26,0x72,0xC2,0x5A,0x6A,0xE0,0x8B,0x9B,0x26,0x72,0x95,0x95,0x35,0x3D, + 0xB7,0xF6,0x6E,0xB4,0x2D,0x2D,0x2D,0x2B,0x17,0xFF,0xD7,0xF6,0xAD,0x8F,0xAD,0xFB, + 0x18,0xFF,0xF7,0xF6,0xBB,0xAB,0xAB,0xAA,0x17,0xFF,0xF8,0xF6,0xAA,0xEF,0x2E,0x2A, + 0x18,0xFF,0xF7,0xF6,0xAB,0xAA,0xE8,0xA0,0x18,0xFF,0xF7,0xEE,0x82,0x82,0xA0,0x8A, + 0xF7,0xF6,0xD7,0xF6,0x60,0xA0,0xE0,0xE0,0xF7,0xF6,0xD7,0xF6,0xAB,0xA8,0xA2,0xB8, + 0xF7,0xF6,0xD7,0xF6,0xF3,0xD5,0xFF,0xFF,0xF7,0xF6,0xD7,0xF6,0x7F,0xBF,0xAD,0xED, + 0xF7,0xF6,0xB6,0xEE,0xBF,0xAE,0xEA,0xFA,0xF7,0xF6,0xB6,0xEE,0xEA,0xAB,0xAE,0xFF, + 0xF7,0xF6,0xD7,0xF6,0x7F,0xAF,0xAD,0xAD,0xF7,0xF6,0xD7,0xF6,0xD5,0x75,0x5F,0x7F, + 0xB7,0xF6,0xF7,0xEE,0xAA,0xAA,0xBA,0xBE,0xD7,0xF6,0xF7,0xEE,0x00,0xB8,0x28,0x82, + 0xF7,0xF6,0xD7,0xF6,0x69,0xFD,0x55,0x79,0xF7,0xF6,0xB6,0xEE,0xFE,0xAA,0xAF,0xAF, + 0xF7,0xF6,0xD7,0xF6,0xD5,0xDF,0x1E,0x37,0x17,0xFF,0xD7,0xF6,0xBD,0xE9,0xAA,0xFE, + 0xF7,0xF6,0x96,0xEE,0xE0,0xF8,0x68,0xFE,0xB6,0xF6,0x96,0xEE,0xAA,0xAA,0xFB,0xFB, + 0x96,0xEE,0x55,0xEE,0x00,0x80,0xC0,0x80,0x96,0xEE,0x55,0xEE,0xC2,0xA2,0xF0,0x58, + 0x55,0xE6,0x14,0xDE,0xA0,0xF8,0x5A,0x5F,0x34,0xE6,0xD3,0xD5,0xEC,0xDE,0xFE,0xDF, + 0x55,0xE6,0xD3,0xD5,0x7F,0xBD,0xBF,0x0F,0xB7,0xF6,0x14,0xDE,0xAD,0x2B,0x23,0x0A, + 0xF7,0xF6,0xB7,0xF6,0xD5,0x55,0xBB,0xBE,0xD7,0xF6,0xB6,0xF6,0xFF,0x8C,0xBE,0xEE, + 0xD7,0xF6,0x96,0xEE,0xEF,0xF8,0xFA,0xFA,0xB7,0xF6,0x76,0xEE,0x7A,0xA0,0x20,0x02, + 0xB6,0xF6,0x35,0xE6,0xDF,0xFA,0x00,0x00,0xD6,0xF6,0x55,0xE6,0xD5,0x75,0xE2,0x88, + 0xB6,0xEE,0x75,0xEE,0x5F,0xAD,0xFB,0xB8,0xB6,0xEE,0x55,0xE6,0x5D,0xAA,0x00,0x00, + 0xB6,0xEE,0x75,0xE6,0xBD,0xD7,0xFA,0xAC,0xD7,0xF6,0x76,0xE6,0x0B,0xAB,0xBF,0xDF, + 0xF7,0xF6,0xB6,0xEE,0xAA,0x8A,0x2F,0x35,0xF7,0xF6,0xD7,0xF6,0xF5,0xBF,0xFB,0xBA, + 0xF7,0xF6,0xB7,0xEE,0xFA,0xFA,0xA8,0xA2,0xD7,0xF6,0x97,0xEE,0x9E,0xEE,0xAA,0xA2, + 0xF8,0xF6,0xB7,0xEE,0x2F,0xAD,0x3F,0xAB,0xD7,0xFE,0x18,0xF7,0xFF,0xFA,0xEF,0xAE, + 0x18,0xFF,0xF8,0xF6,0xAE,0x3B,0xED,0x95,0x18,0xFF,0xF8,0xF6,0xFF,0xAB,0xAE,0xDE, + 0x18,0xF7,0xF8,0xF6,0x37,0xB6,0x5E,0xF7,0x38,0xFF,0xF7,0xF6,0x82,0x22,0x2B,0xAF, + 0x38,0xFF,0xF7,0xF6,0x5E,0x62,0x62,0x68,0xF7,0xF6,0x96,0xEE,0xBA,0xFA,0x7C,0x7E, + 0xB6,0xEE,0x55,0xE6,0x7A,0x78,0xFE,0x7B,0xD7,0xF6,0x54,0xE6,0x0B,0x0B,0x2D,0x2D, + 0xD7,0xF6,0x34,0xDE,0xA0,0xF8,0xFA,0x78,0x96,0xEE,0x34,0xE6,0x8F,0xBF,0xDD,0xF5, + 0x55,0xE6,0x31,0xC5,0xE0,0x60,0x68,0x78,0x31,0xC5,0xD0,0xBC,0x9C,0x16,0x3F,0x2F, + 0x55,0xE6,0x72,0xCD,0x09,0x2D,0x2D,0x2D,0x55,0xE6,0xB2,0xD5,0xFC,0xF8,0x58,0x7A, + 0x14,0xDE,0xB2,0xD5,0x2A,0xAE,0x35,0x15,0x55,0xE6,0x10,0xBD,0x78,0x78,0x7A,0x78, + 0x14,0xDE,0xF0,0xBC,0x2D,0x2D,0xBD,0xF5,0xB6,0xF6,0x92,0xCD,0x22,0x0A,0xAF,0xBD, + 0x96,0xEE,0x55,0xEE,0xF8,0xE2,0xF2,0xFF,0x95,0xEE,0x55,0xE6,0xEB,0xFF,0xF7,0x55, + 0x95,0xEE,0x55,0xE6,0x57,0x7B,0xFF,0x2F,0x96,0xEE,0x34,0xE6,0x5D,0x8E,0xAE,0xBE, + 0xD6,0xF6,0xB6,0xEE,0x56,0xDE,0x6A,0x75,0xD6,0xF6,0xB6,0xEE,0x5D,0x75,0x6F,0xE5, + 0xF6,0xF6,0x96,0xEE,0xDD,0xF5,0x7F,0x7E,0xD6,0xF6,0x96,0xEE,0xEB,0xFB,0xBA,0x7B, + 0x96,0xF6,0xB6,0xEE,0x7F,0x77,0x9F,0x75,0xD5,0xF6,0x96,0xEE,0x7A,0xBB,0xEE,0xBA, + 0xD7,0xF6,0x96,0xEE,0x7E,0xFE,0x3A,0x2A,0x96,0xF6,0xD6,0xEE,0xEA,0xBB,0xBB,0xBF, + 0xB6,0xEE,0x96,0xEE,0xB0,0x80,0x88,0xB8,0xB6,0xEE,0x96,0xEE,0x2A,0x2E,0x2A,0x02, + 0xD7,0xF6,0x96,0xEE,0xBF,0xFA,0xFA,0xEB,0x95,0xF6,0xD6,0xEE,0xAA,0xEF,0xBF,0xAF, + 0xB6,0xEE,0x75,0xEE,0xFA,0xF8,0xE0,0xE0,0x96,0xEE,0x75,0xEE,0x00,0x0E,0x0E,0xA2, + 0x96,0xEE,0x75,0xEE,0xA8,0xAE,0x32,0x28,0x96,0xF6,0x95,0xEE,0xD7,0xFF,0xFF,0xDF, + 0xB6,0xFE,0x96,0xEE,0x57,0x57,0x5F,0xF7,0xB6,0xF6,0x75,0xEE,0xE6,0x2E,0xAB,0x2A, + 0xD6,0xF6,0x96,0xEE,0xFF,0xBF,0xAB,0xAB,0xD7,0xF6,0xB6,0xF6,0xFD,0xD7,0xDD,0x2F, + 0xD7,0xF6,0xB6,0xEE,0x7F,0xAE,0xCB,0xA8,0xB6,0xF6,0xD7,0xEE,0x8A,0xAE,0xEE,0xBE, + 0xB6,0xF6,0xD6,0xEE,0xAA,0x2E,0xA9,0xFF,0xD7,0xF6,0xB6,0xF6,0x75,0xBD,0x1D,0xAB, + 0xD7,0xF6,0xB6,0xF6,0x6A,0xE2,0xE8,0xBA,0x76,0xF6,0x8A,0x9B,0x60,0x60,0xE0,0xE0, + 0xA8,0x82,0xA4,0x61,0xFE,0xFE,0x5C,0x7C,0x26,0x7A,0xC5,0x69,0x7B,0xDA,0xDE,0xE3, + 0x06,0x72,0xA5,0x69,0xD7,0xF5,0xFE,0x62,0xE6,0x71,0x84,0x61,0x2F,0xAF,0xAD,0xAD, + 0x27,0x7A,0xC5,0x69,0xBA,0xBB,0xAD,0x3D,0x27,0x72,0xE6,0x69,0x3B,0xBF,0x74,0x5A, + 0x87,0x7A,0xE6,0x69,0x0A,0xAA,0xAF,0xF7,0x2D,0xAC,0x67,0x7A,0x2F,0xBD,0xFD,0xF5, + 0x35,0xEE,0x8B,0x9B,0x02,0x03,0x2B,0x2D,0xB6,0xF6,0x76,0xF6,0xAA,0x8A,0xAA,0x83, + 0xB6,0xF6,0x96,0xEE,0xA8,0xBE,0x23,0xA2,0xB6,0xF6,0x96,0xEE,0x02,0x80,0x82,0xA0, + 0xD6,0xF6,0xB6,0xF6,0xD5,0xFB,0x5B,0xB5,0xB6,0xF6,0xD6,0xEE,0x28,0x80,0x08,0x02, + 0xB6,0xF6,0xB7,0xEE,0x8A,0xA8,0x00,0x2A,0x96,0xF6,0xD7,0xEE,0xFA,0xEE,0xAB,0xEF, + 0xB6,0xF6,0x96,0xEE,0x08,0x02,0x20,0xA8,0xB6,0xF6,0x96,0xEE,0x02,0x00,0x02,0xE8, + 0xD7,0xF6,0x96,0xEE,0xAE,0xAE,0xAF,0xBB,0xD7,0xF6,0xB6,0xF6,0xDE,0xDE,0xB3,0x2B, + 0xD6,0xF6,0xB6,0xEE,0xB4,0xA2,0x8B,0xEA,0xD7,0xF6,0xB6,0xEE,0x0A,0x0B,0x2B,0x3F, + 0x17,0xFF,0xD7,0xF6,0xFF,0xBD,0xBE,0xAB,0x17,0xFF,0xF7,0xF6,0x5D,0x55,0x5F,0x5F, + 0x18,0xFF,0xF7,0xF6,0xDD,0xF9,0xCF,0x6D,0x17,0xFF,0xF7,0xF6,0x7D,0x77,0xD5,0x75, + 0xD6,0xFE,0xF7,0xF6,0x5D,0x55,0xD7,0xDF,0x18,0xFF,0xD7,0xF6,0xEA,0xEF,0xFF,0x7F, + 0xF6,0xFE,0x14,0xE6,0x80,0xE0,0xF8,0x7A,0x34,0xE6,0xAB,0x9B,0x80,0xA0,0xE8,0x7A, + 0xAF,0xBC,0x46,0x72,0x68,0x7C,0x5E,0x57,0x67,0x82,0x46,0x72,0xBB,0x2B,0x33,0x0A, + 0x87,0x82,0x46,0x7A,0x3D,0x3F,0x8C,0x3A,0xC7,0x8A,0x87,0x82,0xF5,0xCE,0xAD,0x3D, + 0xE8,0x8A,0x66,0x7A,0x7E,0xFB,0xF0,0x70,0x8E,0xBC,0x46,0x7A,0xB5,0xB5,0x35,0x25, + 0xD7,0xFE,0x30,0xCD,0x2D,0x0D,0x09,0x2B,0xF7,0xFE,0x18,0xF7,0xE0,0xA0,0x88,0xA0, + 0x17,0xFF,0xF7,0xF6,0xBE,0xAA,0x0A,0x0F,0x17,0xFF,0xF7,0xF6,0x2A,0x2A,0xBE,0x3F, + 0x18,0xFF,0xF7,0xF6,0x8A,0x2A,0xAB,0xAE,0x18,0xFF,0xF7,0xF6,0xE3,0xFA,0xF8,0xB8, + 0xF7,0xF6,0xD7,0xF6,0xA0,0xBC,0x2A,0x80,0xF7,0xF6,0xD7,0xF6,0xAA,0xAE,0x20,0x88, + 0xF7,0xF6,0xD7,0xF6,0xBA,0xEA,0xAE,0xFA,0xF7,0xF6,0xD7,0xF6,0xF9,0xFF,0x5D,0x57, + 0xD7,0xF6,0xB7,0xEE,0xA0,0x2A,0x83,0x88,0xD7,0xF6,0xB7,0xEE,0x2A,0xA2,0x82,0xAA, + 0xD7,0xF6,0xD7,0xEE,0x00,0x8A,0x20,0x22,0xF7,0xF6,0xD7,0xF6,0x5F,0xF5,0xAD,0xBD, + 0xF7,0xF6,0xD7,0xF6,0xBD,0x55,0x77,0xE5,0xD7,0xF6,0xF7,0xEE,0x0A,0x82,0x00,0x22, + 0xF7,0xF6,0xD7,0xF6,0x7F,0x5D,0xFD,0x2B,0x17,0xFF,0xD7,0xF6,0x75,0xD7,0xF7,0x3F, + 0x17,0xFF,0xD7,0xF6,0x2D,0xAF,0x8A,0x70,0xF7,0xF6,0xB6,0xEE,0xE0,0xF0,0x54,0x5F, + 0x96,0xF6,0xD6,0xEE,0xBB,0xAF,0xBF,0x2A,0xB6,0xF6,0x76,0xEE,0xA2,0xFA,0xDE,0xDE, + 0x96,0xEE,0x55,0xEE,0xA8,0x6A,0x78,0x78,0x75,0xEE,0x14,0xDE,0xF8,0x78,0x5A,0x5F, + 0x35,0xE6,0xB2,0xD5,0xA2,0xFA,0x7E,0x5F,0x75,0xEE,0xB2,0xD5,0xF7,0xD5,0xB5,0x35, + 0xB6,0xF6,0x14,0xDE,0xBD,0x2D,0x2A,0x02,0xD7,0xF6,0x96,0xEE,0x9D,0xFE,0xAA,0xAA, + 0xD7,0xF6,0xB6,0xEE,0x0A,0x8B,0x2B,0x80,0xD7,0xF6,0xB7,0xEE,0xE0,0x80,0xA2,0xA0, + 0xD7,0xF6,0x96,0xEE,0x6A,0xA8,0xA8,0x22,0xD7,0xF6,0x96,0xEE,0xAB,0xF9,0xBA,0xEA, + 0xD6,0xF6,0x96,0xEE,0xAE,0xAE,0xA7,0xF7,0xD6,0xF6,0xB6,0xEE,0xAA,0xEB,0xE9,0xE5, + 0xD6,0xF6,0xB6,0xEE,0x7E,0xDE,0xD0,0x5E,0xD7,0xF6,0xB6,0xEE,0x2D,0x0F,0xBF,0x57, + 0xF7,0xF6,0x96,0xEE,0x7E,0xFA,0x2A,0x2B,0xF7,0xF6,0x96,0xEE,0x55,0x57,0x7A,0x80, + 0xF7,0xF6,0x96,0xEE,0x27,0xBD,0xE5,0xFF,0xF7,0xF6,0xD7,0xF6,0xF2,0xE2,0x25,0x0D, + 0x18,0xFF,0xD7,0xF6,0xFB,0xFF,0x7E,0xFA,0xF7,0xF6,0xB7,0xEE,0xB6,0xAF,0xFA,0xAA, + 0xF8,0xF6,0xD7,0xF6,0xE5,0xCD,0x2B,0xC2,0xF8,0xF6,0xD7,0xEE,0xDA,0xBB,0xBF,0xAE, + 0xF8,0xF6,0xD7,0xEE,0x3B,0xF2,0xF8,0x58,0x18,0xF7,0xD7,0xF6,0xAA,0xAB,0xAF,0xAD, + 0x17,0xF7,0xF8,0xF6,0xF6,0x7A,0xFA,0x5D,0x18,0xF7,0xD7,0xF6,0x2A,0xBA,0xEE,0xD5, + 0x38,0xFF,0xF7,0xF6,0xEA,0xFA,0xF5,0x75,0xF7,0xF6,0x96,0xEE,0x7A,0x78,0x78,0x78, + 0x96,0xEE,0x55,0xE6,0x62,0xFA,0xFA,0x7A,0xD7,0xF6,0x34,0xDE,0x2F,0xB7,0xB5,0xB5, + 0xB6,0xEE,0x14,0xE6,0xF0,0xE0,0x60,0x40,0x55,0xE6,0x14,0xDE,0x0D,0xA7,0x35,0xFD, + 0x55,0xE6,0x51,0xC5,0x78,0x58,0x78,0x7A,0x10,0xC5,0xF0,0xBC,0x25,0x2E,0x36,0x14, + 0x34,0xE6,0x71,0xCD,0x2D,0x29,0xAD,0x2D,0x34,0xE6,0x92,0xCD,0xE0,0xE8,0xE2,0x60, + 0xF3,0xDD,0x92,0xCD,0x2F,0x2E,0xB5,0xBD,0xF4,0xDD,0x30,0xC5,0x70,0x60,0x40,0xC0, + 0x10,0xC5,0x6D,0xAC,0x2E,0x9F,0xDF,0xBE,0x55,0xE6,0x31,0xC5,0x2F,0x0D,0x29,0x0B, + 0x96,0xEE,0x55,0xE6,0xFF,0x6B,0x7A,0xE0,0x75,0xEE,0x55,0xE6,0x57,0x55,0xB7,0xE6, + 0x75,0xEE,0x55,0xE6,0x09,0xFD,0x27,0x37,0x96,0xEE,0x75,0xEE,0x5D,0x3F,0xBD,0xF5, + 0xD7,0xF6,0x96,0xEE,0xEF,0xBE,0xAB,0xEF,0xD6,0xF6,0xB6,0xEE,0xAF,0xBF,0xFD,0xD7, + 0xD6,0xF6,0xB6,0xEE,0x5F,0x57,0x57,0x7B,0xD6,0xF6,0xB6,0xEE,0xDD,0xF7,0x6D,0xFD, + 0xD6,0xF6,0xB6,0xEE,0xFD,0x75,0x7D,0xF3,0xD6,0xF6,0xB6,0xEE,0xBF,0xEA,0xBD,0xFF, + 0xD7,0xF6,0xB6,0xEE,0xD1,0x9F,0x5F,0x7F,0xD7,0xF6,0xB6,0xEE,0xDF,0xF7,0xDD,0xF5, + 0xD7,0xF6,0xB6,0xEE,0x57,0xED,0xFF,0xE4,0xD7,0xF6,0xB6,0xEE,0x77,0x7F,0xF5,0xFD, + 0xD7,0xF6,0xB6,0xEE,0x75,0xD5,0xF7,0xFF,0xD6,0xF6,0x96,0xEE,0x7A,0xEA,0xEA,0xEA, + 0xB6,0xEE,0x96,0xEE,0x68,0x76,0x5E,0x76,0xB6,0xF6,0x75,0xEE,0xFF,0xAF,0xA7,0xBF, + 0x75,0xF6,0x95,0xEE,0x7D,0x75,0x5D,0x57,0x76,0xF6,0x95,0xEE,0x55,0x75,0x5F,0x7D, + 0xB6,0xF6,0x95,0xEE,0xAE,0xF6,0x3B,0xFA,0x96,0xF6,0xB6,0xEE,0xFF,0xFF,0xBB,0xBB, + 0xB6,0xF6,0xD7,0xEE,0xA8,0xAA,0xAA,0xB8,0xD7,0xF6,0xB6,0xEE,0x2B,0x0A,0xAA,0x82, + 0xD7,0xF6,0xB6,0xEE,0xF8,0xE2,0xEA,0x98,0xF7,0xF6,0xB6,0xEE,0x77,0xAF,0xAB,0xAF, + 0xD7,0xF6,0xB6,0xEE,0xAF,0xAA,0x88,0x2A,0xD7,0xF6,0xB6,0xF6,0xE7,0xB5,0xDE,0xAE, + 0xD7,0xF6,0x95,0xF6,0xEA,0xFA,0xFA,0xE8,0x75,0xEE,0x29,0x93,0xE0,0xE0,0x78,0x78, + 0xC8,0x8A,0xA5,0x61,0x7C,0xDE,0x56,0x57,0x26,0x7A,0xE5,0x69,0xEF,0x8D,0xAD,0x2D, + 0x26,0x7A,0xC5,0x69,0x7B,0xFC,0x80,0x82,0xC5,0x69,0x64,0x61,0x2A,0xF8,0xFC,0xB0, + 0x06,0x72,0x84,0x61,0x2B,0x2F,0xBF,0xDF,0x27,0x72,0xC5,0x69,0xE2,0xFA,0xEA,0x75, + 0x26,0x72,0xC5,0x69,0x2C,0xBA,0xAF,0xB6,0xE8,0x82,0xE5,0x69,0x2F,0x2F,0xBD,0xF5, + 0xD2,0xDD,0x08,0x8B,0x2D,0xB5,0xF5,0xD5,0x95,0xF6,0xEE,0xBC,0x00,0x02,0x0B,0x29, + 0xB6,0xF6,0x96,0xEE,0xA0,0x88,0x00,0x00,0xD5,0xF6,0xB6,0xF6,0x5D,0x5D,0xF7,0xBF, + 0xD6,0xF6,0xB6,0xF6,0xEB,0xE7,0xEF,0xFA,0xD6,0xF6,0xB6,0xF6,0xDD,0xF7,0xDA,0xAA, + 0xF6,0xF6,0xB6,0xF6,0x55,0x55,0x5F,0x5F,0xB6,0xF6,0xB7,0xEE,0x08,0xA0,0x2A,0xA2, + 0xD7,0xF6,0x96,0xEE,0xFE,0xFA,0xBE,0xAA,0xB6,0xF6,0xD7,0xEE,0x02,0x82,0x80,0x00, + 0xD7,0xF6,0xB6,0xF6,0x59,0x57,0xF5,0xDD,0xD7,0xF6,0xB6,0xF6,0xAF,0x8D,0x37,0x9D, + 0xD7,0xF6,0xB6,0xEE,0x22,0x28,0x60,0xE2,0xF7,0xF6,0xB6,0xEE,0xBF,0x2B,0xBB,0x3F, + 0x17,0xFF,0xD6,0xF6,0xAB,0xEF,0xFF,0xDE,0xF7,0xF6,0xD6,0xF6,0x80,0x22,0x02,0xAA, + 0x17,0xFF,0xF7,0xF6,0x75,0x5D,0x5D,0x7F,0x17,0xFF,0xF7,0xF6,0xB5,0xDD,0xF5,0x75, + 0xF7,0xFE,0xD6,0xF6,0xEB,0xA8,0xAA,0xBC,0xF7,0xFE,0x34,0xE6,0xA0,0xA0,0xE8,0x7A, + 0x75,0xEE,0x4D,0xB4,0xA0,0xE0,0xF8,0x7E,0xEF,0xC4,0x66,0x7A,0x60,0x78,0x5E,0x57, + 0x67,0x7A,0x05,0x6A,0xBE,0x86,0x8A,0x02,0x67,0x7A,0x06,0x72,0x28,0x20,0x2A,0xDE, + 0xA8,0x8A,0x46,0x7A,0xBF,0x8D,0x8A,0x83,0xC8,0x8A,0x67,0x82,0x27,0xA5,0xAE,0x8B, + 0xC8,0x8A,0x66,0x7A,0x80,0xB0,0x9A,0xF2,0x11,0xCD,0x67,0x7A,0x35,0x35,0x25,0x2D, + 0xF7,0xFE,0xD3,0xDD,0x09,0x29,0x0B,0x0B,0x17,0xFF,0xF8,0xF6,0xAE,0xAA,0xBA,0x72, + 0x18,0xFF,0xF7,0xF6,0xAA,0xBA,0xAA,0xAA,0xF7,0xFE,0x18,0xF7,0x7B,0x7E,0x79,0x5F, + 0x38,0xFF,0x17,0xF7,0x75,0xF7,0xFF,0xDB,0x17,0xFF,0xF7,0xF6,0xA0,0xEB,0xEE,0xEB, + 0xF7,0xF6,0xF7,0xF6,0x00,0x00,0x00,0x00,0xF7,0xF6,0xD7,0xF6,0xAA,0xAA,0xA2,0x5A, + 0xF7,0xF6,0xD7,0xF6,0xAB,0x8B,0x7D,0x5F,0xF7,0xF6,0xD7,0xF6,0x57,0x7F,0x7A,0x5B, + 0xD7,0xF6,0xF6,0xEE,0x00,0xA2,0xA2,0xA8,0xD7,0xF6,0xD6,0xEE,0xAA,0x20,0x0A,0x08, + 0xF7,0xF6,0xB6,0xEE,0xBA,0x7A,0xBA,0xBE,0xF7,0xF6,0xD7,0xF6,0x65,0x7F,0x79,0xAA, + 0xD7,0xF6,0xF7,0xEE,0xA0,0x00,0x80,0xA0,0xF6,0xF6,0xD7,0xF6,0xDD,0xF5,0x57,0xAF, + 0xF7,0xF6,0xB6,0xEE,0x03,0x0F,0x21,0x02,0x18,0xFF,0xF7,0xF6,0xA5,0x89,0x83,0xC0, + 0x18,0xF7,0xD7,0xF6,0x78,0x5E,0x5F,0x57,0x95,0xF6,0xD6,0xEE,0xFD,0xAB,0xAF,0xBB, + 0x76,0xF6,0xB6,0xEE,0xFD,0xAD,0xBF,0x2E,0x96,0xF6,0x55,0xE6,0xAA,0xFA,0xAA,0x7B, + 0x75,0xEE,0x14,0xDE,0xA8,0xF8,0xFE,0x7F,0x34,0xE6,0x92,0xCD,0xE8,0xE8,0xF8,0x7E, + 0x14,0xDE,0x51,0xC5,0xFE,0xFE,0xB7,0x25,0x96,0xEE,0x92,0xD5,0x2D,0x0B,0x02,0x00, + 0xD7,0xF6,0xB6,0xEE,0x95,0xBF,0xBF,0x88,0xD7,0xF6,0xB6,0xEE,0x33,0x82,0xA0,0x80, + 0xD7,0xF6,0xB6,0xEE,0x80,0xB0,0x3E,0xAC,0xD7,0xF6,0xB6,0xEE,0x0B,0x8E,0xA8,0xA2, + 0xD7,0xF6,0xB7,0xEE,0xA2,0xA2,0x08,0xBA,0xD7,0xF6,0xB6,0xEE,0xEB,0xEA,0xAA,0xEA, + 0xD7,0xF6,0x96,0xEE,0xFF,0xFA,0xEA,0xBA,0xD7,0xF6,0x96,0xEE,0xA7,0xFF,0xEA,0xAA, + 0x97,0xFE,0xB6,0xEE,0xD5,0x5F,0x75,0x5F,0x96,0xF6,0xB6,0xEE,0x77,0x57,0xD5,0xF5, + 0xD7,0xF6,0x96,0xEE,0x2E,0x3F,0xBD,0xBF,0xF7,0xF6,0xB7,0xEE,0x02,0x02,0x2F,0x2D, + 0x18,0xFF,0xD7,0xF6,0x5F,0xFE,0xAA,0x2A,0x17,0xF7,0xB8,0xF6,0xAB,0xAA,0xAA,0x02, + 0x18,0xFF,0xF7,0xF6,0x6E,0x6F,0xCB,0x02,0x18,0xF7,0xD7,0xF6,0xFF,0xFB,0xF8,0xF8, + 0xF7,0xF6,0xD7,0xEE,0xA2,0xFA,0x68,0xA2,0xF8,0xF6,0xD7,0xEE,0x2C,0x2A,0x03,0x2A, + 0x18,0xF7,0xB7,0xF6,0xDA,0xF8,0xEE,0xEA,0xF8,0xF6,0xD7,0xF6,0x8D,0x88,0xE3,0xDB, + 0xF8,0xF6,0xD7,0xF6,0x00,0x21,0xAC,0xFE,0xF7,0xF6,0xD7,0xF6,0xFD,0xF8,0x78,0x5A, + 0xF8,0xF6,0xB7,0xEE,0xAA,0xBE,0xFF,0xF6,0xD7,0xF6,0x96,0xEE,0xE0,0x68,0xE8,0xAA, + 0x96,0xEE,0x34,0xDE,0xBA,0x6E,0x78,0x78,0x96,0xEE,0x13,0xDE,0x3D,0x27,0xB5,0xB5, + 0xD7,0xF6,0x54,0xE6,0x62,0xE2,0xE0,0xAA,0x75,0xEE,0x14,0xDE,0x7D,0xFE,0xAA,0xAC, + 0x55,0xE6,0x71,0xCD,0x7A,0x58,0x78,0x78,0x51,0xC5,0xEF,0xBC,0x96,0xB8,0x20,0x00, + 0x13,0xDE,0x51,0xC5,0x29,0x29,0xAD,0xBD,0x55,0xE6,0xB2,0xD5,0x7A,0xF2,0x7A,0x6B, + 0xB2,0xD5,0x72,0xCD,0x2E,0xAF,0xBF,0x2F,0xF3,0xDD,0x71,0xCD,0x62,0x43,0xE2,0x82, + 0xD3,0xD5,0xAE,0xB4,0xD5,0x37,0x2F,0x2E,0xD6,0xF6,0xB2,0xD5,0xAD,0x2B,0x0B,0x2B, + 0xB6,0xF6,0x55,0xE6,0xFA,0xF8,0x60,0xE0,0x76,0xE6,0x35,0xE6,0xFE,0xF6,0xD7,0xDE, + 0x55,0xEE,0x34,0xE6,0x08,0x2C,0x5E,0x55,0x96,0xEE,0x34,0xE6,0xAB,0x2B,0xAF,0xAD, + 0xD6,0xF6,0xB6,0xEE,0xD5,0xA5,0xFD,0x95,0xD6,0xF6,0xB6,0xEE,0x7D,0x7E,0x5E,0x75, + 0xD6,0xF6,0xB6,0xEE,0x72,0x5B,0x95,0xA9,0xD6,0xF6,0xB6,0xEE,0xDF,0xB6,0xBE,0x77, + 0xD6,0xF6,0xB6,0xEE,0x4D,0x8B,0xAB,0xFD,0xD6,0xF6,0x96,0xEE,0xAE,0x8A,0x82,0x8F, + 0xD6,0xF6,0xB6,0xEE,0xFB,0xE9,0xB5,0x5B,0xD6,0xF6,0xB6,0xEE,0xFD,0xAE,0x39,0x77, + 0xD6,0xF6,0xB6,0xEE,0xBE,0x3F,0xBA,0xAA,0xD6,0xF6,0xB6,0xEE,0xAF,0xE7,0xFF,0xD6, + 0xD7,0xF6,0xB6,0xEE,0xEE,0xEB,0x7B,0xEF,0xD6,0xF6,0xB6,0xEE,0xFB,0xFF,0x7A,0xFE, + 0xD6,0xEE,0x75,0xEE,0xFE,0xDE,0xFF,0xF8,0xB6,0xF6,0x75,0xEE,0xFA,0xBA,0xEA,0xFA, + 0xB5,0xF6,0x55,0xE6,0xAA,0xA2,0xAA,0xEA,0xB6,0xF6,0x95,0xEE,0xDF,0xFD,0xBB,0x6A, + 0xB5,0xEE,0x95,0xEE,0xAF,0xFB,0xFF,0xF9,0xB7,0xF6,0x96,0xEE,0xF9,0xDF,0xD7,0xAD, + 0xD6,0xF6,0xB6,0xEE,0xAF,0x8D,0xBD,0xB5,0xD7,0xF6,0xB6,0xEE,0xA2,0x8E,0x0A,0x02, + 0xD7,0xF6,0xF7,0xEE,0x00,0x20,0x88,0x88,0xD6,0xF6,0xB7,0xE6,0x0A,0x22,0x20,0x82, + 0xF7,0xF6,0xB6,0xEE,0xFE,0xBE,0xAA,0xEA,0xD6,0xF6,0xB7,0xF6,0xAE,0xAA,0x00,0xA8, + 0xD7,0xFE,0x34,0xEE,0xE0,0xC8,0x60,0x6A,0xF2,0xDD,0x46,0x72,0x78,0x7C,0x5E,0x5E, + 0x47,0x7A,0x85,0x61,0xFA,0xE2,0xE8,0xF0,0x26,0x72,0x43,0x59,0x0A,0xAB,0xAF,0x95, + 0x26,0x72,0xE6,0x71,0xEA,0x63,0xFB,0xD7,0x06,0x72,0xA5,0x69,0x55,0x7E,0x68,0xEA, + 0xA5,0x69,0x64,0x61,0xC0,0xF9,0x57,0x5C,0xC5,0x69,0x85,0x61,0x0A,0x8B,0xBB,0xFF, + 0xE6,0x69,0x64,0x59,0x2A,0x8A,0x2B,0x29,0x46,0x72,0xC5,0x61,0x2F,0x2D,0xBF,0xD7, + 0x69,0x93,0x26,0x72,0x2F,0xBD,0xBD,0xF5,0x35,0xEE,0x29,0x8B,0x0B,0x0D,0x2D,0xB5, + 0xD7,0xFE,0x55,0xEE,0xAA,0x2A,0x0B,0x2D,0xD7,0xF6,0xB6,0xF6,0x75,0x5B,0xFA,0xAA, + 0xD6,0xF6,0xB6,0xF6,0xFD,0xA5,0x87,0x8F,0xD6,0xF6,0xB6,0xF6,0xAD,0xBF,0xA3,0x0A, + 0xD6,0xF6,0xB6,0xF6,0xA8,0xAA,0xBE,0x97,0xD6,0xF6,0xB6,0xF6,0xD4,0x7C,0x5C,0x77, + 0xB6,0xF6,0xD7,0xEE,0x0A,0x02,0x08,0x08,0xB6,0xF6,0x96,0xEE,0x08,0x0A,0x88,0x00, + 0xB6,0xF6,0xD6,0xEE,0xA0,0x00,0x08,0x28,0xD7,0xF6,0xB6,0xF6,0xAF,0xBD,0xB5,0xEF, + 0xD6,0xF6,0xB6,0xEE,0xA0,0x7A,0x3A,0xAF,0xF7,0xF6,0xD6,0xF6,0x9D,0xDD,0xBF,0xB7, + 0xD7,0xFE,0xF7,0xF6,0xDF,0x7D,0x57,0x55,0xF6,0xFE,0xF7,0xF6,0xFD,0x7F,0xF7,0xFD, + 0xD7,0xFE,0xF7,0xF6,0x55,0x55,0x7D,0xFD,0xF7,0xFE,0xD7,0xF6,0xA8,0xAE,0xAB,0x82, + 0xF7,0xFE,0x55,0xEE,0xA0,0xA8,0xE0,0x7A,0xB6,0xF6,0xAF,0xBC,0xA0,0xE8,0xFA,0x7A, + 0x30,0xCD,0x66,0x7A,0xE0,0x78,0x5E,0x5F,0x66,0x7A,0x05,0x72,0xA0,0xDA,0xFE,0xAE, + 0x66,0x7A,0x26,0x7A,0x8A,0x9B,0x9E,0xBA,0x46,0x82,0x26,0x7A,0x7F,0xFF,0xAD,0xB3, + 0x87,0x8A,0x26,0x7A,0x2B,0xA9,0xAB,0x8A,0xA8,0x8A,0x67,0x82,0xBA,0xF3,0xB3,0xFE, + 0x87,0x82,0x46,0x7A,0xA0,0xE2,0x7A,0x38,0x14,0xE6,0x09,0x93,0x35,0xAD,0x2D,0x2D, + 0xF7,0xFE,0x55,0xEE,0x0D,0x01,0x03,0x03,0x17,0xFF,0xF7,0xF6,0xF0,0xAA,0xEA,0xCA, + 0x17,0xFF,0xF8,0xF6,0xAB,0xB8,0xAE,0xAB,0x38,0xFF,0xF7,0xF6,0xAF,0xAB,0xED,0xAB, + 0x18,0xFF,0x17,0xF7,0xEF,0xBB,0xFE,0xBE,0x36,0xFF,0x18,0xF7,0x5D,0x77,0xF7,0xFF, + 0x37,0xF7,0xD7,0xF6,0xDE,0x7F,0xD7,0x5F,0xF7,0xF6,0xD7,0xF6,0xE8,0xA2,0xAF,0xBF, + 0xF7,0xF6,0xD7,0xF6,0x7A,0xF2,0xBB,0xBD,0xF7,0xF6,0xD7,0xF6,0xFD,0x7D,0xD7,0xFD, + 0xF7,0xF6,0xD7,0xF6,0xFD,0xFD,0xD6,0x56,0xF7,0xF6,0xD7,0xF6,0xD7,0x75,0xD7,0x7F, + 0xD7,0xF6,0xB7,0xEE,0x20,0x00,0x68,0x80,0xF7,0xF6,0xB7,0xF6,0x22,0xAA,0xA9,0xAF, + 0xF7,0xF6,0xD7,0xF6,0x75,0xF5,0x97,0xAF,0x37,0xFF,0xD7,0xF6,0x75,0xF7,0xF5,0xB7, + 0x18,0xFF,0xD7,0xF6,0x2F,0x8A,0x82,0xC0,0x17,0xFF,0xB6,0xEE,0xA8,0xFA,0x7E,0xD7, + 0xB6,0xF6,0xD6,0xEE,0x2D,0x2B,0x0A,0x80,0xB6,0xF6,0x75,0xEE,0xE8,0x6A,0xFC,0xFA, + 0x96,0xEE,0x75,0xEE,0xE0,0x68,0x4C,0xFA,0x75,0xEE,0x14,0xE6,0xA0,0x78,0xF8,0x7E, + 0x35,0xE6,0xB3,0xD5,0xC8,0xE2,0xFA,0xDE,0x14,0xDE,0x71,0xCD,0x7E,0xDF,0x97,0x2D, + 0xB6,0xF6,0x92,0xCD,0xA5,0x2F,0x22,0x02,0xD7,0xF6,0x96,0xEE,0x09,0x0A,0x02,0x08, + 0xD7,0xF6,0xD6,0xEE,0x20,0x22,0x22,0x00,0xF7,0xF6,0xB6,0xEE,0xAB,0xBB,0xAE,0xB3, + 0xD7,0xF6,0xF7,0xEE,0x00,0x00,0x8A,0x0A,0xD7,0xF6,0xB6,0xEE,0x80,0x00,0xA0,0xC0, + 0xD7,0xF6,0xB7,0xEE,0x28,0x22,0xE8,0xEA,0xD7,0xF6,0xB7,0xEE,0xFC,0x57,0x76,0xEF, + 0xD7,0xF6,0xB6,0xEE,0x97,0x8F,0x2F,0x2A,0xD7,0xF6,0xB7,0xEE,0xE3,0xA2,0xA2,0x22, + 0xD7,0xF6,0xB6,0xEE,0x5F,0xEA,0xF2,0xFE,0xD7,0xF6,0xB6,0xEE,0x5F,0x5E,0x5E,0x7E, + 0xB6,0xEE,0x96,0xEE,0xA3,0xFE,0x3A,0x00,0xF7,0xF6,0x96,0xEE,0x2F,0xBD,0xBF,0xFD, + 0x17,0xFF,0xB7,0xEE,0xAA,0x2E,0xAF,0xFD,0x18,0xFF,0xF7,0xF6,0xBB,0x0B,0x0A,0x2B, + 0x38,0xFF,0x18,0xF7,0xF7,0xEF,0xCB,0xEB,0x39,0xFF,0xF7,0xF6,0x7E,0xFA,0xEA,0x8B, + 0x18,0xFF,0xD7,0xEE,0xFF,0xBF,0xBE,0xF8,0x18,0xF7,0xF8,0xF6,0x55,0x5F,0xD5,0xFD, + 0xF8,0xF6,0xD7,0xF6,0xAA,0xA8,0xB0,0x80,0xF8,0xF6,0xD7,0xF6,0x55,0xB7,0xCF,0x6B, + 0xF7,0xF6,0xD7,0xF6,0xBE,0x0A,0x0A,0x09,0xF7,0xF6,0xB7,0xEE,0x68,0xE0,0x78,0x7A, + 0xD7,0xF6,0xB7,0xEE,0x8D,0x02,0x82,0xAB,0xD7,0xF6,0xB7,0xEE,0xEA,0x88,0xAA,0xAA, + 0xB6,0xEE,0x55,0xE6,0x58,0x78,0x68,0xE0,0x55,0xE6,0xF3,0xD5,0x26,0x37,0x1F,0x16, + 0xD7,0xF6,0x96,0xEE,0x2B,0xA9,0x2B,0x2D,0xB7,0xEE,0x34,0xE6,0x5E,0x7C,0x78,0x58, + 0x34,0xE6,0x92,0xCD,0x70,0x78,0x70,0x78,0x92,0xD5,0x30,0xC5,0xFB,0x6A,0x68,0xB0, + 0xD3,0xDD,0x51,0xC5,0x2D,0x2D,0x3D,0xA7,0x14,0xDE,0xB2,0xD5,0x82,0xC2,0x42,0xC2, + 0xB2,0xD5,0x30,0xC5,0x2A,0xBE,0x9F,0xD6,0xF4,0xDD,0x51,0xCD,0x82,0x8B,0xCB,0x7D, + 0xF3,0xDD,0x31,0xC5,0x37,0x2E,0xA6,0xAD,0xB6,0xF6,0xF3,0xDD,0x0B,0x29,0x09,0x0B, + 0xD7,0xF6,0x75,0xEE,0x7A,0xFA,0xFA,0xCA,0x96,0xEE,0x34,0xE6,0xFE,0x56,0x5A,0xFC, + 0x55,0xE6,0x34,0xE6,0x09,0x25,0x9D,0xFE,0x96,0xEE,0x34,0xE6,0xAD,0xAB,0xAF,0xAF, + 0xD6,0xF6,0xB6,0xEE,0xAF,0xBB,0x7D,0x7D,0xD5,0xF6,0xB6,0xEE,0x57,0x75,0xF5,0xF7, + 0xD6,0xF6,0xB6,0xEE,0xD9,0xDF,0xFA,0xEB,0xD6,0xF6,0xB6,0xEE,0xD9,0x7A,0xAE,0xA7, + 0xD6,0xF6,0xB6,0xEE,0x7F,0x6B,0xAB,0x8D,0xD6,0xF6,0xB6,0xEE,0xAD,0xCF,0xFE,0xFE, + 0xD6,0xF6,0x96,0xEE,0x6A,0xAA,0x32,0x38,0xD6,0xF6,0xB6,0xEE,0xE3,0xEA,0xDA,0x7E, + 0xD6,0xF6,0xB6,0xEE,0xDD,0x57,0xD6,0xB7,0xB6,0xF6,0xD7,0xEE,0xEB,0xEB,0xEA,0xFB, + 0xD7,0xF6,0xB6,0xEE,0xFF,0xFE,0x7E,0x5A,0xD6,0xF6,0xB6,0xEE,0xAF,0x2B,0xAB,0xFE, + 0xB6,0xEE,0x95,0xEE,0xF8,0xA0,0x78,0x50,0xB6,0xF6,0x95,0xEE,0x77,0xEE,0xEB,0xF7, + 0xB6,0xF6,0x75,0xEE,0x6F,0x3E,0xAF,0x3A,0xB5,0xF6,0x96,0xEE,0x0B,0xCA,0xBA,0x7E, + 0x95,0xF6,0xB6,0xEE,0xFF,0xFB,0xFA,0xAE,0x96,0xF6,0xB6,0xEE,0xE5,0xFD,0x7B,0x5E, + 0xD6,0xF6,0xB6,0xEE,0x95,0xB5,0xAB,0xBA,0xD7,0xF6,0xB6,0xE6,0x80,0x22,0xA2,0x20, + 0xD7,0xF6,0xF6,0xEE,0x20,0x22,0x28,0x00,0xD7,0xF6,0xB6,0xEE,0x8A,0x5E,0xFE,0xAA, + 0xF8,0xF6,0xD7,0xF6,0x7D,0x79,0x7D,0xD5,0xD6,0xF6,0xB6,0xF6,0x18,0xBE,0xAA,0x20, + 0xB6,0xF6,0x52,0xCD,0xC0,0xC0,0x60,0x40,0x2C,0xAC,0x05,0x6A,0x58,0x5C,0x54,0x5E, + 0x06,0x6A,0x64,0x59,0xB0,0x6A,0x7E,0x77,0x64,0x61,0xE2,0x48,0x2A,0x96,0xDE,0xDE, + 0x06,0x72,0x23,0x59,0xAA,0x0B,0xA9,0x2D,0x06,0x72,0xA5,0x61,0x78,0xA8,0xA2,0xEA, + 0xA5,0x69,0x44,0x59,0x28,0xEC,0x7E,0x98,0x85,0x61,0x44,0x59,0xEA,0x4E,0xA6,0x27, + 0xC5,0x61,0x23,0x51,0x3B,0xB7,0xBF,0xA5,0xE6,0x69,0x85,0x59,0x3F,0xBD,0xBF,0x97, + 0x88,0x7A,0x06,0x6A,0x0D,0x3D,0x3D,0x35,0x2C,0xAC,0x47,0x72,0x2F,0xAF,0xBF,0xBD, + 0x96,0xF6,0x0C,0xA4,0x02,0x0B,0x0D,0x25,0xF7,0xFE,0x96,0xF6,0xAA,0xAA,0xAB,0xA9, + 0xD6,0xFE,0xD7,0xF6,0xFF,0xFF,0xFF,0xFF,0xB6,0xFE,0xD7,0xF6,0x55,0x75,0x67,0x7D, + 0xF7,0xFE,0xB6,0xF6,0xD7,0x5E,0x76,0x7E,0xD7,0xF6,0xB6,0xF6,0x6E,0xCF,0xBD,0xDF, + 0xD7,0xF6,0xB6,0xF6,0x55,0x56,0x54,0x57,0xD7,0xF6,0xB6,0xF6,0x75,0xBD,0xB7,0x2F, + 0xD7,0xF6,0xB6,0xF6,0xDE,0xF8,0xBC,0x53,0xD6,0xF6,0xB6,0xF6,0x6D,0xFF,0xF6,0xA4, + 0xD6,0xF6,0xB6,0xF6,0x1F,0x0F,0x8B,0xB8,0xF7,0xF6,0xD6,0xF6,0x35,0x15,0x95,0x55, + 0x17,0xFF,0xD7,0xF6,0xEE,0xEA,0xEF,0xEF,0x17,0xFF,0xF7,0xF6,0xD5,0x75,0xFD,0xFD, + 0xD7,0xFE,0xF7,0xF6,0xF9,0xB7,0xAD,0x2B,0xF7,0xFE,0x95,0xEE,0x00,0xAA,0xEA,0x78, + 0xD6,0xF6,0xF0,0xC4,0xA0,0xE8,0x6A,0x5A,0x71,0xD5,0x46,0x7A,0xE0,0xE8,0x5A,0x5E, + 0xC8,0x82,0xC5,0x69,0xE8,0xBE,0xFB,0xF7,0x46,0x7A,0x05,0x72,0xE8,0x90,0x60,0x8F, + 0x46,0x82,0xE5,0x71,0xAC,0xBA,0x2D,0xEA,0x87,0x8A,0x26,0x7A,0xBD,0xF3,0x89,0x2B, + 0xA8,0x8A,0x46,0x82,0x2A,0xBF,0xDF,0xFE,0xA8,0x8A,0x26,0x7A,0xA8,0xA0,0xEF,0xDF, + 0xA8,0x82,0xE5,0x71,0x2A,0x3E,0x1F,0x37,0x55,0xEE,0x8A,0x9B,0x0D,0x29,0x09,0x0B, + 0x18,0xFF,0xD7,0xFE,0x39,0xA9,0xAB,0x2B,0x17,0xFF,0x18,0xF7,0xF8,0xA8,0xBA,0xEA, + 0x17,0xFF,0x18,0xF7,0xFB,0xBE,0xEB,0xEE,0x18,0xFF,0x17,0xF7,0xFF,0xEF,0xFE,0xEB, + 0x18,0xFF,0x17,0xF7,0xEE,0xFE,0xAF,0xFB,0x18,0xFF,0xF7,0xF6,0x82,0xE0,0x70,0x7A, + 0xF7,0xF6,0xD7,0xF6,0x78,0xFA,0x5E,0xAA,0xF7,0xF6,0xD7,0xF6,0xAA,0xAA,0x8A,0x83, + 0xF7,0xF6,0xD7,0xF6,0xFD,0xFA,0xBA,0xA6,0xF7,0xF6,0xD7,0xF6,0xF7,0xBF,0xFF,0xFF, + 0xF7,0xF6,0xD7,0xF6,0x36,0xBA,0x76,0x5E,0xF7,0xF6,0xD7,0xF6,0x75,0xD7,0x9D,0xD5, + 0xF7,0xF6,0x97,0xF6,0xB2,0xAA,0xA0,0xA2,0xD7,0xF6,0xF7,0xEE,0x80,0xA0,0x00,0xA0, + 0xF7,0xF6,0xD7,0xF6,0x8F,0xED,0x35,0x31,0x18,0xFF,0xF7,0xF6,0x35,0x0D,0xBA,0xEA, + 0x18,0xFF,0xB6,0xEE,0xE0,0x78,0xFE,0xDF,0xB7,0xF6,0xB6,0xEE,0xFF,0x97,0xBF,0xAA, + 0xB6,0xF6,0x96,0xEE,0xA2,0xAA,0xA0,0xFA,0x96,0xF6,0x75,0xEE,0x70,0x60,0xE8,0x78, + 0x96,0xEE,0x14,0xDE,0xA8,0xE8,0xE8,0x5A,0x55,0xE6,0xB3,0xD5,0xA8,0xAA,0xE2,0x7A, + 0x14,0xDE,0x71,0xCD,0x78,0x7A,0xD7,0x25,0xB6,0xF6,0x92,0xD5,0xBD,0x2D,0x0B,0x02, + 0xF7,0xFE,0x96,0xF6,0xBD,0xAF,0xBB,0x8A,0xF7,0xF6,0xB7,0xEE,0xEA,0xBA,0xEA,0xAE, + 0xF7,0xF6,0xD7,0xF6,0xFF,0xDD,0x57,0x55,0xF7,0xF6,0xD7,0xF6,0x59,0xD5,0x55,0xB5, + 0xF8,0xF6,0xB6,0xEE,0xEE,0x7F,0xBE,0x2A,0xF7,0xF6,0xB7,0xEE,0xFF,0xFF,0xEB,0xAA, + 0xD7,0xF6,0xB7,0xEE,0xEC,0xBF,0xAC,0x38,0xD7,0xF6,0xB7,0xEE,0xAB,0x2E,0x8E,0xAA, + 0xD7,0xF6,0xB6,0xEE,0x08,0xA2,0xA8,0xEA,0xD7,0xF6,0xB6,0xEE,0x88,0x3E,0xBE,0xB7, + 0xD7,0xF6,0xB6,0xEE,0xFE,0x6E,0xFE,0x7E,0xD7,0xF6,0xB6,0xEE,0xFF,0x3F,0x3F,0xAF, + 0xD7,0xF6,0xB6,0xEE,0xDD,0x7E,0x70,0xEA,0xD6,0xF6,0xB7,0xEE,0x5D,0x5F,0x5F,0xFB, + 0xD7,0xF6,0xB7,0xEE,0xAD,0xFD,0xAD,0xB7,0xF8,0xFE,0xD7,0xEE,0x2B,0x27,0x2D,0xF5, + 0x38,0xFF,0xF8,0xF6,0x2A,0xAA,0xAF,0xBF,0x38,0xFF,0x19,0xFF,0x2E,0xA6,0xAF,0xAF, + 0x38,0xFF,0xF7,0xF6,0x7A,0xEA,0xE0,0x80,0x18,0xF7,0xF7,0xF6,0x55,0x55,0x57,0x5E, + 0xF8,0xF6,0xD7,0xF6,0xE8,0xAA,0xFB,0x2E,0xF7,0xF6,0xD7,0xF6,0x6A,0x2E,0x2B,0xA8, + 0xF7,0xF6,0xD7,0xF6,0xA5,0xD6,0xFA,0x7A,0xF7,0xF6,0x96,0xEE,0xE0,0xAA,0xD8,0xFA, + 0xB7,0xF6,0xD7,0xEE,0xBE,0x8A,0xAA,0xA0,0xD7,0xF6,0xB6,0xEE,0x2B,0x2A,0xAA,0x0F, + 0xD7,0xF6,0x34,0xDE,0xF8,0x78,0xE8,0x78,0x54,0xE6,0xD2,0xD5,0x36,0x36,0x3E,0x2E, + 0xD7,0xF6,0x75,0xE6,0x0F,0x89,0x01,0x0B,0xD7,0xF6,0x34,0xE6,0x78,0x78,0xE8,0xE2, + 0x34,0xE6,0x92,0xCD,0x58,0x5A,0x58,0x78,0xB3,0xD5,0x71,0xCD,0x5F,0xEA,0xC3,0xC2, + 0xD2,0xD5,0x71,0xCD,0x2D,0x17,0xA5,0xA5,0x14,0xDE,0xD3,0xDD,0x63,0xEB,0x8A,0xCD, + 0x92,0xCD,0xEF,0xBC,0xEA,0xB8,0xF8,0x5C,0x51,0xC5,0x10,0xC5,0x28,0xBE,0xBE,0x55, + 0x75,0xEE,0x51,0xCD,0xBD,0xA5,0x2D,0x0D,0xD7,0xF6,0x75,0xEE,0xAD,0x29,0x0A,0x02, + 0xD7,0xF6,0x75,0xEE,0xC2,0xAA,0x68,0xA8,0x96,0xEE,0x34,0xE6,0x7C,0xFA,0x7A,0x6E, + 0x55,0xE6,0x34,0xE6,0xDE,0xDB,0x77,0x5B,0x75,0xEE,0x55,0xE6,0x07,0x09,0x29,0x75, + 0xD6,0xF6,0x95,0xEE,0xAF,0xA9,0xAB,0xAB,0xB5,0xF6,0xD6,0xEE,0xAF,0xAA,0xFA,0xE2, + 0xD6,0xF6,0xB6,0xEE,0x8F,0x78,0x50,0x71,0xD6,0xF6,0xB6,0xEE,0xAD,0xAB,0xFF,0xA7, + 0xD6,0xF6,0xB6,0xEE,0xAD,0x77,0x77,0xFF,0xD6,0xF6,0xB6,0xEE,0xEA,0xBB,0xAB,0x8A, + 0xD6,0xF6,0xB6,0xEE,0xBF,0x6F,0x6A,0x72,0xD6,0xF6,0xB6,0xEE,0x5F,0x59,0xFE,0x7E, + 0xD6,0xF6,0xB6,0xEE,0x2B,0xAF,0xFF,0xF7,0xD6,0xF6,0xB6,0xEE,0xAE,0xBA,0xDE,0xFB, + 0xD6,0xF6,0xB6,0xEE,0x78,0xBF,0x75,0xFD,0xD6,0xF6,0xB6,0xEE,0xFE,0xFE,0xFF,0x6B, + 0xD6,0xF6,0x95,0xEE,0x56,0xDA,0x7E,0xFF,0xB6,0xF6,0x96,0xEE,0xDF,0x77,0xBF,0xCD, + 0xB6,0xF6,0x96,0xEE,0x9A,0x7E,0xF2,0xE2,0xB5,0xF6,0x96,0xEE,0x5E,0xDF,0xFF,0xFE, + 0xB6,0xF6,0x96,0xEE,0xFB,0xEB,0xFD,0xED,0xD6,0xF6,0x96,0xEE,0xAD,0xAF,0xBD,0xFF, + 0xD6,0xF6,0xB6,0xEE,0xBA,0x36,0x2F,0x0B,0xF6,0xF6,0xB7,0xEE,0xBE,0xBE,0xAA,0xAB, + 0xD7,0xF6,0xB6,0xEE,0xEC,0xAC,0xA8,0x28,0xD7,0xF6,0xF6,0xEE,0x00,0xA8,0xA8,0x88, + 0xD6,0xF6,0xF7,0xEE,0x88,0x0A,0x02,0x00,0xD6,0xF6,0xB7,0xF6,0xE8,0xC2,0xE0,0xFA, + 0xB6,0xF6,0x72,0xD5,0x60,0x60,0x60,0x40,0x8B,0x9B,0x84,0x59,0x7C,0x5C,0x5C,0x5C, + 0xA5,0x61,0x43,0x51,0xEC,0x7A,0xFA,0x8F,0x65,0x59,0xE3,0x48,0xEE,0x6A,0x78,0xE0, + 0xA5,0x61,0xC2,0x48,0x0F,0x2D,0xBD,0xBF,0x06,0x72,0x84,0x59,0x8A,0xAA,0xFF,0xBD, + 0xC5,0x69,0x64,0x59,0x58,0x7E,0xEE,0x6A,0x64,0x59,0x04,0x51,0x8A,0xAA,0x98,0xAA, + 0x64,0x59,0x24,0x51,0x2F,0xFB,0xFA,0xAB,0xC5,0x61,0x44,0x51,0x2E,0x3F,0xBD,0xD5, + 0x27,0x72,0xC5,0x61,0x2F,0x2D,0x5D,0x55,0x09,0x8B,0xE6,0x61,0x2B,0xAF,0xBD,0xB5, + 0x92,0xD5,0x29,0x8B,0x2D,0xBD,0xF5,0x55,0xB6,0xF6,0x6E,0xB4,0x00,0x02,0x0B,0x0D, + 0xD7,0xFE,0xD6,0xF6,0xFF,0xFE,0xEA,0xAA,0xB7,0xFE,0xD7,0xF6,0x77,0xFD,0x57,0x55, + 0xD7,0xF6,0xB6,0xF6,0xF8,0xE2,0xE0,0x80,0xD7,0xF6,0xB6,0xF6,0x7E,0xEB,0xF9,0xA9, + 0xD7,0xF6,0xB6,0xF6,0xD5,0xB5,0xAF,0xBF,0xD7,0xF6,0xB6,0xF6,0xAE,0xF6,0xAA,0xEB, + 0xD6,0xF6,0xB7,0xF6,0x60,0xE2,0x20,0xAA,0xD6,0xF6,0xB6,0xF6,0x1A,0xAE,0x9A,0x3A, + 0xD6,0xF6,0xB7,0xF6,0x78,0xCA,0x80,0xA0,0xF7,0xFE,0xB6,0xF6,0xAB,0xBF,0xA7,0xAD, + 0xF7,0xFE,0xD7,0xF6,0x8B,0xAA,0x8B,0xAB,0xF7,0xFE,0xD7,0xF6,0x8B,0xAE,0xAA,0xAA, + 0xF7,0xFE,0xB6,0xF6,0xA8,0xA2,0xEA,0x68,0xB6,0xF6,0x31,0xCD,0x80,0x80,0xE8,0x78, + 0x72,0xD5,0x25,0x72,0xA0,0xE0,0x78,0x7E,0x09,0x8B,0xE5,0x69,0xDC,0xDE,0xD7,0xFD, + 0x46,0x7A,0x05,0x72,0xD1,0xAF,0x3F,0x2A,0x67,0x82,0x26,0x7A,0xB5,0x5F,0x1F,0x03, + 0x67,0x82,0x26,0x7A,0x57,0xDC,0x38,0x80,0x87,0x8A,0x06,0x7A,0x23,0x82,0xCA,0x5E, + 0x67,0x82,0x26,0x7A,0x28,0xE2,0xCB,0x59,0x67,0x82,0x26,0x7A,0xB2,0xBE,0xBD,0x77, + 0x0D,0xAC,0x66,0x7A,0xD5,0x95,0xB5,0x35,0xD7,0xFE,0x8E,0xBC,0x2D,0x29,0x09,0x0B, + 0x18,0xFF,0xF7,0xFE,0xBD,0xB5,0xAD,0x2D,0xF7,0xFE,0x38,0xF7,0xBE,0xEA,0xFA,0x7E, + 0x18,0xFF,0x37,0xF7,0x82,0xAA,0xAB,0xAB,0x38,0xFF,0x17,0xF7,0x77,0x5F,0xDD,0xFE, + 0x38,0xFF,0xF7,0xF6,0xAB,0xBA,0xAB,0xAA,0x18,0xFF,0xF7,0xF6,0x7B,0xEA,0xF8,0xD8, + 0xF7,0xF6,0xD7,0xF6,0xA0,0xB0,0xE8,0xAE,0xF7,0xF6,0xD7,0xF6,0xAA,0xEE,0xAE,0xA8, + 0xF7,0xF6,0xD7,0xF6,0xBB,0xEA,0xEA,0xC2,0xF7,0xF6,0xB7,0xEE,0xBA,0xF8,0xAA,0x2A, + 0xF7,0xF6,0xD7,0xF6,0xD5,0x55,0x57,0x28,0xF7,0xF6,0xD7,0xF6,0xF5,0xAD,0xEB,0xC8, + 0xF7,0xF6,0xD7,0xF6,0x7E,0xDF,0xEF,0x0E,0xF7,0xF6,0xD7,0xF6,0xB5,0x5F,0x9E,0x2E, + 0x17,0xFF,0xD7,0xF6,0xAF,0x0B,0xAB,0xA2,0x17,0xFF,0xB6,0xF6,0xC8,0xE8,0x5A,0x57, + 0xD6,0xF6,0x96,0xEE,0x28,0xAA,0xBF,0xAF,0xB6,0xF6,0xD7,0xEE,0x8A,0x0A,0x20,0x82, + 0xD6,0xF6,0x96,0xEE,0x7F,0x5E,0x5E,0x7E,0x96,0xEE,0x34,0xE6,0xA0,0xE8,0xF8,0xFE, + 0x75,0xE6,0xF3,0xD5,0xF8,0xFA,0x6A,0x7A,0x35,0xE6,0x92,0xCD,0x7A,0x5E,0xBF,0x2E, + 0xD7,0xF6,0x92,0xD5,0xB5,0xAF,0x2A,0x02,0xD7,0xF6,0xB6,0xF6,0x21,0x0D,0x0D,0x09, + 0xF7,0xF6,0xD7,0xF6,0x79,0xFD,0xF5,0x55,0xF7,0xF6,0xD7,0xF6,0xF5,0xFB,0x5F,0x5D, + 0xF7,0xF6,0xB7,0xEE,0xAB,0xAB,0xAF,0xAF,0xF7,0xF6,0xB7,0xEE,0x2A,0xAA,0xEA,0xFA, + 0xD7,0xF6,0xF7,0xEE,0x2A,0x00,0x00,0x20,0xD7,0xF6,0xB7,0xEE,0x82,0x80,0xA0,0x80, + 0xD7,0xF6,0xB7,0xEE,0xA8,0xEB,0x82,0xC8,0xD7,0xF6,0xB7,0xEE,0x28,0x02,0xC2,0xEA, + 0xD7,0xF6,0xB7,0xEE,0xF8,0x2A,0xAE,0xAF,0xD7,0xF6,0xB6,0xEE,0xA7,0xB5,0xFF,0xDF, + 0xD7,0xF6,0xB7,0xEE,0x77,0xBE,0xBC,0xA8,0xD7,0xF6,0xB6,0xEE,0x8B,0x8B,0x2F,0xBE, + 0xD7,0xF6,0xB7,0xEE,0xC8,0x82,0x00,0x80,0xD7,0xF6,0xB7,0xEE,0xE8,0xAE,0xEA,0x2A, + 0xD7,0xF6,0xB6,0xEE,0xEF,0xFB,0xAA,0xAF,0xD7,0xF6,0xB6,0xEE,0x29,0xEF,0xAA,0x0A, + 0x18,0xF7,0xD7,0xF6,0x2B,0xAB,0xAF,0xBD,0x38,0xFF,0xF7,0xF6,0xAB,0x2A,0x2B,0xED, + 0x39,0xFF,0x38,0xFF,0xEB,0xAF,0xAF,0xBF,0x38,0xFF,0xF7,0xF6,0x5E,0x7A,0x78,0x60, + 0xF7,0xF6,0xD7,0xF6,0xAF,0x09,0xA8,0x83,0xF7,0xF6,0xD7,0xF6,0xC8,0x62,0x7E,0x57, + 0xF7,0xF6,0x96,0xEE,0xA0,0xAA,0xEA,0xDF,0xD7,0xF6,0x96,0xEE,0x70,0xFE,0x5F,0x57, + 0xB6,0xEE,0x96,0xEE,0x8A,0xAF,0x3F,0xA5,0xD7,0xF6,0xB6,0xEE,0x0D,0x0D,0x2D,0x25, + 0xD7,0xF6,0xF4,0xDD,0xE8,0xE0,0x60,0x60,0x14,0xDE,0x51,0xC5,0x00,0x20,0x2E,0x35, + 0xD6,0xF6,0x55,0xE6,0x09,0x2D,0xAD,0xBD,0xD7,0xF6,0x55,0xEE,0x62,0xE8,0xEA,0xE8, + 0x35,0xE6,0x92,0xCD,0x5A,0x58,0x58,0x58,0xB2,0xD5,0x71,0xCD,0x63,0xC2,0xC2,0xC2, + 0xB2,0xD5,0x71,0xCD,0xB5,0xAD,0x2D,0x2D,0x13,0xDE,0xB2,0xD5,0x8B,0x83,0x29,0xA9, + 0x92,0xD5,0xCF,0xBC,0x7C,0x5C,0x5C,0x5C,0x31,0xC5,0xAE,0xB4,0x0B,0x2B,0xB5,0xD7, + 0x96,0xEE,0x51,0xCD,0x2D,0xAF,0xBD,0xF5,0xD7,0xF6,0xF3,0xDD,0x00,0x0A,0x0B,0x2D, + 0xD7,0xF6,0x75,0xEE,0xEA,0xF8,0x58,0xFA,0x75,0xEE,0x34,0xE6,0xE8,0xC0,0x70,0x78, + 0x35,0xEE,0x54,0xE6,0xE5,0x57,0xDF,0x76,0x76,0xEE,0x35,0xE6,0xFB,0xAF,0xB6,0xFE, + 0xD6,0xF6,0xB6,0xEE,0xFD,0xFE,0xEE,0x2A,0xD6,0xF6,0xB6,0xEE,0xDB,0xFF,0x7B,0x6A, + 0xD6,0xF6,0xB6,0xEE,0xAD,0xEF,0xAD,0x3F,0xB6,0xF6,0xD6,0xEE,0xFF,0xFF,0xFF,0xAF, + 0xD6,0xF6,0xB6,0xEE,0xA6,0xEA,0xEA,0xAA,0xD6,0xF6,0xB6,0xEE,0xF2,0xAF,0xAA,0xA2, + 0xD6,0xF6,0xB6,0xEE,0xA1,0x8E,0xFE,0xAA,0xD6,0xF6,0xB6,0xEE,0xE2,0xA3,0x82,0xBA, + 0xD6,0xF6,0x96,0xEE,0xA2,0x8A,0xD8,0x8A,0xD6,0xF6,0xB6,0xEE,0xEB,0xA2,0x68,0xA2, + 0xD6,0xF6,0xB6,0xEE,0x6E,0xF2,0xE2,0xEB,0xD6,0xF6,0xB6,0xEE,0xF9,0xFF,0x7A,0xAA, + 0xD6,0xF6,0x96,0xEE,0xFF,0xDF,0xFA,0xFA,0xB6,0xF6,0x96,0xEE,0x9F,0xAA,0x8B,0xBA, + 0x96,0xF6,0xB6,0xEE,0xBF,0xED,0xBB,0xFF,0xB6,0xF6,0x96,0xEE,0x7E,0xFA,0xCA,0xA8, + 0x96,0xF6,0xB6,0xEE,0x7E,0x7F,0xF7,0xF7,0xB6,0xEE,0x96,0xEE,0x22,0x2A,0xAA,0xC2, + 0xD6,0xF6,0xB6,0xEE,0x8F,0x0B,0x03,0x2D,0xF6,0xF6,0xB6,0xEE,0xEE,0xFA,0xFA,0xFE, + 0xD6,0xF6,0xB7,0xE6,0x20,0xA2,0x0A,0x80,0xD6,0xF6,0xF6,0xEE,0x08,0x28,0x20,0x02, + 0xF6,0xF6,0xB6,0xEE,0xEB,0xAF,0xAF,0xFE,0xD6,0xF6,0xB6,0xF6,0x72,0xDA,0xBA,0x20, + 0xD6,0xF6,0xB2,0xD5,0x60,0x60,0x60,0xE0,0x6C,0xAC,0x83,0x51,0x5E,0x5C,0x5C,0x5C, + 0xA5,0x61,0x23,0x51,0x2F,0xB7,0x7F,0xDA,0x85,0x59,0x23,0x51,0x6A,0xE8,0xAA,0xB7, + 0x85,0x59,0x23,0x51,0xF5,0x77,0x5C,0xEE,0xC6,0x61,0x24,0x51,0x0B,0xAF,0xEF,0x57, + 0xA6,0x61,0x44,0x51,0x88,0xEB,0x7E,0x6B,0x64,0x59,0x03,0x49,0x2A,0xFE,0xDE,0xFF, + 0x44,0x51,0x03,0x49,0x00,0xAE,0x96,0x57,0x85,0x59,0x23,0x49,0xAF,0x2F,0xAF,0xFD, + 0xE5,0x61,0x65,0x51,0x2A,0x2F,0xAD,0xAD,0x87,0x7A,0xE5,0x61,0x3D,0xED,0x35,0xB5, + 0x4B,0x93,0x88,0x7A,0x2B,0x2D,0x2D,0x2D,0xD3,0xDD,0x6A,0x93,0x2D,0xBD,0xF5,0xD5, + 0xB6,0xF6,0x0D,0xA4,0x00,0x02,0x2F,0xB5,0xD7,0xFE,0xF4,0xDD,0x00,0x00,0xAA,0xF5, + 0xD7,0xF6,0xB2,0xD5,0x00,0x80,0xEA,0x5F,0xB6,0xF6,0x50,0xCD,0x00,0x00,0x0A,0xF5, + 0xD6,0xF6,0x55,0xEE,0x80,0x22,0x22,0xBD,0xD6,0xF6,0xB6,0xF6,0xED,0x7F,0x7A,0x9D, + 0xD6,0xF6,0xB6,0xF6,0x2F,0xAB,0xBB,0x55,0xD6,0xF6,0xB6,0xF6,0xA8,0xDE,0xFE,0xBF, + 0xD6,0xF6,0xB6,0xF6,0xA3,0x2B,0x88,0x6A,0xF7,0xFE,0xB6,0xF6,0xA9,0xA7,0x3D,0x0D, + 0xF7,0xFE,0xD7,0xF6,0x6F,0xBF,0xE8,0xFC,0xF7,0xFE,0xD7,0xF6,0x2A,0x2B,0xCA,0x60, + 0xD7,0xFE,0x72,0xD5,0x80,0x80,0xE0,0x7A,0x34,0xE6,0x87,0x7A,0xA0,0xE8,0x6A,0x7E, + 0x8B,0x9B,0x05,0x72,0x58,0x5E,0x57,0x55,0x46,0x7A,0x05,0x72,0xA7,0xEF,0xE8,0x03, + 0x67,0x82,0x26,0x7A,0x2F,0x0D,0x05,0x2D,0x87,0x8A,0x46,0x82,0x39,0x2E,0xAF,0xE2, + 0x88,0x8A,0x26,0x82,0xA8,0xE2,0x53,0x7B,0x67,0x8A,0xE5,0x79,0x76,0xF0,0xFE,0xEF, + 0x46,0x82,0xE4,0x71,0xEB,0x6F,0xCB,0x03,0xC8,0x92,0x25,0x7A,0xDD,0xF7,0xBF,0x2F, + 0x52,0xD5,0xA8,0x8A,0x35,0x35,0x3D,0x2D,0xF8,0xFE,0xD3,0xE5,0x2D,0x0B,0x0B,0x03, + 0x17,0xFF,0xF8,0xFE,0xB9,0xA9,0xEF,0xBB,0x38,0xFF,0xF7,0xF6,0xAB,0xBB,0xAF,0x8F, + 0x18,0xFF,0x37,0xF7,0xEB,0xAA,0xBA,0xAA,0x38,0xFF,0x18,0xFF,0x5E,0x5A,0xDA,0xBF, + 0x18,0xFF,0x38,0xF7,0x28,0xA2,0x28,0xAA,0x18,0xFF,0xF7,0xF6,0x78,0x78,0x7C,0x78, + 0xF7,0xF6,0xD7,0xF6,0xD6,0xAC,0x2A,0x02,0xF7,0xF6,0xD7,0xF6,0xF8,0xE8,0x2A,0xAE, + 0xF7,0xF6,0xD7,0xF6,0xEA,0x62,0x8A,0xAA,0xF7,0xF6,0xD7,0xF6,0x0E,0x3A,0xEE,0xF6, + 0xF7,0xF6,0xD7,0xF6,0x80,0x00,0xBA,0xBF,0xF7,0xF6,0xD7,0xF6,0xA8,0xFE,0xB8,0xAA, + 0xF7,0xF6,0xD7,0xF6,0x2C,0xAC,0xAA,0x28,0x17,0xFF,0xD7,0xF6,0xBF,0x0B,0x0B,0x82, + 0x18,0xF7,0xB6,0xF6,0xE0,0xF8,0x78,0x5F,0xD6,0xF6,0x96,0xEE,0xFA,0xFA,0xEA,0xFF, + 0xB6,0xF6,0x96,0xEE,0x2B,0xAF,0xF7,0x5F,0xB6,0xF6,0x96,0xEE,0x38,0xEF,0x5F,0x7D, + 0xB7,0xF6,0x55,0xE6,0xE8,0xFA,0x6E,0x57,0x75,0xEE,0x14,0xE6,0xE8,0xE2,0xFA,0x7F, + 0x96,0xEE,0xF3,0xDD,0x5B,0xBF,0xAF,0x0F,0xD7,0xFE,0x34,0xE6,0xB5,0x2F,0x02,0x02, + 0xF7,0xF6,0xB7,0xF6,0xFF,0xFA,0xEA,0xA8,0xF7,0xF6,0xD7,0xF6,0x55,0xEF,0x9D,0x3D, + 0xF7,0xF6,0xD7,0xF6,0x5F,0x76,0x5F,0xFF,0xF7,0xF6,0xB6,0xEE,0xDB,0xAB,0xAE,0xAE, + 0xD7,0xF6,0xF7,0xEE,0x00,0x82,0xA2,0x08,0xB7,0xF6,0xF7,0xEE,0xAB,0x2F,0xAB,0x2A, + 0xF7,0xF6,0xB7,0xF6,0x2A,0xBB,0xEF,0xFF,0xD7,0xF6,0xB6,0xEE,0x80,0xE0,0xF8,0xFC, + 0xD7,0xF6,0xB7,0xEE,0x4E,0xAA,0xAA,0x0A,0xD7,0xF6,0xB7,0xEE,0xAA,0xAE,0xFA,0x4A, + 0xD7,0xF6,0xB6,0xEE,0xEF,0xFF,0xEF,0xA2,0xD7,0xF6,0xB7,0xEE,0xFF,0xAA,0x82,0x00, + 0xD7,0xF6,0xB7,0xEE,0x2A,0x82,0xA8,0xBA,0xD7,0xF6,0xB7,0xEE,0xA8,0x08,0x00,0x00, + 0xF7,0xF6,0xB6,0xEE,0xFF,0xEB,0xEA,0xEA,0xD7,0xF6,0xB6,0xEE,0x88,0xAC,0x3E,0xAA, + 0xB7,0xF6,0xF7,0xEE,0xBA,0xFA,0xAE,0xAE,0xF7,0xF6,0xD7,0xEE,0xF5,0xFD,0xAF,0xA9, + 0xF7,0xF6,0xD7,0xF6,0xED,0xAD,0xBE,0xAE,0x18,0xFF,0xD7,0xF6,0x0B,0x29,0xAF,0xAF, + 0x38,0xFF,0x18,0xF7,0x23,0x2B,0xAF,0xB5,0x38,0xFF,0xF8,0xF6,0xE8,0xE8,0xA0,0xA2, + 0x18,0xF7,0xD7,0xF6,0x7E,0x5E,0x5E,0x50,0xD7,0xF6,0xB7,0xEE,0xE8,0x70,0x72,0x5E, + 0xD7,0xF6,0x96,0xEE,0xFA,0xFE,0x7F,0xDF,0x96,0xEE,0x97,0xE6,0x00,0x88,0x22,0x80, + 0x96,0xEE,0x76,0xE6,0x20,0x20,0x0B,0x08,0xD7,0xF6,0x96,0xEE,0x2F,0x1D,0xA7,0x3D, + 0xD7,0xF6,0xF4,0xDD,0x60,0x60,0x60,0x68,0xF3,0xD5,0xEF,0xBC,0xBF,0x27,0xBF,0x3F, + 0xB7,0xF6,0x34,0xE6,0x29,0x09,0x2B,0x29,0xB6,0xF6,0x76,0xEE,0xE8,0xA8,0xE2,0x6A, + 0x55,0xEE,0x92,0xD5,0x58,0x58,0x58,0xF8,0xD3,0xD5,0x92,0xCD,0x55,0x7B,0x6A,0x7E, + 0xB2,0xD5,0x71,0xCD,0x0D,0x35,0xF5,0x97,0xF3,0xDD,0xB2,0xD5,0x0F,0x0D,0x0F,0x01, + 0x92,0xD5,0x8E,0xB4,0xD8,0xFC,0x58,0x7C,0xCF,0xBC,0x4D,0xA4,0x2A,0x0A,0x2B,0x27, + 0xD3,0xDD,0x10,0xC5,0x09,0x29,0xA9,0xAD,0x75,0xEE,0xD3,0xD5,0x2D,0x3D,0xB5,0xF5, + 0xB6,0xF6,0x55,0xE6,0x8A,0xAA,0xEB,0xB5,0x75,0xEE,0x34,0xE6,0x60,0xF0,0xE0,0x22, + 0x55,0xE6,0x34,0xE6,0x3B,0x28,0x48,0x5C,0x75,0xEE,0x34,0xE6,0xF7,0xF5,0xB5,0xB5, + 0xD6,0xF6,0xB6,0xEE,0xAA,0xA8,0xAD,0xED,0xD6,0xF6,0xB6,0xEE,0xFB,0xAF,0xAB,0xA2, + 0xD6,0xF6,0xB6,0xEE,0xFC,0xB0,0xAA,0xFA,0xD6,0xF6,0xB7,0xEE,0xEA,0xFA,0xF8,0xE8, + 0xD7,0xF6,0xB6,0xEE,0xAB,0xAA,0xAA,0xAB,0xD6,0xF6,0xD7,0xEE,0xAA,0x8A,0xA8,0x8A, + 0xD6,0xF6,0xB6,0xEE,0xAA,0xEA,0xE0,0x02,0xD6,0xF6,0xB6,0xEE,0xEA,0x21,0xEE,0xB2, + 0xD6,0xF6,0xB6,0xEE,0xFF,0xFE,0xBE,0x22,0xD6,0xF6,0xB6,0xEE,0xDA,0x77,0xDE,0x90, + 0xD6,0xF6,0xB6,0xEE,0xE9,0xAB,0xAB,0x2B,0xD6,0xF6,0xB6,0xEE,0x2A,0x3D,0x07,0x5A, + 0xD6,0xF6,0x96,0xEE,0xFE,0xFE,0xFE,0xFE,0xB6,0xF6,0x96,0xEE,0xDA,0xBA,0x9E,0x7F, + 0xB6,0xF6,0x96,0xEE,0xAE,0xAE,0x8A,0x2B,0x96,0xF6,0xB6,0xEE,0xBF,0xAB,0xAF,0xF7, + 0x95,0xF6,0xB6,0xEE,0xFD,0xD5,0x56,0x57,0xD6,0xF6,0x95,0xEE,0xEB,0xFF,0x9F,0x2F, + 0xD6,0xF6,0xB6,0xEE,0x2D,0x2B,0x0D,0x2E,0xD6,0xF6,0xF7,0xEE,0x80,0xA0,0x00,0x28, + 0xF6,0xF6,0xB6,0xEE,0xE2,0xBA,0xEE,0xFF,0xF6,0xF6,0xD6,0xF6,0x56,0xD5,0xFD,0xFF, + 0xF6,0xF6,0xB6,0xEE,0xBF,0xAE,0xFE,0xEA,0xF5,0xFE,0xD7,0xF6,0x57,0x55,0xF5,0x5D, + 0xD7,0xF6,0x33,0xEE,0x60,0xE0,0x80,0xA0,0xF2,0xDD,0x83,0x59,0x5E,0x5C,0x78,0x78, + 0x84,0x51,0x03,0x49,0xA0,0x7E,0xFE,0x7E,0x64,0x51,0x03,0x49,0x3E,0xD7,0xBB,0xBB, + 0x64,0x59,0x23,0x49,0xB8,0xBC,0xFB,0x7F,0x63,0x51,0x24,0x51,0x5E,0x7E,0xBA,0x5F, + 0x45,0x51,0x04,0x49,0x02,0xB7,0x58,0x5D,0x24,0x51,0xE3,0x40,0x08,0xAA,0x77,0x77, + 0x24,0x49,0xC2,0x40,0xA8,0xAE,0x09,0xB7,0x85,0x59,0x03,0x49,0xBB,0x07,0x2D,0xBD, + 0x06,0x6A,0x64,0x59,0xAB,0xAF,0xAF,0x2D,0xA8,0x7A,0xC5,0x61,0xB5,0xAD,0x2F,0x2B, + 0x2A,0x8B,0x88,0x72,0x2D,0x2F,0xBD,0xAD,0xAB,0x9B,0x0A,0x8B,0x2B,0xAF,0xA9,0xBD, + 0x4E,0xAC,0x6A,0x93,0x3F,0xDD,0x55,0x55,0x31,0xC5,0x6B,0x93,0x02,0xFF,0x55,0x55, + 0x31,0xC5,0x4A,0x8B,0xA0,0xFB,0xF7,0x5D,0x0F,0xC5,0x4A,0x8B,0x2A,0xAF,0xDF,0x55, + 0x34,0xE6,0x8B,0x93,0x02,0xBB,0xF5,0x55,0x75,0xEE,0x8A,0x93,0x00,0x8A,0xFF,0x55, + 0x96,0xF6,0x2C,0xA4,0x00,0x02,0xAF,0x55,0x96,0xF6,0xCF,0xBC,0x00,0x00,0xAA,0x55, + 0xB6,0xF6,0xCF,0xBC,0x00,0x22,0xFE,0x55,0xD7,0xF6,0xF0,0xC4,0x00,0x02,0x2B,0xBD, + 0xD7,0xFE,0x14,0xE6,0x00,0x00,0x82,0x55,0xB7,0xF6,0xD0,0xC4,0x00,0x80,0xA0,0x7E, + 0x15,0xE6,0xC9,0x82,0xA0,0xE8,0x7A,0x5F,0xCC,0xA3,0xE5,0x69,0x78,0x5E,0x5F,0x75, + 0x26,0x72,0xC4,0x69,0xDA,0x8A,0x08,0xEA,0x46,0x82,0x05,0x72,0x8F,0x81,0x8B,0xEB, + 0x87,0x8A,0x47,0x82,0xBD,0x03,0x29,0x75,0x88,0x8A,0x05,0x7A,0xA0,0x98,0xB8,0xF3, + 0x67,0x8A,0xE5,0x79,0xEA,0xAA,0xFE,0xF6,0x67,0x8A,0xE5,0x79,0xA7,0xAB,0x27,0x0F, + 0xA8,0x92,0x05,0x82,0xBD,0xFF,0x2A,0x2A,0x29,0x9B,0x67,0x82,0xB5,0xBF,0xAB,0x2F, + 0xD3,0xE5,0x29,0x9B,0x25,0x3D,0x2D,0x2D,0xF7,0xFE,0x55,0xEE,0x01,0x09,0x03,0x03, + 0x18,0xFF,0xF8,0xFE,0xAB,0xAD,0xFB,0xBB,0x38,0xFF,0xF8,0xF6,0xAF,0xEF,0xFF,0xAF, + 0x18,0xFF,0x38,0xF7,0xA2,0xA0,0x22,0xA8,0x38,0xFF,0x18,0xF7,0xAF,0xFF,0xBE,0xAF, + 0x38,0xFF,0x18,0xFF,0xFE,0x7A,0x7A,0x6E,0x18,0xFF,0xF7,0xF6,0x78,0x7E,0xDA,0xEA, + 0x17,0xFF,0xF7,0xF6,0xD7,0x5D,0x55,0x7D,0xF7,0xF6,0xD7,0xF6,0xA8,0x0E,0x2B,0x88, + 0xF7,0xFE,0xF7,0xF6,0xFD,0xD7,0x7D,0xDF,0xF7,0xF6,0xD7,0xF6,0x60,0xF0,0x80,0x8B, + 0xF7,0xF6,0xD7,0xF6,0xAB,0x0A,0x2F,0x26,0xD7,0xFE,0xF7,0xF6,0xDD,0xD7,0x57,0xD5, + 0x18,0xFF,0xF7,0xF6,0x95,0x2D,0x2B,0xCF,0x17,0xFF,0xB6,0xF6,0xA0,0xE0,0x7C,0x7E, + 0xD6,0xF6,0x96,0xEE,0xFA,0xFA,0xDE,0xFE,0xB6,0xF6,0x96,0xEE,0xFF,0xBF,0x3F,0x77, + 0xB6,0xF6,0x96,0xEE,0xFF,0xAF,0xA9,0x2B,0xB6,0xF6,0x35,0xE6,0xAA,0xE0,0xFA,0x78, + 0x55,0xE6,0xD3,0xDD,0x20,0xE2,0xFA,0x5A,0x35,0xE6,0x93,0xCD,0x20,0xAA,0xB7,0x37, + 0xD7,0xFE,0x55,0xE6,0xB5,0xA5,0xAD,0x2B,0xD7,0xF6,0xB7,0xF6,0x01,0x2D,0x08,0x02, + 0xF7,0xF6,0xD7,0xF6,0xDF,0xED,0x7D,0xFB,0xF7,0xF6,0xD7,0xF6,0xAF,0xE3,0xED,0x5B, + 0xF7,0xF6,0xD7,0xF6,0x6A,0xEE,0xFD,0x55,0xF7,0xF6,0xB6,0xEE,0xAA,0xFF,0xA6,0xAF, + 0xF7,0xF6,0xD7,0xF6,0x75,0x77,0x55,0xFD,0xD7,0xF6,0xB6,0xEE,0xD8,0xE8,0x80,0x80, + 0xD7,0xF6,0xB6,0xEE,0x3B,0xBB,0x7C,0xE0,0xD7,0xF6,0xB6,0xEE,0x7E,0xEF,0x2B,0x8A, + 0xF7,0xF6,0xB7,0xEE,0xAB,0xEE,0xE2,0xFA,0xD7,0xF6,0xB7,0xEE,0xA8,0x80,0x02,0x02, + 0xD7,0xF6,0xB7,0xEE,0x82,0xBA,0x3A,0xFA,0xD7,0xF6,0xB7,0xEE,0x88,0x2A,0xFA,0xEA, + 0xD7,0xF6,0xB7,0xEE,0xAE,0xAF,0xEB,0x7D,0xD7,0xF6,0xB6,0xEE,0x8A,0x23,0x0A,0x5F, + 0xF7,0xF6,0xB7,0xEE,0xEA,0xAB,0xFB,0xFF,0xD7,0xF6,0xB7,0xEE,0xAA,0xB2,0xA8,0x0A, + 0xD7,0xF6,0xD7,0xEE,0xE2,0xA8,0xAA,0xAA,0xD7,0xF6,0xF7,0xE6,0x88,0x20,0x82,0x20, + 0xD7,0xF6,0xF7,0xEE,0xAA,0xA8,0x80,0x00,0x18,0xFF,0xD7,0xF6,0xBA,0xAF,0xBF,0xFD, + 0x38,0xFF,0xF7,0xF6,0xAF,0xBD,0xB5,0xD5,0x18,0xFF,0x38,0xF7,0xAC,0xA2,0xA8,0x80, + 0x38,0xFF,0xD7,0xF6,0x5A,0x7A,0x68,0xE8,0xD7,0xF6,0x96,0xEE,0x7A,0x5A,0x5E,0x5C, + 0x96,0xEE,0x76,0xE6,0x20,0x38,0xC0,0x80,0x96,0xEE,0x76,0xE6,0xF0,0x38,0x80,0xB9, + 0x96,0xEE,0x76,0xEE,0x08,0x20,0xA8,0x5E,0xD7,0xF6,0x76,0xEE,0x2E,0xAF,0xBF,0xBD, + 0xB7,0xF6,0x13,0xDE,0x60,0x40,0x60,0x40,0xD2,0xD5,0x30,0xC5,0x17,0x37,0x37,0x37, + 0xB6,0xF6,0x14,0xDE,0x09,0x29,0x29,0x2D,0xB6,0xF6,0x76,0xEE,0xE2,0xE2,0xE8,0xA0, + 0x76,0xEE,0xD3,0xD5,0x5A,0x58,0x58,0x78,0x93,0xD5,0xD2,0xCD,0xAB,0xAA,0xAE,0xBF, + 0xB2,0xD5,0x72,0xCD,0xBE,0xAE,0xAA,0xAB,0x15,0xDE,0xB3,0xD5,0xAF,0x3D,0xA5,0xA7, + 0xB3,0xD5,0x4D,0xAC,0x58,0x78,0x78,0x78,0xCE,0xBC,0x2C,0xA4,0xBF,0xBF,0xBF,0x35, + 0x71,0xCD,0xEF,0xBC,0x09,0x2D,0xAD,0x03,0xF4,0xDD,0x72,0xCD,0x2B,0x2D,0x3F,0x2F, + 0x95,0xEE,0xF3,0xDD,0x2B,0x8F,0x2F,0x29,0x96,0xEE,0x55,0xE6,0xBE,0x7E,0x7A,0x5E, + 0x75,0xEE,0x35,0xE6,0x7C,0xF2,0xEB,0xEB,0x75,0xEE,0x34,0xE6,0xAD,0x3F,0xBF,0x56, + 0xD6,0xF6,0xB6,0xEE,0xAD,0xFA,0xFA,0xEA,0xD6,0xF6,0xB6,0xEE,0xBA,0xAB,0x9B,0x72, + 0xD6,0xF6,0xB6,0xEE,0xAA,0x2A,0xAE,0xF7,0xD7,0xF6,0xB6,0xEE,0x2A,0xA8,0x38,0x36, + 0xD7,0xF6,0xB6,0xEE,0xBE,0xB8,0x09,0x2B,0xD6,0xF6,0xB6,0xEE,0x8B,0xAA,0x22,0x00, + 0xD7,0xF6,0xF6,0xEE,0x80,0xA0,0x88,0x22,0xD6,0xF6,0xD7,0xEE,0x8A,0xAA,0xA2,0xAA, + 0xD6,0xF6,0xB6,0xEE,0x8A,0x0A,0x22,0x02,0xD6,0xF6,0xF7,0xEE,0x00,0x0A,0x28,0x82, + 0xF7,0xF6,0xB6,0xEE,0xFF,0xEB,0xEC,0xEA,0xD6,0xF6,0xB6,0xEE,0x76,0x5B,0xFE,0xFE, + 0x96,0xF6,0xB6,0xEE,0xED,0xBD,0xED,0xE5,0xB6,0xF6,0x96,0xEE,0xAA,0xBA,0x2A,0x82, + 0xB6,0xF6,0x96,0xEE,0xAE,0xF8,0xAB,0x81,0xB7,0xF6,0xB6,0xEE,0x6B,0xEA,0xEE,0xFF, + 0x95,0xF6,0xB6,0xEE,0x7D,0x57,0x55,0x55,0xD6,0xF6,0xB6,0xEE,0xB5,0xFF,0xBF,0xF7, + 0xD6,0xF6,0xF6,0xEE,0x80,0xA8,0xA0,0x80,0xF7,0xF6,0xD6,0xF6,0x75,0x7B,0x5A,0x7A, + 0xD6,0xF6,0xB6,0xEE,0xA2,0x28,0xA0,0x00,0xD6,0xF6,0xB6,0xEE,0x02,0x00,0x28,0xA0, + 0xF6,0xF6,0xD6,0xF6,0x5F,0x5F,0xB6,0xB5,0xD6,0xF6,0xD7,0xEE,0x0A,0x28,0x2A,0xA8, + 0xF7,0xFE,0xB6,0xF6,0x7E,0xEA,0xAB,0xDA,0x95,0xEE,0x26,0x62,0x78,0x60,0xE0,0xE0, + 0x84,0x51,0x03,0x41,0x7F,0x7C,0xD4,0x5C,0x65,0x51,0xE3,0x40,0x2A,0x83,0xA2,0xA9, + 0x44,0x51,0xE2,0x40,0xAE,0x26,0xF0,0x8A,0x44,0x51,0x03,0x49,0x4B,0x7A,0x4D,0xAB, + 0x24,0x49,0x03,0x49,0x49,0xF4,0xFE,0x78,0x24,0x49,0xC2,0x38,0xFA,0xDA,0xF2,0xF8, + 0x23,0x41,0xE3,0x40,0x75,0x85,0x69,0xF5,0x64,0x51,0xE2,0x40,0x0F,0x0B,0x2F,0x25, + 0x26,0x6A,0x64,0x51,0x35,0x0F,0x0F,0x29,0xC9,0x7A,0x67,0x72,0x2D,0x29,0x29,0x0D, + 0x09,0x83,0xA8,0x7A,0xAF,0xB9,0xF7,0x2F,0x6A,0x93,0xE9,0x82,0x2B,0x09,0xAD,0xBF, + 0x6B,0x93,0x09,0x8B,0x8A,0x0A,0xFB,0x7E,0x4A,0x8B,0xC9,0x82,0x20,0xB2,0xFA,0x77, + 0x4A,0x8B,0xA8,0x7A,0x88,0xFC,0x5F,0x57,0x29,0x8B,0xA8,0x7A,0x08,0xEA,0xFD,0x55, + 0x6A,0x93,0xC8,0x7A,0x0F,0xB7,0xD5,0x55,0x8B,0x93,0xE9,0x82,0x08,0xAF,0xFF,0x75, + 0xCB,0x9B,0x09,0x8B,0x20,0xAB,0xAF,0xB5,0x2C,0xAC,0x6A,0x93,0x2A,0xAF,0xBD,0x7D, + 0x2D,0xAC,0xCC,0xA3,0x02,0xFE,0xFF,0x7D,0xF0,0xC4,0x8B,0x9B,0x2B,0xBF,0xD5,0x55, + 0x10,0xCD,0xE8,0x8A,0x00,0xEA,0xFF,0x7F,0x6E,0xB4,0x46,0x7A,0x80,0xFA,0x7F,0x5F, + 0xE9,0x8A,0xE5,0x69,0xF8,0x7E,0x7F,0x7F,0x67,0x7A,0x05,0x6A,0x7F,0xA5,0xAF,0xEB, + 0x47,0x7A,0xE5,0x71,0x5A,0x78,0x5A,0x7E,0x26,0x7A,0xC5,0x71,0xB2,0x2F,0xBF,0xFD, + 0x46,0x82,0xE5,0x71,0x0A,0x0B,0xEA,0xF5,0x47,0x82,0xE5,0x79,0xF8,0xEB,0x6B,0xAB, + 0x67,0x8A,0xE5,0x79,0x9E,0xBB,0x2D,0x2A,0xC9,0x92,0x46,0x82,0xF5,0xBD,0xBA,0xA2, + 0xA8,0x92,0x46,0x82,0xDF,0x17,0x2E,0x88,0x4A,0x9B,0xC8,0x92,0xBD,0xBD,0xBD,0x35, + 0x76,0xF6,0xAB,0xAB,0x2D,0x0D,0x2B,0x09,0xF7,0xFE,0xB6,0xF6,0x03,0x03,0x00,0x00, + 0x17,0xFF,0xF7,0xF6,0xEF,0xEF,0xAA,0xAB,0x38,0xFF,0xF7,0xF6,0xEF,0xAD,0xAF,0xBF, + 0x38,0xFF,0x17,0xF7,0xFF,0xBD,0xD7,0xF5,0x37,0xFF,0x18,0xF7,0xBE,0xBF,0xFF,0xFF, + 0x38,0xFF,0x17,0xF7,0xFA,0x6E,0xFE,0xDF,0xF7,0xFE,0x18,0xF7,0xFD,0x5F,0xFF,0x7F, + 0x17,0xF7,0xF7,0xF6,0x77,0xF6,0x7E,0xF2,0x17,0xF7,0xF7,0xF6,0x55,0x77,0x56,0x57, + 0x17,0xFF,0xF7,0xF6,0xD7,0x7F,0xF7,0x55,0x18,0xFF,0xD7,0xF6,0xFB,0xAB,0xEA,0xFE, + 0x18,0xFF,0xD7,0xF6,0xFF,0xFB,0xAB,0x2A,0x18,0xFF,0xF7,0xF6,0x7D,0xAF,0x0D,0x82, + 0x18,0xFF,0x95,0xEE,0xA0,0xA8,0x78,0x56,0xD6,0xF6,0x74,0xEE,0xA0,0xAA,0xFA,0xFD, + 0xB6,0xF6,0x96,0xEE,0x22,0x8F,0x2B,0xAA,0xD6,0xF6,0x97,0xEE,0x7E,0xBA,0xAB,0xBF, + 0xD7,0xF6,0x76,0xEE,0x8E,0xEA,0xFE,0x7B,0x96,0xEE,0x34,0xE6,0xF8,0x7A,0x5E,0x7E, + 0x76,0xEE,0x92,0xD5,0x7E,0x5E,0xAF,0x02,0xF7,0xFE,0xB3,0xD5,0xB5,0x2F,0x0A,0x22, + 0xF7,0xFE,0xB7,0xF6,0xBF,0xAB,0xAA,0xAA,0xF7,0xF6,0xD7,0xF6,0xFD,0xD7,0xDD,0x5F, + 0xF7,0xF6,0xD7,0xF6,0x8F,0xAD,0xB6,0xF7,0xF7,0xF6,0xD7,0xF6,0x4E,0x7A,0x78,0xF8, + 0xF7,0xF6,0xD7,0xF6,0x75,0x57,0x5F,0xDF,0xD7,0xF6,0xB7,0xEE,0x02,0xA8,0xA2,0x80, + 0xD7,0xF6,0xB6,0xEE,0x00,0x0A,0x2B,0xEE,0xD7,0xF6,0xF7,0xEE,0x02,0x20,0xA0,0x00, + 0xF7,0xF6,0xB6,0xEE,0xFE,0xE8,0xAA,0xBA,0xD7,0xF6,0xB6,0xEE,0x08,0x02,0x00,0xAC, + 0xF7,0xF6,0xB7,0xEE,0xF2,0xFA,0xEF,0xBB,0xD7,0xF6,0xB7,0xEE,0x8A,0x0A,0xAA,0xFA, + 0xD7,0xF6,0xB7,0xEE,0xEA,0x68,0xFA,0xB2,0xD7,0xF6,0xB6,0xEE,0x77,0xFD,0x7B,0x7F, + 0xD7,0xF6,0xB6,0xEE,0x6D,0xED,0xAD,0xEA,0xD7,0xF6,0xB7,0xEE,0x7F,0xE9,0xBF,0xBE, + 0xB7,0xF6,0xD7,0xEE,0xEE,0xAB,0xFA,0xF9,0xD7,0xF6,0x97,0xEE,0x8A,0xE2,0xAA,0x08, + 0xD7,0xF6,0xB7,0xEE,0x88,0xA2,0x88,0x00,0xD7,0xF6,0xF7,0xEE,0x88,0xA0,0x88,0x02, + 0xF8,0xF6,0xD7,0xF6,0x75,0x8F,0xAF,0xAB,0x18,0xFF,0xD7,0xF6,0xE9,0xFB,0xFA,0xAB, + 0x19,0xF7,0xF8,0xF6,0xD5,0xED,0xB5,0x57,0x38,0xFF,0xF8,0xF6,0xAF,0xAB,0x9F,0x75, + 0x38,0xFF,0xF8,0xF6,0x72,0x6A,0x7A,0xFB,0xF8,0xF6,0x56,0xE6,0xFE,0xEC,0xFC,0xF8, + 0xB7,0xEE,0x76,0xEE,0xFF,0xFA,0xFE,0xFA,0x96,0xEE,0x76,0xE6,0xEF,0xAF,0xC0,0xAA, + 0x96,0xEE,0x55,0xE6,0xEA,0xAA,0xEB,0xF8,0xB7,0xF6,0x76,0xEE,0x3D,0x3D,0x25,0xB5, + 0xB7,0xF6,0x13,0xDE,0x40,0x60,0x60,0xE0,0x13,0xDE,0x0F,0xC5,0xB5,0x37,0x37,0xB7, + 0x96,0xEE,0x14,0xDE,0x0D,0x2B,0x29,0x0F,0xB7,0xF6,0x96,0xEE,0xAA,0xAA,0x2A,0xDA, + 0x76,0xEE,0xD3,0xD5,0x60,0xF8,0x60,0xE0,0xD3,0xDD,0xB3,0xD5,0x6A,0x82,0xE2,0xBF, + 0xB3,0xD5,0x92,0xCD,0xF6,0x14,0xBC,0x70,0xF3,0xDD,0x92,0xCD,0x2F,0xB7,0xAF,0xFF, + 0xB2,0xD5,0x0C,0x9C,0xF8,0x70,0x78,0x7A,0x71,0xCD,0x4D,0xAC,0xB5,0x35,0x25,0x2D, + 0x13,0xDE,0x71,0xCD,0xED,0xAF,0xAA,0xAB,0x35,0xE6,0xB3,0xD5,0xE5,0xFD,0xAB,0x2E, + 0x96,0xEE,0x14,0xE6,0x2D,0x0D,0x0B,0xA9,0x96,0xEE,0x55,0xE6,0x78,0x5E,0x7E,0x5A, + 0x55,0xE6,0x34,0xE6,0x04,0x0C,0xB2,0x79,0x55,0xE6,0x34,0xE6,0xA2,0x3F,0xB9,0x37, + 0xB6,0xF6,0xD6,0xEE,0xFF,0xAB,0xCF,0x6B,0xD6,0xF6,0xB7,0xEE,0x82,0xAA,0x82,0xE8, + 0xD6,0xF6,0xB7,0xEE,0xAA,0xEA,0x08,0x80,0xD6,0xF6,0xB6,0xEE,0x3F,0xAB,0xAA,0xA2, + 0xD6,0xF6,0xB6,0xEE,0x82,0x80,0xE0,0x70,0xD7,0xF6,0xB6,0xEE,0x82,0x07,0xAE,0xAA, + 0xD6,0xF6,0xB6,0xEE,0x02,0x09,0x2B,0xAA,0xD6,0xF6,0xB6,0xE6,0x00,0x88,0x20,0x2A, + 0xD6,0xF6,0xF8,0xEE,0x88,0x08,0xA2,0x08,0xF7,0xF6,0xB6,0xEE,0xEA,0xCE,0xBB,0x6B, + 0xD7,0xF6,0xF6,0xEE,0x08,0x20,0x20,0x2A,0xB6,0xF6,0xD7,0xEE,0xED,0xFF,0xB7,0xFD, + 0xD6,0xF6,0xB6,0xEE,0x57,0x5E,0xDE,0x5E,0x96,0xF6,0xB6,0xEE,0xDD,0xFD,0x55,0xD5, + 0xD6,0xF6,0x96,0xEE,0xAB,0x29,0xBB,0xAB,0xD6,0xF6,0xB6,0xEE,0x5F,0xFE,0xBD,0xD5, + 0xD7,0xF6,0xB6,0xEE,0xF5,0xF7,0x7E,0x5D,0xD6,0xF6,0xB6,0xEE,0xDD,0xEB,0xF9,0x5F, + 0xD6,0xF6,0xB6,0xEE,0x22,0x8A,0x2A,0x02,0xD6,0xF6,0xF6,0xEE,0xAA,0x80,0x88,0x88, + 0xF7,0xF6,0xD6,0xF6,0x77,0xDD,0x75,0xFF,0xF7,0xF6,0xB5,0xF6,0xEA,0xA8,0x2B,0xAF, + 0xF7,0xF6,0xD6,0xF6,0xF5,0x7F,0x6E,0x6A,0xF7,0xF6,0xD7,0xF6,0x5F,0xBB,0xBF,0xFD, + 0xB6,0xFE,0xF7,0xF6,0xAE,0xAD,0xBF,0xEF,0xB6,0xF6,0x8E,0xAC,0x60,0x60,0xC0,0xC0, + 0xCC,0x9B,0x02,0x41,0x57,0x56,0x5E,0x5C,0x64,0x51,0xE2,0x38,0xAF,0x39,0xAA,0xAD, + 0x64,0x51,0x23,0x49,0xAF,0xE2,0xFF,0x77,0x23,0x49,0xE2,0x40,0x28,0x88,0x68,0x62, + 0x24,0x49,0xE2,0x40,0x78,0x6E,0x7A,0xFB,0x03,0x41,0xC2,0x38,0xAF,0xA7,0xDF,0x9A, + 0x23,0x49,0xC2,0x38,0xF7,0xB7,0xBD,0x2F,0x84,0x51,0x03,0x41,0xA5,0xAF,0xA5,0x27, + 0x06,0x6A,0x84,0x51,0x0F,0xAD,0xAD,0x2D,0xA8,0x7A,0x06,0x62,0x23,0x0D,0x27,0xBD, + 0x2A,0x8B,0x87,0x72,0x2B,0x29,0x3D,0xAD,0x4A,0x93,0xE9,0x82,0x2A,0x88,0x7A,0xD2, + 0x4A,0x93,0xA8,0x7A,0xEC,0xFE,0x5F,0x5F,0xA8,0x7A,0x88,0x72,0xE0,0x52,0xC0,0x23, + 0xA8,0x7A,0x47,0x6A,0x82,0xEC,0x7A,0xE8,0xC8,0x7A,0x47,0x6A,0x8A,0xEF,0xBD,0xF7, + 0xC9,0x7A,0x67,0x72,0x3A,0xFE,0xDE,0xB7,0xE9,0x82,0x87,0x72,0x03,0xAD,0xE5,0xDF, + 0x6A,0x93,0xA8,0x7A,0x2B,0x2F,0x2D,0x2D,0x8A,0x9B,0x4A,0x93,0x2A,0xAB,0xB5,0xBF, + 0xCC,0xA3,0x6A,0x93,0x83,0x8B,0xEF,0x7D,0x6B,0x9B,0xC8,0x82,0xA8,0x68,0x78,0x7E, + 0x09,0x93,0x26,0x72,0x80,0xE8,0xFA,0x7E,0x66,0x7A,0xC4,0x69,0xA8,0xFC,0x7E,0x5F, + 0x47,0x7A,0xA3,0x61,0xAA,0xAF,0xB5,0x27,0x88,0x82,0x27,0x72,0x6D,0xEF,0xEB,0x2F, + 0x47,0x7A,0xC5,0x69,0xFA,0xFC,0x5A,0x78,0x06,0x7A,0xC5,0x71,0xA9,0xAE,0xDF,0xD5, + 0x06,0x7A,0xC5,0x71,0x9E,0xAF,0x3F,0xBE,0x47,0x8A,0xE6,0x79,0xAF,0x29,0xAD,0x2B, + 0x87,0x8A,0x26,0x82,0xAD,0xA5,0xAD,0xAB,0xC8,0x92,0x67,0x8A,0xF0,0x69,0xFC,0x5D, + 0x2A,0xA3,0x88,0x8A,0xFD,0xBD,0xAD,0x3D,0x4A,0xA3,0xC8,0x92,0x2D,0x8A,0x82,0x2A, + 0xB6,0xF6,0xAC,0xAB,0x09,0x0D,0x2D,0x2D,0xD7,0xFE,0x18,0xF7,0xAA,0xAE,0xEE,0xBC, + 0x18,0xFF,0xF7,0xF6,0xAB,0x2B,0xAB,0xA3,0x17,0xFF,0xF8,0xF6,0x2A,0x0A,0x8A,0x2A, + 0x17,0xFF,0x39,0xF7,0xA2,0x88,0xB0,0xA8,0x37,0xFF,0x18,0xF7,0xFB,0xFD,0xF7,0xFF, + 0x38,0xFF,0x17,0xF7,0x77,0x57,0xDD,0x7B,0x38,0xFF,0x17,0xF7,0x7F,0xDD,0x7F,0xFF, + 0x17,0xFF,0x38,0xF7,0x0A,0x08,0xA2,0xAE,0x17,0xFF,0xF7,0xF6,0x76,0x7F,0xAA,0xA8, + 0x17,0xFF,0xD7,0xF6,0xBF,0xBF,0xB2,0xA0,0x17,0xFF,0xF7,0xF6,0x77,0xA7,0xAE,0x08, + 0x18,0xFF,0xF7,0xF6,0xAB,0x0B,0x0A,0xA0,0x18,0xFF,0xB6,0xEE,0x60,0x78,0x58,0x5E, + 0xB6,0xEE,0x75,0xEE,0x7E,0xD7,0xBF,0x8A,0x96,0xF6,0x75,0xE6,0xB5,0xFD,0xFE,0x88, + 0xB6,0xF6,0x75,0xEE,0xAB,0xAD,0xF5,0x7F,0xB6,0xF6,0x55,0xEE,0x2A,0xAA,0xEF,0xDF, + 0x96,0xEE,0x75,0xEE,0x40,0x28,0x66,0x5D,0xB6,0xF6,0x54,0xE6,0xBF,0x2F,0xEF,0x75, + 0xD7,0xF6,0x54,0xE6,0x02,0x02,0xBA,0xD5,0xF7,0xFE,0x76,0xEE,0x02,0x22,0xAF,0xDD, + 0xF7,0xFE,0xD7,0xF6,0xAA,0xAA,0x3F,0x95,0xF7,0xF6,0xD7,0xF6,0x7A,0xE2,0x8A,0xA8, + 0xF7,0xF6,0xD7,0xF6,0x8F,0x85,0xB7,0xE7,0xF7,0xF6,0xD7,0xF6,0xFA,0xDE,0xD6,0xFE, + 0xF7,0xF6,0xD7,0xF6,0x5B,0x5A,0xFA,0x00,0xF7,0xF6,0xD7,0xF6,0x75,0x7B,0x5E,0xE4, + 0xF7,0xF6,0xB7,0xF6,0xFF,0xEF,0xAB,0x08,0xD7,0xF6,0xB7,0xEE,0x0A,0x02,0x0A,0x00, + 0xD7,0xF6,0xB6,0xEE,0xA8,0xA0,0x28,0x00,0xD7,0xF6,0xB7,0xEE,0x7C,0xBE,0xEA,0x00, + 0xD7,0xF6,0xB6,0xEE,0x28,0x3E,0x7A,0x5A,0xD7,0xF6,0xB7,0xEE,0xF8,0xAA,0xEA,0xFE, + 0xD7,0xF6,0xB7,0xEE,0xAA,0xAB,0xA5,0xEE,0xD7,0xF6,0xB7,0xEE,0xF7,0x2F,0xAE,0xAA, + 0xD7,0xF6,0xB7,0xEE,0x3A,0xBE,0xAA,0xBE,0xD7,0xF6,0xB7,0xEE,0xA3,0xA6,0xFE,0xAC, + 0xF7,0xF6,0xB7,0xF6,0xFF,0xFE,0xFF,0xCB,0xF8,0xF6,0x97,0xEE,0xAE,0x2A,0x2A,0x0A, + 0xF8,0xF6,0xB7,0xF6,0xAF,0xAE,0xBA,0x0A,0xF8,0xF6,0xD7,0xF6,0xDD,0xBD,0x2A,0x28, + 0xF8,0xF6,0xD7,0xF6,0xEA,0xAE,0xAA,0x3A,0xF8,0xF6,0xD7,0xF6,0x00,0x08,0xAA,0x22, + 0xF8,0xF6,0xD8,0xF6,0x00,0x28,0xBE,0xAA,0xD7,0xFE,0xF8,0xF6,0x55,0x77,0x5D,0x7F, + 0x18,0xFF,0xF8,0xF6,0x2A,0x2A,0x2F,0x2D,0x18,0xFF,0x76,0xE6,0x58,0x7A,0xF8,0xF8, + 0x96,0xEE,0x55,0xE6,0x80,0x2A,0xB6,0xBA,0x96,0xEE,0x76,0xE6,0xB2,0xEF,0x37,0xA3, + 0x96,0xEE,0x76,0xEE,0x5C,0xD7,0xBE,0xF6,0xB6,0xF6,0x76,0xEE,0xB5,0x3F,0xA9,0xBD, + 0xB7,0xF6,0xF3,0xDD,0xC8,0x60,0x60,0x60,0xD3,0xD5,0xF0,0xBC,0x3E,0x2F,0x37,0x3F, + 0x96,0xEE,0xF4,0xDD,0x2B,0x0D,0x0B,0x29,0xB6,0xF6,0x96,0xEE,0x7F,0xF6,0x78,0xFB, + 0x96,0xEE,0x14,0xDE,0x78,0x78,0x78,0x68,0xB3,0xD5,0x51,0xC5,0x00,0xB8,0x7C,0x7E, + 0xB3,0xD5,0x71,0xCD,0xA0,0xFA,0x75,0x55,0xB2,0xCD,0x51,0xC5,0xAA,0x8A,0xAA,0xED, + 0x72,0xCD,0x0C,0xA4,0x78,0x78,0x78,0xF8,0xB3,0xD5,0x8E,0xAC,0x2D,0x2D,0x29,0x09, + 0x14,0xDE,0xB2,0xD5,0xAD,0x2F,0xB7,0xB5,0x55,0xEE,0xF3,0xDD,0xBF,0xBF,0xAF,0x37, + 0x96,0xEE,0x34,0xE6,0x2F,0xAD,0xBF,0x2F,0x96,0xEE,0x55,0xE6,0x78,0xFA,0xA8,0x7A, + 0x55,0xE6,0x14,0xE6,0xE0,0x08,0xA8,0x80,0x55,0xE6,0x35,0xE6,0x3F,0x9E,0xDB,0x23, + 0xD6,0xF6,0xB6,0xEE,0xAF,0xEA,0xAA,0xAA,0xD7,0xF6,0xB6,0xEE,0xBA,0xE8,0xBE,0xBA, + 0xB7,0xF6,0xD6,0xEE,0xBF,0xFF,0xB7,0x1F,0xD7,0xF6,0xB6,0xEE,0xA2,0xB3,0x2A,0xBB, + 0xD7,0xF6,0xB6,0xEE,0xA2,0x0A,0x82,0x02,0xD6,0xF6,0xD7,0xEE,0xAA,0xAA,0xA2,0xAA, + 0xD6,0xF6,0xB6,0xEE,0x21,0xCB,0x0A,0xAA,0xD6,0xF6,0xB6,0xEE,0xA2,0xA8,0x2A,0x02, + 0xD7,0xF6,0xD6,0xEE,0xA2,0xAB,0x2A,0xA8,0xF7,0xF6,0xB6,0xEE,0xBF,0xAE,0xAB,0xAF, + 0xF7,0xF6,0xD7,0xF6,0xFD,0xF5,0xD7,0x5E,0xF7,0xF6,0xB6,0xEE,0xFA,0xEA,0xEE,0xEA, + 0xD6,0xF6,0xB6,0xEE,0x5E,0x5E,0x5F,0xFF,0xD6,0xF6,0x96,0xEE,0xFE,0xEF,0xAA,0xFA, + 0xD6,0xF6,0x95,0xEE,0xAF,0xB7,0xFF,0xFF,0xD6,0xF6,0xB6,0xEE,0xFD,0x5F,0xFF,0x7D, + 0xB7,0xF6,0xB6,0xEE,0xFD,0xFF,0xD7,0xFF,0xD6,0xF6,0xB6,0xEE,0xBD,0xB7,0xD5,0xB5, + 0xD6,0xF6,0xF8,0xEE,0xA0,0x88,0x20,0x08,0xD7,0xF6,0xF6,0xEE,0x02,0xA8,0x2A,0x80, + 0xF7,0xF6,0xB6,0xEE,0xBE,0xAF,0xEB,0x8A,0xF7,0xF6,0xB6,0xEE,0xB6,0xAB,0xBA,0xAB, + 0xD6,0xF6,0xF8,0xEE,0x20,0x88,0x20,0x00,0xF7,0xF6,0xD7,0xF6,0xFD,0xEF,0xF5,0x55, + 0xF7,0xF6,0xB6,0xF6,0xBA,0xFA,0xF8,0xFE,0xB7,0xF6,0x14,0xDE,0x40,0xC0,0xC0,0x00, + 0x51,0xC5,0x43,0x49,0x5E,0x5C,0x5C,0x58,0x23,0x41,0xE2,0x40,0x01,0x2D,0xDD,0xEF, + 0x43,0x49,0x03,0x41,0xB8,0x2A,0x2F,0x0D,0x64,0x51,0x23,0x41,0x5D,0xAB,0x2E,0xBB, + 0x44,0x49,0x03,0x41,0x57,0xD8,0x70,0x70,0x44,0x49,0xE2,0x38,0xF7,0xF7,0xBF,0x2E, + 0x64,0x51,0x03,0x41,0xD7,0xB7,0x0F,0x02,0xE5,0x59,0x43,0x49,0xB5,0x2F,0x05,0xAD, + 0x47,0x6A,0xA4,0x59,0xAD,0x2B,0x2B,0x0A,0x88,0x72,0x26,0x6A,0x29,0x8F,0xAF,0xC3, + 0xC8,0x7A,0x67,0x72,0x03,0xAA,0x2B,0xC9,0x09,0x83,0xA8,0x7A,0x82,0x83,0xED,0x5D, + 0xC9,0x82,0x47,0x72,0xF8,0xE2,0xEA,0x7B,0xA8,0x7A,0x47,0x6A,0x2E,0xFA,0xDF,0x9F, + 0xA8,0x7A,0x47,0x6A,0xE2,0xFA,0x5F,0x57,0x87,0x72,0x26,0x6A,0xA8,0xB6,0x0A,0x8E, + 0x67,0x72,0x26,0x6A,0x3C,0xF7,0xB0,0x20,0xC8,0x7A,0x26,0x6A,0xAA,0xA3,0xA9,0xFB, + 0x4A,0x93,0x87,0x72,0x2F,0xAF,0xE5,0x7D,0x6B,0x9B,0xC8,0x82,0x0A,0x8B,0xAF,0xFD, + 0x8B,0x9B,0x09,0x8B,0xCA,0x8B,0xEA,0xFD,0x29,0x8B,0xC8,0x82,0xD8,0xF8,0x78,0x60, + 0xC8,0x82,0xE6,0x69,0xF8,0xE8,0xF8,0x5A,0x05,0x6A,0xA4,0x61,0xF8,0xDE,0xDA,0xFA, + 0x47,0x72,0xC4,0x69,0xB5,0xBF,0xB9,0x25,0x88,0x82,0x27,0x72,0xAB,0xAA,0x2B,0xE5, + 0x47,0x7A,0x84,0x69,0xF0,0x60,0xE0,0xE8,0xC5,0x71,0x64,0x61,0x28,0x2E,0xB5,0xF5, + 0x06,0x82,0xA5,0x69,0xAF,0xBF,0xBD,0xBF,0x67,0x8A,0xE6,0x79,0xAD,0xA7,0x2F,0xAE, + 0x87,0x8A,0x46,0x82,0x4F,0xE7,0x77,0x5D,0x87,0x8A,0x26,0x82,0x28,0xBA,0xB7,0x55, + 0xE8,0x92,0x46,0x82,0x2D,0xB5,0xBF,0xFF,0x6A,0xA3,0xA8,0x8A,0x2B,0xA9,0xAD,0x25, + 0x96,0xF6,0x8A,0xA3,0x2D,0x2D,0x2D,0x2D,0xD7,0xFE,0x17,0xF7,0xF8,0xE8,0xF8,0xEA, + 0x17,0xFF,0xF7,0xF6,0xAA,0xA2,0xAA,0x0B,0x18,0xFF,0xF7,0xF6,0x8A,0x02,0x0A,0x2A, + 0x18,0xFF,0xF7,0xEE,0x8A,0x8A,0x00,0x80,0x38,0xFF,0x17,0xF7,0xB7,0xED,0xEF,0xFD, + 0x18,0xFF,0x38,0xF7,0xEE,0xAF,0xAE,0xA8,0x37,0xFF,0x18,0xF7,0xBE,0xAF,0xDB,0xBF, + 0x38,0xFF,0x18,0xFF,0xAA,0xEA,0x8A,0x8B,0x38,0xFF,0x18,0xF7,0xFF,0xAB,0xA8,0xA8, + 0x18,0xFF,0x37,0xF7,0x0A,0x2A,0x0A,0x02,0x18,0xFF,0x37,0xF7,0x08,0x20,0xB0,0x20, + 0x18,0xFF,0xB6,0xEE,0xA0,0xE8,0x78,0x7A,0xD7,0xF6,0x96,0xEE,0xD8,0x5E,0xFF,0xEE, + 0xB6,0xF6,0x96,0xEE,0xAF,0xFE,0xFE,0xA0,0xB6,0xF6,0x96,0xEE,0xEA,0xEB,0xEA,0xFB, + 0x96,0xEE,0x54,0xEE,0xE0,0xC0,0xC0,0xC0,0x54,0xE6,0x71,0xCD,0x00,0x80,0xA8,0x78, + 0x55,0xEE,0x10,0xC5,0x00,0xAA,0xFB,0x57,0x14,0xE6,0x71,0xCD,0x80,0xEA,0xFD,0x09, + 0xF3,0xDD,0x10,0xC5,0x00,0xFE,0x7E,0xA8,0x55,0xE6,0x31,0xC5,0x00,0x0F,0xBD,0xF7, + 0xD7,0xFE,0x14,0xDE,0x02,0x2B,0x2F,0xAD,0xF7,0xF6,0x96,0xF6,0x82,0x2A,0xAA,0xAB, + 0xF7,0xF6,0xD7,0xF6,0xA7,0xBD,0xED,0xA6,0xF7,0xF6,0xD7,0xF6,0xAB,0x21,0x89,0xA2, + 0x18,0xFF,0xD7,0xF6,0xBE,0xEA,0xFB,0xFB,0xD7,0xFE,0xF7,0xF6,0xFD,0x5D,0xF5,0xF7, + 0xF7,0xF6,0xD7,0xF6,0xA8,0x5E,0x55,0xFF,0xF7,0xF6,0xD7,0xF6,0x55,0xD5,0xAB,0xAA, + 0xF7,0xF6,0xD7,0xF6,0x5F,0xFB,0x7F,0xBC,0xD7,0xF6,0xF7,0xEE,0x20,0x08,0x00,0x22, + 0xD7,0xF6,0xB7,0xEE,0xB8,0xA8,0xC8,0x42,0xD7,0xF6,0xB6,0xEE,0xA4,0x22,0xBF,0xFD, + 0xD7,0xF6,0xB7,0xEE,0xEE,0x2A,0x8A,0x02,0xB6,0xF6,0xF7,0xEE,0xAA,0xAA,0xBB,0xFA, + 0xF7,0xF6,0xB6,0xEE,0xDF,0xFF,0xAF,0xAB,0xF7,0xF6,0xB7,0xEE,0xAF,0xA9,0x2F,0xA8, + 0xF7,0xF6,0xD8,0xF6,0x8F,0x8A,0xA8,0xA0,0xF8,0xF6,0xD7,0xF6,0xA2,0xF8,0xDE,0xEA, + 0xF8,0xF6,0xD7,0xF6,0xBA,0xAB,0x3E,0x8A,0x18,0xFF,0xD7,0xF6,0xAF,0xAB,0xFE,0xBF, + 0xF7,0xFE,0xF8,0xF6,0xF7,0xFD,0xD7,0x7F,0x18,0xFF,0xD7,0xF6,0xEE,0xAA,0xEE,0x7F, + 0xF7,0xF6,0xB8,0xF6,0xA2,0xAE,0xAA,0xEB,0xF8,0xF6,0xD7,0xF6,0xFF,0xDE,0x5D,0x55, + 0x18,0xFF,0xD7,0xF6,0x2B,0x3F,0xBD,0xBF,0x18,0xFF,0xB6,0xEE,0x58,0x78,0xFA,0xFA, + 0xB6,0xEE,0x76,0xE6,0x57,0x57,0xFE,0xFC,0x76,0xEE,0x96,0xE6,0x2F,0x8B,0xAA,0x28, + 0x96,0xEE,0x76,0xEE,0x9B,0xA2,0xFB,0xFD,0x96,0xEE,0x76,0xEE,0x0D,0x2B,0x2D,0x3F, + 0xB6,0xF6,0xF4,0xDD,0x60,0x60,0x68,0x62,0xD3,0xD5,0xF0,0xBC,0x37,0x3F,0x2F,0x2E, + 0x96,0xF6,0x14,0xE6,0x2D,0xAD,0xAD,0x25,0xB6,0xF6,0x76,0xEE,0xEA,0xFB,0xFF,0xFF, + 0x96,0xEE,0x14,0xE6,0x60,0x70,0xEA,0xE8,0xF4,0xDD,0x31,0xC5,0x7E,0x7A,0x7C,0xF8, + 0x71,0xCD,0x51,0xC5,0x2E,0xB9,0xE7,0xCE,0x71,0xCD,0x51,0xC5,0x20,0x2E,0x25,0x3D, + 0x72,0xCD,0xCF,0xB4,0x5C,0x5C,0x7C,0xA8,0xB3,0xD5,0x10,0xC5,0x0D,0x0B,0x03,0x0A, + 0x14,0xDE,0xB3,0xD5,0xBD,0x3F,0x2F,0x23,0x55,0xE6,0xF4,0xDD,0x2D,0x35,0xB7,0xB7, + 0x76,0xEE,0x55,0xE6,0x23,0x82,0x0B,0x0D,0x96,0xEE,0x35,0xE6,0xA8,0xC8,0xA8,0xAA, + 0x75,0xEE,0x35,0xE6,0xFF,0xF8,0xFA,0xEA,0x35,0xEE,0x55,0xE6,0x77,0x6D,0x7F,0x5F, + 0xD6,0xF6,0xB6,0xEE,0xAA,0xAA,0x8A,0x02,0xD7,0xF6,0xB5,0xEE,0x22,0x22,0x28,0x20, + 0xD7,0xF6,0xB6,0xEE,0x6E,0xC8,0xF8,0xC8,0xD6,0xF6,0xB6,0xEE,0xB9,0x23,0x02,0x02, + 0xD6,0xF6,0xB7,0xE6,0x08,0x8A,0x08,0xA2,0xF7,0xF6,0xB6,0xEE,0xDB,0x5A,0xFF,0xBF, + 0xD7,0xF6,0xB6,0xEE,0x1B,0x29,0x2C,0x00,0xD7,0xF6,0xD6,0xEE,0xAA,0x22,0xAA,0xAA, + 0xD7,0xF6,0xF7,0xEE,0x28,0x08,0x20,0xAA,0xF6,0xF6,0xB7,0xEE,0xA7,0xBE,0xAB,0xAB, + 0xD6,0xF6,0xF7,0xEE,0x2A,0x2A,0x20,0x82,0xD6,0xF6,0xF8,0xEE,0x08,0x80,0x28,0xA8, + 0xD6,0xF6,0xB6,0xEE,0xEE,0x68,0xF8,0x6C,0xD6,0xF6,0x96,0xEE,0xBB,0xEF,0xAF,0x0F, + 0xD6,0xF6,0x96,0xEE,0xFF,0xFE,0xF2,0xC2,0xD6,0xF6,0xB6,0xEE,0xFD,0xF7,0xBD,0xBB, + 0xD7,0xF6,0xB6,0xEE,0x7D,0xFF,0xAD,0xEE,0xD6,0xF6,0xB6,0xEE,0xB5,0xBD,0xBB,0xB6, + 0xF7,0xF6,0xD7,0xF6,0xDF,0xFD,0xDD,0xFD,0xF7,0xF6,0xD7,0xF6,0xDD,0xBF,0x3A,0x8D, + 0xF7,0xF6,0xD7,0xF6,0xEA,0xF8,0xDA,0xFE,0xF6,0xF6,0xD7,0xF6,0xB5,0xFB,0xFF,0xED, + 0xF7,0xF6,0xD7,0xF6,0x79,0x6B,0xFB,0x9B,0xD7,0xF6,0xF7,0xEE,0x00,0x80,0x0E,0x02, + 0xF7,0xF6,0x96,0xEE,0xAA,0x2A,0x8A,0xA2,0xF7,0xFE,0x76,0xEE,0x6A,0xE0,0xEA,0xEA, + 0xF4,0xDD,0x42,0x41,0x58,0x78,0x78,0x78,0x03,0x39,0xC1,0x38,0xAA,0x1D,0x24,0xBA, + 0x64,0x49,0x02,0x41,0x3F,0xAB,0x2F,0x65,0x84,0x51,0x23,0x49,0xE2,0xA2,0xA9,0xF5, + 0x64,0x49,0xE2,0x40,0xF8,0x5A,0xFB,0x7E,0x43,0x49,0x03,0x41,0xFF,0xBB,0x2D,0x29, + 0xC5,0x59,0x44,0x49,0x35,0x2D,0x09,0x0A,0x27,0x6A,0x84,0x51,0xAD,0xAF,0x2A,0x3B, + 0x27,0x6A,0xA4,0x59,0x08,0x88,0xA8,0x7E,0x67,0x72,0x85,0x59,0x20,0x2A,0xAD,0xAD, + 0xA8,0x7A,0x46,0x6A,0x83,0xAA,0xA5,0xF5,0xA8,0x7A,0x47,0x6A,0x82,0x8A,0xEF,0x7F, + 0x88,0x72,0x47,0x72,0xB0,0xBA,0xCD,0xB5,0x88,0x72,0x06,0x6A,0xA0,0xAF,0x97,0xAB, + 0x67,0x72,0x26,0x6A,0xA6,0x02,0x2B,0xEF,0x67,0x72,0x26,0x6A,0x80,0xF0,0x68,0xD8, + 0x67,0x72,0x06,0x62,0xB0,0xBF,0xFD,0xFF,0xA7,0x7A,0xE5,0x61,0x0A,0xAD,0xAB,0xFF, + 0xC8,0x7A,0x67,0x72,0xAB,0xAE,0xAB,0x0D,0xE9,0x82,0x87,0x7A,0x0B,0xBF,0xEF,0xF7, + 0x2A,0x8B,0x88,0x7A,0x0A,0xBE,0xFF,0xD5,0xE9,0x8A,0x46,0x72,0xA0,0xE0,0x7A,0x5E, + 0x67,0x7A,0xA4,0x61,0xE0,0xF8,0x7E,0x5F,0xE5,0x69,0x83,0x59,0xBC,0xE7,0xCF,0x2E, + 0x26,0x72,0xC5,0x69,0xAD,0x3D,0x3D,0x2A,0x68,0x7A,0xE6,0x69,0xEA,0xF8,0x6A,0x7E, + 0x06,0x72,0x64,0x61,0xE0,0x72,0x72,0x5A,0x84,0x69,0x22,0x59,0x2A,0x27,0x37,0xBF, + 0x06,0x7A,0x63,0x61,0x0B,0x2F,0xAD,0xBF,0x47,0x82,0x06,0x7A,0xAF,0xA6,0xF5,0x75, + 0x67,0x8A,0x06,0x82,0xC0,0xCA,0x69,0xCB,0x47,0x82,0x26,0x82,0xB2,0xDD,0x95,0x55, + 0xE9,0x92,0x47,0x82,0xAD,0xAB,0x2D,0x2F,0x29,0x9B,0xA8,0x8A,0x27,0xB7,0xFB,0xFF, + 0xB6,0xF6,0x6B,0xA3,0x2D,0x2D,0x2D,0x2D,0x17,0xFF,0xD7,0xFE,0xAD,0xBD,0xAD,0xBF, + 0xF7,0xFE,0x18,0xF7,0xBE,0xFA,0xFE,0xFE,0x18,0xFF,0xF7,0xF6,0xAF,0x89,0xAB,0xAB, + 0x17,0xFF,0xF7,0xF6,0x82,0x8A,0x2A,0xB6,0x18,0xFF,0x17,0xF7,0xEA,0xAA,0xA2,0xAA, + 0x38,0xFF,0xF7,0xF6,0xAE,0xBA,0x2F,0xBF,0x38,0xFF,0x17,0xF7,0xFF,0xAE,0xAA,0xFF, + 0x38,0xFF,0x18,0xFF,0x2A,0xAA,0xBB,0xEB,0x38,0xFF,0x18,0xFF,0xA2,0xAA,0xFA,0xD5, + 0x18,0xFF,0x38,0xF7,0x08,0x02,0xC0,0xAA,0x38,0xFF,0xD7,0xF6,0x6A,0xEA,0x78,0x57, + 0xD7,0xF6,0xB6,0xEE,0xE0,0xA8,0xA8,0xAA,0xD7,0xF6,0xB6,0xEE,0xAF,0x0A,0x08,0x02, + 0xD7,0xF6,0xB6,0xF6,0xAB,0xEA,0xEA,0x5C,0xB6,0xF6,0x75,0xEE,0xA2,0xA0,0xA8,0xD8, + 0x96,0xEE,0x55,0xEE,0xE0,0xE0,0xF8,0xF7,0xB6,0xF6,0x30,0xCD,0x7A,0x7E,0xEA,0x00, + 0x75,0xEE,0xAE,0xBC,0xD7,0xB7,0x2A,0x00,0x76,0xEE,0xD3,0xDD,0x2D,0x0B,0x00,0x08, + 0x75,0xEE,0xB2,0xD5,0x58,0xE2,0xA0,0x00,0x14,0xE6,0x71,0xCD,0xF5,0xDF,0xF6,0xF8, + 0x76,0xEE,0xD3,0xD5,0x0B,0x2D,0xB5,0xB5,0xF7,0xF6,0x55,0xE6,0x2A,0x8B,0x2B,0xBD, + 0xF7,0xF6,0xD7,0xF6,0x8A,0xAB,0xEF,0x95,0xF8,0xF6,0xD7,0xF6,0xAA,0x9D,0x3E,0xFA, + 0xD8,0xFE,0xF7,0xF6,0xDD,0x5D,0x75,0xFD,0xF7,0xF6,0xD7,0xF6,0xAA,0x88,0x80,0xFC, + 0xF7,0xF6,0xD7,0xF6,0xEC,0xB2,0xD0,0x5D,0xF7,0xF6,0xD7,0xF6,0x88,0x82,0xFD,0x55, + 0xF7,0xF6,0xB7,0xF6,0xA0,0xFA,0xD7,0xDB,0xF7,0xF6,0xB7,0xF6,0x7A,0x7F,0xDF,0xBF, + 0xF7,0xF6,0xB6,0xEE,0x5F,0x55,0x95,0xAA,0xF7,0xF6,0xB6,0xEE,0xF5,0xFB,0xAA,0x2A, + 0xF7,0xF6,0xD7,0xF6,0x5D,0xF5,0xAA,0xA0,0x18,0xFF,0xD7,0xF6,0x75,0xBF,0xEB,0xEB, + 0xF7,0xF6,0xD7,0xF6,0xAD,0x02,0x00,0x80,0xF8,0xFE,0xF7,0xF6,0xFF,0xFF,0x5D,0x55, + 0xF8,0xF6,0xD8,0xF6,0x00,0x20,0xF8,0xAE,0xF8,0xF6,0xD7,0xF6,0x80,0xEE,0xFC,0x8A, + 0xF8,0xF6,0xD8,0xF6,0x00,0x86,0xAE,0xFE,0xF7,0xF6,0xD8,0xF6,0x2E,0xAF,0xFF,0x5A, + 0xF8,0xF6,0xD7,0xF6,0xE0,0x80,0xCA,0xAD,0xF8,0xF6,0xD7,0xF6,0x7F,0xFF,0xFD,0xA9, + 0xF8,0xF6,0xD7,0xF6,0x59,0x7F,0x6E,0x5A,0xD7,0xF6,0xD8,0xEE,0xAA,0xA2,0xAA,0x2A, + 0xF7,0xF6,0xB7,0xEE,0x0A,0x3B,0x2F,0xBF,0x18,0xFF,0xB7,0xEE,0xFA,0xFA,0x62,0xFA, + 0xB7,0xEE,0x75,0xEE,0xFA,0xD8,0x78,0xFC,0x76,0xEE,0x96,0xE6,0x08,0x02,0x8A,0x0F, + 0x96,0xEE,0x55,0xEE,0x8A,0xEE,0xFF,0xDF,0xB7,0xEE,0x56,0xEE,0xEB,0xAF,0x2D,0xAF, + 0x96,0xEE,0xF4,0xDD,0x60,0x60,0xE0,0xC0,0xD3,0xDD,0x10,0xBD,0x3D,0xA5,0x26,0x27, + 0x96,0xEE,0xF4,0xDD,0x2B,0x2D,0xAD,0x2F,0xB7,0xF6,0x76,0xEE,0xFE,0xEA,0xFA,0x7A, + 0x96,0xEE,0x35,0xE6,0xF2,0xEA,0xFC,0x7A,0x14,0xDE,0x72,0xCD,0x5C,0x5C,0x58,0x78, + 0x92,0xCD,0x51,0xCD,0xFF,0x3E,0xEF,0x55,0x92,0xD5,0x31,0xC5,0xE3,0xFA,0xDE,0x5F, + 0xB2,0xD5,0x10,0xC5,0xFB,0xAF,0xAF,0x25,0xF3,0xDD,0x92,0xCD,0xB5,0xAD,0x2F,0x2B, + 0x14,0xDE,0xD3,0xDD,0x0F,0xAF,0xAB,0xC2,0x55,0xE6,0xF4,0xDD,0xBD,0xB7,0x37,0x97, + 0x96,0xEE,0x55,0xE6,0x2D,0x2D,0x8B,0xAD,0x96,0xEE,0x76,0xEE,0x7C,0x6B,0xFB,0xFF, + 0x75,0xEE,0x55,0xE6,0x58,0xBA,0xE8,0xFA,0x96,0xEE,0x34,0xE6,0xFD,0xAF,0x3F,0xAB, + 0xF7,0xF6,0xB6,0xEE,0xAB,0xEB,0xEB,0xFE,0xF7,0xF6,0xB6,0xEE,0xFA,0xFE,0xFF,0xF7, + 0xD7,0xF6,0xD6,0xEE,0xAA,0x22,0xAA,0xAA,0xD7,0xF6,0xF6,0xEE,0x00,0x22,0xA8,0x2A, + 0xF7,0xF6,0xB6,0xEE,0xEF,0xFE,0xAA,0xCA,0xD7,0xF6,0xB6,0xEE,0x8A,0x2A,0x08,0x83, + 0xD7,0xF6,0xF6,0xEE,0x08,0x82,0x08,0x38,0xD7,0xF6,0xF7,0xEE,0x80,0x08,0x22,0x82, + 0xD7,0xF6,0xF6,0xEE,0xE8,0xA0,0x20,0x08,0xD7,0xF6,0xF7,0xEE,0x88,0x22,0x20,0xA2, + 0xF7,0xF6,0xD7,0xF6,0xB7,0xFD,0xFF,0x7F,0xF6,0xF6,0xD7,0xF6,0xEF,0xFD,0xD7,0x57, + 0xD7,0xF6,0xB5,0xEE,0xE0,0xA0,0xA8,0xE8,0xD7,0xF6,0xB6,0xEE,0xAA,0x6A,0xEA,0xEE, + 0xD6,0xF6,0xB6,0xEE,0xEB,0xB5,0x9F,0xB2,0xD7,0xF6,0xB6,0xEE,0x55,0xF7,0x76,0xDF, + 0xD6,0xF6,0xB6,0xEE,0xFE,0x57,0xFE,0xA3,0xD6,0xF6,0xB6,0xEE,0x3F,0xAB,0x29,0xAD, + 0xF7,0xF6,0xB6,0xEE,0xAA,0xAA,0xAF,0xEB,0xF7,0xF6,0xD7,0xF6,0x89,0x97,0x5D,0x5D, + 0xF7,0xF6,0xD7,0xF6,0xFF,0x6F,0x6C,0x7D,0xF7,0xF6,0xD7,0xF6,0xF5,0x5F,0x75,0xBD, + 0xF7,0xF6,0xD7,0xF6,0x3E,0xBA,0xAB,0xBB,0xF7,0xF6,0xD7,0xF6,0xFA,0xA2,0x4C,0xEA, + 0xF7,0xF6,0xD7,0xF6,0x5E,0xFA,0x5E,0x6A,0xF7,0xF6,0xB6,0xEE,0xCA,0xEA,0xEA,0x7A, + 0x34,0xDE,0xE5,0x59,0x78,0x70,0x60,0x60,0x43,0x41,0xC2,0x38,0x5E,0xFE,0x7C,0x7A, + 0x23,0x49,0x81,0x30,0x0A,0x2B,0xAD,0xAF,0x64,0x51,0x03,0x41,0xAF,0x8F,0xA5,0x3D, + 0x85,0x51,0x02,0x41,0x5F,0xFA,0xAE,0x02,0xC5,0x61,0x43,0x49,0xF5,0xB9,0xAA,0x0A, + 0x06,0x62,0x84,0x59,0xE5,0xBF,0x2F,0x02,0xE6,0x61,0xA5,0x59,0xA2,0xE0,0xE0,0xBC, + 0xC5,0x59,0x64,0x59,0x80,0x88,0xAA,0x3A,0xE6,0x61,0xA5,0x59,0x0E,0xBD,0x79,0x5A, + 0x26,0x6A,0xA5,0x59,0x02,0xAA,0xE9,0xA7,0x47,0x72,0xE6,0x61,0x03,0xA2,0xAA,0xED, + 0x47,0x6A,0x06,0x62,0xEA,0xFF,0xFB,0xFF,0x68,0x72,0xE5,0x61,0x0A,0x2B,0xAB,0xB5, + 0x88,0x72,0x05,0x62,0xE2,0xF0,0x7A,0xDF,0x47,0x6A,0x06,0x62,0xF0,0x70,0xDD,0x57, + 0x26,0x6A,0x05,0x62,0xAC,0xBA,0x57,0x7D,0x67,0x72,0xE5,0x61,0xBA,0x2E,0xED,0xF7, + 0xC9,0x7A,0x26,0x6A,0x2D,0xAF,0xBB,0xF5,0xE9,0x82,0x47,0x72,0x8E,0xAE,0x77,0x55, + 0x88,0x7A,0xE6,0x61,0x00,0xA8,0xEE,0x5F,0x47,0x72,0xA4,0x59,0xE8,0xEA,0x7A,0x7F, + 0x05,0x6A,0x83,0x59,0x7F,0xF7,0xBF,0x2F,0x47,0x7A,0xA4,0x61,0xB5,0xBF,0x2A,0x02, + 0x68,0x7A,0x26,0x72,0x7D,0x7F,0x7B,0x70,0x26,0x72,0xC5,0x69,0x78,0x78,0x78,0x70, + 0xC5,0x69,0xE3,0x50,0xE8,0xFC,0x7E,0xDE,0x44,0x59,0x03,0x59,0x22,0x03,0x9A,0xAF, + 0xA5,0x69,0x44,0x61,0x0A,0x2B,0x2F,0xFD,0x06,0x7A,0xA5,0x69,0x02,0xAB,0x1F,0xB9, + 0x87,0x8A,0x27,0x82,0x7D,0xF5,0xF5,0x27,0x87,0x8A,0x26,0x7A,0x5D,0xDB,0xF3,0xFE, + 0xC8,0x8A,0x47,0x82,0xBD,0xBF,0xAD,0x29,0x29,0x93,0x87,0x82,0x9F,0x75,0x37,0x37, + 0x96,0xF6,0xEC,0xAB,0x2D,0x2D,0x29,0x09,0xF7,0xFE,0xD7,0xF6,0x0A,0x08,0x02,0x03, + 0xF7,0xFE,0x17,0xF7,0xEE,0xEA,0xEE,0xE8,0xF7,0xFE,0x18,0xF7,0xEF,0xAE,0xFF,0xBB, + 0x17,0xFF,0xF7,0xF6,0x9E,0xB5,0xBD,0xAB,0xF7,0xFE,0x18,0xF7,0x9B,0x5B,0xBF,0xBF, + 0x17,0xFF,0xF7,0xF6,0x2B,0xAE,0xAE,0xEB,0x17,0xFF,0xF7,0xF6,0xA0,0xBF,0xB7,0xDF, + 0x17,0xFF,0xF8,0xF6,0x00,0xAA,0xEF,0xAF,0x18,0xFF,0xF7,0xF6,0x22,0x0A,0x02,0x0A, + 0x38,0xFF,0xD7,0xF6,0xA8,0xF2,0x7A,0x7E,0xF7,0xF6,0xB6,0xEE,0xF0,0xF8,0xFA,0xFF, + 0xD7,0xF6,0xB6,0xEE,0x29,0xAB,0xFA,0xFE,0xB6,0xF6,0xD7,0xEE,0xFE,0xBE,0xAE,0xEF, + 0xD6,0xF6,0x96,0xEE,0x7A,0xFE,0x7F,0x5E,0x96,0xEE,0x92,0xD5,0xA0,0xA8,0xEA,0x5A, + 0xD7,0xF6,0x71,0xCD,0x2A,0xAB,0x0F,0x2D,0x18,0xFF,0xD7,0xFE,0xBD,0xAF,0x2E,0xAA, + 0x18,0xFF,0x96,0xF6,0x5E,0x7A,0xE8,0xA2,0xD7,0xF6,0x75,0xEE,0x55,0x5E,0x5F,0x5C, + 0x75,0xEE,0x55,0xEE,0x98,0x38,0xB8,0x78,0x55,0xEE,0xB2,0xD5,0xFC,0x70,0xE0,0x80, + 0x34,0xE6,0xB2,0xD5,0x2B,0x3D,0x35,0xAF,0xB6,0xF6,0x14,0xDE,0x2F,0x2F,0xBD,0xED, + 0xF7,0xF6,0x96,0xF6,0x2A,0x2B,0x2F,0x2D,0xF7,0xF6,0xD7,0xF6,0x7E,0xAF,0xEB,0x6B, + 0xF7,0xF6,0xD7,0xF6,0xAD,0xFE,0xE8,0xA3,0xF7,0xF6,0xD7,0xF6,0xFE,0x5B,0x6B,0xEA, + 0xF7,0xF6,0xD7,0xF6,0x75,0xFF,0xA9,0x0F,0xF7,0xF6,0xD7,0xF6,0x75,0xFB,0xFE,0xD7, + 0xF7,0xF6,0xD7,0xF6,0x55,0xF5,0xBD,0xCF,0xF8,0xF6,0xD7,0xF6,0xD5,0x2D,0x01,0x0A, + 0xF7,0xF6,0xD7,0xF6,0x5C,0x76,0x54,0x5C,0xF7,0xF6,0xD7,0xF6,0x95,0x57,0xB5,0xA5, + 0xF7,0xF6,0xD7,0xF6,0xB8,0xAE,0xE6,0xE2,0xF7,0xF6,0xB7,0xF6,0x00,0x2C,0x2E,0x82, + 0xD7,0xF6,0xF7,0xEE,0xAB,0x8B,0xAA,0xAC,0xF7,0xF6,0xD7,0xF6,0xAA,0x2B,0x8E,0xFA, + 0xF7,0xF6,0xD7,0xF6,0x08,0x22,0x02,0xBA,0xF7,0xF6,0xD8,0xF6,0xAA,0xB8,0xA8,0x88, + 0xF7,0xF6,0xD7,0xF6,0xFE,0xBA,0xA2,0x20,0xF7,0xF6,0xD7,0xF6,0x78,0xAA,0x80,0x20, + 0xF7,0xF6,0xD8,0xF6,0x8A,0x8A,0x00,0x80,0xD8,0xFE,0xF8,0xF6,0xD5,0x55,0x7D,0xF5, + 0xF7,0xF6,0xD7,0xF6,0xE4,0x6A,0x60,0x7A,0xD7,0xF6,0xB7,0xEE,0x8A,0xBA,0xDF,0xD6, + 0xB7,0xF6,0x18,0xEF,0xA8,0xA8,0xAA,0xA8,0xF8,0xF6,0xB7,0xF6,0xE2,0xC0,0xC0,0xC2, + 0xB6,0xEE,0x76,0xEE,0x7C,0x5E,0x7E,0x5E,0xB6,0xEE,0x56,0xE6,0xEB,0x7B,0xEB,0x2F, + 0x96,0xEE,0x55,0xEE,0xDF,0xBA,0x08,0x00,0x96,0xF6,0x76,0xEE,0x2D,0xAB,0xE8,0xA2, + 0xB7,0xF6,0x14,0xDE,0x60,0x6A,0x6A,0x72,0xF4,0xDD,0x51,0xC5,0x17,0xB7,0x37,0xB7, + 0x97,0xEE,0x14,0xDE,0xBD,0xAD,0x25,0x2D,0x96,0xEE,0x55,0xEE,0xA0,0xE8,0xE0,0xFA, + 0x75,0xEE,0x35,0xE6,0xF8,0xBA,0xE8,0xAE,0x35,0xE6,0x72,0xCD,0x7C,0x58,0x58,0x58, + 0x72,0xCD,0x31,0xC5,0xBE,0x5E,0x58,0xD7,0x52,0xCD,0xD0,0xBC,0xE0,0xFB,0x7E,0x7A, + 0xB2,0xD5,0xCF,0xBC,0x2B,0xAF,0x25,0x2D,0x34,0xE6,0xD2,0xD5,0xFD,0xB5,0xBD,0x2D, + 0x14,0xE6,0x34,0xDE,0xA8,0xBF,0xAF,0xAF,0x55,0xE6,0xF3,0xDD,0xBD,0xBE,0xBF,0xAF, + 0x96,0xEE,0x55,0xE6,0xBD,0xED,0x0D,0xAF,0x96,0xEE,0x76,0xEE,0x79,0x39,0xAF,0x8B, + 0x75,0xEE,0x55,0xE6,0xF8,0xE8,0x82,0xA0,0x96,0xEE,0x55,0xE6,0xAF,0xAF,0xB7,0xBF, + 0xD6,0xF6,0xB7,0xEE,0xB0,0x82,0xA8,0x2A,0xD7,0xF6,0xB6,0xEE,0xFA,0xEE,0xAA,0xA2, + 0xD6,0xF6,0xB7,0xEE,0x8B,0x2E,0x8A,0xA8,0xD6,0xF6,0xB7,0xEE,0x80,0xF0,0x82,0x28, + 0xD7,0xF6,0xB6,0xEE,0x2B,0xAA,0xAA,0xAC,0xD7,0xF6,0xB6,0xEE,0x02,0x02,0x00,0x8E, + 0xD7,0xF6,0xF6,0xEE,0xA8,0x28,0x00,0x20,0xF7,0xF6,0xD7,0xF6,0x5F,0xFF,0xFF,0xF5, + 0xD7,0xF6,0xF7,0xEE,0x22,0x00,0x82,0xA8,0xF7,0xF6,0xD7,0xF6,0xF5,0xBB,0xBE,0xAD, + 0xF7,0xF6,0xD7,0xF6,0xFF,0xFF,0x2F,0xAD,0xF7,0xF6,0xD7,0xF6,0xBA,0xA9,0xAB,0xE8, + 0xD7,0xF6,0xF6,0xEE,0x2A,0x02,0x08,0x2A,0xD6,0xF6,0xB7,0xEE,0x2A,0x2A,0xAC,0xAE, + 0xD6,0xF6,0xB7,0xEE,0xA2,0x2A,0xAA,0x2A,0xD7,0xF6,0xB6,0xEE,0xBF,0xBE,0x88,0x80, + 0xB6,0xF6,0xD6,0xEE,0xEF,0xAB,0xBB,0xED,0xB6,0xF6,0xD7,0xEE,0x8B,0xAB,0xFE,0xEF, + 0xF6,0xF6,0xD7,0xF6,0x75,0xF5,0xED,0xAD,0xF7,0xF6,0xD7,0xF6,0xDD,0xF7,0xDD,0x57, + 0xF7,0xF6,0xD7,0xF6,0x5F,0xE9,0xE3,0x7D,0xF7,0xF6,0xD7,0xF6,0xAD,0xBA,0xEB,0x6E, + 0xF7,0xF6,0xD7,0xF6,0xFA,0xAF,0xEA,0x0C,0xF7,0xF6,0xD7,0xF6,0xAF,0xA8,0xEE,0xEA, + 0xF7,0xF6,0xD7,0xF6,0x6A,0x5E,0x5D,0x9D,0xF7,0xF6,0xB6,0xEE,0x7A,0xEA,0xAB,0xAA, + 0x75,0xEE,0x09,0x7B,0x70,0x70,0x60,0xE0,0xE4,0x59,0xC2,0x38,0x5E,0x5E,0x7A,0xF8, + 0x64,0x51,0xC2,0x38,0xDD,0xA5,0xBF,0x2A,0xE5,0x61,0xE2,0x40,0xBD,0xBD,0x2B,0x2E, + 0x06,0x6A,0x84,0x51,0xF5,0xBF,0xAA,0x80,0x26,0x6A,0xC5,0x59,0x9D,0x09,0xAB,0x80, + 0x27,0x72,0x05,0x62,0xE9,0x8A,0x89,0xCA,0x26,0x6A,0xC6,0x61,0x64,0xC8,0xE8,0xA2, + 0x06,0x62,0xA4,0x59,0x5B,0x7E,0xBE,0xE8,0xE5,0x61,0xA5,0x59,0xBF,0xFA,0xAF,0x8A, + 0x27,0x6A,0xE6,0x61,0xE1,0x3F,0x09,0x09,0x47,0x6A,0x06,0x62,0x97,0xD7,0xE2,0x00, + 0x47,0x6A,0xE5,0x61,0xF7,0x5F,0x7C,0xF8,0x26,0x6A,0xC4,0x59,0x2F,0xCF,0xFF,0x96, + 0x06,0x6A,0xC5,0x59,0xBC,0xFE,0xBB,0xFA,0x05,0x6A,0xC5,0x59,0x2A,0xE9,0xFA,0xFA, + 0x26,0x6A,0xC5,0x59,0xA2,0xFD,0xF7,0x5D,0x47,0x6A,0xE5,0x61,0x4B,0xAD,0xF5,0x5D, + 0x47,0x6A,0xA4,0x59,0x0E,0xFA,0xEE,0x9E,0x26,0x6A,0xC4,0x59,0x88,0xC2,0x7B,0x57, + 0x06,0x6A,0xA4,0x59,0xE8,0xAE,0xF6,0xFF,0xE5,0x69,0x83,0x59,0xDE,0xBA,0xBE,0x0E, + 0x67,0x7A,0xC4,0x61,0xB5,0xAD,0x2D,0x0B,0xC8,0x8A,0x47,0x7A,0x5F,0xF7,0xAD,0x8A, + 0xA8,0x82,0x47,0x7A,0x7B,0x7F,0xE8,0x80,0x68,0x7A,0x64,0x61,0xFA,0x7A,0x78,0xF8, + 0x65,0x61,0xE2,0x50,0xB4,0xF6,0xFE,0xAC,0x85,0x61,0x23,0x59,0x55,0xE5,0xFD,0x8B, + 0xA4,0x69,0x43,0x59,0xB5,0x15,0xBF,0x3B,0x67,0x82,0xC5,0x71,0xBD,0xA9,0x29,0x09, + 0xA8,0x8A,0x47,0x82,0xFD,0x2D,0x8F,0x22,0xC8,0x8A,0x67,0x82,0x77,0xFA,0xAB,0xEA, + 0xA8,0x8A,0x26,0x7A,0x0A,0x80,0xAA,0x7E,0x2D,0xAC,0x26,0x72,0xBF,0xB7,0xB5,0x25, + 0xD7,0xFE,0xAF,0xBC,0x2D,0x29,0x09,0x0B,0x17,0xFF,0xD8,0xF6,0xEB,0x8B,0xAA,0x02, + 0x18,0xFF,0xF7,0xF6,0xFF,0xCF,0xA3,0x82,0x17,0xFF,0xF7,0xF6,0xFE,0xF7,0xBD,0xBF, + 0x18,0xFF,0xF7,0xF6,0x8B,0x2A,0xAA,0x2A,0xF7,0xFE,0x18,0xF7,0xE5,0xFF,0xEF,0xFF, + 0x17,0xFF,0xF7,0xF6,0xEB,0xFE,0x7E,0x5E,0xF7,0xFE,0xF7,0xF6,0x5F,0xFF,0xFD,0xDF, + 0x17,0xFF,0xD7,0xF6,0xAF,0x0B,0x2B,0x0B,0x18,0xFF,0xD7,0xF6,0x00,0x80,0x68,0x58, + 0xF7,0xF6,0xB6,0xEE,0xB8,0x5E,0x57,0x77,0xB6,0xF6,0xD7,0xEE,0xAA,0xEB,0xEB,0xFA, + 0x18,0xFF,0xB6,0xEE,0xF7,0xF7,0xFF,0x2B,0x38,0xFF,0xB6,0xEE,0x77,0xFD,0xBF,0x02, + 0x18,0xFF,0x96,0xEE,0x57,0xFF,0xAA,0x00,0xD7,0xF6,0xB2,0xD5,0x7E,0xF8,0xE0,0xA8, + 0xD7,0xF6,0xB2,0xD5,0x0D,0x2B,0x0A,0x0B,0xF8,0xFE,0x18,0xF7,0x88,0x20,0x28,0xAA, + 0x17,0xFF,0xD8,0xF6,0xAB,0xA5,0xFB,0x2A,0x18,0xFF,0x76,0xEE,0x5E,0x7C,0x7A,0x78, + 0x75,0xEE,0x55,0xE6,0x5E,0xF8,0xE8,0xB8,0x75,0xEE,0x34,0xEE,0xEA,0xEA,0xEA,0xAA, + 0x35,0xE6,0xD2,0xD5,0xB6,0xBE,0xE0,0xA0,0x75,0xEE,0x14,0xDE,0x29,0xAF,0xAF,0x95, + 0xF8,0xFE,0x55,0xE6,0x2B,0x2F,0xA9,0xAD,0xF7,0xF6,0xD7,0xF6,0x89,0xBE,0xBF,0xAB, + 0xF7,0xF6,0xD7,0xF6,0xEA,0xE2,0xE2,0x0A,0xF7,0xF6,0xD7,0xF6,0x6E,0xDD,0x7F,0x80, + 0xF7,0xF6,0xD7,0xF6,0xAD,0xA5,0xA9,0x05,0xF7,0xF6,0xD7,0xF6,0xB7,0xAF,0x6D,0xD7, + 0xF7,0xF6,0xD7,0xF6,0xAA,0x57,0x55,0x55,0xF7,0xF6,0xD7,0xF6,0xE8,0x5E,0x5D,0x5F, + 0xF7,0xF6,0xD7,0xF6,0x5F,0x7D,0xFF,0x7F,0xF7,0xF6,0xD7,0xF6,0xBF,0xFD,0x7F,0xFF, + 0xD7,0xF6,0xF7,0xEE,0xAE,0x82,0xA8,0xEA,0xF7,0xF6,0xD7,0xF6,0xEB,0xE9,0xE9,0x5E, + 0xF7,0xF6,0xD7,0xF6,0xAB,0xBA,0xAE,0x2E,0xF7,0xF6,0xD7,0xF6,0x25,0xA3,0xE2,0x7C, + 0xF7,0xF6,0xD7,0xF6,0xAE,0x0A,0x2A,0x7B,0x18,0xFF,0xD7,0xF6,0xAA,0xAB,0xEF,0x55, + 0xF7,0xF6,0xD7,0xEE,0x20,0xAC,0xD4,0xDD,0xF7,0xF6,0xD7,0xF6,0xA8,0xAA,0xB9,0x3D, + 0xF7,0xF6,0xD7,0xF6,0x88,0xEA,0xAE,0x88,0xF7,0xF6,0xD7,0xF6,0xEA,0x78,0x5E,0x7F, + 0xF7,0xF6,0xB7,0xEE,0xFA,0xFA,0x7E,0x5F,0xD7,0xF6,0x96,0xEE,0xAA,0xBA,0xBF,0xB7, + 0xD7,0xF6,0xB7,0xEE,0x0A,0x22,0xAF,0x55,0xF7,0xF6,0xB7,0xEE,0xC2,0xEA,0xFB,0xAF, + 0xD7,0xF6,0x75,0xE6,0x5F,0xFE,0x7A,0xDC,0xB6,0xEE,0x96,0xEE,0x75,0x75,0xFD,0xE5, + 0x96,0xEE,0x76,0xEE,0x00,0xFC,0xDC,0x9C,0x96,0xEE,0x36,0xEE,0x28,0x2A,0x3A,0x2A, + 0x97,0xF6,0xF4,0xDD,0x68,0x60,0x48,0x60,0xF4,0xDD,0x51,0xC5,0xB6,0xBE,0x3F,0x36, + 0x96,0xEE,0x14,0xDE,0xAD,0xAF,0xAD,0xAD,0x96,0xEE,0x55,0xE6,0x7A,0x68,0x7E,0x5A, + 0x75,0xEE,0x36,0xE6,0xAA,0xAA,0xFA,0xDF,0x55,0xE6,0x52,0xCD,0x78,0x78,0x68,0x78, + 0x52,0xCD,0xAF,0xBC,0x88,0xA0,0xEA,0x7E,0x11,0xC5,0xAF,0xBC,0xF8,0x76,0xDB,0xF5, + 0xD3,0xDD,0xCF,0xBC,0xAD,0x2D,0x2D,0x2D,0x34,0xE6,0xD2,0xD5,0x2D,0x29,0x22,0x0B, + 0x55,0xE6,0x14,0xE6,0xEB,0xAA,0xAA,0xEA,0x54,0xE6,0x14,0xE6,0xB7,0xB7,0xB5,0xA9, + 0x96,0xEE,0x34,0xE6,0x8A,0xAB,0x2E,0xA9,0xB6,0xF6,0x76,0xEE,0xEF,0xED,0xAB,0xAF, + 0x95,0xEE,0x55,0xE6,0x5E,0x5E,0xDE,0xDE,0xB7,0xF6,0x55,0xE6,0xBD,0xAD,0x2B,0x0B, + 0xD6,0xF6,0xB6,0xEE,0xA2,0xFA,0xE8,0x8A,0xB6,0xF6,0xD7,0xEE,0xBF,0xBF,0xBF,0xF7, + 0xB6,0xF6,0xD7,0xEE,0xFF,0xFB,0xFB,0xBF,0xD7,0xF6,0xB6,0xEE,0x2A,0x8E,0xB8,0xAC, + 0xB6,0xF6,0xD7,0xEE,0x6D,0xFF,0xFF,0xFF,0xD6,0xF6,0xB6,0xEE,0xE8,0x0A,0x2A,0x02, + 0xD7,0xF6,0xF6,0xEE,0x80,0x22,0x0A,0x2A,0xD7,0xF6,0xF6,0xEE,0x20,0x02,0xC8,0xA0, + 0xD7,0xF6,0xB7,0xEE,0x02,0x08,0x28,0x08,0xD7,0xF6,0xF7,0xEE,0xA8,0xA0,0x20,0x80, + 0xF7,0xF6,0xD7,0xF6,0xA1,0xB5,0xB5,0x55,0xF7,0xF6,0xD7,0xF6,0xDB,0xDA,0xD0,0x5F, + 0xF7,0xF6,0xD7,0xF6,0x5A,0xDE,0x56,0xD7,0xF7,0xF6,0xD7,0xF6,0x55,0x5F,0xFE,0x95, + 0xD6,0xF6,0xB7,0xEE,0x20,0x22,0x28,0xA0,0xD7,0xF6,0xF6,0xEE,0x20,0xA2,0x22,0xA2, + 0xF7,0xF6,0xB6,0xEE,0xDA,0x7E,0xEE,0xEA,0xD7,0xF6,0xB6,0xEE,0xBF,0xBA,0xB2,0xEB, + 0xF8,0xF6,0xD7,0xF6,0x85,0xB5,0xF5,0xFD,0xF7,0xF6,0xD7,0xF6,0x5B,0xBE,0xB5,0xF9, + 0xF7,0xF6,0xD7,0xF6,0xFB,0x3A,0xAE,0xAC,0xF7,0xF6,0xD7,0xF6,0xEA,0xE8,0xEA,0xEF, + 0xF7,0xF6,0xD7,0xF6,0x87,0xED,0xED,0xDF,0xF7,0xF6,0xD7,0xF6,0x8E,0xBB,0xAF,0xEA, + 0xF7,0xF6,0xD7,0xF6,0xB7,0x94,0xD4,0xF8,0xF7,0xFE,0xD7,0xF6,0x7B,0x6E,0xFE,0x57, + 0xB6,0xF6,0x4D,0xAC,0x60,0xE0,0x60,0x78,0x29,0x83,0x43,0x49,0x5E,0x7C,0xF8,0xEA, + 0x25,0x6A,0x43,0x49,0xD5,0xFB,0xAA,0x80,0x46,0x6A,0xA4,0x59,0x7D,0xFF,0x2F,0x0B, + 0x67,0x72,0xC5,0x61,0xBD,0xEA,0xA8,0x02,0x67,0x72,0x06,0x6A,0x7F,0xD7,0x37,0x22, + 0x88,0x7A,0xE5,0x61,0xFD,0xFB,0xC8,0x80,0x67,0x72,0x06,0x6A,0x7E,0xEF,0xEB,0xB0, + 0x26,0x62,0xC5,0x59,0xFF,0xB8,0xFE,0x6E,0x06,0x62,0xA4,0x59,0xEA,0x62,0xBA,0xFF, + 0x68,0x72,0xC5,0x59,0xAD,0xAF,0x2D,0xA5,0xC8,0x7A,0x67,0x72,0xFD,0xB5,0xBD,0x2D, + 0xA8,0x7A,0x06,0x6A,0x7A,0xE8,0x40,0xE0,0x26,0x6A,0xC5,0x59,0x37,0xDE,0x5E,0x5E, + 0xE6,0x61,0xA5,0x59,0x6E,0x94,0x5E,0x1B,0x06,0x62,0xC5,0x59,0xDF,0x3D,0x25,0x80, + 0x05,0x62,0xC5,0x59,0xFB,0xBA,0xFE,0xBC,0x06,0x62,0xC5,0x59,0xE8,0xA7,0x8B,0xEA, + 0x06,0x62,0xC5,0x61,0x3B,0x0B,0x82,0x53,0xC4,0x59,0x63,0x51,0x80,0x60,0xE0,0xFA, + 0xE5,0x69,0x83,0x51,0xFF,0xDD,0xFD,0x3F,0xC9,0x82,0xA4,0x61,0xFD,0xBD,0x0F,0x0B, + 0x4A,0x93,0x67,0x7A,0x75,0xFF,0xAB,0x22,0x4B,0x9B,0xA8,0x82,0xF5,0xEB,0x0A,0x00, + 0x2A,0x9B,0xA8,0x82,0xD7,0xFE,0xFA,0xBC,0xC9,0x8A,0xA5,0x69,0x7A,0x7A,0xE0,0x80, + 0xC8,0x8A,0x85,0x61,0x55,0xFF,0xAB,0x00,0x88,0x82,0x64,0x61,0xF5,0xFF,0xFA,0xF8, + 0x67,0x7A,0xC5,0x69,0x55,0xD5,0x37,0x3F,0xE9,0x92,0x46,0x7A,0xC5,0x29,0x2B,0x2F, + 0x09,0x93,0x67,0x82,0xFA,0xF8,0x7A,0x5E,0xA8,0x8A,0x05,0x72,0xA0,0xEA,0xE8,0x7E, + 0x46,0x7A,0xE5,0x69,0xA0,0xA8,0x3E,0xB5,0xB4,0xDD,0x67,0x7A,0xB5,0x2D,0x2D,0x0B, + 0xF7,0xFE,0xF4,0xDD,0x2D,0x0F,0x0B,0x02,0xF7,0xFE,0x18,0xF7,0xBE,0xFE,0xBE,0xF8, + 0x18,0xFF,0xF7,0xF6,0xA2,0xE0,0xF2,0xBF,0x18,0xFF,0xF7,0xF6,0xAA,0x8B,0xAA,0xEF, + 0x18,0xFF,0xF7,0xF6,0xAA,0x2A,0x2A,0x8B,0x17,0xFF,0xF7,0xF6,0x7A,0xFA,0xFA,0xEA, + 0x17,0xFF,0xF7,0xF6,0xFE,0xF5,0x5F,0xDF,0x18,0xFF,0xF7,0xF6,0xDD,0x55,0x95,0xBB, + 0x17,0xFF,0xD7,0xF6,0x8A,0xEA,0x7A,0x7A,0xF7,0xF6,0xB6,0xEE,0xF8,0xFA,0xBF,0xBB, + 0xD6,0xF6,0xB7,0xEE,0xEB,0x82,0x08,0xAA,0xD6,0xF6,0x96,0xEE,0x08,0x00,0x22,0xEF, + 0x18,0xFF,0x96,0xEE,0x0A,0x2A,0x3E,0xB5,0x38,0xFF,0x18,0xFF,0x0B,0x09,0x0B,0x01, + 0x38,0xFF,0xF7,0xF6,0xE0,0x60,0x6A,0xF8,0xF8,0xF6,0x55,0xE6,0x5E,0xFE,0xB8,0xA8, + 0xF8,0xFE,0x96,0xE6,0x2D,0xAD,0x2F,0x2A,0x18,0xFF,0xF8,0xF6,0xAB,0xED,0xAF,0xFD, + 0x18,0xFF,0xF8,0xF6,0xFF,0xF9,0xEF,0xEB,0x18,0xFF,0x97,0xF6,0x6A,0xE8,0xA2,0xA0, + 0xD7,0xF6,0x55,0xE6,0x77,0xDF,0x5E,0x78,0x75,0xEE,0x55,0xE6,0xAF,0xB7,0x7F,0x5F, + 0x55,0xE6,0x14,0xE6,0x70,0x60,0x00,0x00,0x35,0xE6,0xF4,0xDD,0x0B,0x29,0x2F,0x38, + 0xB6,0xF6,0x34,0xE6,0x09,0x2F,0x89,0xAD,0xF7,0xF6,0xB7,0xF6,0x8A,0xA2,0x83,0x2D, + 0x17,0xF7,0xB6,0xEE,0xAB,0xA9,0xAF,0xEE,0xF7,0xFE,0x18,0xF7,0xAA,0xAA,0xAA,0xA0, + 0x18,0xFF,0xD7,0xF6,0xFD,0xFF,0xFA,0xEA,0xF7,0xF6,0xD7,0xF6,0x75,0x5E,0xD8,0x7E, + 0xF7,0xF6,0xB7,0xEE,0xFB,0xA3,0xAB,0xFF,0xD7,0xF6,0xF7,0xEE,0x0A,0x80,0x00,0x00, + 0xF7,0xF6,0xD7,0xF6,0x5F,0xDF,0x7D,0xD5,0xF7,0xF6,0xD7,0xF6,0xEA,0xFB,0xFB,0x59, + 0xD7,0xF6,0xF7,0xEE,0xEA,0xA8,0x82,0x00,0xD7,0xF6,0xF7,0xEE,0x8A,0x8E,0xA2,0xE8, + 0xD7,0xF6,0xF7,0xEE,0xAA,0x2A,0x8A,0xBA,0xD7,0xF6,0xF8,0xEE,0x08,0x00,0xF2,0xEA, + 0x18,0xF7,0xD7,0xF6,0x55,0x97,0xAA,0xAE,0xF8,0xFE,0xD7,0xEE,0xFF,0xAA,0x82,0xAA, + 0x18,0xF7,0xD7,0xF6,0xFF,0xAB,0xAB,0xEB,0x18,0xF7,0xD7,0xF6,0xAF,0xBE,0xFE,0xFA, + 0xF7,0xF6,0xD7,0xF6,0x80,0x40,0xF0,0xDF,0xF7,0xF6,0xB7,0xEE,0xEA,0xEE,0x7F,0xFE, + 0xD7,0xF6,0x76,0xE6,0xA8,0xFA,0xFA,0x68,0xB6,0xEE,0x76,0xE6,0x2A,0xBF,0xBF,0xAB, + 0xD7,0xF6,0x96,0xEE,0x56,0x9D,0x2D,0x2B,0xD7,0xF6,0xF7,0xEE,0xA0,0x20,0x20,0x08, + 0xD7,0xF6,0x76,0xE6,0x5C,0xFF,0xDE,0x5E,0x96,0xEE,0x55,0xE6,0x0A,0x28,0xFE,0x7A, + 0x96,0xEE,0x55,0xE6,0xA8,0x2A,0xAF,0x95,0x96,0xEE,0x76,0xEE,0xFD,0xFB,0x3D,0x25, + 0x96,0xEE,0xF4,0xDD,0x48,0x60,0xE0,0x60,0xF4,0xDD,0x52,0xC5,0x3F,0x37,0x37,0xBF, + 0x96,0xEE,0x14,0xDE,0xAD,0x29,0xAD,0x3D,0xB6,0xF6,0x56,0xE6,0x7F,0xFC,0x7B,0x7E, + 0x35,0xEE,0x56,0xE6,0xFB,0xFB,0xFF,0xF7,0x35,0xE6,0x31,0xCD,0x60,0xE0,0x40,0x60, + 0x10,0xC5,0xAF,0xBC,0xFC,0x74,0xDC,0x76,0xD0,0xBC,0x6D,0xB4,0xA2,0xEC,0x7A,0xDE, + 0xF3,0xDD,0xCF,0xBC,0x2D,0x2D,0x0D,0x2D,0x54,0xE6,0xD2,0xDD,0x2F,0x2F,0xB9,0x2B, + 0x55,0xE6,0xF3,0xDD,0x8A,0x68,0x6A,0xFE,0x55,0xE6,0x14,0xDE,0xBB,0xB5,0x35,0xBD, + 0x75,0xEE,0x55,0xE6,0x2D,0x37,0xA9,0xC5,0xB6,0xF6,0x35,0xE6,0x8A,0x2A,0xAF,0xED, + 0x96,0xEE,0x35,0xE6,0xA8,0xAE,0x2E,0x27,0xD7,0xF6,0x75,0xE6,0x2D,0xAF,0x2B,0x2A, + 0xD7,0xF6,0xB6,0xEE,0xAC,0xAC,0x2F,0x0A,0xD7,0xF6,0xF6,0xEE,0x2A,0x0A,0x00,0xA2, + 0xD6,0xF6,0xB6,0xEE,0xAE,0x2A,0xA2,0xE0,0xD6,0xF6,0xB7,0xEE,0xE2,0xAE,0xAB,0x2A, + 0xD6,0xF6,0xB6,0xEE,0xA3,0xA8,0xAA,0x22,0xD6,0xF6,0xD7,0xEE,0x2A,0xAA,0x8A,0xA8, + 0xD7,0xF6,0xB6,0xEE,0x08,0x26,0x0F,0x00,0xF7,0xF6,0xB6,0xEE,0x6A,0xEE,0xAA,0xBB, + 0xD7,0xF6,0xF6,0xEE,0xA0,0x82,0x8A,0x0A,0xD7,0xF6,0xF8,0xEE,0x02,0x0A,0xA0,0x80, + 0xF7,0xF6,0xD7,0xF6,0x7E,0x5B,0x7A,0xFE,0xD7,0xF6,0xD6,0xEE,0xAA,0x8A,0x8C,0x2A, + 0xD7,0xF6,0xB6,0xEE,0x28,0xA8,0xAA,0xFA,0xF7,0xF6,0xB6,0xEE,0xAA,0xEB,0xFF,0xE7, + 0xD6,0xF6,0xB7,0xEE,0x20,0x02,0xA8,0xE2,0xF7,0xF6,0xD7,0xF6,0xED,0xAD,0xFD,0x7D, + 0xF7,0xF6,0xD7,0xF6,0x56,0x77,0xDD,0x7B,0xD7,0xF6,0xB6,0xEE,0xAA,0xB2,0x02,0x00, + 0xF7,0xF6,0xD7,0xF6,0x83,0xA2,0x8B,0x02,0xF7,0xF6,0xD7,0xF6,0xDF,0xFA,0x2A,0x88, + 0xF7,0xF6,0xD7,0xF6,0xFE,0x6A,0xE2,0xEE,0xF7,0xF6,0xD7,0xF6,0x6B,0xA6,0xFA,0xAF, + 0xF7,0xF6,0xD7,0xF6,0xBF,0x8F,0x2B,0xB8,0xF7,0xF6,0xD7,0xF6,0xF0,0xE2,0x6A,0xEA, + 0xF7,0xFE,0xD7,0xF6,0xFA,0x5F,0x55,0xDF,0xF7,0xFE,0x76,0xEE,0xE2,0xE8,0x6A,0x6A, + 0x55,0xEE,0x6A,0x93,0x70,0x78,0x5E,0x5E,0xE8,0x82,0x66,0x72,0x54,0xFE,0xEA,0xB8, + 0xA7,0x7A,0x05,0x62,0xDE,0xEA,0xAA,0xF8,0xA8,0x82,0x45,0x6A,0xF5,0x2F,0x0B,0x22, + 0xE9,0x8A,0x47,0x72,0xBD,0xAA,0x2A,0x02,0x09,0x8B,0x66,0x72,0x5F,0xFE,0x20,0x00, + 0x0A,0x8B,0x67,0x72,0xDD,0xBB,0xB8,0xE8,0xE9,0x82,0x47,0x72,0x5E,0x7E,0x28,0x8A, + 0xA8,0x7A,0x06,0x62,0x55,0x7A,0x88,0x80,0x47,0x6A,0xA4,0x59,0x57,0xDC,0x5C,0x70, + 0x06,0x6A,0x84,0x51,0x39,0xAB,0xA9,0xA9,0xA8,0x7A,0xE5,0x61,0x0B,0x0B,0x03,0xBD, + 0xA8,0x7A,0xE5,0x61,0xA0,0xE8,0xEC,0x7E,0x26,0x6A,0xA5,0x59,0xF8,0x9E,0xBE,0xFE, + 0xE5,0x61,0xA5,0x59,0x1E,0xD9,0xD8,0xFF,0x06,0x62,0xA4,0x59,0x8A,0x0A,0xFB,0xFD, + 0x47,0x6A,0xC5,0x59,0xA2,0x0A,0xFF,0x7D,0x06,0x62,0xC5,0x61,0x7A,0xCC,0xFE,0xFE, + 0x26,0x6A,0xC5,0x59,0x5F,0xFD,0xFC,0x5B,0x06,0x6A,0x84,0x59,0x9B,0x2A,0x02,0x00, + 0x87,0x7A,0xC4,0x61,0xD7,0x2F,0xAA,0x0A,0x09,0x93,0x26,0x72,0xAD,0x2B,0x2A,0xAA, + 0xAD,0xA3,0x0A,0x93,0xB7,0xBD,0xAD,0x0F,0xED,0xAB,0x4B,0x9B,0x7D,0xFF,0xAA,0x80, + 0x6B,0xA3,0xC8,0x8A,0x5C,0x5C,0x78,0xE0,0x4A,0x9B,0xA8,0x8A,0xB9,0x09,0x0F,0xAF, + 0x4A,0x9B,0xE9,0x92,0x6B,0xC2,0xA0,0xFF,0x8C,0xA3,0x26,0x7A,0x5F,0x7A,0xAA,0x0A, + 0xCC,0xAB,0x26,0x72,0xD5,0xFF,0xEA,0x80,0xC8,0x8A,0x66,0x82,0x0B,0x0B,0xFA,0xF4, + 0xC9,0x8A,0x26,0x72,0xF8,0xFE,0xFB,0x57,0x67,0x7A,0xC4,0x61,0xE8,0xE8,0x7E,0x77, + 0x11,0xCD,0xE5,0x69,0xD5,0xB5,0xB5,0x25,0xD7,0xFE,0x6F,0xBC,0x2D,0x2B,0x0B,0x02, + 0x18,0xFF,0xD7,0xFE,0xAD,0xAB,0xAA,0x2A,0x17,0xFF,0xF8,0xF6,0xAF,0xEA,0xE3,0xEA, + 0xF8,0xFE,0x17,0xF7,0xEA,0xBA,0xBA,0xBA,0x17,0xFF,0xF7,0xF6,0xBD,0xEF,0xAF,0xAB, + 0x17,0xFF,0xF7,0xF6,0x8B,0xA6,0xAA,0x7E,0x17,0xFF,0xF7,0xF6,0xFA,0xD6,0x77,0xD5, + 0x18,0xFF,0xF7,0xF6,0xF7,0xF7,0xAD,0xAB,0x18,0xFF,0xB6,0xEE,0x08,0x80,0xE8,0x7A, + 0xF7,0xF6,0x96,0xEE,0x80,0xE8,0xFE,0xDF,0xD7,0xF6,0x96,0xEE,0xA0,0xBE,0x5F,0x57, + 0xB6,0xEE,0x55,0xEE,0x00,0xE8,0x7A,0x5F,0x96,0xEE,0xB2,0xD5,0x20,0xA2,0xFA,0x7A, + 0x18,0xFF,0xF3,0xD5,0xAF,0x2D,0x2D,0x29,0x38,0xFF,0x18,0xFF,0x2B,0x8B,0x2F,0xAF, + 0x38,0xFF,0xF8,0xF6,0x6A,0xEA,0xC0,0x80,0x18,0xFF,0xB7,0xEE,0x7E,0xDA,0xFA,0xFC, + 0xF8,0xFE,0xD7,0xF6,0x9D,0xBF,0xA5,0xB5,0x18,0xFF,0xF8,0xF6,0xFF,0xBE,0xAB,0xAB, + 0x18,0xFF,0xF8,0xF6,0xEA,0xAE,0xB2,0xAA,0x18,0xFF,0xF8,0xF6,0xFF,0xAF,0xFE,0xF2, + 0xF8,0xFE,0x75,0xEE,0x58,0x58,0x68,0xE0,0x96,0xEE,0x35,0xE6,0x7E,0xFE,0xBE,0xF8, + 0x76,0xEE,0x55,0xE6,0x57,0xF7,0xEC,0xFF,0x55,0xEE,0x35,0xE6,0x5E,0xF8,0xDC,0xF8, + 0x96,0xEE,0x35,0xE6,0x2F,0x3F,0xAD,0xEF,0xF7,0xFE,0x96,0xEE,0xA9,0x2F,0xAD,0xAD, + 0xF7,0xF6,0xD7,0xF6,0x94,0xBA,0xAA,0x82,0xD7,0xFE,0xF7,0xF6,0x77,0x5F,0xFD,0xF7, + 0x18,0xFF,0xD7,0xF6,0xEA,0xAA,0xAB,0xAF,0x18,0xF7,0xD7,0xF6,0x7F,0xDE,0xFE,0xA2, + 0xF7,0xF6,0xB7,0xEE,0xFA,0xAA,0x80,0x00,0xD7,0xF6,0xF7,0xEE,0x00,0x00,0x8A,0xFA, + 0xF7,0xF6,0xD7,0xEE,0xB7,0xEF,0xF7,0x28,0xF7,0xF6,0xD7,0xF6,0x5F,0x7A,0xE2,0xB2, + 0x38,0xF7,0xD7,0xF6,0x55,0x7D,0xFF,0xBF,0x18,0xFF,0xD7,0xF6,0xFD,0xBB,0xB2,0xF2, + 0xD9,0xFE,0xF7,0xF6,0xF5,0x55,0xF5,0xD5,0xD8,0xFE,0xF8,0xF6,0xDD,0x77,0x75,0x57, + 0x17,0xFF,0xF8,0xF6,0x7D,0xFD,0xFD,0x77,0xF8,0xFE,0xF7,0xF6,0x77,0xDD,0xD7,0x5D, + 0xF7,0xF6,0xD7,0xF6,0x00,0x20,0x08,0x22,0xF7,0xF6,0xD7,0xF6,0x88,0xC2,0xE8,0xEC, + 0xF7,0xF6,0xD7,0xF6,0xDF,0xF7,0xDD,0xD5,0xD7,0xF6,0xB6,0xEE,0xF8,0xE8,0xF8,0xFF, + 0xB7,0xEE,0x76,0xE6,0xE0,0xFA,0x78,0xE0,0xD7,0xF6,0x75,0xE6,0xBF,0xAD,0x3D,0xA9, + 0xF7,0xF6,0xB6,0xEE,0xF7,0xBF,0xBB,0xAA,0xF7,0xF6,0xB6,0xEE,0xFA,0xFA,0xFA,0xEA, + 0xB7,0xF6,0x75,0xEE,0x7E,0xF8,0xFC,0x5F,0x96,0xEE,0x35,0xE6,0xE8,0xA8,0x88,0x22, + 0x76,0xEE,0x55,0xE6,0x2B,0x02,0x00,0x00,0x96,0xEE,0x76,0xEE,0x85,0xB4,0x9F,0xF5, + 0x76,0xEE,0xF3,0xDD,0x60,0x60,0x40,0xE0,0xF4,0xDD,0x52,0xCD,0x37,0x3E,0x3F,0x2F, + 0x76,0xEE,0x14,0xDE,0x2D,0xAD,0xAD,0x2D,0x96,0xEE,0x14,0xE6,0xAA,0xEA,0xE0,0xFA, + 0x55,0xE6,0xF4,0xDD,0xA2,0xEA,0xFE,0xFE,0x14,0xE6,0x52,0xCD,0x60,0xC0,0xE0,0xC0, + 0x11,0xC5,0x6E,0xB4,0xFE,0xF8,0x78,0x5C,0xCF,0xBC,0x4D,0xAC,0xFE,0xBF,0x3F,0xB7, + 0x13,0xDE,0x0F,0xC5,0xAD,0x2D,0x2D,0x29,0x54,0xE6,0x14,0xDE,0xB5,0xBD,0xAF,0xAA, + 0x55,0xE6,0x14,0xE6,0xFF,0xDA,0x7A,0xFA,0x55,0xE6,0x14,0xDE,0xB9,0xEF,0x2B,0x0F, + 0x55,0xEE,0x35,0xE6,0x3A,0xFF,0xFA,0x28,0x55,0xE6,0x14,0xDE,0x08,0xBF,0xFF,0xA8, + 0xB6,0xEE,0x35,0xE6,0xB5,0xA5,0x2F,0x2B,0xD6,0xF6,0x96,0xEE,0xA9,0xAB,0x8A,0xBE, + 0xB6,0xF6,0xF7,0xEE,0xFA,0xFE,0xAA,0xAE,0xD7,0xF6,0xF6,0xEE,0x22,0x0A,0x00,0x08, + 0xD7,0xF6,0xB6,0xEE,0x28,0xAA,0x8E,0xAB,0xD6,0xF6,0xB6,0xEE,0xA2,0x82,0xA2,0xEA, + 0xD6,0xF6,0xB5,0xEE,0x02,0xAA,0xAE,0xA5,0xD6,0xF6,0xB6,0xEE,0x00,0x82,0x2C,0xAA, + 0xD7,0xF6,0xF7,0xEE,0x28,0x20,0x20,0x00,0xD6,0xF6,0xB7,0xEE,0x82,0x2A,0xAA,0x20, + 0xF6,0xF6,0xD7,0xF6,0x7D,0x7F,0x5A,0x5F,0xD6,0xF6,0xD7,0xEE,0x2A,0xAA,0xAA,0xAA, + 0xD7,0xF6,0xF6,0xEE,0x22,0x00,0x02,0x08,0xF7,0xF6,0xB6,0xEE,0xBE,0xBF,0xAF,0xAE, + 0xD7,0xF6,0xB6,0xEE,0xBE,0xAA,0xF8,0xE2,0xD6,0xF6,0xB6,0xEE,0x8F,0xFF,0xAF,0xAF, + 0xD6,0xF6,0xB6,0xEE,0x88,0x28,0x8B,0x2D,0xF7,0xF6,0xB6,0xEE,0xAA,0xBA,0xEF,0xBF, + 0xD7,0xF6,0xF7,0xEE,0x88,0x08,0xC0,0x02,0xF7,0xF6,0xD7,0xF6,0x8F,0xBE,0xDE,0xA9, + 0xF7,0xF6,0xD7,0xF6,0x08,0x2A,0x0A,0x0A,0x17,0xFF,0xD7,0xF6,0xFE,0xAA,0xFA,0xFF, + 0xD7,0xFE,0xF7,0xF6,0xDD,0xDD,0x55,0x57,0xF7,0xF6,0xD6,0xF6,0xB7,0x3A,0x21,0x00, + 0xF7,0xF6,0xD7,0xF6,0xA8,0xA8,0x22,0x28,0xF7,0xF6,0xD7,0xF6,0xEA,0xFE,0x60,0x78, + 0xF7,0xFE,0xD7,0xF6,0xFF,0xBD,0xDF,0xDF,0xF7,0xF6,0x13,0xE6,0x60,0x68,0x68,0x62, + 0xEF,0xC4,0xA6,0x7A,0xF8,0x78,0x78,0x78,0xC7,0x82,0x46,0x72,0xB8,0xF8,0x56,0x5F, + 0x87,0x7A,0x26,0x72,0x2A,0xAB,0xFA,0x7D,0xA8,0x7A,0x47,0x72,0x00,0xAB,0x9D,0x5D, + 0xE9,0x82,0x46,0x72,0x0A,0x2A,0xBF,0xF5,0x4A,0x8B,0x67,0x72,0xA2,0xAB,0x7D,0x55, + 0xE9,0x8A,0x06,0x6A,0xA8,0xE8,0xFB,0x5F,0xA8,0x7A,0x05,0x62,0x88,0xAA,0xBA,0x7F, + 0xA8,0x7A,0x06,0x62,0xA8,0xFE,0x5E,0x5F,0x27,0x6A,0x84,0x51,0xE0,0xBA,0xBF,0xDE, + 0xE5,0x61,0x64,0x51,0x0A,0xAA,0xAC,0xA5,0x05,0x62,0x84,0x59,0x02,0x7B,0xFF,0xD7, + 0xE5,0x61,0xA4,0x59,0x8A,0xDF,0xB9,0xF5,0xE5,0x61,0x84,0x59,0xA2,0xAA,0xB8,0xBB, + 0xE5,0x61,0xA4,0x59,0xE5,0xAA,0x82,0xAA,0x06,0x62,0xA5,0x59,0x5F,0xD5,0xBE,0x8E, + 0xE5,0x61,0xA5,0x59,0x53,0x2B,0x09,0x02,0x26,0x6A,0xC5,0x59,0xEF,0xB9,0xCB,0x0A, + 0x67,0x72,0xC5,0x59,0x5F,0xED,0xAA,0xA2,0xA8,0x82,0xE5,0x61,0xDD,0xF7,0xBB,0x02, + 0x09,0x93,0x66,0x72,0xD5,0xBD,0x2A,0x0E,0x2A,0x93,0xC8,0x8A,0x9F,0x83,0x08,0x28, + 0xAC,0xA3,0x0A,0x93,0x0D,0x2B,0x0D,0x2B,0x4E,0xBC,0xCC,0xAB,0x7D,0x0F,0xAF,0x29, + 0x6E,0xBC,0x6B,0xA3,0x5F,0xFE,0xA8,0x00,0x2D,0xB4,0x0A,0x93,0x55,0x5F,0x7A,0xB0, + 0x2A,0x9B,0xC8,0x8A,0xBF,0xFE,0x57,0xF8,0x6B,0xA3,0xC9,0x8A,0x0B,0x2D,0x3F,0xA5, + 0xED,0xB3,0x4A,0x9B,0x83,0xAA,0xFF,0xD5,0x2A,0x9B,0x67,0x82,0xD4,0x58,0x78,0xF0, + 0x87,0x82,0x26,0x72,0x7A,0xEA,0x7E,0x2A,0x4A,0x93,0xC5,0x69,0x57,0xDF,0xB5,0x2F, + 0x56,0xEE,0xC9,0x82,0x35,0x2D,0x0B,0x0B,0xD7,0xFE,0x35,0xEE,0x09,0x03,0x02,0x00, + 0x18,0xFF,0xF7,0xFE,0xFD,0xBD,0xBD,0xA5,0x18,0xFF,0xF8,0xF6,0xEE,0x7E,0xD8,0xBA, + 0x17,0xFF,0xF7,0xF6,0xEF,0xEB,0xF7,0xFA,0x18,0xFF,0xF7,0xF6,0xBA,0x8E,0xEB,0x8E, + 0x17,0xFF,0xD7,0xF6,0xAA,0xBA,0xFA,0xFE,0x17,0xFF,0xD7,0xF6,0xBF,0xB6,0x3A,0xAB, + 0x18,0xFF,0xB6,0xEE,0x82,0xA0,0xA8,0x72,0xF7,0xF6,0x96,0xEE,0xF8,0xFA,0x5E,0x57, + 0x75,0xEE,0xB6,0xE6,0xAD,0xAA,0xAE,0xEB,0xB6,0xEE,0x75,0xEE,0xFF,0x7F,0x7F,0x00, + 0xB6,0xF6,0x54,0xE6,0x7F,0xFF,0xEB,0x80,0x75,0xEE,0xD3,0xD5,0x5A,0x5E,0x9E,0x28, + 0x18,0xFF,0x34,0xDE,0x0D,0x0F,0x03,0x02,0x39,0xFF,0x18,0xFF,0xBF,0xBF,0xBB,0xAF, + 0x39,0xFF,0x18,0xFF,0xC2,0x00,0x02,0xC2,0x18,0xF7,0xD7,0xF6,0x56,0x5E,0x78,0xF8, + 0xF8,0xF6,0xD7,0xF6,0xA5,0x29,0xA3,0x0A,0x18,0xFF,0xF8,0xF6,0xAF,0xED,0xAF,0xA9, + 0x18,0xFF,0xF8,0xF6,0xBA,0x7F,0xDD,0xEF,0x18,0xFF,0xF8,0xF6,0x6A,0xFF,0x7D,0x7D, + 0xF8,0xF6,0xB7,0xF6,0x60,0x80,0x20,0x00,0xD7,0xF6,0x55,0xE6,0x57,0x5E,0x7C,0x78, + 0x76,0xEE,0x55,0xE6,0xEB,0x8F,0x1F,0xEB,0x55,0xEE,0x35,0xE6,0x78,0x70,0xF0,0xE8, + 0x76,0xEE,0x14,0xDE,0x2A,0x2A,0xAF,0xA9,0xD7,0xF6,0x55,0xEE,0x0B,0x0B,0x2D,0xAF, + 0x18,0xF7,0xB6,0xEE,0xCA,0xA2,0xFB,0xAD,0xF7,0xF6,0xD7,0xF6,0x2B,0x8D,0xA5,0xBE, + 0xD7,0xFE,0xF8,0xF6,0x57,0x5D,0x97,0x55,0x18,0xFF,0xF8,0xF6,0xED,0xAD,0xFD,0xED, + 0xF7,0xF6,0xD8,0xF6,0x2A,0xB8,0x70,0xB0,0x18,0xFF,0xD7,0xF6,0x3D,0xA7,0xB7,0x57, + 0x18,0xFF,0xF8,0xF6,0x5F,0x7F,0xFF,0xBD,0x18,0xFF,0xD7,0xF6,0xFE,0xFF,0xEA,0xA8, + 0xF7,0xF6,0xD7,0xF6,0x08,0x2E,0xAA,0x22,0x18,0xFF,0xF7,0xF6,0x75,0x55,0x75,0xD7, + 0xF7,0xFE,0xF8,0xF6,0x75,0xDD,0x7F,0xF7,0x18,0xFF,0xF8,0xF6,0x75,0x55,0x7F,0x7F, + 0x18,0xFF,0xD7,0xF6,0xAB,0xEA,0xFB,0xDF,0xF7,0xF6,0xD7,0xF6,0x00,0x00,0x00,0xAC, + 0xF7,0xF6,0xD7,0xF6,0x28,0x22,0xAC,0xEE,0xF7,0xF6,0xD7,0xF6,0x6C,0x7E,0xD7,0x59, + 0xD7,0xF6,0xB6,0xEE,0x00,0xC8,0xE0,0xC0,0xD7,0xF6,0x96,0xEE,0xAB,0x8B,0xEE,0x7F, + 0xB6,0xEE,0x75,0xE6,0xE8,0xAE,0xEC,0xDF,0xD7,0xF6,0x96,0xEE,0x0D,0x2D,0x25,0xAD, + 0xF7,0xF6,0xB7,0xEE,0xAA,0xE8,0xFA,0xEF,0xF7,0xF6,0xB6,0xEE,0xAA,0xEB,0xFA,0xFB, + 0xB7,0xF6,0x55,0xE6,0x7E,0xD6,0x76,0x5C,0x96,0xEE,0x76,0xEE,0x89,0xFF,0x7D,0xD5, + 0x76,0xEE,0x55,0xE6,0x88,0xE0,0xF0,0xFE,0x96,0xEE,0x55,0xE6,0xAB,0xBB,0xEF,0xFF, + 0x76,0xEE,0xD3,0xDD,0xE0,0xE0,0xE0,0x60,0xF3,0xDD,0x72,0xCD,0xBF,0xAF,0x2F,0x3F, + 0x76,0xEE,0xF4,0xDD,0x2D,0x2D,0x0B,0x2D,0x76,0xEE,0x14,0xE6,0xF8,0xB8,0x68,0x70, + 0x34,0xE6,0xF4,0xDD,0xEC,0x68,0xFA,0xB7,0x15,0xE6,0x92,0xD5,0x60,0x48,0x6A,0x62, + 0x10,0xC5,0xEC,0xA3,0xE8,0xF8,0xFC,0x7C,0xF0,0xC4,0xEC,0x9B,0xAF,0x2F,0x3D,0x25, + 0x34,0xE6,0x51,0xCD,0xAD,0x2D,0x3D,0x2F,0x55,0xE6,0x14,0xE6,0xAF,0x89,0x23,0x23, + 0x54,0xE6,0x14,0xDE,0xFA,0x5E,0xDA,0xFC,0xB7,0xF6,0x34,0xE6,0xF5,0xAD,0xA9,0x09, + 0xB6,0xF6,0x55,0xE6,0xD5,0xFF,0xEA,0x70,0x76,0xEE,0x55,0xE6,0xD7,0x1F,0x2F,0x2B, + 0xB6,0xEE,0x76,0xEE,0xAD,0x2F,0xAA,0xAA,0xB6,0xF6,0x96,0xEE,0xCA,0xCB,0x7E,0xDE, + 0xD7,0xF6,0xB6,0xEE,0x0A,0x31,0x22,0xBA,0xD6,0xF6,0xB6,0xEE,0xB8,0xFE,0xA2,0x80, + 0xD6,0xF6,0xD7,0xEE,0xAA,0xA2,0xAA,0xAA,0xD6,0xF6,0xB7,0xEE,0xEA,0xA8,0x2C,0x28, + 0xF6,0xF6,0xB7,0xEE,0xBD,0xFE,0xFA,0xEA,0xD7,0xF6,0xB6,0xEE,0xA2,0xE2,0x82,0xA8, + 0xD6,0xF6,0xB6,0xEE,0x22,0x0A,0x8B,0xA8,0xF7,0xF6,0xB6,0xEE,0xBA,0xFE,0xAB,0xAF, + 0xF7,0xF6,0xB6,0xEE,0xBA,0xEF,0xAA,0xAA,0xD6,0xF6,0xF8,0xEE,0x88,0x28,0x00,0x22, + 0xF5,0xF6,0xD7,0xF6,0x57,0xDF,0xF5,0xFD,0xD6,0xF6,0xD7,0xEE,0xAA,0xA2,0xAA,0x28, + 0xD6,0xF6,0xB6,0xEE,0xFE,0x6E,0x60,0xF0,0xD6,0xF6,0xB6,0xEE,0x6F,0x7F,0xF9,0x9B, + 0xD6,0xF6,0xB6,0xEE,0x8F,0xEF,0xBE,0xAE,0xD7,0xF6,0xB6,0xEE,0xAA,0xA8,0xBA,0xFF, + 0xF6,0xF6,0xB6,0xEE,0xEB,0xEB,0xAF,0xAF,0xF7,0xF6,0xB6,0xEE,0xAA,0xBA,0xAD,0xBB, + 0xF6,0xF6,0xD6,0xF6,0xF6,0xFF,0xDD,0xF5,0xF6,0xF6,0xD6,0xF6,0xAA,0xA2,0xBB,0x79, + 0xF7,0xF6,0xD7,0xF6,0x20,0xAA,0xAE,0xF5,0xF7,0xF6,0xD7,0xF6,0x80,0x28,0xA0,0xAA, + 0xF7,0xFE,0xF7,0xF6,0xFD,0xDF,0x7F,0x7D,0xD7,0xFE,0xF7,0xF6,0xF5,0xFD,0xFD,0xBD, + 0xF7,0xFE,0xD6,0xF6,0xD8,0xEA,0xFF,0x5E,0xB6,0xF6,0x51,0xCD,0xC0,0x60,0x40,0x60, + 0x4D,0xAC,0xA6,0x7A,0x58,0x5C,0x5C,0x5C,0xE7,0x82,0x45,0x6A,0x55,0x57,0xFD,0x8A, + 0xA7,0x7A,0x26,0x6A,0x7D,0x77,0x7A,0x78,0x67,0x72,0xC5,0x61,0x0A,0xBA,0x6E,0xEF, + 0x47,0x72,0xE6,0x61,0x02,0xEA,0xF5,0x85,0x46,0x6A,0xE5,0x61,0xBC,0xDF,0x7B,0xD7, + 0x46,0x6A,0xE5,0x61,0x9F,0x3F,0xAF,0xAA,0x46,0x6A,0x26,0x6A,0x06,0x68,0x9E,0x76, + 0x46,0x6A,0xC4,0x59,0xE8,0xF8,0xFA,0x5E,0xE5,0x59,0x43,0x51,0x6E,0xE0,0xE8,0xEA, + 0x84,0x59,0x03,0x49,0x82,0x6A,0xAA,0xA0,0x84,0x59,0x23,0x49,0x2E,0x3D,0x25,0x8A, + 0xC6,0x61,0x64,0x51,0xD5,0xBD,0x8B,0x0B,0x06,0x62,0x85,0x59,0xFF,0xFF,0xBA,0x2E, + 0x06,0x62,0xA5,0x59,0xFB,0xB5,0xFE,0xE8,0x26,0x6A,0xC5,0x61,0xEB,0xFF,0x0F,0x29, + 0x47,0x72,0xC5,0x59,0x7D,0xD7,0xAB,0x2A,0xC8,0x7A,0x06,0x62,0xF5,0xFF,0xFD,0x8F, + 0xE9,0x8A,0x46,0x72,0xF5,0xBD,0x2D,0x2A,0x2A,0x93,0xC8,0x82,0xF5,0xFF,0x2E,0x0B, + 0x2A,0x93,0xE8,0x8A,0x36,0x2B,0xAC,0xAA,0x6B,0x9B,0x09,0x93,0xFF,0xFF,0xEB,0x2B, + 0x8B,0xA3,0x2A,0x9B,0x29,0x2B,0x0B,0x02,0x6E,0xBC,0xAC,0xAB,0x2D,0xA5,0xAD,0xAD, + 0xCF,0xCC,0x4E,0xBC,0xF7,0xAD,0xAF,0x0F,0xCF,0xCC,0xCC,0xAB,0x7E,0xEA,0xA8,0xA0, + 0x0D,0xB4,0x2A,0x93,0x5F,0x7A,0xF8,0xE8,0x4A,0x93,0xE9,0x8A,0xAF,0xEF,0xFA,0xF8, + 0x2A,0x93,0x87,0x82,0x00,0xEA,0x6E,0x7E,0xE9,0x8A,0xC5,0x69,0xA0,0xEA,0x7E,0x57, + 0x09,0x8B,0xE5,0x69,0xFF,0xDD,0xB5,0x3D,0x12,0xE6,0xE8,0x82,0xF5,0xB5,0x2D,0x0B, + 0xD7,0xFE,0x72,0xD5,0x2D,0x0B,0x02,0x00,0x18,0xFF,0xD7,0xFE,0xBF,0xEB,0xAA,0xAA, + 0x18,0xFF,0xF7,0xFE,0x8D,0xAB,0xA5,0x2D,0x18,0xFF,0xF7,0xF6,0xA2,0x80,0xA8,0xFA, + 0x17,0xFF,0xF8,0xF6,0xAA,0x7A,0xAE,0xAA,0xF7,0xFE,0x18,0xF7,0xEF,0xFE,0xFF,0xAF, + 0x17,0xFF,0xD7,0xF6,0x7A,0xFA,0xEA,0xEA,0x17,0xFF,0xB6,0xEE,0x22,0x0A,0xE2,0x6A, + 0xF7,0xF6,0x96,0xEE,0x60,0x5C,0xDF,0xF7,0xF7,0xF6,0x96,0xEE,0x55,0xF5,0xFD,0x0B, + 0x17,0xFF,0x96,0xEE,0xFD,0xAF,0x8A,0x00,0x38,0xFF,0xD7,0xF6,0xD5,0xFB,0xAA,0x8A, + 0x18,0xFF,0xB6,0xF6,0x7E,0xFE,0xE2,0xF0,0xF7,0xF6,0x75,0xEE,0x9D,0xB7,0x37,0x37, + 0x38,0xFF,0xF8,0xFE,0xAF,0xAB,0xAA,0x8A,0x39,0xFF,0x18,0xFF,0xBF,0xF5,0x2D,0x29, + 0x39,0xFF,0x18,0xFF,0xC2,0xE8,0xE0,0xB0,0x18,0xFF,0xF8,0xF6,0x56,0x78,0x50,0xD0, + 0xF8,0xF6,0xD7,0xF6,0x88,0xAA,0xB8,0xA2,0x18,0xFF,0xF8,0xF6,0xFD,0xF5,0xD5,0xDD, + 0x18,0xFF,0xF8,0xF6,0xED,0xA5,0xAB,0xAF,0x18,0xFF,0xF8,0xF6,0xEB,0xAE,0x2A,0xBA, + 0x18,0xFF,0xF8,0xF6,0xFA,0xDA,0xB2,0xAA,0x18,0xFF,0x55,0xE6,0x7A,0xFA,0xE0,0xA8, + 0x75,0xEE,0x55,0xE6,0xBF,0xFD,0xDF,0x70,0x75,0xEE,0x35,0xE6,0xEA,0xFF,0xAF,0x9A, + 0x76,0xEE,0x35,0xE6,0xAD,0xEF,0x2F,0xAB,0xB6,0xF6,0x55,0xE6,0xAD,0xAD,0xBF,0x0F, + 0xF7,0xF6,0xB6,0xF6,0x8F,0xA9,0xED,0xAD,0xF7,0xF6,0xD7,0xF6,0xFA,0x7B,0xFF,0xBF, + 0x18,0xFF,0xD7,0xF6,0xAA,0xAB,0xEB,0xAF,0x18,0xFF,0xF8,0xF6,0xEB,0xED,0xF5,0x55, + 0x18,0xFF,0xF8,0xF6,0x57,0x56,0x5F,0x5F,0xF8,0xF6,0xD7,0xF6,0xDE,0xFA,0xA2,0x20, + 0xF8,0xF6,0xD7,0xF6,0x00,0xA2,0xAA,0x2B,0x18,0xFF,0xD7,0xF6,0xAA,0xBF,0xBF,0xBF, + 0x18,0xFF,0xF7,0xF6,0x5D,0x77,0x7E,0xFD,0xF7,0xF6,0xD7,0xF6,0x00,0xA0,0xF2,0xA0, + 0x18,0xFF,0xD7,0xF6,0xAE,0xBE,0xEB,0x7F,0x18,0xFF,0xF7,0xF6,0xFF,0xED,0x77,0xD5, + 0x18,0xF7,0xD7,0xF6,0xDE,0xFA,0x7E,0xFF,0xF7,0xF6,0xD7,0xF6,0xBC,0xEE,0x2E,0x9E, + 0xF7,0xF6,0xD7,0xF6,0xA8,0xAA,0xAE,0x8A,0xD7,0xF6,0xF7,0xEE,0x2A,0xA2,0x02,0x00, + 0xD7,0xF6,0xB6,0xEE,0xCA,0xEB,0xE3,0xEB,0xB6,0xEE,0x96,0xEE,0xE0,0xC0,0x78,0x56, + 0x96,0xEE,0x75,0xEE,0x9E,0xB8,0xC2,0x6A,0xD7,0xF6,0x76,0xEE,0xAB,0x0B,0xEF,0xAD, + 0xD7,0xF6,0xB6,0xEE,0xEA,0xEB,0xAB,0x3A,0xD7,0xF6,0xB6,0xEE,0x8B,0xFB,0x63,0x74, + 0x96,0xEE,0x14,0xDE,0xF8,0xFC,0xFC,0x58,0x96,0xEE,0x35,0xE6,0x2B,0xAB,0x8F,0xAD, + 0x75,0xEE,0x56,0xE6,0xE8,0xA2,0x2B,0x2A,0x96,0xEE,0x55,0xEE,0xB7,0x9D,0x2F,0x8B, + 0x96,0xEE,0xF4,0xDD,0x60,0x72,0x68,0xE0,0x14,0xDE,0x72,0xCD,0xB7,0x2F,0x35,0xB7, + 0x76,0xEE,0xF3,0xDD,0x2D,0xAF,0x2B,0x2B,0x75,0xEE,0x35,0xE6,0x72,0x7A,0x5A,0x7A, + 0x14,0xE6,0xD3,0xDD,0xE8,0xFA,0x7E,0x56,0x14,0xE6,0x93,0xD5,0x62,0x6A,0xEF,0x7B, + 0xF0,0xC4,0x8B,0x93,0xFC,0xFC,0x7C,0xF8,0x72,0xD5,0xEC,0x9B,0x35,0x25,0x2D,0x2B, + 0x55,0xEE,0x92,0xD5,0xBD,0xAD,0x2D,0xAD,0x96,0xEE,0x34,0xE6,0xFD,0x2A,0x0A,0x02, + 0x96,0xEE,0x34,0xE6,0x57,0xF4,0x80,0x00,0xB7,0xF6,0x55,0xE6,0x09,0x29,0xEA,0xFF, + 0xB6,0xEE,0x14,0xE6,0xB0,0xFA,0xFE,0xD6,0x96,0xEE,0xF4,0xDD,0x2A,0x0A,0xAA,0x75, + 0x96,0xEE,0x35,0xE6,0x20,0x00,0x82,0x09,0xB6,0xF6,0x55,0xE6,0xAA,0xEA,0x7E,0x7F, + 0xD6,0xF6,0xB6,0xEE,0xBE,0x2B,0x2A,0xAA,0xF7,0xF6,0xD7,0xF6,0x7C,0x9F,0x55,0x55, + 0xD7,0xF6,0xD6,0xEE,0xAB,0xAA,0x88,0xAA,0xD6,0xF6,0xD7,0xEE,0xAA,0xAA,0x8A,0x8A, + 0xD6,0xF6,0xB6,0xEE,0x80,0xA2,0xAB,0x0B,0xF6,0xF6,0xB7,0xEE,0xFA,0xFE,0xBA,0xAB, + 0xD6,0xF6,0xF8,0xEE,0x00,0xA2,0x02,0x02,0xD6,0xF6,0xB6,0xE6,0x88,0x32,0x02,0x00, + 0xD6,0xF6,0xF8,0xEE,0x08,0x82,0x20,0x22,0xD7,0xF6,0xD6,0xEE,0xAA,0xA2,0xA8,0xA3, + 0xB5,0xF6,0xF6,0xEE,0xFA,0xEA,0xBF,0xAA,0xD6,0xF6,0xD6,0xEE,0x38,0xA8,0xAA,0xA8, + 0xD6,0xF6,0xB6,0xEE,0xF2,0xE2,0x70,0x78,0xD6,0xF6,0xB6,0xEE,0xAA,0xAF,0x9D,0x57, + 0xD6,0xF6,0xB6,0xEE,0xEF,0x96,0xFE,0xAA,0xD6,0xF6,0xB6,0xEE,0xFE,0xEE,0xEB,0xFE, + 0xD6,0xF6,0xB6,0xF6,0xA8,0x0B,0x8D,0xAF,0xD6,0xF6,0xB6,0xEE,0x80,0x00,0x80,0xA3, + 0xF6,0xF6,0xB6,0xEE,0xAA,0x9E,0xBF,0xEF,0xF6,0xF6,0xB6,0xEE,0xAA,0xDA,0xBF,0xEF, + 0xD6,0xF6,0xF7,0xEE,0x88,0x80,0x20,0xA8,0xF7,0xF6,0xD6,0xF6,0xFA,0xFA,0xED,0xF7, + 0xF7,0xF6,0xD6,0xF6,0x38,0x96,0xEB,0xFA,0xF7,0xFE,0xD7,0xF6,0xAA,0xAF,0xFF,0x74, + 0xF7,0xFE,0x75,0xEE,0xA2,0xAA,0xEA,0x7E,0x54,0xEE,0x29,0x83,0x80,0xE0,0xE0,0x78, + 0xEC,0xA3,0xE5,0x61,0xF8,0xFA,0xFE,0x57,0xC8,0x7A,0x64,0x51,0x00,0xA0,0xFB,0x57, + 0xA8,0x7A,0x63,0x51,0xA0,0xE8,0xFF,0xD5,0x26,0x6A,0x84,0x51,0xA0,0xA8,0xBB,0xD5, + 0x06,0x62,0xA5,0x59,0x02,0x22,0xBB,0xDD,0x26,0x6A,0x84,0x51,0xAA,0x82,0x8E,0x6F, + 0x26,0x6A,0x23,0x41,0xA0,0x8A,0xFA,0x5F,0xE5,0x59,0x43,0x49,0x00,0xFA,0x7E,0x55, + 0xC5,0x59,0x43,0x49,0x2A,0xAA,0xFE,0xFD,0xA4,0x51,0x64,0x51,0xB0,0xE8,0xAF,0x7D, + 0xC5,0x61,0x43,0x49,0xDF,0xFF,0x2F,0x0F,0xA8,0x7A,0x84,0x59,0x55,0xFF,0xAB,0x2E, + 0x47,0x72,0xA5,0x59,0x55,0xFE,0xA8,0x00,0x27,0x6A,0xC5,0x59,0xB7,0xAF,0x98,0x90, + 0x47,0x6A,0xE5,0x61,0x79,0xF2,0x20,0xAA,0x06,0x6A,0xC5,0x61,0xA7,0x3A,0x9A,0xAC, + 0xA8,0x7A,0x06,0x6A,0xF7,0xB5,0x8D,0x2F,0x8B,0xA3,0x67,0x72,0xFD,0xAF,0xAB,0x0B, + 0xCC,0xA3,0xE9,0x8A,0x55,0xFF,0xAA,0x20,0xAB,0xA3,0xC9,0x8A,0xFD,0xAE,0xCA,0x00, + 0x8B,0xA3,0x09,0x93,0x55,0xEF,0xFB,0x78,0x8B,0xA3,0x2A,0x9B,0x39,0x3F,0x2D,0xA9, + 0xAB,0xA3,0x6A,0xA3,0xAE,0x9A,0xDC,0x55,0x2D,0xBC,0x8B,0xA3,0x2B,0x25,0xAD,0xF5, + 0xCF,0xCC,0xCC,0xAB,0x2A,0xAF,0x37,0xFD,0xCF,0xCC,0x2D,0xBC,0x78,0xE8,0x7A,0x77, + 0x2E,0xBC,0x4A,0x9B,0xF8,0xF8,0x78,0x5E,0x29,0x93,0x46,0x7A,0x80,0xFC,0xFA,0x5E, + 0xC8,0x8A,0xE5,0x69,0xE0,0xFA,0x56,0x5F,0x46,0x72,0xA4,0x61,0xDE,0x5F,0xAA,0x0A, + 0xF3,0xE5,0xA7,0x7A,0xD5,0xB5,0x25,0x2D,0xD6,0xF6,0x10,0xCD,0x2D,0x2B,0x02,0x02, + 0x18,0xFF,0xB6,0xFE,0xAB,0x8A,0x2A,0x22,0x17,0xFF,0xF8,0xFE,0xAF,0xB9,0xAB,0x22, + 0x17,0xFF,0xF8,0xF6,0xAA,0xA2,0xA8,0x08,0x17,0xFF,0xF8,0xF6,0xEA,0xA0,0x82,0x82, + 0xF7,0xFE,0x18,0xF7,0xFF,0xEF,0xBF,0xFA,0x17,0xFF,0xF7,0xF6,0x5B,0xFD,0xFF,0xEF, + 0x17,0xFF,0xD7,0xF6,0xAA,0xE2,0xEA,0x7A,0xF7,0xF6,0x96,0xEE,0xE8,0x78,0xBF,0xAF, + 0xF7,0xF6,0xB6,0xEE,0x7D,0x2F,0x0A,0x00,0x18,0xFF,0xD7,0xF6,0xBD,0x0B,0x02,0x00, + 0x38,0xFF,0x18,0xFF,0xB5,0xAD,0xAD,0x8D,0x38,0xFF,0x18,0xFF,0x0A,0x02,0x02,0x00, + 0x38,0xFF,0xF4,0xDD,0xA0,0xE8,0x78,0x78,0xF7,0xFE,0xD3,0xD5,0x2B,0x27,0x2D,0x2D, + 0x38,0xFF,0x18,0xFF,0xED,0x7D,0xFD,0xFD,0x39,0xFF,0x18,0xFF,0x2F,0xAE,0xBF,0xBD, + 0x38,0xFF,0x19,0xFF,0xE8,0xF8,0xFA,0x6A,0x18,0xFF,0xF8,0xF6,0xA8,0xF8,0x72,0xDA, + 0x18,0xFF,0xD7,0xF6,0xFF,0xAB,0xAF,0xBF,0x18,0xFF,0xF8,0xF6,0xEE,0xBA,0x0A,0x6A, + 0x18,0xFF,0xF8,0xF6,0xFF,0xFE,0xAA,0xBD,0x18,0xFF,0xF8,0xF6,0xFE,0x9F,0xAF,0x8A, + 0x18,0xFF,0xF8,0xF6,0xAF,0x2B,0x8E,0x0A,0x18,0xFF,0xD7,0xF6,0x7A,0xE2,0xEA,0xEA, + 0xF7,0xFE,0x55,0xE6,0x5F,0x5E,0xFA,0xF8,0x75,0xEE,0x55,0xE6,0x55,0x7F,0xFA,0x02, + 0x55,0xEE,0x75,0xE6,0x80,0x82,0xBE,0xAB,0xB6,0xF6,0x54,0xE6,0x2F,0x29,0x2B,0xAB, + 0xF7,0xF6,0xB7,0xF6,0xAF,0x0F,0xA5,0x3D,0xF8,0xF6,0xD7,0xF6,0xEB,0x6E,0x60,0x60, + 0xF7,0xF6,0xD8,0xF6,0x02,0x02,0xAB,0xBD,0xD6,0xFE,0xF8,0xF6,0x55,0x5D,0xDD,0x5F, + 0xF8,0xF6,0xD8,0xF6,0x00,0xAE,0xBE,0xAA,0xF8,0xF6,0xD7,0xF6,0xAA,0x8B,0xB3,0x82, + 0xF7,0xF6,0xD7,0xF6,0x88,0xA8,0x82,0x00,0xF7,0xF6,0xD7,0xF6,0x08,0xE0,0xC8,0x00, + 0xF7,0xF6,0xD7,0xF6,0x00,0x8A,0x8F,0xBF,0xF7,0xF6,0xD7,0xF6,0x20,0x00,0x0A,0x3B, + 0xF7,0xF6,0xD7,0xF6,0xCA,0xC8,0xE2,0x28,0xF7,0xFE,0xD7,0xF6,0x2D,0x2D,0x2B,0xBA, + 0xF7,0xF6,0xD7,0xF6,0xA8,0xA8,0xE8,0xFA,0xF7,0xF6,0xD7,0xF6,0xDE,0xDF,0x7E,0x56, + 0xF7,0xF6,0xD7,0xF6,0xEB,0x4A,0xDD,0x55,0xF7,0xF6,0xB7,0xEE,0x8F,0xBF,0xDE,0xFE, + 0xD7,0xF6,0x96,0xEE,0xE8,0xEC,0x7E,0x7F,0xB6,0xEE,0x55,0xE6,0xF8,0xFA,0x7A,0x5F, + 0x96,0xEE,0x55,0xE6,0xBB,0xBD,0xBD,0x35,0xD7,0xF6,0x96,0xEE,0xAD,0x2D,0x0F,0x3B, + 0xD7,0xF6,0xB6,0xF6,0xB2,0xDF,0xD8,0xEA,0xD7,0xF6,0x96,0xEE,0xA8,0xAA,0xEB,0xE8, + 0x96,0xEE,0xF4,0xDD,0x78,0x78,0x5C,0x5A,0x76,0xEE,0xF4,0xDD,0x03,0x2B,0x2D,0xAF, + 0x75,0xEE,0x55,0xE6,0x88,0xA2,0x88,0xA2,0x96,0xEE,0x75,0xEE,0xBF,0xD7,0x7D,0x55, + 0x76,0xEE,0xD3,0xD5,0x60,0xF8,0x60,0x68,0xF4,0xDD,0x92,0xD5,0xAF,0x27,0x2D,0x3F, + 0x55,0xEE,0xF4,0xDD,0x0B,0x2B,0x29,0xA7,0x76,0xEE,0x35,0xE6,0x7A,0x7A,0x62,0x6B, + 0x35,0xE6,0xD3,0xDD,0x56,0x7E,0xE2,0xE8,0x15,0xE6,0xB3,0xD5,0x7B,0x6A,0x62,0x68, + 0x31,0xC5,0x0D,0xA4,0xDC,0x7C,0xBC,0xAA,0x92,0xD5,0xAF,0xB4,0x2D,0x2D,0x09,0xAF, + 0x55,0xEE,0x92,0xD5,0x3F,0x35,0x95,0xFD,0x96,0xF6,0xF4,0xDD,0x00,0x22,0xAA,0xF5, + 0x96,0xEE,0xD3,0xDD,0xA0,0xEA,0xFF,0x5F,0x35,0xE6,0x92,0xD5,0x80,0xBA,0xDF,0x55, + 0xF4,0xDD,0x52,0xCD,0x00,0xAA,0xFB,0xFD,0xF4,0xDD,0x92,0xD5,0x8F,0xAF,0xAD,0x0D, + 0x76,0xEE,0xF3,0xDD,0x0D,0xA5,0xAD,0xAD,0x76,0xEE,0x35,0xE6,0xE8,0xFC,0x57,0x55, + 0xD6,0xF6,0xB6,0xEE,0xAA,0xAA,0x08,0x83,0xF6,0xF6,0xB7,0xEE,0xFB,0xEB,0xAA,0xAF, + 0xD6,0xF6,0xB6,0xEE,0x2B,0x83,0x02,0x08,0xD6,0xF6,0xD7,0xEE,0x8A,0xAA,0xAA,0x2A, + 0xD6,0xF6,0xD7,0xEE,0xA2,0x8A,0xA8,0xAA,0xF6,0xF6,0xD6,0xF6,0xBD,0xCB,0x7D,0x55, + 0xD6,0xF6,0xB6,0xEE,0x38,0x00,0x2A,0x38,0xF6,0xF6,0xD6,0xF6,0xF5,0xF5,0xDD,0xFD, + 0xD6,0xF6,0xD7,0xEE,0x8A,0xA8,0x2A,0xA8,0xD6,0xF6,0xB6,0xEE,0xAA,0x8A,0x30,0x00, + 0xF6,0xF6,0xB6,0xEE,0xFF,0xFF,0xEE,0xAA,0xD6,0xF6,0xD6,0xEE,0x2A,0x22,0xAA,0xAA, + 0xD6,0xF6,0xB6,0xEE,0xB6,0x2E,0xA2,0xFA,0xD6,0xF6,0xB6,0xEE,0x9F,0xDF,0xE7,0xA5, + 0xB6,0xF6,0xD6,0xEE,0xEB,0xAA,0xBA,0x2A,0xD6,0xF6,0xB6,0xEE,0xFA,0x63,0xAF,0xBD, + 0xD7,0xF6,0xB6,0xF6,0xFB,0xEB,0xEA,0xF7,0xD6,0xF6,0xB6,0xEE,0x29,0xFB,0xAF,0xAB, + 0xD6,0xF6,0xB6,0xEE,0x0A,0x0A,0x28,0xBA,0xD6,0xF6,0xB6,0xEE,0x08,0x28,0xA8,0xA3, + 0xD6,0xF6,0xB6,0xEE,0x00,0xA2,0xA8,0xA2,0xF6,0xF6,0xB5,0xEE,0xAA,0xBA,0xEE,0xFA, + 0xF6,0xF6,0xB5,0xEE,0x2A,0xAB,0x3F,0xFF,0xF6,0xF6,0xB7,0xF6,0xE8,0xFA,0xFE,0xFE, + 0xD7,0xF6,0x75,0xEE,0x6A,0x68,0xC0,0xC0,0xF3,0xDD,0xE8,0x82,0x78,0x78,0x78,0x78, + 0x46,0x6A,0xA4,0x51,0x7E,0x56,0x5C,0x58,0x84,0x51,0x23,0x41,0x77,0xBE,0x7A,0xA0, + 0x63,0x49,0xE2,0x38,0x02,0xA8,0xDF,0x56,0x84,0x51,0xC2,0x30,0x0A,0x2E,0xEF,0x55, + 0x84,0x51,0xC2,0x30,0x00,0x02,0xBF,0xFD,0xA4,0x51,0x03,0x39,0xA0,0xFB,0xD7,0x55, + 0x84,0x51,0xE2,0x38,0xE2,0xDB,0xD5,0x57,0x43,0x49,0xE2,0x38,0x82,0xB6,0xFD,0x75, + 0x44,0x49,0xC2,0x38,0x22,0xAF,0xAD,0xAB,0x84,0x51,0x23,0x49,0xA9,0xAD,0x3F,0xF9, + 0x67,0x72,0x84,0x59,0xBD,0x2D,0x2D,0x2F,0xE8,0x82,0x67,0x72,0xBD,0x29,0x8B,0xAB, + 0xA8,0x7A,0x47,0x72,0xFC,0x7E,0x7C,0xF2,0x47,0x6A,0xC5,0x61,0xBC,0xA8,0xF8,0x5C, + 0x26,0x6A,0xC5,0x59,0xEC,0x7F,0xFB,0xEB,0x26,0x6A,0xC5,0x61,0xBE,0xAD,0xA9,0xAA, + 0xC8,0x82,0x26,0x6A,0x3D,0x2D,0x2F,0xB7,0xCC,0xA3,0xC9,0x82,0x0B,0x0B,0xA9,0xA5, + 0x0D,0xB4,0xAC,0xA3,0xA2,0x2A,0x2F,0x9D,0x4E,0xBC,0xED,0xAB,0x5F,0xFE,0x2F,0x8F, + 0x4D,0xBC,0x4A,0x9B,0x5F,0xFA,0xC0,0x80,0xCC,0xAB,0x2A,0x9B,0xF7,0x5E,0x7E,0xB0, + 0x8B,0xA3,0x29,0x9B,0x6F,0x75,0xFB,0x80,0x8B,0xA3,0xE8,0x8A,0x2A,0xAF,0xFF,0x55, + 0xEC,0xAB,0x09,0x93,0x0A,0xAB,0xAF,0xFD,0x0D,0xB4,0x6A,0x9B,0x0A,0xAF,0xBF,0x75, + 0xEC,0xAB,0xC8,0x8A,0xE0,0xF8,0x7A,0x5F,0xC8,0x8A,0x26,0x72,0xFC,0xFE,0xDF,0x57, + 0xC9,0x8A,0xE6,0x69,0x5D,0x7F,0x8A,0x0B,0x4D,0xB4,0x26,0x72,0xD5,0xBD,0x3D,0x2F, + 0xB6,0xFE,0xAB,0x9B,0xAD,0x2D,0x2A,0x0A,0x18,0xFF,0x96,0xF6,0x29,0x2F,0x8B,0x2A, + 0x18,0xFF,0xF7,0xFE,0xBD,0xBD,0xA5,0xA7,0x18,0xFF,0x17,0xF7,0xAA,0xA8,0xA0,0x20, + 0x18,0xFF,0xF6,0xEE,0xA8,0x22,0x08,0xA0,0xF7,0xFE,0x18,0xF7,0xDF,0xFF,0xFF,0xEF, + 0x17,0xFF,0xF7,0xF6,0x9E,0xBA,0x88,0xAA,0x17,0xFF,0xD7,0xF6,0xAA,0x82,0xE0,0x68, + 0xF7,0xF6,0xD7,0xF6,0x70,0x58,0x57,0x5F,0xF8,0xFE,0xD6,0xEE,0xB5,0xAB,0xAE,0x8B, + 0x38,0xFF,0xF7,0xF6,0xF5,0xBF,0xAD,0xAB,0x38,0xFF,0x18,0xFF,0xD5,0xAB,0x0A,0x02, + 0x59,0xFF,0x18,0xFF,0xAD,0xAA,0xAA,0x2A,0x38,0xFF,0x96,0xEE,0x80,0x80,0x40,0xF0, + 0xD7,0xF6,0xF4,0xDD,0x78,0x7E,0xFE,0xFE,0x18,0xFF,0x14,0xDE,0x2D,0x2D,0x0F,0x8F, + 0x38,0xFF,0x18,0xFF,0xFD,0xFD,0x7D,0x55,0x39,0xFF,0x18,0xFF,0xAD,0xAD,0xAF,0x7D, + 0x39,0xFF,0x18,0xFF,0x6E,0xFE,0xDE,0x5F,0x18,0xFF,0xF8,0xF6,0x5F,0x5A,0xD6,0xDE, + 0x18,0xFF,0xF8,0xF6,0x95,0xB5,0x9D,0xDD,0x18,0xFF,0xF8,0xF6,0xD6,0xFA,0xFE,0x7F, + 0x18,0xFF,0xF8,0xF6,0xA9,0xAB,0x77,0xF7,0x18,0xFF,0xF8,0xF6,0x80,0x80,0xAA,0xAB, + 0x18,0xFF,0xF7,0xF6,0x8E,0x8B,0x82,0x82,0x18,0xFF,0xF7,0xF6,0xFE,0xEA,0xFA,0xFF, + 0xF7,0xF6,0xB7,0xF6,0x52,0x70,0x78,0x78,0xB6,0xF6,0x76,0xEE,0x57,0x5E,0x7C,0xFA, + 0x96,0xEE,0x76,0xEE,0x55,0xBD,0x69,0xCA,0xB6,0xF6,0x55,0xE6,0xA9,0xAB,0xAB,0x2E, + 0xF7,0xF6,0x96,0xEE,0xAF,0xB9,0x2F,0x2B,0x18,0xFF,0xD7,0xF6,0xFF,0xEB,0xBF,0xAF, + 0xF7,0xF6,0xD7,0xF6,0x3B,0xAF,0x2F,0x28,0x18,0xFF,0xF7,0xF6,0x55,0x55,0xF7,0x7F, + 0xF8,0xF6,0xD7,0xF6,0x2A,0xA8,0x08,0x00,0xD7,0xFE,0xF7,0xF6,0x57,0xD7,0x55,0x55, + 0xF7,0xF6,0xD7,0xF6,0x88,0x0A,0x22,0xAA,0x18,0xFF,0xD7,0xF6,0xFA,0xFB,0xFB,0xF9, + 0xF7,0xF6,0xD7,0xF6,0x96,0xFE,0xAA,0xA2,0xF7,0xF6,0xD7,0xF6,0xD7,0x5D,0x55,0x58, + 0xF7,0xF6,0xD7,0xF6,0x88,0x2B,0xEF,0x2C,0xF7,0xF6,0xD7,0xF6,0xB4,0xD4,0xFE,0xFA, + 0xF7,0xF6,0xD7,0xF6,0xAF,0xAF,0xED,0xD7,0xF7,0xF6,0x97,0xEE,0xA8,0xAA,0x80,0xEA, + 0xD7,0xF6,0xB7,0xEE,0x08,0x02,0x82,0xAC,0xD7,0xF6,0x96,0xEE,0xA8,0xA0,0xE8,0xFA, + 0xB7,0xF6,0x55,0xEE,0xA0,0xE8,0xE2,0x7E,0x75,0xEE,0x35,0xE6,0xB0,0xA8,0xEE,0xFF, + 0x96,0xEE,0x55,0xE6,0x3D,0x0D,0x0B,0x0B,0xD7,0xF6,0xB7,0xF6,0x8D,0x35,0xE9,0xFD, + 0xD7,0xF6,0xB6,0xF6,0x38,0xF8,0xE2,0x77,0xD7,0xF6,0x76,0xEE,0xA8,0xAA,0xE8,0x7A, + 0x76,0xEE,0xD4,0xD5,0xD8,0x5C,0x7E,0x5A,0x55,0xEE,0xD4,0xDD,0x2F,0xAD,0xAD,0xBD, + 0x75,0xEE,0x55,0xE6,0x09,0x2F,0x37,0x05,0x96,0xEE,0x75,0xEE,0xFF,0xEE,0x77,0x57, + 0x76,0xEE,0xD3,0xD5,0x68,0x70,0x60,0xFA,0xF4,0xDD,0x92,0xCD,0x37,0x3D,0x37,0x3F, + 0x55,0xEE,0xF4,0xDD,0x2F,0x29,0x29,0x2D,0x55,0xEE,0x35,0xE6,0xE2,0x68,0xEA,0x8A, + 0x55,0xEE,0xB3,0xDD,0xFA,0x7E,0x7E,0xF0,0xF4,0xDD,0x92,0xD5,0x4A,0x7A,0x4A,0xC2, + 0x72,0xCD,0xCF,0xBC,0x56,0xF6,0xBE,0xF8,0x92,0xD5,0xF0,0xBC,0xAD,0x2F,0x2F,0x2F, + 0xB3,0xDD,0x72,0xD5,0x2D,0xBD,0xDF,0x7D,0xB3,0xDD,0x51,0xCD,0xA0,0x6C,0xFA,0x5F, + 0xB2,0xD5,0x31,0xCD,0xA8,0xFF,0x77,0x55,0x72,0xCD,0x31,0xCD,0x80,0x8A,0x2B,0x3D, + 0xB3,0xDD,0x51,0xCD,0xB5,0xBF,0x2F,0x2B,0xF4,0xE5,0xB3,0xD5,0xBF,0xB7,0xFF,0x35, + 0x55,0xE6,0xF4,0xDD,0x2D,0xAD,0x2F,0xEB,0x55,0xE6,0x14,0xE6,0xFE,0xAE,0x2F,0x2B, + 0xD6,0xF6,0xB6,0xF6,0xE2,0xEA,0xBE,0x7E,0xD6,0xF6,0xB6,0xEE,0x22,0xE2,0xA0,0x2A, + 0xD6,0xF6,0xB6,0xEE,0x02,0x88,0x22,0x08,0xD6,0xF6,0xF8,0xEE,0x88,0x20,0xAA,0x28, + 0xD6,0xF6,0xB7,0xEE,0xA2,0xA8,0x00,0x02,0xF7,0xF6,0xD6,0xF6,0xF7,0xE7,0x7F,0x5D, + 0xB6,0xF6,0xF6,0xEE,0xAB,0xEF,0xAB,0xAF,0xF6,0xF6,0xB6,0xEE,0x8A,0xA2,0xAA,0xBF, + 0xF6,0xF6,0xB6,0xEE,0xFE,0xBE,0xBA,0xAA,0xD6,0xF6,0xB6,0xEE,0x82,0xA0,0x8A,0x28, + 0xD6,0xF6,0xF7,0xEE,0xA8,0x80,0x02,0x80,0xF6,0xF6,0xB6,0xEE,0xFA,0xBA,0xBF,0xFE, + 0xD6,0xF6,0xB6,0xEE,0xEE,0xBA,0x2A,0x00,0xD6,0xF6,0xB6,0xEE,0xB7,0x7B,0xEA,0x00, + 0xD6,0xF6,0xB6,0xEE,0xFF,0xEB,0x8A,0x22,0xD6,0xF6,0xB6,0xF6,0xDD,0xEE,0x68,0xA8, + 0xB6,0xF6,0xD6,0xEE,0x82,0xAA,0xE8,0xFE,0xB6,0xF6,0xD5,0xEE,0xAA,0xAA,0xF8,0xEA, + 0xB6,0xF6,0xD6,0xEE,0xEE,0xBA,0xA8,0xF8,0xB6,0xF6,0xD6,0xEE,0xFF,0xEB,0xAA,0x8E, + 0xD6,0xF6,0xB6,0xEE,0x0A,0x23,0x8B,0x0A,0xD6,0xF6,0xF6,0xEE,0x22,0x02,0xA8,0x80, + 0xF7,0xF6,0xB6,0xEE,0xBF,0xAE,0xAA,0xEA,0xD6,0xF6,0xB7,0xF6,0xB8,0xBA,0xBE,0xBC, + 0xD7,0xF6,0x34,0xE6,0xC0,0xE0,0x60,0x68,0x71,0xCD,0x86,0x72,0xF0,0x70,0x78,0x78, + 0x46,0x6A,0x64,0x49,0xF8,0x78,0x5A,0x5E,0xA4,0x51,0x02,0x39,0xE8,0xFA,0x7A,0x7F, + 0x02,0x39,0xA1,0x28,0xF8,0xE0,0xEA,0x56,0xC2,0x30,0x81,0x28,0xF8,0xA8,0xA8,0x00, + 0x03,0x39,0xA2,0x28,0xAB,0x8F,0x6F,0xE7,0xE3,0x38,0xC2,0x30,0x2F,0xEB,0x79,0x7D, + 0x03,0x39,0xC2,0x30,0xA7,0x2B,0x0B,0x85,0x23,0x41,0xE2,0x38,0x57,0xD6,0xAB,0x0A, + 0x44,0x49,0x03,0x39,0xE9,0xB9,0xAB,0xA9,0xE5,0x61,0x43,0x49,0xD5,0x35,0xA5,0x35, + 0x09,0x93,0xA5,0x59,0xBD,0xAF,0xAB,0x2B,0xE9,0x8A,0x87,0x7A,0xFF,0x5B,0x7A,0x60, + 0xA7,0x82,0xC5,0x61,0xA0,0xFA,0x77,0x5E,0x26,0x6A,0x63,0x49,0xF8,0xFA,0xFF,0x57, + 0xE5,0x59,0x02,0x41,0x02,0xA2,0xBF,0xF7,0x06,0x6A,0x84,0x51,0x02,0xAB,0xAF,0xB5, + 0x87,0x7A,0xE6,0x61,0x0F,0x2F,0xA9,0x2D,0x4B,0x93,0x67,0x72,0x0B,0x2B,0xBD,0xF5, + 0x8B,0x9B,0xA8,0x82,0x08,0xAA,0xAF,0xF5,0x0C,0xAC,0x09,0x93,0x08,0x2F,0xBF,0xF5, + 0x2D,0xBC,0x8B,0xA3,0x82,0x02,0x2A,0xA9,0x2D,0xB4,0xAB,0xA3,0x7C,0xFA,0xFA,0x7A, + 0xCC,0xAB,0x6A,0x9B,0x6B,0x6A,0xE8,0xBE,0x6A,0xA3,0xC8,0x8A,0xFA,0x78,0xE0,0xC8, + 0x49,0x9B,0xA7,0x82,0x0A,0xAB,0xFB,0x5F,0x4A,0x9B,0x87,0x7A,0xA0,0xFA,0x7F,0x56, + 0x09,0x93,0x46,0x7A,0x60,0xEA,0xAA,0xAB,0x0A,0x93,0x27,0x72,0x7D,0xF7,0xAA,0x02, + 0x09,0x93,0x68,0x7A,0x35,0xA7,0x2B,0x02,0xEF,0xC4,0x09,0x8B,0x3D,0x25,0x2D,0xAD, + 0xB6,0xFE,0x51,0xD5,0x0B,0x0B,0x09,0x0D,0x18,0xFF,0xD7,0xFE,0xEB,0xAB,0x29,0xAF, + 0x18,0xFF,0xF7,0xFE,0xAB,0x7E,0x7A,0x7E,0x18,0xFF,0xF7,0xFE,0x0A,0x09,0xAB,0xAA, + 0x17,0xFF,0xF8,0xF6,0x22,0x82,0x0A,0x02,0x17,0xFF,0xF8,0xF6,0xB8,0xE8,0x20,0x80, + 0x18,0xFF,0xD7,0xF6,0x28,0x80,0x80,0x78,0xF7,0xF6,0xD7,0xF6,0xE0,0xE8,0xFE,0x77, + 0xF7,0xF6,0xD7,0xF6,0xF9,0xAD,0xBD,0xA7,0x18,0xFF,0xD7,0xF6,0xAF,0xAD,0xBF,0xAF, + 0x38,0xFF,0xF7,0xFE,0xBB,0xAF,0x09,0x02,0x59,0xFF,0x39,0xFF,0xF5,0xF5,0xED,0xFB, + 0x59,0xFF,0x18,0xFF,0x8A,0xAA,0xEA,0x7E,0x18,0xFF,0x96,0xEE,0x70,0x78,0x58,0x5E, + 0x96,0xEE,0x55,0xE6,0x5E,0x7A,0xFA,0xFA,0x18,0xFF,0x76,0xEE,0x2D,0x29,0x8F,0x0B, + 0x18,0xFF,0x19,0xF7,0x22,0x88,0x82,0x22,0x39,0xFF,0x18,0xFF,0xF9,0xED,0xB9,0x9D, + 0x39,0xFF,0x18,0xFF,0x7F,0x7E,0x5E,0x7E,0x18,0xFF,0xF8,0xF6,0xFE,0xEA,0xA8,0x2A, + 0x18,0xFF,0xF8,0xF6,0xFF,0xFA,0xBF,0x77,0xF7,0xFE,0xF8,0xF6,0x7F,0xDF,0x7F,0x75, + 0x18,0xFF,0xF8,0xF6,0xA9,0xC9,0xB9,0xBB,0xF8,0xFE,0x18,0xF7,0x5E,0xFE,0xFE,0xEE, + 0x18,0xFF,0xF7,0xEE,0x22,0x0A,0x22,0xA8,0x18,0xFF,0xF7,0xF6,0x76,0x7E,0xF8,0x78, + 0xF7,0xF6,0xB7,0xEE,0xFA,0x7A,0x7C,0xFC,0x96,0xF6,0xB6,0xEE,0x2B,0xAD,0xFE,0xFD, + 0xB7,0xF6,0x96,0xEE,0x55,0x77,0xF8,0xF8,0xD6,0xF6,0x75,0xEE,0xF5,0xDD,0xF7,0xBF, + 0xD7,0xF6,0x96,0xEE,0x03,0x0B,0x2F,0x2B,0x18,0xFF,0xD7,0xF6,0xAF,0xAA,0xAB,0xE9, + 0xF7,0xF6,0xD7,0xF6,0xA8,0xA8,0xA8,0xA8,0x18,0xFF,0xD7,0xF6,0xAA,0x8B,0x2B,0xAD, + 0x18,0xFF,0xD7,0xF6,0xFE,0xFA,0xB8,0x28,0x18,0xF7,0xD7,0xF6,0xEF,0xFF,0xFE,0xA8, + 0x18,0xF7,0xD7,0xF6,0xF7,0xFF,0xBB,0xAB,0x18,0xFF,0xD7,0xF6,0xF5,0xFF,0xAE,0xBE, + 0x18,0xFF,0xD7,0xF6,0xEE,0xAE,0xFE,0xFE,0xD8,0xFE,0xF7,0xF6,0xF5,0xFD,0xF5,0xF5, + 0xF7,0xF6,0xD7,0xF6,0x28,0xAA,0xAF,0xEA,0xF7,0xF6,0xB6,0xEE,0xA0,0xEA,0x7C,0x7E, + 0xF7,0xF6,0x96,0xEE,0xAA,0x2B,0xBF,0xD5,0xD7,0xF6,0x96,0xEE,0xA0,0xF8,0x5E,0x5F, + 0xB6,0xEE,0x76,0xEE,0x28,0xAA,0xDB,0x5D,0xB6,0xF6,0x35,0xE6,0x80,0xAA,0xFA,0x7F, + 0x96,0xEE,0x35,0xE6,0x68,0xEE,0xFF,0xFF,0x96,0xEE,0x35,0xE6,0xBD,0xAB,0xAB,0x0A, + 0x76,0xF6,0x96,0xEE,0x7E,0x7F,0x5F,0xDD,0xD7,0xF6,0xB7,0xF6,0xED,0xAB,0xDB,0xC3, + 0xB6,0xF6,0x96,0xEE,0x6C,0xFE,0xB7,0xF6,0xB6,0xF6,0x76,0xEE,0x7B,0xFF,0xEA,0x82, + 0x56,0xEE,0xB3,0xD5,0x58,0x78,0x7C,0xD8,0x35,0xE6,0xD3,0xD5,0x35,0x2D,0xAB,0xBF, + 0x76,0xEE,0x35,0xE6,0x0D,0x2D,0xA5,0xB5,0x76,0xEE,0x55,0xE6,0xE0,0xE0,0xE0,0x73, + 0x55,0xE6,0xB2,0xD5,0xE0,0x70,0x68,0x70,0xF3,0xDD,0xB2,0xD5,0x35,0xA7,0xB5,0x95, + 0x55,0xEE,0xF4,0xDD,0xA9,0x29,0xAD,0xBB,0x76,0xEE,0xD3,0xDD,0x8A,0x8A,0xAA,0xDF, + 0x55,0xEE,0xD3,0xDD,0x68,0xFA,0xE2,0xEB,0x14,0xE6,0xB3,0xD5,0x7F,0x62,0xE2,0xEA, + 0x72,0xCD,0x8F,0xB4,0xE8,0xF8,0xFC,0xDE,0x72,0xD5,0xD0,0xBC,0x2B,0x2B,0xA9,0x2D, + 0x92,0xD5,0x52,0xCD,0xB2,0xEF,0xFF,0xDF,0x72,0xCD,0x31,0xCD,0xC8,0xF2,0x42,0x5A, + 0x71,0xCD,0x31,0xC5,0x55,0xFE,0xBD,0x35,0xB3,0xD5,0x31,0xC5,0xAD,0xAB,0xAF,0x0A, + 0xB3,0xD5,0x92,0xD5,0xC9,0xC1,0xB9,0xDD,0xF4,0xDD,0x92,0xD5,0x2F,0xAE,0xA7,0x3B, + 0x14,0xE6,0xD3,0xDD,0x00,0x0A,0xEF,0x5B,0x75,0xEE,0xF4,0xDD,0x2B,0xAF,0xAF,0xBD, + 0xB6,0xF6,0x50,0xC5,0x00,0x00,0x82,0xB5,0xD6,0xF6,0x55,0xEE,0x08,0x0A,0x8A,0xA9, + 0xD6,0xF6,0xB6,0xEE,0x28,0xA2,0xAA,0xFE,0xD6,0xF6,0xB6,0xEE,0x02,0x80,0xA3,0xE2, + 0xD6,0xF6,0xB6,0xEE,0xAA,0xAA,0xA8,0xAA,0xD6,0xF6,0xD7,0xEE,0xAA,0x2A,0x8A,0x20, + 0xF8,0xF6,0xD6,0xF6,0x77,0x7D,0xE5,0xBD,0xF7,0xF6,0xB6,0xEE,0xBF,0xEE,0xBA,0xEA, + 0xF6,0xF6,0xB6,0xEE,0xAA,0xAB,0xEB,0xFF,0xD6,0xF6,0xD6,0xEE,0xA8,0x2A,0xAA,0xAA, + 0xD6,0xF6,0xF6,0xEE,0x00,0xA0,0x8A,0xA0,0xD6,0xF6,0xF7,0xEE,0x08,0x88,0x08,0x02, + 0xD6,0xF6,0xF6,0xEE,0x88,0x00,0x80,0xA2,0xF7,0xF6,0xD6,0xF6,0xE7,0xA5,0xB5,0xD5, + 0xF7,0xF6,0xD6,0xF6,0x55,0x75,0xF7,0x5F,0xD6,0xF6,0xD6,0xF6,0x00,0x00,0x00,0x00, + 0xF7,0xF6,0xD6,0xF6,0x55,0x55,0x75,0xFD,0xD6,0xF6,0xB6,0xEE,0x3B,0x83,0x8B,0x80, + 0xD6,0xF6,0xB6,0xF6,0x0C,0x8A,0x88,0x00,0xD6,0xF6,0xB6,0xF6,0x9A,0x9A,0x3A,0xBE, + 0xD6,0xF6,0xB6,0xEE,0x08,0x28,0x2A,0xBA,0xD6,0xF6,0xB6,0xEE,0x00,0x28,0x2A,0x02, + 0xD6,0xF6,0xB6,0xF6,0x20,0xE0,0x60,0xB8,0xF7,0xF6,0xB6,0xF6,0xFA,0xDF,0x7F,0xDF, + 0xD6,0xF6,0xB2,0xD5,0xE0,0x60,0x60,0x68,0xCE,0xBC,0x05,0x62,0x78,0x78,0x78,0x58, + 0xC5,0x59,0x23,0x41,0xE8,0xE8,0x5C,0xEE,0x43,0x41,0xE2,0x30,0xC0,0xE0,0xFE,0x78, + 0x02,0x31,0xA1,0x28,0x7A,0x78,0xD8,0x5E,0xE2,0x28,0x81,0x28,0xE2,0xFE,0xFA,0xF7, + 0xC1,0x28,0x80,0x28,0x28,0x28,0xFB,0xBF,0x03,0x31,0xA2,0x28,0x2B,0x2F,0xB9,0xEB, + 0x02,0x31,0xC2,0x30,0x07,0xAF,0xAD,0xAF,0x23,0x41,0xE2,0x30,0x0A,0x2B,0xA9,0xE9, + 0x43,0x49,0x03,0x41,0x8B,0x02,0x23,0x29,0x26,0x6A,0x64,0x51,0xB5,0x2D,0x2D,0x2D, + 0x09,0x8B,0x66,0x7A,0x0D,0x09,0x09,0x29,0x29,0x93,0xA7,0x82,0xDA,0xF8,0xE8,0x70, + 0x87,0x7A,0xA5,0x59,0x58,0x5C,0x5C,0x7C,0x85,0x59,0x03,0x41,0xF8,0x7E,0x77,0x5F, + 0x23,0x49,0xE2,0x38,0x2C,0xAF,0xDE,0xFE,0xC6,0x61,0xE2,0x38,0x0A,0xAF,0xFF,0xF5, + 0x46,0x6A,0x64,0x51,0x0A,0x2B,0xAD,0xBD,0xA8,0x7A,0x06,0x62,0x0B,0xBF,0xF7,0xFD, + 0xC9,0x82,0x26,0x6A,0x22,0xA2,0xB7,0xF5,0x2A,0x93,0x87,0x7A,0x0A,0x0A,0xAF,0xBD, + 0xEC,0xAB,0x09,0x93,0x2B,0xAF,0xAD,0xB5,0xEC,0xAB,0xAC,0xAB,0x78,0x72,0x3E,0x3D, + 0xCC,0xAB,0x6A,0xA3,0xFF,0xED,0xAC,0xFC,0xAB,0xA3,0xE9,0x8A,0xEA,0xE8,0xE0,0x78, + 0xE8,0x8A,0x67,0x7A,0xF8,0x78,0x7E,0x7F,0x87,0x7A,0x46,0x7A,0xBA,0xF6,0x7F,0xA7, + 0x29,0x93,0x67,0x7A,0xB9,0x3D,0xB5,0xAD,0xEC,0xAB,0x0A,0x93,0x7D,0xAF,0x0B,0x03, + 0xAB,0xA3,0x29,0x93,0x75,0x7F,0xEA,0x88,0x6D,0xB4,0x09,0x8B,0x3D,0x35,0x35,0xB7, + 0xD7,0xFE,0x4D,0xB4,0x0B,0x0B,0xAB,0xD5,0xF7,0xFE,0xD3,0xDD,0x00,0x00,0x0A,0x2D, + 0x17,0xFF,0xF8,0xFE,0xDB,0xFE,0xB7,0xF5,0x18,0xFF,0xF8,0xFE,0xAB,0xAE,0xFF,0xA7, + 0x18,0xFF,0xF7,0xFE,0x0A,0x0B,0x2A,0xBE,0x38,0xFF,0xF7,0xF6,0xAA,0xEA,0xFB,0x5F, + 0x18,0xFF,0xB6,0xEE,0xE8,0xFA,0xFA,0x7F,0xD7,0xF6,0xB6,0xEE,0x00,0xA0,0xE2,0xFA, + 0xF7,0xF6,0xB6,0xEE,0xAA,0xFB,0x6D,0xDD,0x39,0xFF,0xB6,0xEE,0xBF,0x2D,0x2D,0x0F, + 0x59,0xFF,0x38,0xFF,0xB5,0xFD,0xAB,0xEE,0x59,0xFF,0x39,0xFF,0xEB,0xEE,0xFA,0x5F, + 0x38,0xFF,0xD7,0xF6,0xC0,0xE0,0xF0,0x68,0xD6,0xEE,0x76,0xEE,0xFC,0xFE,0xFE,0xF7, + 0x96,0xEE,0x55,0xE6,0xD8,0x9C,0xB6,0x37,0x18,0xFF,0x96,0xEE,0x01,0x0B,0x29,0x8B, + 0x18,0xFF,0xF8,0xF6,0x82,0x0A,0x0A,0x22,0x39,0xFF,0x18,0xFF,0x95,0xB5,0xB5,0xFD, + 0x39,0xFF,0x18,0xFF,0x7A,0x7E,0x7A,0x7E,0x18,0xFF,0xF8,0xF6,0xAE,0xBA,0xAA,0xEA, + 0x18,0xFF,0xF8,0xF6,0xDF,0x5E,0x58,0x5E,0x18,0xF7,0xD7,0xF6,0xBF,0xAE,0x2B,0xAA, + 0x18,0xFF,0xF8,0xF6,0xAB,0xEE,0xA9,0xFD,0x18,0xFF,0xF8,0xF6,0xBB,0xDE,0xAE,0xAA, + 0x18,0xFF,0xF8,0xF6,0xAA,0xBF,0xBE,0xAA,0x18,0xFF,0xF8,0xF6,0x58,0x7A,0xEA,0xFE, + 0xF7,0xF6,0xB7,0xF6,0xFE,0xE0,0xE0,0xA0,0xD7,0xF6,0xB6,0xEE,0xEF,0xB5,0x35,0x87, + 0xD7,0xF6,0x96,0xEE,0xFA,0xE0,0xA0,0x20,0xD7,0xF6,0x96,0xEE,0x97,0x9F,0xBE,0xAA, + 0xD7,0xF6,0x96,0xEE,0xAB,0xBF,0xBB,0xB8,0x18,0xFF,0xB6,0xEE,0xAB,0xAF,0xAD,0x2D, + 0xF8,0xFE,0xF7,0xF6,0x5F,0x5F,0xDE,0x5F,0x18,0xF7,0xB7,0xF6,0x0A,0x2A,0x2E,0xAA, + 0x18,0xFF,0xF7,0xF6,0x28,0x28,0x0A,0xAF,0x18,0xFF,0xF8,0xF6,0xA8,0xA0,0xE8,0xB8, + 0x18,0xFF,0xF7,0xF6,0x7E,0x5D,0x7D,0xEA,0x17,0xFF,0xF8,0xF6,0xFD,0xDD,0xDF,0xB7, + 0x18,0xFF,0xD7,0xF6,0xFE,0xDE,0xDA,0xEA,0xF8,0xFE,0xF7,0xF6,0xFF,0xFB,0xFF,0xF7, + 0xF7,0xF6,0xD7,0xF6,0x6F,0xDE,0x5E,0x56,0xD7,0xF6,0x96,0xEE,0xF8,0xEA,0xA8,0xBA, + 0xB7,0xF6,0x96,0xEE,0x77,0xEB,0x80,0xA0,0x97,0xEE,0x76,0xEE,0xD8,0x5C,0x5C,0xDC, + 0x96,0xEE,0x76,0xEE,0x55,0xA5,0x9F,0xFE,0x96,0xEE,0x35,0xE6,0x7E,0xF8,0xB2,0xAA, + 0x96,0xEE,0x55,0xEE,0xD5,0xBD,0x2B,0xAA,0x96,0xEE,0x76,0xEE,0xAD,0x3B,0x00,0xA3, + 0xB6,0xF6,0x76,0xEE,0xAB,0x89,0xAF,0x3F,0xD7,0xF6,0x96,0xEE,0x22,0xAB,0x6B,0x7F, + 0xB6,0xF6,0x76,0xEE,0xAE,0x2A,0xBA,0xF7,0xB6,0xF6,0x96,0xEE,0xA2,0x8A,0xE2,0x63, + 0x76,0xEE,0xD3,0xD5,0x5C,0x58,0x7E,0x5C,0x14,0xE6,0xD3,0xD5,0xAB,0x2D,0x2F,0xA5, + 0x55,0xEE,0x14,0xE6,0x0B,0x8B,0x8B,0x09,0x75,0xEE,0x35,0xE6,0xF3,0xBF,0xBF,0xAB, + 0x75,0xEE,0xB2,0xD5,0x78,0x78,0x7E,0x7A,0xF3,0xDD,0x92,0xD5,0x35,0xAD,0xB5,0xBD, + 0x34,0xE6,0xD3,0xDD,0x8B,0xEB,0x7B,0x7B,0xD4,0xDD,0x30,0xC5,0x28,0xBC,0xFC,0x57, + 0x14,0xE6,0x71,0xCD,0x00,0x2B,0xAD,0xF5,0x14,0xE6,0x92,0xD5,0xE0,0xCA,0xE2,0x4A, + 0x51,0xCD,0x2D,0xAC,0xF8,0xFC,0xFC,0xDC,0x72,0xD5,0xD0,0xBC,0x8D,0x2D,0xAD,0x2D, + 0x72,0xCD,0x10,0xC5,0xE0,0xA0,0x88,0x60,0x51,0xCD,0x11,0xC5,0xB3,0x8F,0xBF,0xF9, + 0x71,0xCD,0x31,0xC5,0xAD,0x3F,0xED,0xF7,0xB3,0xD5,0x72,0xD5,0x95,0xAD,0xEF,0xA5, + 0xB3,0xD5,0x51,0xD5,0xBA,0x22,0x22,0x0A,0x14,0xE6,0xB3,0xD5,0x9D,0xAD,0xBF,0xAD, + 0xF4,0xDD,0xB3,0xDD,0xB8,0x38,0xB2,0xDE,0x35,0xE6,0xD3,0xDD,0x2B,0xAF,0xDB,0x77, + 0xCE,0xBC,0xE8,0x82,0x2B,0xF5,0x55,0x55,0x14,0xE6,0x29,0x8B,0x02,0xBF,0x75,0x55, + 0x95,0xEE,0x8A,0x93,0x00,0x02,0xBD,0x55,0x95,0xEE,0x4D,0xAC,0x00,0x00,0x0A,0xB5, + 0xB6,0xF6,0x13,0xDE,0x00,0x00,0x00,0x0D,0xD6,0xF6,0xB6,0xF6,0x08,0xAA,0x8A,0x75, + 0x17,0xFF,0xB6,0xF6,0xFF,0xFF,0x9D,0xD7,0xD7,0xF6,0xB6,0xF6,0x00,0x08,0xAA,0xAE, + 0xD7,0xF6,0xB6,0xF6,0xAC,0x2A,0xAB,0x08,0xF7,0xFE,0xD6,0xF6,0x55,0x55,0xFD,0xB7, + 0xF7,0xF6,0xD6,0xF6,0xB5,0x9F,0x5B,0x7F,0xF7,0xF6,0xD6,0xF6,0x57,0x57,0x37,0xF5, + 0xF7,0xF6,0xD6,0xF6,0xFB,0x7A,0x7E,0x7A,0xF7,0xFE,0xD6,0xF6,0x55,0xF5,0xB7,0xFD, + 0xF6,0xF6,0xD6,0xF6,0x5D,0x7D,0x6A,0x5A,0xF7,0xF6,0xD6,0xF6,0xD5,0xD7,0x57,0x5F, + 0xF6,0xFE,0xD6,0xF6,0xE7,0xFF,0x57,0x59,0xF6,0xF6,0xB7,0xF6,0xAA,0xEB,0xAF,0xFF, + 0xF7,0xF6,0xD6,0xF6,0xA5,0xAF,0x3E,0xFF,0xF7,0xFE,0xD6,0xF6,0x55,0x57,0x5F,0xF7, + 0xD6,0xF6,0xB6,0xF6,0xBC,0xAA,0xA0,0x08,0xD6,0xF6,0xB6,0xF6,0x8E,0xA7,0xAF,0x0A, + 0xD6,0xF6,0xB6,0xF6,0xEC,0xF8,0x88,0x20,0xD6,0xF6,0xB6,0xF6,0xAB,0xEB,0xCA,0xAA, + 0xB6,0xF6,0xB3,0xD5,0x60,0x60,0x60,0x60,0x6E,0xB4,0x63,0x49,0xF8,0x78,0x78,0x78, + 0x84,0x49,0x23,0x41,0xE0,0xF0,0x78,0x7A,0x43,0x41,0xE2,0x30,0x78,0xF8,0x7E,0xF5, + 0xE2,0x30,0x81,0x28,0xEA,0x6A,0x58,0x78,0xA1,0x28,0x40,0x20,0x08,0x22,0xBC,0xB7, + 0xC2,0x28,0x81,0x20,0xBF,0x25,0x25,0x0D,0xE2,0x30,0xA1,0x28,0x0A,0x0B,0xAD,0x3F, + 0x03,0x31,0xC2,0x30,0xEA,0xFA,0xFB,0xE9,0x02,0x39,0xC2,0x30,0x8F,0xAF,0xAB,0x8A, + 0x44,0x49,0xE2,0x38,0x09,0x0F,0xAF,0x2D,0x26,0x72,0x64,0x51,0x2D,0x3D,0x0D,0x2D, + 0x29,0x93,0x87,0x7A,0x29,0x0D,0xBF,0xB5,0x2A,0x93,0xA8,0x82,0xE8,0xB2,0x78,0x6A, + 0x88,0x7A,0x44,0x49,0xF8,0x78,0x78,0x7A,0x44,0x49,0xE2,0x38,0xB8,0x78,0x78,0x5C, + 0x02,0x39,0xC2,0x38,0xAC,0xB6,0xD7,0xDF,0x44,0x49,0xE3,0x38,0x2D,0x27,0x2D,0x29, + 0x05,0x62,0x43,0x49,0x8B,0x3D,0xB5,0xFD,0x26,0x6A,0xA5,0x51,0x0A,0xAB,0xA5,0x2D, + 0x87,0x72,0x06,0x62,0x3B,0xAF,0x0D,0xBF,0x09,0x8B,0x66,0x72,0x3D,0xBD,0xED,0xFF, + 0x29,0x93,0xC8,0x82,0x0E,0x2E,0xFD,0xB5,0xAB,0xAB,0xE8,0x8A,0x03,0x2B,0xAD,0x95, + 0xAB,0xA3,0x4A,0x9B,0x2A,0xA0,0xEA,0x75,0x6A,0x9B,0xC8,0x82,0xE0,0xE0,0x78,0x7E, + 0xA8,0x82,0x47,0x72,0xEA,0xFA,0xFE,0xDE,0xC8,0x8A,0x46,0x7A,0xB7,0xBD,0x0F,0x0B, + 0x4A,0x93,0xA8,0x82,0xAD,0x2B,0x2B,0x2B,0x0C,0xAC,0x4A,0x9B,0x0F,0x0B,0x2B,0xAD, + 0x2C,0xB4,0x8B,0x9B,0x5E,0x68,0x68,0x6A,0x2A,0x93,0x66,0x72,0xA0,0x78,0x78,0x78, + 0x6A,0x93,0x06,0x6A,0x0A,0xEF,0xF5,0xD5,0xF4,0xE5,0x87,0x7A,0x0B,0xBF,0xF5,0x55, + 0xB6,0xF6,0x86,0x72,0x00,0x0A,0xBF,0xD5,0xD7,0xFE,0xCE,0xBC,0x00,0x02,0x0B,0x2D, + 0x18,0xFF,0xD7,0xFE,0xA2,0x22,0xA3,0xEF,0xF7,0xFE,0x96,0xF6,0x80,0xF0,0x7A,0xFA, + 0xB6,0xF6,0xD6,0xE6,0x88,0x88,0x08,0x20,0xD6,0xF6,0xB6,0xEE,0xAA,0xCF,0xE9,0x7F, + 0x18,0xFF,0xB6,0xEE,0xD5,0x95,0xBD,0x2D,0x59,0xFF,0xF7,0xFE,0xAD,0x2B,0x22,0x8A, + 0x59,0xFF,0x38,0xFF,0xEA,0xFE,0xFF,0x7B,0x59,0xFF,0x18,0xFF,0xAE,0xFA,0xFA,0xEE, + 0x38,0xFF,0x56,0xEE,0xE0,0xE8,0xEA,0x78,0x96,0xEE,0x55,0xE6,0xC8,0xAA,0xEB,0xFF, + 0xB6,0xF6,0x34,0xE6,0x3F,0xAF,0xBF,0x35,0x18,0xFF,0xD7,0xF6,0xBD,0x2D,0xA5,0xAD, + 0x18,0xFF,0xF8,0xF6,0x0E,0x22,0x0A,0x23,0x38,0xFF,0x19,0xFF,0xBF,0xEB,0xBD,0xAD, + 0x39,0xFF,0x18,0xFF,0x5E,0xDF,0xDE,0x7E,0x18,0xFF,0xF8,0xF6,0xE2,0xE0,0xAA,0xB8, + 0x18,0xFF,0xF8,0xF6,0x77,0x57,0x5D,0x5D,0x18,0xFF,0xF8,0xF6,0x5F,0x7F,0xEF,0xEF, + 0x18,0xFF,0xF8,0xF6,0xED,0xFB,0xBB,0xFD,0x18,0xFF,0xF8,0xF6,0xEA,0xEB,0xE9,0xF7, + 0x18,0xFF,0xF8,0xF6,0xAA,0xAA,0xEF,0xAA,0x18,0xFF,0xF8,0xF6,0xFE,0xDE,0xFE,0x5E, + 0xF8,0xF6,0xD7,0xF6,0x60,0x70,0x5C,0x79,0xD7,0xF6,0xB7,0xEE,0x2F,0x0B,0x2A,0x0E, + 0xF8,0xF6,0xB6,0xEE,0x6E,0xEA,0x8A,0xAA,0xF7,0xF6,0xB6,0xEE,0x9F,0xBB,0xAA,0xB2, + 0xD7,0xF6,0xB6,0xEE,0x7E,0xE8,0x2A,0x0A,0xF7,0xFE,0xD6,0xEE,0x2D,0x2F,0xBD,0xAF, + 0x18,0xFF,0xF7,0xF6,0x7F,0x77,0xFF,0x7B,0x18,0xF7,0xD7,0xF6,0xBF,0xFF,0xAF,0xAE, + 0xF8,0xFE,0x18,0xF7,0xFE,0xFE,0xFF,0xFA,0x18,0xFF,0xF7,0xF6,0xEE,0xBB,0xAE,0xAF, + 0x18,0xFF,0xF7,0xF6,0xAA,0xAA,0x20,0xA2,0x18,0xFF,0xF7,0xF6,0xE7,0x97,0xD6,0xF7, + 0x18,0xFF,0xF7,0xF6,0x7D,0x5E,0x76,0x6F,0xD7,0xFE,0xF7,0xF6,0xF7,0xFF,0xDF,0xF7, + 0xF7,0xF6,0x96,0xEE,0xA8,0xBA,0xFA,0x7E,0xD7,0xF6,0x96,0xEE,0xBA,0xFA,0xFA,0xFF, + 0xB6,0xF6,0x96,0xEE,0xC0,0xE0,0xDB,0x5F,0x96,0xEE,0x76,0xEE,0x88,0x20,0xA3,0xAD, + 0x96,0xEE,0x76,0xEE,0xFD,0x6E,0x76,0x5F,0x75,0xEE,0x55,0xE6,0x2A,0xE8,0x7A,0xEE, + 0x76,0xEE,0x55,0xE6,0xCC,0xE7,0xB5,0xF5,0x76,0xEE,0x55,0xE6,0x00,0x8B,0x22,0x2A, + 0xB6,0xF6,0x76,0xEE,0xAF,0x89,0xAD,0x2D,0xB6,0xF6,0x76,0xEE,0xAA,0xE2,0xFA,0x6A, + 0x96,0xF6,0x76,0xEE,0x3E,0x0B,0x09,0x2B,0xB6,0xF6,0x76,0xEE,0x8A,0xC2,0xCA,0x48, + 0x55,0xE6,0x92,0xCD,0x78,0x5C,0x5C,0x5A,0x15,0xE6,0x92,0xD5,0x2F,0xAB,0xAD,0xB5, + 0x55,0xEE,0xF4,0xE5,0x2A,0xAF,0x09,0x2B,0x76,0xEE,0x55,0xEE,0xDD,0xF5,0xD9,0x5F, + 0x55,0xEE,0xB2,0xD5,0x78,0x78,0x6A,0x78,0xD3,0xDD,0x92,0xD5,0x0B,0x29,0x2E,0x2B, + 0x14,0xE6,0xB2,0xD5,0x63,0x63,0x6A,0x62,0x92,0xD5,0xF0,0xBC,0xFE,0xDE,0x7E,0x5C, + 0x92,0xD5,0xEF,0xC4,0x2B,0xBD,0xB5,0xFF,0xD4,0xDD,0x71,0xCD,0xCA,0x8F,0xCF,0x85, + 0x51,0xCD,0x2D,0xAC,0xDC,0x5C,0xDE,0xDC,0x51,0xCD,0xAF,0xB4,0x89,0x21,0xA9,0x2D, + 0x51,0xCD,0xD0,0xBC,0xE0,0xFA,0xF6,0xDE,0x51,0xCD,0xF0,0xC4,0x9F,0x2D,0x2F,0xA9, + 0x71,0xD5,0x31,0xC5,0x9B,0xAD,0x3F,0x9F,0x92,0xD5,0x52,0xCD,0x2A,0x8B,0x2B,0xAF, + 0xB3,0xD5,0x92,0xD5,0xDF,0x35,0x25,0x95,0xF3,0xDD,0xB3,0xD5,0xAD,0xC9,0xFB,0xFF, + 0xD3,0xDD,0xB2,0xD5,0x3D,0xAD,0x7D,0xFD,0xD3,0xDD,0x71,0xCD,0x08,0xE8,0x78,0x5E, + 0xE8,0x82,0xA7,0x7A,0x0E,0x80,0x3A,0x98,0x08,0x83,0xC8,0x82,0x28,0xAE,0xCB,0x0F, + 0x28,0x8B,0xC7,0x7A,0x0A,0xBB,0xEF,0xDF,0xEB,0x9B,0xC7,0x7A,0x2B,0xFF,0x7F,0xD7, + 0x91,0xD5,0x08,0x83,0x0A,0xFD,0x55,0x55,0x75,0xEE,0x49,0x8B,0x00,0x2B,0xF5,0x55, + 0x95,0xEE,0xE8,0x82,0x00,0x00,0x2A,0xBD,0xD6,0xF6,0x50,0xCD,0x00,0x02,0x2A,0xBD, + 0xD6,0xF6,0x54,0xEE,0x00,0x08,0x82,0xAD,0xD6,0xF6,0xB6,0xF6,0x28,0x22,0x0A,0x8D, + 0xF7,0xF6,0xB6,0xF6,0xAE,0x2F,0xEF,0xBF,0xF7,0xFE,0xB6,0xF6,0xBB,0xBA,0xFE,0x7A, + 0xD6,0xF6,0xB6,0xF6,0x00,0x80,0xA3,0xAA,0x16,0xF7,0xB6,0xF6,0xEF,0xDD,0xFF,0x55, + 0xF7,0xFE,0xD6,0xF6,0x7F,0x5D,0xD5,0x5D,0xF6,0xF6,0xD6,0xF6,0x7D,0xD5,0xFD,0x77, + 0xF7,0xF6,0xD6,0xF6,0x56,0xFE,0x5E,0x57,0xD6,0xF6,0xB6,0xF6,0xE0,0xB0,0x00,0x00, + 0xF7,0xFE,0xB6,0xF6,0xBB,0xFF,0xFB,0xAA,0xD7,0xF6,0xD6,0xF6,0xFD,0xF5,0xFF,0xEE, + 0xD7,0xF6,0xD6,0xF6,0xAD,0xBF,0xBD,0xF5,0xB6,0xFE,0xF7,0xF6,0xFA,0xFB,0xEE,0x7A, + 0xF6,0xF6,0xD6,0xF6,0x57,0xB7,0xEF,0xAB,0xB7,0xFE,0xF6,0xF6,0xBA,0xAF,0xFF,0xEF, + 0xD6,0xF6,0xB3,0xD5,0x60,0xE8,0xC0,0xC0,0xEF,0xBC,0x43,0x49,0x78,0x78,0x78,0x78, + 0x64,0x49,0x02,0x39,0xFC,0xFE,0x7B,0xFE,0x23,0x41,0xE2,0x38,0x7D,0x6E,0xF8,0xE0, + 0x23,0x39,0x80,0x28,0x7E,0xFA,0xAA,0x22,0x03,0x39,0x60,0x20,0xD5,0xFF,0xBA,0x20, + 0x02,0x31,0x81,0x20,0xAD,0xA1,0xBA,0xA8,0x02,0x39,0xC2,0x30,0xBD,0xAB,0xAF,0xAB, + 0x23,0x39,0xC2,0x30,0x7D,0xEF,0xEA,0xCB,0x03,0x39,0xC2,0x30,0x2E,0xB7,0xA7,0xFB, + 0x84,0x59,0xE3,0x38,0xBD,0xAD,0x37,0x25,0x87,0x7A,0x64,0x59,0xAD,0x2D,0x2F,0x2F, + 0xE9,0x8A,0x87,0x7A,0x09,0xA9,0xA9,0xF5,0xE9,0x8A,0x05,0x6A,0x80,0x80,0xE2,0x7B, + 0x47,0x72,0xE3,0x38,0xF0,0xE8,0xF8,0x7F,0x24,0x41,0xA1,0x30,0xF0,0xFA,0x7C,0xFE, + 0xE2,0x38,0xC2,0x30,0xFD,0x2D,0x39,0xBB,0x44,0x49,0xC2,0x38,0x8F,0x2F,0xAF,0x6D, + 0xA5,0x51,0x81,0x28,0x02,0xAA,0xFE,0x5D,0xA5,0x51,0x61,0x28,0x00,0xAA,0xDF,0x75, + 0xE5,0x61,0xA2,0x30,0x00,0xAB,0x7D,0x55,0x46,0x6A,0xE3,0x40,0x00,0x0A,0xBD,0xD5, + 0xE8,0x8A,0x84,0x51,0x02,0x8A,0xAF,0xBD,0x29,0x93,0x87,0x7A,0x2A,0xAB,0xBF,0xB5, + 0x4A,0x9B,0xC8,0x82,0x02,0xAB,0x7F,0x55,0x2A,0x93,0x67,0x7A,0x60,0x60,0xEE,0xEE, + 0xA8,0x82,0x46,0x7A,0x93,0xBF,0xB5,0xAA,0x09,0x8B,0x87,0x7A,0x65,0x3F,0x2F,0xAD, + 0x4A,0x93,0xE9,0x8A,0xAF,0xA3,0xEA,0x7F,0x6A,0x9B,0xC8,0x82,0x2A,0xAF,0x37,0xBD, + 0xCC,0xA3,0xE9,0x8A,0xA0,0xEE,0x7E,0x5F,0x4B,0x93,0xA8,0x82,0x78,0xE8,0x62,0x6F, + 0x87,0x7A,0x06,0x6A,0xD7,0xD8,0x78,0xF8,0x67,0x72,0xC5,0x61,0x0A,0xAE,0x5F,0x7A, + 0x86,0x7A,0xE6,0x61,0x2A,0xA7,0xBD,0xD5,0x54,0xEE,0x29,0x8B,0x0D,0x3D,0x2D,0xB5, + 0xD7,0xFE,0x54,0xEE,0x82,0xAB,0xAF,0xB5,0xB6,0xF6,0x96,0xEE,0x28,0xFA,0x3C,0x0A, + 0xD6,0xF6,0x95,0xEE,0xEF,0xBF,0xEA,0xC0,0xF7,0xF6,0x96,0xEE,0x7E,0xFE,0xBF,0x35, + 0x38,0xFF,0xB6,0xF6,0x2D,0x0B,0x02,0x02,0x59,0xFF,0x39,0xFF,0xAD,0xED,0xFF,0x5D, + 0x58,0xFF,0x39,0xFF,0x5B,0xD7,0xDF,0x75,0x39,0xFF,0xF7,0xFE,0xC0,0xE8,0xF8,0x68, + 0xF8,0xFE,0x75,0xEE,0x58,0x5C,0x5E,0x5F,0x75,0xEE,0x35,0xE6,0xE2,0xE0,0xE2,0xEA, + 0xD7,0xF6,0x34,0xE6,0x35,0xBD,0xBD,0x3D,0x18,0xFF,0xD7,0xF6,0xA9,0xA9,0x2B,0xAB, + 0x18,0xFF,0xF8,0xF6,0x2B,0x2F,0x2F,0x3F,0x38,0xFF,0x19,0xFF,0xEF,0xEB,0x6B,0xFD, + 0x39,0xFF,0x18,0xFF,0xFF,0xFD,0xFD,0xDD,0x18,0xFF,0xF8,0xF6,0xF8,0xA0,0xB0,0xF0, + 0x18,0xFF,0xF8,0xF6,0xDA,0x6A,0xBE,0xF7,0x18,0xFF,0xF8,0xF6,0xFD,0x77,0x57,0x77, + 0xF7,0xFE,0xF8,0xF6,0xEF,0xAF,0xAD,0xFF,0x18,0xFF,0xF8,0xF6,0xBF,0xDB,0xF5,0xF7, + 0x18,0xFF,0xF8,0xF6,0xBA,0x77,0x5F,0xDF,0x18,0xFF,0xD7,0xF6,0xE8,0xBA,0x7E,0x6E, + 0xF8,0xF6,0xD7,0xF6,0x75,0x76,0x5D,0xEF,0xF8,0xF6,0xB6,0xEE,0xA7,0x2F,0x2A,0xAA, + 0xF7,0xF6,0xD7,0xF6,0xAF,0xBF,0xAB,0xF8,0xF7,0xF6,0xD7,0xF6,0xBA,0xAB,0xAB,0xEA, + 0xF7,0xF6,0xD7,0xF6,0x57,0xEF,0xAB,0xA3,0xF8,0xF6,0xD7,0xF6,0xA5,0xA7,0x22,0x0A, + 0x18,0xFF,0xF8,0xF6,0x6A,0xAB,0x8F,0xFF,0x17,0xFF,0xF7,0xF6,0x75,0x57,0x75,0x5F, + 0x18,0xFF,0xF7,0xF6,0xBB,0xFD,0xBD,0xFF,0x18,0xFF,0xF7,0xF6,0xB7,0xBD,0xAF,0xAB, + 0x18,0xFF,0xF8,0xF6,0xBA,0xEE,0xFE,0xBA,0x18,0xFF,0xF7,0xF6,0xDF,0x7F,0xEA,0xEA, + 0xD7,0xFE,0x18,0xF7,0xBF,0xAB,0xAB,0xAF,0xF7,0xF6,0x98,0xEE,0x88,0xA0,0xAA,0xBA, + 0xD7,0xF6,0x96,0xEE,0xE8,0xAA,0x78,0x7E,0xB6,0xF6,0x76,0xEE,0xA8,0xAA,0xEA,0xFA, + 0x96,0xEE,0x56,0xEE,0x00,0x80,0x8A,0xFF,0x96,0xEE,0x55,0xE6,0xAB,0xA8,0xFA,0xFF, + 0x96,0xEE,0x55,0xE6,0xA8,0xBA,0xAF,0xFE,0x75,0xEE,0x35,0xE6,0xA2,0xE0,0xB8,0xFF, + 0x55,0xEE,0x76,0xE6,0xA0,0xAA,0xA8,0xAA,0x96,0xEE,0x55,0xE6,0xBD,0xBD,0xBF,0xAF, + 0xB6,0xF6,0x76,0xEE,0x29,0x23,0xAB,0x2B,0xB6,0xF6,0x76,0xEE,0xF8,0xE8,0xEA,0xFA, + 0xB6,0xF6,0x76,0xEE,0xAD,0xBB,0xAD,0x2F,0xB7,0xF6,0x55,0xE6,0xA0,0xE2,0xC0,0x48, + 0x35,0xE6,0x52,0xCD,0xF8,0xDC,0xDE,0x5A,0xF4,0xDD,0x51,0xCD,0x2A,0xA9,0x3D,0xAD, + 0x55,0xEE,0xD3,0xDD,0x0A,0x8B,0x2F,0xA9,0x75,0xEE,0x35,0xE6,0xFA,0xBE,0xFB,0xDB, + 0x35,0xEE,0xB3,0xD5,0x78,0x58,0x7C,0x7C,0xF4,0xDD,0x92,0xD5,0xAB,0x2F,0x2D,0xAF, + 0x14,0xE6,0xD3,0xDD,0x62,0xE2,0xA2,0xE2,0xF3,0xDD,0x11,0xC5,0x7E,0x7A,0xF8,0xA0, + 0x71,0xCD,0x10,0xC5,0xFD,0x7F,0xD6,0xD8,0xB3,0xD5,0x10,0xC5,0x89,0xAB,0xFD,0xAD, + 0x30,0xC5,0x4D,0xAC,0x5C,0x5C,0x5E,0x54,0x31,0xCD,0x8E,0xB4,0x29,0x8B,0x0D,0x0D, + 0x31,0xCD,0xD0,0xBC,0xFF,0x9E,0xAA,0xA8,0x31,0xC5,0xF0,0xC4,0x0F,0x2B,0xBB,0xEB, + 0x51,0xCD,0x11,0xC5,0x28,0xB2,0xBB,0xFE,0x92,0xD5,0x51,0xCD,0xAB,0xEB,0xAD,0xFD, + 0xB3,0xD5,0x72,0xCD,0x2B,0x27,0xAF,0x35,0xD3,0xDD,0xB3,0xD5,0x8E,0xEB,0xAF,0x09, + 0xD3,0xDD,0x92,0xD5,0xEE,0x66,0x78,0x68,0x92,0xD5,0x30,0xCD,0xB8,0x5E,0xFF,0xD7, + 0x08,0x83,0xC7,0x7A,0xBC,0xB6,0x96,0xDF,0x08,0x83,0xC8,0x7A,0x2A,0xFA,0x5C,0xBA, + 0x29,0x8B,0xC8,0x7A,0xFE,0x7F,0xB6,0x8E,0x08,0x83,0xC8,0x82,0xF6,0xE6,0xF2,0xBE, + 0x08,0x83,0xC7,0x7A,0xAA,0x85,0xEF,0x18,0x08,0x83,0xC7,0x82,0x02,0xA3,0x2F,0x0E, + 0x8A,0x93,0xE8,0x82,0x0B,0x77,0x55,0x57,0xCE,0xBC,0x08,0x83,0x2B,0xF5,0x55,0x55, + 0x14,0xE6,0x28,0x8B,0x02,0xAF,0xD5,0x55,0x96,0xEE,0x29,0x8B,0x00,0x02,0xBF,0xD5, + 0xB6,0xF6,0x4E,0xAC,0x00,0x00,0x0A,0xBD,0xD6,0xF6,0xF3,0xE5,0x00,0x00,0x0A,0xAD, + 0xD6,0xF6,0xB5,0xF6,0xA8,0xAA,0xAA,0xF5,0xD6,0xF6,0xB6,0xF6,0xF7,0xFF,0xFD,0x77, + 0xD6,0xF6,0xB6,0xF6,0xA2,0xEE,0x7B,0xF9,0xD6,0xF6,0xB6,0xF6,0x0C,0x2B,0x8A,0xE8, + 0xD7,0xFE,0xD6,0xF6,0xD7,0xDF,0x7D,0xD7,0xF7,0xFE,0xD6,0xF6,0xEF,0xED,0xE9,0xFD, + 0xF7,0xFE,0xD6,0xF6,0xFF,0xDF,0x7F,0xDF,0xF6,0xFE,0xD7,0xF6,0xFD,0xF5,0x57,0x5D, + 0xF7,0xFE,0xD6,0xF6,0x55,0x5F,0x5F,0x7F,0xF7,0xFE,0xB6,0xF6,0xAF,0xAF,0xBF,0xBF, + 0xF6,0xFE,0xD6,0xF6,0xAF,0xBB,0x95,0xF7,0xF7,0xFE,0xB6,0xF6,0xBE,0xEE,0xDE,0xFE, + 0xD6,0xF6,0x54,0xEE,0x60,0xC0,0xA0,0x80,0xF2,0xDD,0xC4,0x59,0x78,0x58,0x78,0xF8, + 0x84,0x49,0x02,0x39,0xDF,0x5F,0xFF,0xF0,0x43,0x41,0xE2,0x38,0x2A,0x0B,0xA5,0xBF, + 0x84,0x49,0x23,0x39,0x59,0x8A,0xAB,0xFD,0x64,0x49,0x02,0x39,0x5F,0xBE,0xA8,0x2A, + 0x85,0x49,0xE2,0x30,0x57,0x57,0x7A,0xE8,0x43,0x41,0xE2,0x30,0x75,0xFD,0xAA,0xA0, + 0x23,0x41,0xE2,0x38,0xED,0xBB,0x7B,0x5C,0x03,0x39,0xC2,0x38,0xBA,0xBC,0xB8,0x28, + 0xE5,0x69,0x23,0x41,0xB5,0xB5,0xAD,0xAD,0x47,0x7A,0xC4,0x61,0x09,0x29,0x03,0x83, + 0x67,0x7A,0x06,0x72,0x00,0xA0,0xA8,0x43,0x46,0x72,0x84,0x59,0x80,0xC8,0xEA,0x7E, + 0x84,0x59,0xE3,0x38,0x58,0xE8,0x68,0xE8,0x24,0x41,0xC2,0x38,0x55,0x7A,0xA2,0x60, + 0x03,0x39,0xC2,0x30,0xFF,0xBF,0x7F,0x65,0xE2,0x38,0xA1,0x28,0x5A,0xF8,0xFA,0x78, + 0xC2,0x30,0x61,0x28,0x7A,0xBE,0xBA,0xA8,0xA2,0x30,0x82,0x28,0xE5,0x0F,0x0B,0x02, + 0xC2,0x38,0xA2,0x30,0x29,0x28,0x3F,0x25,0x44,0x49,0xE3,0x38,0xBD,0xAF,0xAD,0x95, + 0xC5,0x61,0x23,0x49,0x09,0xBD,0xD5,0xDD,0xC8,0x82,0x84,0x59,0x0B,0x2F,0xAD,0xB5, + 0xC8,0x82,0x67,0x7A,0x2C,0xAA,0xBD,0xF5,0x09,0x93,0x87,0x82,0xFF,0xF7,0xAD,0x25, + 0xE9,0x8A,0x87,0x7A,0xFB,0x0A,0xCB,0x60,0xE8,0x8A,0x88,0x7A,0xAF,0xB1,0xDD,0x7D, + 0xE9,0x8A,0x87,0x7A,0x00,0x0B,0xF7,0xF6,0x2A,0x93,0xC9,0x82,0x29,0x2D,0xB9,0x15, + 0x2A,0x93,0x46,0x72,0xE8,0x78,0x78,0x78,0x29,0x8B,0x06,0x6A,0x8A,0xFD,0xD5,0x75, + 0x87,0x7A,0xE5,0x69,0xE8,0xBA,0x2F,0xBD,0xC8,0x82,0xC5,0x61,0x7F,0xE2,0xA2,0x0A, + 0x67,0x72,0xC5,0x61,0xD5,0xD7,0xFE,0x80,0x6E,0xB4,0x26,0x72,0x2D,0xB5,0xF5,0xDD, + 0x96,0xF6,0xCC,0xA3,0x02,0x0B,0x2D,0xB5,0xD7,0xFE,0x96,0xF6,0x2D,0x0A,0x0A,0x2D, + 0xF7,0xFE,0x96,0xEE,0x6A,0x78,0xFA,0xAA,0x38,0xFF,0x95,0xEE,0xAD,0x29,0x0B,0x02, + 0x58,0xFF,0x39,0xFF,0x75,0x5D,0x57,0x57,0x39,0xFF,0x18,0xFF,0x00,0x00,0x00,0x3A, + 0x39,0xFF,0x18,0xFF,0x80,0xA0,0xF8,0xFA,0x59,0xFF,0xB6,0xEE,0x6A,0x6A,0x7A,0x7E, + 0x96,0xEE,0x55,0xEE,0xD8,0x7E,0x76,0x57,0x76,0xEE,0x35,0xE6,0xE2,0x68,0x5A,0x5E, + 0xD7,0xF6,0x35,0xE6,0x25,0x2D,0x2D,0x3F,0x18,0xFF,0xF8,0xF6,0x37,0x9B,0xA9,0xED, + 0x18,0xFF,0xF8,0xF6,0x3F,0x2E,0x2E,0x0E,0x39,0xFF,0x18,0xFF,0x7F,0x79,0xBF,0x9E, + 0x18,0xFF,0x3A,0xF7,0x80,0x02,0x22,0x2A,0x18,0xFF,0xF8,0xF6,0xE8,0xF2,0xE8,0xFA, + 0x18,0xFF,0xF8,0xF6,0x76,0x5D,0xF7,0x77,0x18,0xFF,0xF8,0xF6,0x7F,0x66,0x77,0xF5, + 0x17,0xFF,0xF8,0xF6,0x7F,0x77,0xFD,0xFD,0x17,0xFF,0xF8,0xF6,0xF7,0xED,0xDF,0x7F, + 0x17,0xFF,0xF8,0xF6,0xFF,0xF7,0x5D,0xF7,0x18,0xFF,0xF7,0xF6,0x57,0x75,0x6F,0x5F, + 0xF7,0xF6,0xD7,0xF6,0x7A,0x62,0xE0,0xEC,0xF7,0xF6,0xD7,0xF6,0x35,0xAD,0x5D,0xF9, + 0xF7,0xF6,0xD7,0xF6,0xEA,0xEA,0xF7,0x6F,0xF8,0xF6,0xD7,0xF6,0xAF,0x9D,0x0D,0x0D, + 0x17,0xFF,0xF8,0xF6,0xD5,0xF5,0xDF,0xDB,0x18,0xFF,0xF8,0xF6,0x57,0x7D,0xBD,0xF7, + 0x18,0xFF,0xF8,0xF6,0xEF,0xF9,0xFB,0x3D,0x18,0xFF,0xF7,0xF6,0x5D,0x5A,0x7E,0xEA, + 0x18,0xFF,0xF7,0xF6,0xED,0xB9,0xED,0x97,0x18,0xFF,0xF8,0xF6,0xAA,0xAB,0xFD,0xFF, + 0x18,0xFF,0xF7,0xF6,0xAE,0x82,0xAE,0xFE,0xF8,0xFE,0x18,0xF7,0xBF,0x2B,0x2F,0x2E, + 0xF8,0xF6,0xD7,0xF6,0xF0,0x52,0x58,0x5A,0xD7,0xF6,0x97,0xEE,0xE0,0x68,0xE0,0xA8, + 0xB7,0xF6,0x76,0xEE,0xA0,0xF0,0xFC,0x7A,0x96,0xEE,0x76,0xEE,0xB8,0x68,0xF8,0x5F, + 0x96,0xEE,0x55,0xE6,0x7E,0x5E,0xFA,0xBA,0x76,0xEE,0x35,0xE6,0xAF,0xFF,0xFF,0xC0, + 0x76,0xEE,0x35,0xE6,0xFA,0x5F,0x57,0xFF,0x55,0xE6,0x35,0xE6,0x9E,0xD8,0x02,0x83, + 0x75,0xEE,0x55,0xE6,0xD9,0xDD,0xFF,0x5D,0x96,0xEE,0x55,0xE6,0xBD,0xB7,0x37,0xAD, + 0x96,0xF6,0xB7,0xEE,0xE8,0xFE,0xEE,0xBA,0xB7,0xF6,0x76,0xEE,0xE8,0xFC,0xFE,0x5F, + 0xB6,0xF6,0x96,0xEE,0xE5,0xAD,0xCD,0xFD,0xB6,0xF6,0x55,0xE6,0x6A,0x7A,0x72,0x7A, + 0xF4,0xDD,0x72,0xCD,0x5C,0x5C,0x5C,0x78,0xD3,0xDD,0x72,0xCD,0x25,0x3D,0xAF,0xE9, + 0x35,0xE6,0xD3,0xDD,0x2B,0x2B,0x2D,0xAD,0x55,0xEE,0x14,0xE6,0xEA,0xEA,0xEB,0xAF, + 0x35,0xE6,0xB3,0xD5,0x5A,0xDA,0x7A,0x78,0xF4,0xDD,0xB3,0xD5,0xBD,0x2D,0x39,0x2F, + 0x14,0xE6,0xD3,0xDD,0xF3,0xA8,0xE2,0x60,0xF4,0xDD,0x92,0xD5,0xE2,0xAA,0x80,0x80, + 0xD3,0xDD,0x31,0xCD,0x5E,0xFE,0xA8,0x00,0x92,0xD5,0xF0,0xBC,0xBF,0xF7,0x78,0x60, + 0x10,0xC5,0x4E,0xAC,0x5C,0x5E,0x56,0x57,0x32,0xCD,0x8F,0xB4,0x2D,0x2D,0x0D,0x09, + 0x52,0xCD,0x11,0xC5,0x5A,0xDA,0xDE,0x7C,0x31,0xC5,0xD0,0xC4,0xAA,0x28,0x2B,0x0A, + 0x51,0xCD,0x10,0xC5,0xEA,0xAA,0xDA,0xEF,0x72,0xD5,0x51,0xCD,0xAD,0x35,0x55,0x55, + 0xB3,0xD5,0x72,0xCD,0x15,0x2B,0x3D,0xBD,0x34,0xE6,0xD3,0xDD,0xEB,0xA9,0xC9,0xED, + 0xD3,0xDD,0x10,0xC5,0xA0,0xE0,0xE0,0x78,0x51,0xCD,0x10,0xC5,0xBC,0xBF,0xF5,0xFF, + 0xE8,0x82,0xC8,0x7A,0xDA,0x9E,0x80,0xC2,0xE8,0x82,0xA7,0x7A,0xDA,0x2F,0x06,0x3F, + 0x08,0x83,0xC8,0x7A,0xBE,0xEF,0xED,0xA7,0xE8,0x82,0xC8,0x7A,0x28,0x3F,0x65,0x7A, + 0x08,0x83,0xA7,0x7A,0x68,0xE2,0x8F,0xF5,0x08,0x83,0xC7,0x82,0xEF,0x7A,0xEF,0x77, + 0x09,0x8B,0xA7,0x7A,0xBB,0xB7,0x3D,0xFF,0x08,0x8B,0xC8,0x82,0xAC,0x7C,0xCF,0xEF, + 0x29,0x8B,0xC7,0x82,0xA7,0xEB,0xE9,0x75,0x29,0x8B,0xA7,0x7A,0x89,0x6A,0xF9,0x5A, + 0x2C,0xA4,0xC8,0x82,0x2F,0xFD,0x55,0x55,0x90,0xD5,0x07,0x83,0x0A,0xBD,0x55,0x55, + 0x54,0xEE,0x49,0x8B,0x00,0x2A,0xB5,0x55,0x96,0xF6,0x8A,0x9B,0x00,0x00,0x2B,0xF5, + 0xB6,0xF6,0x72,0xD5,0x00,0x00,0x0A,0xBD,0xD6,0xF6,0x76,0xF6,0xA0,0x8A,0x2A,0xB5, + 0xD6,0xF6,0xB6,0xF6,0x29,0xBD,0xFF,0x55,0xF7,0xF6,0xB6,0xF6,0xEB,0xFF,0xFF,0xD5, + 0xB7,0xFE,0xD6,0xF6,0xD5,0xD5,0x77,0xDD,0xF7,0xFE,0xB6,0xF6,0xBF,0xAB,0xAF,0xFB, + 0xF7,0xFE,0xD7,0xF6,0x55,0x57,0x7F,0x55,0xF7,0xFE,0xB6,0xF6,0x9E,0xBF,0xAE,0xBA, + 0xD6,0xFE,0xF7,0xF6,0xEA,0xFE,0xFB,0xEA,0xF7,0xFE,0xD7,0xF6,0x77,0x5F,0x7D,0x7B, + 0xB6,0xFE,0xD6,0xF6,0x95,0xB5,0x57,0x55,0xB5,0xF6,0x29,0x83,0x78,0x78,0x78,0xE8, + 0x46,0x6A,0x44,0x49,0x5F,0xFE,0xDC,0xDC,0xA5,0x51,0x02,0x41,0xDF,0xFC,0xA2,0xC8, + 0x84,0x51,0x23,0x41,0x55,0x55,0xDF,0x80,0x84,0x51,0x03,0x39,0xF7,0xFD,0xAF,0x02, + 0x85,0x49,0x03,0x41,0xFA,0x7B,0x6A,0xF8,0x44,0x41,0xE2,0x38,0x8A,0xAB,0xFB,0xDF, + 0x23,0x41,0xC2,0x38,0xEC,0xAE,0x29,0x29,0x44,0x49,0xE2,0x38,0xFD,0xBF,0xBE,0x3B, + 0xE5,0x69,0x23,0x49,0x2F,0xBD,0xBF,0x2B,0x67,0x7A,0xE5,0x69,0xAB,0x8B,0x2D,0xAB, + 0x47,0x72,0xE4,0x69,0x6E,0x7E,0x7E,0xE0,0xE5,0x69,0x44,0x51,0xF8,0xF8,0x78,0x78, + 0x64,0x51,0x04,0x41,0xF8,0xDE,0xEA,0xE2,0x44,0x49,0xE3,0x38,0x7A,0xDC,0xF2,0x68, + 0x03,0x39,0xC2,0x30,0xAB,0xA8,0xF8,0x57,0x03,0x39,0xA1,0x30,0x68,0xEA,0xEF,0x83, + 0xE2,0x30,0x81,0x28,0xEF,0xBE,0xFA,0x78,0xC2,0x30,0x81,0x28,0xB7,0xFA,0x7A,0x75, + 0xC2,0x30,0x81,0x28,0x2B,0x3E,0xB5,0xE5,0x44,0x49,0xA2,0x30,0xBF,0xAF,0xBF,0x2D, + 0x84,0x59,0x03,0x41,0xAF,0x27,0x35,0xB7,0xA9,0x82,0x85,0x59,0x3D,0x3F,0x2F,0x29, + 0xE9,0x82,0x67,0x7A,0x75,0x7F,0xAA,0x02,0x09,0x8B,0x67,0x72,0x0F,0xAF,0x9F,0x57, + 0x0A,0x93,0x87,0x7A,0xC0,0xEA,0xE3,0xD5,0xC8,0x82,0x67,0x72,0x2B,0x1F,0x2E,0xB3, + 0xE9,0x82,0x88,0x82,0x9E,0xFE,0x8E,0x8B,0xE9,0x82,0x87,0x7A,0x3A,0xEA,0x68,0x70, + 0xE9,0x8A,0xC5,0x61,0xA8,0xAA,0xFE,0x5F,0x47,0x72,0xA5,0x59,0x68,0x58,0x5F,0x57, + 0x67,0x72,0xA5,0x61,0x3D,0x25,0x2D,0x0D,0x08,0x8B,0x86,0x7A,0xBD,0xAD,0x2A,0xA9, + 0xE8,0x82,0x67,0x7A,0xFE,0xEA,0x6A,0xE8,0xC8,0x82,0x27,0x72,0x2F,0xB7,0xAF,0x2E, + 0x2E,0xA4,0xC9,0x82,0x3F,0x95,0xD5,0x55,0x76,0xEE,0x0A,0x8B,0x02,0x2F,0xAD,0xF5, + 0x38,0xFF,0x14,0xE6,0x2A,0x8A,0x0B,0x2D,0x39,0xFF,0x18,0xFF,0x89,0x2B,0x2A,0xA2, + 0x39,0xFF,0x38,0xFF,0xA2,0xAA,0xA8,0xAA,0x39,0xFF,0x18,0xFF,0xAA,0xAC,0xBA,0xFC, + 0x38,0xFF,0x18,0xFF,0x7A,0x7A,0xEE,0xFA,0x18,0xFF,0x75,0xEE,0x68,0x78,0x7C,0x5C, + 0x76,0xEE,0x55,0xE6,0x76,0x5F,0x2E,0xAE,0x76,0xEE,0x14,0xDE,0xF2,0xFA,0xFA,0xDE, + 0xD7,0xF6,0x55,0xE6,0x2D,0x2D,0x2B,0x09,0xF8,0xFE,0x18,0xF7,0xEC,0xB8,0xAC,0xEA, + 0x18,0xFF,0xF8,0xF6,0x2F,0x3D,0x05,0x29,0x39,0xFF,0x18,0xFF,0x9F,0xFF,0x5D,0xDD, + 0x18,0xFF,0x39,0xF7,0x2A,0x82,0x22,0x02,0x18,0xFF,0xF8,0xF6,0xEA,0xAE,0xAA,0xA2, + 0x18,0xFF,0xF8,0xF6,0xD5,0x7F,0x7A,0xEF,0xF8,0xFE,0x18,0xF7,0xA8,0xA8,0xAA,0x82, + 0x18,0xFF,0xF8,0xF6,0xF7,0x7D,0x5F,0x7F,0x19,0xFF,0xF7,0xF6,0x7F,0x5F,0x75,0x75, + 0xF8,0xFE,0x18,0xF7,0xAA,0xEA,0x8A,0x2A,0x18,0xFF,0xD7,0xF6,0xEA,0x7A,0xFB,0x7E, + 0x38,0xFF,0xD7,0xF6,0x77,0xFD,0xDD,0xFD,0xF7,0xF6,0xD7,0xF6,0x3A,0xBA,0xEA,0xE2, + 0xF7,0xF6,0xD7,0xF6,0x7E,0xD6,0xD5,0xDD,0x18,0xFF,0xD7,0xF6,0xBD,0xAF,0xAF,0xFF, + 0x18,0xFF,0xD7,0xF6,0xAA,0xAE,0xAF,0xFF,0xF8,0xFE,0x17,0xEF,0xAA,0x82,0x22,0x2A, + 0x18,0xFF,0xF8,0xF6,0xBD,0x3D,0xAF,0x2D,0x18,0xFF,0xF7,0xF6,0xE8,0x6A,0x52,0x6A, + 0xF7,0xF6,0xD7,0xF6,0x28,0x0C,0x0F,0x0E,0xF8,0xFE,0x18,0xF7,0xFF,0x7E,0xEE,0xBA, + 0x18,0xFF,0xF8,0xF6,0xFE,0xF6,0xD7,0xDF,0x18,0xFF,0xD7,0xF6,0xA2,0x7A,0xAA,0xEA, + 0xF8,0xF6,0x97,0xEE,0xA8,0x80,0xA8,0xEA,0xD7,0xF6,0x96,0xEE,0xAA,0xE8,0xFE,0x5A, + 0xB7,0xF6,0x76,0xEE,0xFA,0xFE,0x5F,0xD7,0x96,0xEE,0x55,0xE6,0xFA,0xBC,0xFA,0x82, + 0x76,0xEE,0x55,0xE6,0x00,0x20,0xBE,0xD7,0x96,0xEE,0x55,0xEE,0x80,0x80,0xB5,0xFD, + 0x96,0xEE,0x55,0xE6,0x7B,0xC0,0xA2,0xFA,0x96,0xEE,0x55,0xE6,0x55,0x7F,0xCA,0xAB, + 0x55,0xEE,0x35,0xE6,0xB9,0x7A,0xB8,0x20,0x96,0xEE,0x55,0xE6,0xBD,0x95,0x25,0x2F, + 0xB7,0xF6,0x76,0xEE,0xFB,0xFB,0x7A,0x78,0x96,0xEE,0x76,0xEE,0xDA,0x7B,0x7F,0xD5, + 0x96,0xEE,0x75,0xEE,0xA2,0x3D,0x2B,0x03,0xB7,0xF6,0x35,0xE6,0xFA,0xEA,0x72,0x62, + 0x14,0xDE,0x51,0xCD,0x7C,0x5C,0x5E,0x5E,0xB3,0xD5,0x51,0xCD,0x2F,0xAD,0xB5,0xBB, + 0x35,0xEE,0xB3,0xD5,0x2D,0x3D,0x3D,0xBD,0x34,0xE6,0x14,0xE6,0xE0,0xC0,0xC2,0xE7, + 0x14,0xE6,0xB2,0xD5,0x78,0xE8,0x78,0x70,0x34,0xE6,0xB3,0xD5,0xBD,0xA7,0xBD,0x2D, + 0x35,0xE6,0xD3,0xDD,0x72,0xFE,0x5C,0x5C,0xF4,0xDD,0xD3,0xDD,0xFB,0x3D,0xAD,0xF2, + 0xF4,0xE5,0xD3,0xDD,0x60,0xFA,0x77,0x55,0xB3,0xDD,0x11,0xC5,0x78,0xE0,0x60,0x70, + 0xD0,0xBC,0x2D,0xA4,0xDE,0xDC,0x5C,0x5C,0x51,0xCD,0x6E,0xAC,0x29,0x2D,0x05,0xBD, + 0x31,0xCD,0xD0,0xBC,0xB8,0xF8,0xE8,0x5A,0x31,0xC5,0xAF,0xB4,0x0A,0xAF,0x9F,0xDF, + 0x51,0xCD,0x10,0xC5,0xFE,0xBB,0x77,0xF9,0x72,0xD5,0x31,0xC5,0x37,0x39,0xAE,0xBF, + 0x92,0xD5,0x51,0xCD,0xAB,0xFA,0x6A,0x7E,0xD3,0xDD,0xF0,0xC4,0x02,0xEA,0xFF,0x5F, + 0x72,0xD5,0xF0,0xBC,0xFC,0xD6,0x55,0xD5,0x72,0xCD,0x10,0xC5,0xBF,0xBF,0xA9,0x2A, + 0xC8,0x7A,0x87,0x7A,0x00,0x88,0x40,0x03,0xE8,0x82,0xA7,0x7A,0xBF,0xB2,0xA9,0x8B, + 0xE8,0x82,0xA8,0x7A,0x78,0xAC,0xEB,0xBF,0xE8,0x82,0xA7,0x7A,0x24,0x08,0xEF,0xAD, + 0xE8,0x82,0xC7,0x7A,0x3B,0x6B,0x9E,0x2B,0x09,0x8B,0xC7,0x82,0xA7,0x9E,0xDB,0x5F, + 0x08,0x8B,0xA7,0x7A,0xFE,0xEF,0xE4,0xB7,0xE8,0x82,0xA7,0x82,0xB8,0x80,0x8A,0xFC, + 0xE8,0x82,0xA7,0x82,0xEB,0x28,0x0A,0x32,0x08,0x8B,0xC7,0x82,0xDF,0xFF,0xA9,0xBF, + 0x08,0x8B,0xA7,0x7A,0xBF,0xBE,0x36,0xFC,0x08,0x8B,0xC7,0x82,0x29,0xE8,0xEA,0xA3, + 0x08,0x8B,0xC7,0x82,0xA0,0x7A,0xAB,0xEB,0x49,0x93,0xA7,0x7A,0x0E,0xAF,0xFE,0xFB, + 0xF0,0xC4,0x09,0x8B,0x2B,0xD5,0x55,0x55,0x34,0xE6,0x29,0x8B,0x02,0xAF,0xD5,0x55, + 0x96,0xF6,0x8A,0x93,0x00,0x0A,0xAF,0x55,0x96,0xF6,0x8E,0xB4,0x00,0x00,0x0A,0xB5, + 0xB6,0xF6,0x14,0xE6,0x00,0x00,0x08,0xAD,0xD6,0xF6,0x95,0xF6,0x23,0x22,0x23,0xA5, + 0xD7,0xF6,0xB6,0xF6,0xFA,0xFE,0xD8,0x9E,0xB6,0xFE,0xD6,0xF6,0x57,0xFF,0xDF,0xFD, + 0xF7,0xFE,0xB6,0xF6,0xAA,0xAF,0xFA,0x7F,0xD7,0xF6,0xB6,0xF6,0xC0,0x80,0x0B,0xEB, + 0xF6,0xFE,0xB7,0xF6,0xBB,0xAB,0xAB,0xEF,0xD6,0xF6,0xAE,0xB4,0x78,0x68,0xE0,0xA0, + 0x8E,0xB4,0xA4,0x59,0x57,0x56,0x5E,0x58,0xA5,0x51,0x64,0x49,0x82,0x9F,0x9D,0xD7, + 0xE5,0x59,0x84,0x51,0xED,0xF9,0xD7,0x57,0xE6,0x59,0x84,0x51,0x6F,0x7E,0x68,0x63, + 0xA5,0x51,0x44,0x41,0x7A,0xF2,0x58,0x7E,0x44,0x41,0x03,0x41,0xDA,0xB8,0x3C,0xBC, + 0x44,0x49,0x03,0x41,0x7D,0x6E,0xE8,0x8F,0xC5,0x61,0x03,0x41,0xDD,0x95,0xBF,0x2A, + 0x67,0x7A,0xC5,0x61,0xF5,0x35,0x29,0x0A,0xC8,0x8A,0x26,0x72,0xF5,0x8B,0xAA,0x28, + 0xC9,0x8A,0x06,0x6A,0x5B,0x6A,0x78,0xB8,0x27,0x72,0x84,0x51,0x5E,0x7A,0x78,0xF0, + 0x64,0x51,0x24,0x49,0xFA,0xF7,0xD4,0xAC,0x64,0x51,0xE2,0x38,0xFA,0x7C,0x7A,0xEC, + 0xE3,0x38,0xA2,0x30,0xBE,0xDC,0x5F,0xFA,0x03,0x39,0xC2,0x30,0x8B,0xAB,0x89,0xA9, + 0x03,0x39,0x82,0x28,0x6A,0xFA,0xE2,0xCA,0xA2,0x30,0x82,0x28,0xD5,0x55,0x57,0x5C, + 0xE2,0x30,0x82,0x28,0xFF,0xF5,0xB5,0x3D,0x43,0x41,0xA1,0x30,0x29,0xAD,0xAF,0xAF, + 0xA5,0x59,0x23,0x41,0xB5,0xAD,0x3D,0x0D,0xA9,0x82,0xA5,0x59,0x2D,0x2D,0xAB,0xAB, + 0xC9,0x82,0x06,0x6A,0x00,0xA8,0xFE,0x7B,0xA8,0x7A,0xE4,0x61,0xF8,0xFA,0x7F,0x55, + 0x67,0x7A,0xC4,0x61,0x0A,0xBF,0xF5,0xFF,0x88,0x7A,0xE5,0x69,0x00,0x02,0x0B,0xBD, + 0xC9,0x82,0x46,0x72,0x82,0x2A,0xAF,0x97,0xE9,0x82,0x84,0x51,0x80,0xAA,0xFA,0x7E, + 0x06,0x6A,0x02,0x49,0xA8,0xE8,0xFF,0x57,0xE6,0x61,0x43,0x51,0xAA,0xFD,0xBD,0x35, + 0x47,0x72,0xA4,0x59,0x0D,0x2D,0x2F,0x0A,0xA8,0x82,0x46,0x72,0x03,0xB5,0xED,0xAD, + 0xC9,0x8A,0xA8,0x7A,0xEB,0xEF,0xA9,0x87,0xC9,0x82,0x67,0x7A,0xB7,0xFC,0xFE,0x5E, + 0xA8,0x82,0x46,0x72,0x02,0xAA,0x2B,0x89,0x8B,0x9B,0x68,0x7A,0x2F,0x2D,0xAD,0xBD, + 0xD6,0xF6,0x8A,0x93,0x0B,0x0F,0x2D,0x95,0x39,0xFF,0xB6,0xF6,0x00,0x20,0x82,0x89, + 0x39,0xFF,0x18,0xFF,0x20,0x0A,0x8B,0x8B,0x38,0xFF,0x18,0xFF,0xDE,0x9E,0xBE,0xBE, + 0x38,0xFF,0xF7,0xF6,0xA0,0xEA,0x6A,0x7A,0xB6,0xF6,0x55,0xE6,0xF0,0xF8,0x78,0xFA, + 0x55,0xEE,0x75,0xE6,0x0A,0x02,0xA0,0xA0,0x55,0xEE,0x35,0xE6,0xD7,0xDE,0xAC,0xB8, + 0xF8,0xFE,0x76,0xEE,0x2D,0x2D,0x29,0x0F,0x18,0xFF,0xD7,0xF6,0xFA,0xFA,0xFA,0xE8, + 0x38,0xFF,0xF8,0xF6,0xB7,0xB5,0xB5,0xAD,0x18,0xFF,0x38,0xF7,0x20,0x0A,0x2A,0x2A, + 0x18,0xFF,0xF8,0xF6,0x28,0xA8,0xF8,0xBA,0x18,0xFF,0xF8,0xF6,0xEA,0xBA,0xAE,0xAB, + 0xF8,0xFE,0x18,0xF7,0xAA,0xBA,0xEB,0xBB,0xF8,0xFE,0x18,0xF7,0x82,0xAA,0xA8,0xAC, + 0x18,0xFF,0xF8,0xF6,0x7F,0x5F,0xDA,0x5F,0xD8,0xFE,0xF7,0xF6,0xF7,0xF7,0x7D,0xDF, + 0xD7,0xFE,0xF8,0xF6,0xF7,0xFF,0xDD,0x75,0xD8,0xFE,0xF7,0xF6,0xFD,0xFD,0x77,0x55, + 0x18,0xFF,0xD7,0xF6,0xAF,0xBB,0xFF,0xDF,0xD8,0xFE,0xF7,0xF6,0xBD,0xF5,0x77,0x5F, + 0x18,0xFF,0xD7,0xF6,0xDD,0x5D,0x7F,0xFA,0xF7,0xF6,0xD7,0xF6,0x2B,0x25,0xB7,0x37, + 0xF8,0xFE,0xF7,0xF6,0xFF,0xFF,0xFB,0xBF,0x18,0xFF,0xF8,0xF6,0x6D,0xDF,0xF5,0xFF, + 0x18,0xFF,0xF8,0xF6,0xAD,0x0B,0x8F,0xAF,0x18,0xFF,0xF8,0xF6,0x60,0x7A,0xEE,0xEB, + 0xD8,0xFE,0xF7,0xF6,0x5D,0x75,0xF5,0xFF,0x18,0xFF,0xD7,0xF6,0xA2,0xAA,0xF7,0xB7, + 0xF7,0xF6,0xD8,0xF6,0xA0,0xA0,0xE2,0xEA,0xF8,0xF6,0xD7,0xF6,0x82,0x7B,0x5F,0x57, + 0xF8,0xF6,0xB7,0xF6,0x7A,0xFA,0x77,0x5F,0xB7,0xF6,0x76,0xEE,0xF8,0xB8,0xEC,0xFE, + 0x96,0xEE,0x76,0xEE,0xD9,0xD7,0x5F,0xD5,0x96,0xEE,0x76,0xEE,0x68,0x7A,0x57,0x55, + 0x75,0xEE,0x35,0xE6,0xE2,0xBC,0xAE,0xAE,0x75,0xEE,0x35,0xE6,0xAA,0xBB,0xB6,0xFF, + 0x75,0xEE,0x55,0xE6,0x8A,0xAA,0xFF,0x56,0x76,0xEE,0x35,0xE6,0x2A,0xEE,0x9F,0xD7, + 0x76,0xEE,0x55,0xE6,0x95,0xBD,0x0D,0xA3,0xB7,0xF6,0x76,0xEE,0xA5,0x2B,0xA9,0xAB, + 0xB7,0xF6,0x76,0xEE,0xFA,0xF8,0xEA,0x5E,0xB6,0xF6,0x55,0xEE,0xFD,0xAF,0x2B,0x2A, + 0xB6,0xF6,0x96,0xEE,0xFD,0xFE,0x8A,0xA6,0xB6,0xF6,0x14,0xDE,0xE2,0xE0,0xEA,0x7A, + 0xF4,0xDD,0x31,0xCD,0xF8,0xF8,0x78,0x5E,0xB3,0xDD,0x31,0xCD,0x2B,0x2B,0xAF,0xF5, + 0x15,0xE6,0x92,0xD5,0x2F,0xAB,0xAD,0xBD,0x35,0xE6,0xD3,0xDD,0x82,0x8A,0xEE,0x7E, + 0x14,0xE6,0xB3,0xD5,0x70,0xD8,0xEA,0xEA,0x14,0xE6,0xB3,0xD5,0x2F,0x2D,0x2F,0x0F, + 0x14,0xE6,0xD3,0xDD,0xF8,0x7C,0xDA,0xDA,0xF4,0xDD,0x92,0xD5,0x80,0x80,0xC2,0x68, + 0xD3,0xDD,0x31,0xC5,0x00,0x80,0xAA,0x55,0x92,0xD5,0xD0,0xBC,0x60,0xF0,0xFE,0xFF, + 0xEF,0xBC,0x0D,0xA4,0x5A,0x7E,0xFC,0xF8,0xF0,0xC4,0x4D,0xAC,0x2D,0x2D,0x25,0x35, + 0x31,0xCD,0xB0,0xB4,0xFA,0xF0,0xF8,0x7A,0xCF,0xBC,0x8F,0xB4,0x36,0x0E,0x2F,0x17, + 0x31,0xC5,0xF0,0xC4,0x23,0x89,0x09,0x05,0x72,0xCD,0x31,0xCD,0xAD,0x29,0x3D,0x3B, + 0x71,0xCD,0x31,0xCD,0xAA,0xE8,0xFA,0x56,0x51,0xCD,0xF0,0xBC,0x58,0x56,0xDD,0xF7, + 0x52,0xCD,0xD0,0xBC,0x35,0x2F,0xBA,0xAA,0x92,0xD5,0x31,0xC5,0xBF,0xAF,0x8B,0xAD, + 0xE8,0x82,0x86,0x7A,0x89,0x8A,0xE8,0xA2,0x08,0x83,0x87,0x7A,0xC3,0x6E,0x6B,0xEA, + 0xE8,0x82,0x87,0x7A,0x6E,0xCF,0xEF,0xFE,0xE8,0x82,0x86,0x7A,0x2D,0xBD,0xAB,0xBA, + 0xE8,0x82,0x87,0x7A,0x02,0x90,0x00,0x8B,0xE7,0x82,0xA7,0x7A,0xBF,0xBC,0xFE,0xFA, + 0xC8,0x82,0xA8,0x7A,0x0E,0x40,0xD2,0x05,0xE8,0x82,0xA7,0x7A,0xD5,0xAB,0x2A,0x28, + 0xE8,0x82,0xA6,0x82,0x0F,0xC0,0xE0,0xF0,0x08,0x8B,0xA7,0x7A,0x28,0x5E,0xFA,0xBA, + 0x09,0x8B,0xC7,0x82,0x5E,0xCB,0x79,0x5A,0x08,0x8B,0xA7,0x7A,0xAB,0x3F,0xFE,0xBD, + 0x08,0x83,0xA7,0x82,0x2A,0xBE,0xFE,0x9F,0xE8,0x82,0xC8,0x82,0x20,0x22,0x6B,0xDF, + 0x08,0x8B,0xC8,0x82,0x8B,0xB5,0xA9,0x2D,0x08,0x8B,0xC8,0x82,0x28,0x2A,0x3A,0x5F, + 0x49,0x8B,0xC8,0x82,0xA8,0xFF,0xDA,0xDF,0x0C,0x9C,0xC7,0x82,0x2B,0xFF,0xF5,0x5D, + 0xD3,0xDD,0x29,0x8B,0x0A,0xF5,0x55,0x55,0x75,0xEE,0x29,0x8B,0x00,0x0B,0xFD,0x55, + 0xB6,0xF6,0xCB,0xA3,0x00,0x00,0xAB,0xF5,0xD6,0xF6,0x92,0xD5,0x00,0x08,0x8A,0xBD, + 0xD6,0xF6,0x75,0xF6,0x08,0x8A,0xAB,0xBD,0xD7,0xFE,0x96,0xF6,0xAA,0xAE,0x9E,0xFB, + 0xD7,0xFE,0xB6,0xF6,0xEA,0xFF,0xEB,0xEB,0xB7,0xF6,0x34,0xE6,0x60,0xC0,0xA0,0x80, + 0x55,0xEE,0x87,0x72,0x5E,0x78,0x78,0xE0,0x66,0x6A,0x43,0x49,0xF7,0xD5,0x56,0x5C, + 0xA5,0x59,0x43,0x49,0xA0,0x80,0xEA,0xD5,0xC5,0x51,0x64,0x49,0x8A,0xAA,0xFE,0x75, + 0x85,0x51,0x64,0x49,0x7A,0x68,0xD5,0xEF,0x84,0x51,0x23,0x41,0x77,0x7F,0xFE,0x8E, + 0xC5,0x59,0x23,0x41,0xFD,0x2F,0xAB,0x2A,0xA8,0x82,0x84,0x51,0xF5,0xBD,0xAF,0x2B, + 0x09,0x93,0x46,0x72,0xBD,0x2D,0x0B,0x0A,0x09,0x93,0xA8,0x8A,0xD7,0x6E,0xE2,0xE0, + 0xC9,0x8A,0x26,0x72,0xF8,0xFE,0x58,0xD8,0x47,0x7A,0xA4,0x61,0x5C,0x7A,0x7C,0xB0, + 0xC5,0x69,0x44,0x49,0xDF,0x7F,0xBA,0xA0,0xA5,0x59,0x44,0x49,0x55,0xFF,0xBF,0x2A, + 0xE6,0x69,0xE2,0x40,0x5F,0xFE,0xAA,0x2A,0xC5,0x59,0x03,0x41,0x55,0x55,0x5E,0xE8, + 0x03,0x41,0xC2,0x30,0xE8,0x7A,0xFF,0x2E,0x44,0x41,0xA2,0x30,0x55,0xF7,0xAA,0x0A, + 0x85,0x51,0x81,0x30,0xFD,0xBF,0x2F,0x0A,0x64,0x49,0x03,0x41,0xBD,0x2E,0xAA,0x02, + 0xC5,0x61,0x44,0x49,0x37,0xAF,0x2A,0xAB,0x27,0x6A,0x84,0x51,0x82,0xEB,0xFF,0x57, + 0x06,0x6A,0xA4,0x59,0x80,0xEF,0xB5,0xB5,0xE5,0x61,0xA4,0x61,0xDE,0x7B,0xEA,0xA8, + 0xE5,0x61,0xA4,0x61,0x2E,0x39,0x29,0x09,0x26,0x6A,0xC5,0x61,0x97,0x9F,0x2B,0x2F, + 0x87,0x7A,0x06,0x62,0xAB,0x7B,0x83,0x8A,0x67,0x72,0x23,0x49,0x78,0x78,0x5E,0x5E, + 0x63,0x51,0xE2,0x40,0xF7,0xF7,0xBD,0x27,0x26,0x6A,0x02,0x49,0x2D,0x2F,0x2B,0x0B, + 0x67,0x72,0x26,0x72,0xFF,0x52,0xFA,0xDE,0x88,0x7A,0xE5,0x69,0xA0,0x8B,0xF7,0xFF, + 0xC9,0x8A,0x05,0x6A,0x0A,0x2B,0x3D,0x25,0x4A,0x9B,0x46,0x72,0x57,0x5E,0xFA,0xE2, + 0x88,0x7A,0x05,0x6A,0x0F,0xB5,0xFD,0xBA,0x2A,0x8B,0x67,0x7A,0x2D,0x39,0xBD,0x3D, + 0x8E,0xBC,0x2A,0x8B,0x3D,0xBD,0xD5,0x55,0x18,0xFF,0x6E,0xB4,0x02,0x0B,0x09,0x2D, + 0x38,0xFF,0x18,0xFF,0xED,0xED,0x7D,0xD5,0x38,0xFF,0x18,0xFF,0x5F,0xDF,0x55,0x55, + 0x18,0xFF,0x96,0xF6,0xE0,0xE0,0x68,0x78,0x96,0xF6,0x55,0xEE,0x5C,0xDE,0x77,0xD7, + 0x75,0xEE,0x55,0xEE,0xF5,0xFD,0x7B,0x7D,0x75,0xEE,0x35,0xE6,0xB7,0x97,0x97,0x2F, + 0xF8,0xFE,0x96,0xEE,0x2D,0x2D,0x0D,0x2D,0xF8,0xFE,0x18,0xF7,0xB8,0xAA,0x2E,0xAE, + 0x18,0xFF,0xF8,0xF6,0x29,0x0E,0x0D,0xAF,0x18,0xFF,0x38,0xF7,0x28,0x28,0x80,0x02, + 0x18,0xFF,0xF8,0xF6,0xAA,0xEE,0xBA,0xBE,0x18,0xFF,0xF8,0xF6,0xAA,0xAA,0xE8,0xDE, + 0x18,0xFF,0xF8,0xF6,0x7A,0x7E,0xDF,0xEF,0xF7,0xFE,0xF8,0xF6,0xBF,0xFF,0x7F,0xFF, + 0xD7,0xFE,0xF8,0xF6,0xF5,0xF7,0xD7,0x77,0x18,0xFF,0xD7,0xF6,0xBF,0xAB,0xEB,0xAB, + 0xD7,0xFE,0xF8,0xF6,0x75,0xFD,0xE5,0xE7,0xD7,0xFE,0xF7,0xF6,0x57,0xDD,0xF7,0xFD, + 0xF7,0xF6,0xB7,0xF6,0x2E,0x28,0x2A,0xA8,0x18,0xFF,0xD7,0xF6,0xAE,0xEB,0xFB,0xEF, + 0xD7,0xFE,0xF7,0xF6,0x75,0xFD,0xFF,0xFD,0xF7,0xF6,0xD7,0xF6,0x7E,0x3E,0x8A,0x0A, + 0x18,0xFF,0xF7,0xF6,0x55,0x75,0x7F,0xFF,0x18,0xFF,0xF8,0xF6,0xEF,0x2F,0xB5,0xB7, + 0x18,0xFF,0xF8,0xF6,0x6B,0x78,0xFA,0xFE,0x17,0xFF,0xF8,0xF6,0x6B,0xFF,0xFD,0x77, + 0xF8,0xF6,0xD7,0xF6,0xA8,0xBA,0xA8,0xCE,0xF8,0xF6,0xD7,0xF6,0x8A,0xA8,0xAA,0xBE, + 0xF8,0xF6,0xD7,0xF6,0xC8,0xA2,0x6A,0x7A,0x18,0xF7,0xB7,0xF6,0x7F,0x7F,0xDE,0x7F, + 0xD7,0xF6,0x96,0xEE,0x7A,0x5F,0x5F,0x7E,0x96,0xEE,0x76,0xEE,0xDA,0x58,0x7F,0xF9, + 0x96,0xEE,0x55,0xEE,0xFE,0xEA,0xAE,0xEA,0x76,0xEE,0x55,0xE6,0x20,0x80,0x20,0xE8, + 0x75,0xEE,0x34,0xE6,0xF8,0xFA,0xAA,0xEA,0x75,0xEE,0x35,0xE6,0xBF,0xFE,0xFE,0xEA, + 0x75,0xEE,0x34,0xE6,0xFE,0xA8,0x02,0x2A,0x75,0xEE,0x34,0xE6,0x9F,0xBA,0xA2,0x80, + 0x76,0xEE,0x55,0xE6,0xAF,0x0C,0xB7,0x25,0x96,0xEE,0x76,0xEE,0x22,0x26,0x2E,0xBB, + 0x96,0xEE,0x55,0xE6,0xF8,0xEA,0xEA,0xAA,0x96,0xEE,0x55,0xEE,0x0A,0x02,0x29,0x2F, + 0xB6,0xF6,0x96,0xEE,0xFB,0x7F,0x7D,0x55,0x96,0xEE,0x14,0xDE,0x60,0x70,0xE0,0xE0, + 0xD3,0xDD,0x30,0xC5,0x76,0xFC,0xE8,0xF0,0x71,0xCD,0x30,0xCD,0x09,0xE2,0xAA,0xDC, + 0xF3,0xDD,0x51,0xCD,0x2F,0xA9,0x2D,0xB9,0xF4,0xDD,0xB3,0xD5,0x80,0xE0,0x80,0x02, + 0xF4,0xDD,0x92,0xD5,0x83,0xAA,0xFA,0x60,0x14,0xE6,0xB3,0xD5,0x2D,0x0F,0xA9,0xB5, + 0x14,0xE6,0x10,0xC5,0x20,0xA0,0xFA,0x5E,0xB3,0xD5,0xF0,0xC4,0x80,0x78,0x57,0x77, + 0x30,0xC5,0xF0,0xBC,0x58,0xFF,0x55,0x55,0x30,0xC5,0xD0,0xBC,0xFE,0x36,0x9F,0xDF, + 0x31,0xCD,0x2D,0xAC,0x7A,0x78,0xE0,0x80,0xCF,0xBC,0xEC,0xA3,0x2B,0x2D,0x3F,0x2F, + 0x31,0xCD,0xB0,0xBC,0xFA,0x40,0xA2,0xCB,0xCF,0xBC,0x4E,0xAC,0x3E,0x37,0x97,0xBF, + 0x51,0xCD,0xF0,0xC4,0xA5,0x29,0x89,0x29,0x51,0xCD,0x11,0xC5,0x0A,0x22,0xA9,0xCE, + 0x52,0xCD,0xD0,0xBC,0xE8,0xE8,0x7C,0xDF,0x52,0xCD,0xCF,0xBC,0xF7,0x9F,0xAD,0x8B, + 0x72,0xCD,0x11,0xC5,0xB7,0xBD,0x9F,0x3F,0x72,0xCD,0x51,0xCD,0x29,0x3D,0xB5,0xBD, + 0xC8,0x82,0x25,0x6A,0x20,0xAA,0xAF,0xD7,0xE8,0x82,0x66,0x72,0xA2,0x83,0x8A,0xFD, + 0xC7,0x82,0x87,0x7A,0xB8,0x2A,0x2A,0x2E,0x07,0x83,0xC8,0x82,0x5F,0x7B,0xFF,0x7E, + 0xE8,0x82,0xA7,0x7A,0xAB,0x8B,0x89,0x23,0x08,0x8B,0xA7,0x7A,0xF7,0xB7,0xBF,0xBA, + 0x09,0x8B,0xA7,0x7A,0x8F,0xC6,0xDE,0x5F,0xE8,0x82,0xA7,0x82,0xFB,0x75,0xAB,0xA3, + 0xE8,0x82,0x87,0x7A,0xE0,0x2A,0x0A,0x28,0x08,0x8B,0xA7,0x7A,0xEF,0xBF,0xFA,0x5C, + 0xE8,0x82,0x86,0x7A,0x20,0xA8,0x80,0xC1,0xE8,0x82,0xA7,0x7A,0xDE,0xAA,0x3A,0xE8, + 0x09,0x8B,0xA8,0x7A,0x7F,0xCF,0xAB,0xAF,0x08,0x8B,0xC8,0x82,0xBF,0xB3,0xE3,0x6A, + 0x08,0x8B,0xA7,0x82,0xAF,0xE2,0xAA,0xDA,0x09,0x8B,0xC8,0x82,0xD5,0xD7,0x2B,0xC5, + 0xC8,0x8A,0xE8,0x82,0xFD,0x59,0x5F,0xF7,0x08,0x8B,0xC8,0x82,0xBB,0xAA,0xFA,0x7A, + 0xE8,0x82,0xC8,0x82,0xD8,0xB8,0xAA,0x7B,0x09,0x8B,0xC8,0x82,0x22,0x83,0x0A,0xF9, + 0x8A,0x93,0xE8,0x82,0x2F,0xFD,0x5D,0x55,0x10,0xCD,0x09,0x8B,0x2B,0xF5,0x55,0x55, + 0x54,0xEE,0x09,0x8B,0x02,0xAF,0xD5,0x55,0x95,0xF6,0x4A,0x93,0x00,0x02,0xAF,0xD5, + 0xB6,0xF6,0xAE,0xBC,0x00,0x00,0x0A,0xBD,0xB7,0xF6,0x14,0xE6,0x00,0x00,0x00,0x8D, + 0x96,0xF6,0xF0,0xBC,0x70,0xE0,0xC0,0x80,0xD0,0xBC,0x44,0x49,0x5E,0x5E,0x58,0x78, + 0x43,0x49,0x03,0x41,0xA2,0xB8,0xEE,0xFF,0x63,0x49,0x03,0x49,0x0A,0xBA,0xEB,0x09, + 0xA5,0x51,0x43,0x49,0xCA,0xAE,0xBD,0xEB,0xA5,0x59,0x64,0x51,0x55,0x6D,0xB7,0x35, + 0x26,0x6A,0x84,0x51,0xA5,0xAF,0x29,0x0F,0x09,0x8B,0x26,0x72,0x3D,0x2D,0x29,0x2F, + 0x4A,0x9B,0xE8,0x8A,0xA9,0x02,0x0A,0xA3,0x2A,0x9B,0xA8,0x8A,0x78,0x78,0x60,0xF2, + 0xA8,0x8A,0x47,0x7A,0xD4,0xFA,0x7A,0xF8,0x67,0x82,0xE5,0x69,0xFA,0xF2,0x7E,0x7F, + 0x06,0x72,0xA5,0x61,0x56,0xA8,0xCA,0x0A,0x27,0x72,0xA5,0x61,0x95,0x2A,0x0A,0x22, + 0x67,0x7A,0xC5,0x61,0x57,0xFF,0xBE,0x2E,0x27,0x6A,0xA5,0x59,0x76,0x7E,0x78,0x60, + 0xA5,0x59,0x03,0x41,0xDE,0xA8,0x20,0xF8,0xA5,0x51,0x03,0x41,0xF7,0xA8,0xB8,0x5F, + 0xA6,0x51,0x24,0x49,0x2F,0xAA,0xAE,0xFD,0xA5,0x51,0x23,0x49,0xAE,0xAC,0xEE,0x7F, + 0x84,0x51,0x23,0x49,0x20,0xA2,0xEB,0xFD,0xA5,0x59,0x43,0x49,0x3F,0xFF,0xFF,0xAD, + 0x06,0x62,0x84,0x59,0x2F,0xAD,0x2F,0x8B,0x67,0x72,0xC5,0x61,0x7D,0x7B,0xC2,0x22, + 0x26,0x6A,0xA4,0x59,0xED,0xF7,0x76,0x68,0x67,0x72,0xC5,0x61,0xAB,0xAB,0x2D,0x29, + 0x67,0x72,0xA4,0x59,0x80,0xA0,0x70,0x7C,0xC4,0x59,0xE2,0x38,0xF8,0x5C,0x5E,0x57, + 0xC5,0x61,0xE2,0x38,0xBF,0x35,0x3D,0x2D,0x67,0x7A,0xC5,0x61,0x2D,0x0F,0x8B,0xAB, + 0x88,0x7A,0x26,0x72,0xBE,0x8E,0xEB,0x5E,0x67,0x7A,0xE6,0x69,0xB8,0xE8,0xFA,0xDF, + 0xC8,0x8A,0x06,0x72,0x2D,0x25,0x2F,0x2B,0x2A,0x93,0xC8,0x8A,0x4B,0xFB,0x7D,0xC3, + 0xE9,0x8A,0x67,0x7A,0x56,0xF8,0xBC,0xA8,0xE9,0x8A,0x88,0x82,0x29,0xB7,0xD7,0x5F, + 0x0A,0x8B,0xA8,0x82,0x3A,0x3F,0x35,0x55,0x76,0xF6,0x8B,0x9B,0x2D,0x2D,0xF5,0xD5, + 0xF8,0xFE,0x31,0xD5,0x00,0x00,0x02,0x09,0x18,0xFF,0xF8,0xFE,0x7A,0x57,0x7D,0x55, + 0xF8,0xFE,0x75,0xE6,0xE0,0xF0,0xF0,0x78,0x55,0xEE,0x75,0xE6,0x8A,0xEB,0xAA,0x20, + 0x75,0xEE,0x55,0xEE,0xD9,0xFF,0xFF,0xE5,0x96,0xEE,0x35,0xE6,0x97,0x2F,0xBB,0x2F, + 0xF8,0xFE,0x96,0xF6,0x2D,0x2F,0x09,0x0B,0x18,0xFF,0xF8,0xF6,0xDB,0x7B,0x7B,0x7A, + 0x18,0xFF,0xF8,0xF6,0x2F,0xA9,0x2B,0x0D,0x18,0xFF,0xF8,0xF6,0x00,0x08,0xA0,0xE0, + 0x18,0xFF,0xF8,0xF6,0xBA,0xAA,0xFA,0xEE,0x18,0xFF,0xF8,0xF6,0xFF,0x7E,0x5E,0x7F, + 0x18,0xFF,0xF8,0xF6,0xFF,0xDD,0xEF,0xED,0xF7,0xFE,0xF8,0xF6,0xFF,0x7E,0xFF,0xFF, + 0xD8,0xFE,0xF7,0xF6,0x57,0x5F,0xD7,0x7F,0x18,0xFF,0xF8,0xF6,0x6F,0x55,0x75,0xD5, + 0xF8,0xF6,0xD7,0xF6,0xBA,0xFC,0xDC,0xBA,0xF7,0xF6,0xD7,0xF6,0xAA,0x2A,0x0B,0xAA, + 0x18,0xFF,0xF7,0xF6,0x57,0x5D,0xBF,0xBB,0x17,0xFF,0xF8,0xF6,0x55,0xDD,0xFF,0xFD, + 0x18,0xFF,0xF8,0xF6,0xFF,0xFD,0xFF,0x77,0x18,0xFF,0xF8,0xF6,0xFF,0x7A,0xBD,0xFF, + 0xF8,0xFE,0xF7,0xF6,0xDB,0xFF,0xFF,0xAE,0x18,0xFF,0xF8,0xF6,0xBB,0xFA,0xFA,0xFF, + 0x18,0xFF,0xF8,0xF6,0x7F,0x7D,0x7F,0x9B,0xD7,0xFE,0xF8,0xF6,0xDD,0xFD,0xF5,0xD5, + 0xF8,0xF6,0xD7,0xF6,0x8E,0x9C,0xFE,0x2A,0xF8,0xF6,0xD7,0xF6,0xAA,0xB2,0xF8,0xB2, + 0xF7,0xF6,0x98,0xF6,0xA0,0xAA,0xE8,0xAA,0xD7,0xF6,0x96,0xEE,0xE0,0xAE,0x6A,0xFE, + 0x96,0xF6,0x76,0xEE,0x88,0xD8,0x54,0xB2,0x95,0xEE,0x56,0xE6,0xCA,0xFB,0xFF,0xFE, + 0x76,0xEE,0x55,0xEE,0x00,0xA7,0xD7,0xA5,0x76,0xF6,0x55,0xE6,0xFF,0xFF,0x7C,0x78, + 0x76,0xEE,0x35,0xE6,0xBA,0xEA,0xB2,0xFA,0x36,0xEE,0x55,0xE6,0x55,0xDF,0xD7,0xBA, + 0x75,0xEE,0x35,0xE6,0xF6,0xFF,0x3F,0xB5,0x76,0xEE,0x55,0xE6,0xF3,0x23,0xB3,0xFF, + 0x96,0xEE,0x55,0xE6,0xAD,0xBB,0xAF,0x2F,0x96,0xEE,0x76,0xEE,0x78,0xFE,0x7F,0x6B, + 0x96,0xEE,0x76,0xEE,0x65,0x7D,0x5F,0x7D,0x95,0xEE,0x76,0xEE,0x55,0x55,0x7B,0x99, + 0x96,0xEE,0x76,0xEE,0xB5,0x55,0x75,0x7A,0x96,0xEE,0x34,0xE6,0xE2,0x68,0xFE,0x7E, + 0x14,0xE6,0x71,0xCD,0x5E,0xFA,0xF8,0xE8,0xF4,0xDD,0x51,0xCD,0x57,0x7F,0xAA,0x2A, + 0xD3,0xDD,0x51,0xCD,0x2D,0x2E,0x2A,0x8A,0x14,0xDE,0xB3,0xD5,0x8A,0xAB,0xEF,0xAF, + 0x14,0xE6,0x92,0xD5,0x78,0x7A,0xEA,0x6A,0xD3,0xDD,0x92,0xD5,0x01,0x81,0xA3,0x42, + 0x72,0xD5,0xCF,0xBC,0xF8,0x68,0xFC,0x5E,0x10,0xC5,0xCF,0xBC,0xB8,0xF3,0x72,0x56, + 0xF0,0xC4,0xCF,0xBC,0x81,0x8D,0x75,0xE6,0x10,0xC5,0xAF,0xBC,0x3B,0xAE,0x9B,0x9E, + 0x91,0xD5,0xF0,0xC4,0xEB,0xEF,0xAD,0x2B,0x51,0xCD,0x6E,0xB4,0xD7,0x5E,0x5E,0x78, + 0x31,0xCD,0xAF,0xBC,0xE3,0xCB,0x8B,0xAD,0xAF,0xBC,0x2D,0xAC,0x36,0x9E,0xBC,0x54, + 0x51,0xCD,0xAF,0xBC,0x29,0x2B,0x0F,0x2D,0x71,0xCD,0x31,0xC5,0xAA,0xEA,0xFF,0x7D, + 0x31,0xCD,0xCF,0xBC,0xDA,0xFE,0x2E,0x2A,0x72,0xCD,0xF0,0xC4,0xAD,0x2F,0xAA,0x2A, + 0x72,0xCD,0x51,0xCD,0x5D,0x5E,0x16,0x7C,0x71,0xCD,0x51,0xCD,0x1D,0xF7,0xE4,0xEA, + 0x87,0x7A,0x25,0x6A,0x7E,0xEE,0xEE,0xAA,0xA7,0x7A,0x25,0x6A,0xBD,0xFD,0xFD,0x2E, + 0xC7,0x7A,0x45,0x6A,0x2E,0xD7,0xF5,0xDF,0xC7,0x7A,0x25,0x6A,0x02,0x2B,0xF7,0xF5, + 0xE8,0x82,0x45,0x72,0x2A,0x0B,0xAF,0xFD,0xE8,0x82,0x86,0x7A,0xAA,0xB0,0x2A,0xBD, + 0xE8,0x82,0xA7,0x7A,0xFA,0x60,0xC8,0xFD,0xE8,0x82,0x87,0x7A,0xA3,0x89,0xCA,0x82, + 0xE8,0x82,0x87,0x7A,0x08,0x20,0xAA,0x62,0xE8,0x82,0x86,0x7A,0x70,0xF0,0xBA,0xEB, + 0xE8,0x82,0xA7,0x7A,0x49,0xF9,0xF9,0xEB,0xE8,0x8A,0xA7,0x7A,0x92,0x2A,0xBE,0xAF, + 0xE8,0x82,0xA7,0x7A,0x2B,0xAF,0x56,0xA6,0xE8,0x82,0xC7,0x82,0x07,0xA1,0x05,0xAD, + 0xC8,0x8A,0xE8,0x82,0xB5,0xF5,0x95,0xEC,0x08,0x8B,0xC8,0x82,0xEB,0xEA,0xE9,0xDF, + 0x09,0x8B,0xC8,0x82,0x7B,0xFB,0xFD,0x2E,0x09,0x8B,0xC8,0x82,0x7F,0xFB,0xA9,0x37, + 0xE8,0x8A,0xC8,0x82,0xEB,0x45,0x86,0x04,0x08,0x8B,0xC8,0x82,0x35,0xA5,0xFE,0xBE, + 0x09,0x8B,0xC8,0x82,0xEA,0xF2,0xFF,0xA7,0x09,0x8B,0xC8,0x82,0x3E,0x93,0xFB,0x7C, + 0x29,0x8B,0xE8,0x82,0xA7,0x5D,0x69,0xA9,0x29,0x8B,0xE8,0x82,0x0F,0x8F,0x6F,0x7F, + 0xEC,0xA3,0x09,0x8B,0x0F,0x75,0x55,0x55,0xB3,0xDD,0x09,0x8B,0x0A,0xBD,0x55,0x55, + 0x55,0xEE,0x29,0x8B,0x00,0xAA,0xFD,0x55,0x32,0xCD,0x84,0x51,0x78,0x78,0x7A,0x7F, + 0x43,0x49,0xE2,0x38,0xBF,0xD4,0xBE,0x0A,0x84,0x51,0x03,0x41,0xAD,0xFD,0xEF,0x6A, + 0xA4,0x51,0x23,0x41,0x8B,0x8B,0xBE,0xF7,0xA5,0x59,0x43,0x49,0x2E,0x3E,0x2F,0x2D, + 0x26,0x72,0xC5,0x61,0x3D,0xBD,0xBD,0xB5,0xC8,0x8A,0x26,0x72,0x0F,0x0B,0xAD,0xB5, + 0x2A,0x9B,0xA7,0x82,0x02,0x2B,0xAD,0xAD,0x29,0x9B,0xC9,0x8A,0x6A,0xAA,0x20,0x0A, + 0x0A,0x9B,0x47,0x7A,0x7E,0xFC,0xF8,0xF8,0x67,0x7A,0x06,0x72,0xDD,0xEF,0xEF,0x2C, + 0x87,0x82,0xE6,0x69,0x5D,0x7E,0xFA,0xE2,0x47,0x7A,0xE5,0x69,0x1D,0xB5,0xD7,0xF7, + 0x88,0x7A,0x26,0x72,0x2E,0xA3,0x0F,0xED,0x88,0x82,0x05,0x62,0x78,0xF8,0x7E,0x57, + 0xE6,0x61,0x43,0x49,0x5E,0x70,0xC0,0x80,0x84,0x51,0xC2,0x38,0xDF,0x5E,0xFA,0xA0, + 0x44,0x49,0x03,0x41,0xFD,0x75,0xA9,0xA8,0x64,0x49,0x03,0x41,0xE3,0xBF,0xE7,0x9B, + 0x85,0x51,0x03,0x41,0x95,0xFF,0xAF,0x0A,0xA5,0x59,0x43,0x49,0x2D,0x2D,0x2E,0x2F, + 0x26,0x6A,0xC5,0x59,0xB9,0xAD,0xAD,0xED,0x87,0x72,0x06,0x6A,0xBB,0xFF,0x9F,0x3B, + 0xA8,0x7A,0x26,0x6A,0x7F,0xFB,0xAA,0x02,0x67,0x72,0x06,0x62,0x2B,0x2A,0x88,0x78, + 0x67,0x72,0x63,0x51,0x78,0x58,0x5E,0x5F,0x43,0x49,0xC2,0x38,0xDA,0x5A,0xF8,0xF8, + 0xE5,0x61,0x23,0x41,0x2D,0xAD,0xAD,0xB5,0x26,0x72,0xA5,0x59,0x02,0x2B,0xA7,0x75, + 0x27,0x72,0xC5,0x61,0xE8,0xE8,0xFE,0xA9,0x27,0x72,0xA5,0x61,0x9F,0x95,0x1F,0x9E, + 0xE9,0x8A,0x47,0x7A,0x2D,0xA9,0x2D,0x89,0x4A,0x93,0xA8,0x82,0x8A,0xFA,0x7B,0x5F, + 0xC9,0x8A,0x47,0x7A,0x68,0xEA,0xAB,0xA5,0xA8,0x82,0x67,0x7A,0xAB,0x0B,0x2F,0xA2, + 0x29,0x93,0x88,0x7A,0x7D,0xFF,0xFE,0xE2,0x4A,0x93,0x88,0x7A,0x0F,0x3D,0xD5,0xD5, + 0xB6,0xF6,0x09,0x8B,0x0B,0x2F,0xAD,0xB5,0xD7,0xFE,0xD3,0xDD,0x00,0x00,0x02,0x09, + 0xD7,0xFE,0x55,0xEE,0x68,0x78,0x58,0xDA,0x76,0xEE,0x55,0xEE,0xFF,0xBB,0xBB,0x69, + 0x75,0xEE,0x15,0xEE,0x2A,0xA2,0xA8,0xE2,0x96,0xEE,0x55,0xEE,0x37,0x2D,0x05,0x2D, + 0xF8,0xFE,0xB6,0xF6,0x29,0x2D,0x0D,0x2D,0x18,0xFF,0xF8,0xF6,0x7E,0xFF,0xFF,0xDB, + 0x39,0xFF,0xF8,0xFE,0xBD,0xBD,0xEF,0x29,0x39,0xFF,0x18,0xFF,0x5F,0x6F,0x7F,0x5F, + 0x18,0xFF,0xF8,0xF6,0xAA,0xA8,0xA2,0xAA,0x18,0xFF,0xF8,0xF6,0xFB,0xEB,0x92,0x5E, + 0x18,0xFF,0xF8,0xF6,0xD7,0x77,0xDF,0xFF,0xD7,0xFE,0xF8,0xF6,0x77,0xDD,0xF5,0xF5, + 0xF8,0xF6,0xD7,0xF6,0xAC,0xEA,0xE8,0xEA,0xF8,0xF6,0xD7,0xF6,0xA2,0x8A,0xAB,0xAE, + 0xF7,0xF6,0xD7,0xF6,0xAA,0x0E,0xAA,0xAA,0x18,0xFF,0xD7,0xF6,0xBF,0xBB,0xBB,0xAA, + 0xF7,0xFE,0x18,0xF7,0xAE,0xBE,0xBA,0xAA,0x18,0xFF,0xF7,0xF6,0xFF,0xF7,0xFF,0x7E, + 0xD8,0xFE,0xF7,0xF6,0x55,0xF5,0xDD,0xFD,0xF7,0xFE,0xF8,0xF6,0xFF,0xFF,0xFF,0xEF, + 0x19,0xFF,0xF7,0xF6,0xDF,0xFF,0xDD,0xFD,0x18,0xFF,0xF7,0xF6,0xFF,0x7D,0xED,0xFF, + 0x18,0xFF,0xF8,0xF6,0xFA,0xFE,0x7F,0x7F,0xD7,0xFE,0xF8,0xF6,0x95,0xD5,0x55,0x75, + 0xF7,0xF6,0xD8,0xF6,0x2A,0xA8,0xA8,0xAA,0xF7,0xF6,0xD7,0xF6,0xB8,0xDB,0xE7,0xF6, + 0xF7,0xF6,0xB7,0xF6,0x7E,0x7E,0x5E,0x5F,0xB7,0xF6,0x76,0xEE,0xAA,0xEB,0xE2,0xFA, + 0x96,0xEE,0x55,0xEE,0xA0,0xC8,0xE2,0xEB,0x76,0xEE,0x56,0xE6,0x88,0xAC,0xA0,0x00, + 0x76,0xEE,0x56,0xEE,0x20,0x02,0xAA,0xA2,0x76,0xEE,0x15,0xE6,0xC8,0x2A,0xA2,0x82, + 0x76,0xEE,0x35,0xE6,0xFA,0xEA,0xF2,0xFA,0x55,0xEE,0x14,0xDE,0xFA,0xE8,0xF8,0xFA, + 0x55,0xE6,0x14,0xDE,0x0B,0x0B,0x2F,0x85,0x76,0xEE,0x55,0xE6,0xEF,0x2A,0x29,0xBD, + 0x96,0xEE,0x76,0xEE,0xBD,0x7F,0xDD,0xF7,0x96,0xEE,0x76,0xEE,0x6D,0xA7,0x25,0x3F, + 0x96,0xEE,0x76,0xEE,0x7D,0xF5,0xFB,0xF8,0x96,0xEE,0x76,0xEE,0xFB,0xBA,0xFF,0xFF, + 0x96,0xF6,0x76,0xEE,0xEF,0xEB,0x8B,0xEB,0x96,0xEE,0x14,0xE6,0x6A,0x6A,0xE8,0x68, + 0x14,0xE6,0xD4,0xDD,0xDA,0x08,0x0A,0x28,0x34,0xE6,0xF4,0xDD,0x5D,0x7F,0xFB,0xCA, + 0x14,0xE6,0xD3,0xDD,0x55,0x57,0x7B,0xE2,0xF4,0xDD,0xB3,0xDD,0x8B,0x0A,0xAF,0xA8, + 0x14,0xE6,0x92,0xD5,0x6A,0x7A,0xAA,0xA0,0xF4,0xDD,0xF0,0xC4,0xEA,0xEA,0x78,0x78, + 0x10,0xC5,0x8E,0xB4,0xA8,0xBC,0xFA,0xDE,0xCF,0xBC,0xAF,0xBC,0x00,0xF2,0xFE,0xAC, + 0xEF,0xBC,0x8E,0xB4,0xE3,0xF7,0x5F,0x74,0xD0,0xC4,0x4D,0xAC,0xA2,0xEA,0xFE,0xD7, + 0x51,0xCD,0xCF,0xBC,0x09,0x05,0x8D,0xA5,0x51,0xCD,0x8E,0xB4,0x78,0xE0,0xA0,0x80, + 0x31,0xCD,0xCF,0xBC,0x25,0xE5,0xF5,0xFF,0xF0,0xBC,0xEC,0xA3,0xDE,0xFC,0x5E,0xF8, + 0x31,0xCD,0x8F,0xB4,0x09,0x0D,0x09,0x09,0x51,0xCD,0x10,0xC5,0x8B,0xFE,0xAC,0x7A, + 0x72,0xCD,0xF0,0xC4,0xB7,0xA7,0x2D,0xAA,0x92,0xD5,0x31,0xC5,0xAD,0xEF,0xEC,0x2E, + 0x93,0xD5,0x51,0xCD,0xD7,0x5F,0x5F,0xFA,0x71,0xCD,0x51,0xCD,0xF3,0xFB,0xF6,0x7E, + 0x86,0x7A,0x46,0x72,0xA8,0xA6,0xEE,0xA8,0x86,0x7A,0x46,0x72,0x28,0xAB,0x2B,0xAA, + 0xA7,0x7A,0x45,0x72,0xDF,0x5F,0xEA,0x62,0x86,0x7A,0x45,0x72,0x68,0x60,0x60,0x43, + 0x86,0x72,0x25,0x72,0xFE,0x9F,0xAA,0xA0,0x87,0x7A,0x46,0x72,0x03,0xBB,0x7E,0x8F, + 0xC8,0x82,0x25,0x6A,0x2B,0xAB,0xDF,0x57,0xA7,0x82,0x05,0x6A,0x00,0x00,0x0B,0xBD, + 0xE8,0x82,0x87,0x7A,0xEE,0x2B,0xBB,0x75,0xE8,0x82,0xA7,0x7A,0xEF,0xAB,0xA9,0x29, + 0xE8,0x82,0x87,0x7A,0xEB,0x7A,0x88,0x0E,0xE8,0x82,0xA8,0x82,0x03,0x82,0xAA,0x28, + 0xE8,0x82,0x88,0x82,0x2A,0xA2,0x28,0xB8,0x09,0x8B,0xA7,0x7A,0xFF,0xDE,0xBE,0xE8, + 0xE8,0x82,0xA7,0x7A,0xAB,0xE2,0xC3,0x89,0xE8,0x82,0xA8,0x82,0xA8,0x8A,0xAC,0xEB, + 0xE8,0x82,0xC8,0x82,0x0A,0xFF,0x2B,0x2A,0x09,0x83,0xA7,0x7A,0x2E,0xBF,0x9E,0xFA, + 0x09,0x8B,0xC8,0x82,0x3A,0x77,0xE3,0xF0,0x08,0x8B,0xC8,0x82,0x7A,0x6D,0xF5,0x95, + 0x09,0x8B,0xC8,0x82,0xC1,0xCF,0xAB,0xD4,0x08,0x8B,0xC8,0x82,0x5E,0x7E,0xFA,0x7F, + 0x08,0x8B,0xC7,0x82,0x82,0x01,0xCB,0xBF,0x29,0x8B,0xC8,0x82,0xF5,0x6F,0xA8,0xEB, + 0x09,0x8B,0xC9,0x82,0xBF,0x02,0x38,0xFE,0x09,0x8B,0xC8,0x82,0x00,0xB0,0xBE,0x96, + 0x29,0x8B,0xC8,0x7A,0xFC,0xFA,0xFA,0x7E,0xC9,0x82,0x84,0x51,0x78,0x68,0xF8,0x78, + 0x63,0x49,0x23,0x49,0xEF,0x2E,0x6C,0xF0,0x84,0x51,0x43,0x49,0xEB,0xBE,0xAF,0xDD, + 0x84,0x51,0x44,0x49,0xF5,0x5F,0xBE,0x3A,0xC5,0x61,0x64,0x51,0xBD,0x35,0xAF,0xAF, + 0xE6,0x69,0xA5,0x61,0x38,0xAF,0xB9,0x29,0xA8,0x82,0xE5,0x69,0xAD,0xBF,0x2D,0x29, + 0xE9,0x92,0xA8,0x82,0x89,0xB9,0xBB,0xAA,0x09,0x93,0xA8,0x8A,0x88,0xFA,0xFD,0x77, + 0xEA,0x92,0x67,0x82,0xE8,0xFA,0xFE,0x7E,0x67,0x7A,0x26,0x72,0x1E,0x1A,0x58,0x77, + 0x67,0x7A,0x26,0x72,0xE0,0x00,0x3C,0xD5,0x46,0x72,0x06,0x72,0xE5,0xDE,0x34,0x9C, + 0x67,0x7A,0x06,0x6A,0xFD,0xEE,0xAE,0x0A,0x46,0x72,0xE5,0x61,0x5E,0xFA,0x7E,0x5C, + 0x06,0x6A,0xA5,0x59,0xFA,0xF0,0x72,0x55,0xA5,0x59,0x23,0x49,0x7A,0x68,0x5A,0x7A, + 0x23,0x49,0xE3,0x40,0x28,0xF0,0xE8,0xB2,0x64,0x49,0x03,0x41,0xBD,0x9D,0x2F,0xB9, + 0x64,0x49,0x23,0x49,0x35,0xAD,0xAF,0xFE,0x84,0x59,0x23,0x49,0x9A,0xAA,0x2A,0x2A, + 0x05,0x62,0xA5,0x59,0x3F,0xBF,0xB5,0xDD,0x88,0x72,0xC5,0x59,0x2B,0x27,0xAF,0xAD, + 0x88,0x72,0x46,0x72,0xBE,0xB2,0xE2,0xC2,0x67,0x72,0xA4,0x59,0xE2,0x68,0x7A,0x7A, + 0xA4,0x59,0x43,0x49,0xE0,0xE8,0xF8,0x7E,0x64,0x51,0x02,0x41,0xDC,0xDC,0xFA,0xEF, + 0xA5,0x59,0x23,0x49,0xBD,0xAF,0xBD,0x3B,0x47,0x72,0x84,0x59,0xF5,0xD5,0xBD,0x2F, + 0x27,0x72,0xC6,0x69,0xA5,0xB7,0xAA,0x88,0xA8,0x82,0x06,0x6A,0xD5,0xF5,0xB5,0x0A, + 0x09,0x93,0x67,0x7A,0xED,0xFF,0xAE,0xA2,0xC9,0x8A,0x26,0x72,0xE0,0x7A,0x78,0xFA, + 0x88,0x82,0x26,0x72,0x2F,0x9D,0xFF,0xFB,0xE9,0x8A,0x87,0x82,0xAB,0x83,0x09,0x25, + 0x4A,0x93,0xC8,0x82,0x62,0x6A,0xEB,0x55,0xC9,0x82,0x67,0x7A,0xB7,0xDF,0x7A,0x78, + 0x0C,0x9C,0xA8,0x82,0x2D,0xFD,0xFD,0xF5,0xB6,0xF6,0x4A,0x93,0x0B,0xAD,0xF5,0x55, + 0x76,0xF6,0x11,0xC5,0x00,0x80,0x2B,0xAD,0x76,0xEE,0x55,0xEE,0xFE,0xB5,0xB5,0xB5, + 0x76,0xEE,0x55,0xEE,0xE8,0xAE,0x7E,0x5E,0xD7,0xF6,0x55,0xEE,0xBD,0xA7,0xAF,0xA5, + 0x18,0xFF,0xB7,0xF6,0xAD,0x2F,0xAF,0x2B,0x18,0xFF,0xD7,0xF6,0xBA,0xF8,0xFA,0xBE, + 0x39,0xFF,0xF8,0xF6,0x87,0xAD,0xAD,0xAD,0x18,0xFF,0x38,0xF7,0x22,0x88,0x02,0x08, + 0x18,0xFF,0xF8,0xF6,0xAA,0xA8,0xE2,0xAA,0x18,0xFF,0xF8,0xF6,0xFE,0xFA,0xFF,0xFE, + 0x18,0xFF,0xF8,0xF6,0xFE,0x79,0xEB,0xDF,0xD7,0xFE,0xF8,0xF6,0xDD,0x57,0xDD,0xFF, + 0xF8,0xF6,0xD7,0xF6,0xEA,0xB2,0xBE,0xBA,0xF7,0xF6,0xD7,0xF6,0xAE,0x9E,0x3E,0xA7, + 0xF7,0xF6,0xD7,0xF6,0xE3,0x88,0xAA,0x8A,0xF8,0xFE,0xF7,0xF6,0xFF,0xFF,0xF9,0xFF, + 0xD7,0xFE,0xF7,0xF6,0x5F,0x57,0x57,0x7F,0xF7,0xFE,0x18,0xF7,0x2E,0x0B,0xAA,0xFF, + 0xF8,0xFE,0x17,0xEF,0x28,0xA2,0xA2,0xAA,0x17,0xFF,0xF8,0xF6,0xFD,0x57,0x5F,0xFB, + 0x18,0xFF,0xF8,0xF6,0xAB,0xFE,0xB9,0xDE,0x18,0xFF,0xF8,0xF6,0xFF,0xEE,0xAA,0xAA, + 0x18,0xFF,0xF8,0xF6,0x7E,0xDA,0x5E,0xD7,0xD8,0xFE,0xF7,0xF6,0xD7,0xF7,0x9D,0xBD, + 0xF7,0xF6,0xB7,0xEE,0xAA,0xFE,0x5F,0x77,0xD7,0xF6,0x96,0xEE,0x00,0xAA,0xEF,0xDF, + 0xD7,0xF6,0x76,0xEE,0xA8,0xE2,0xEB,0xFF,0xB7,0xF6,0x55,0xE6,0xE8,0xFC,0xFC,0xFE, + 0x76,0xEE,0x55,0xE6,0x8E,0xAE,0xA8,0x00,0x96,0xEE,0x76,0xEE,0x7D,0x75,0xD5,0x55, + 0x76,0xEE,0x56,0xEE,0xBE,0xF4,0x9E,0xFA,0x75,0xEE,0x56,0xEE,0xD5,0xF5,0xAD,0xBB, + 0x76,0xEE,0x35,0xE6,0xFA,0xFA,0x82,0xA0,0x55,0xEE,0x14,0xE6,0xF2,0xF8,0x20,0x00, + 0x55,0xEE,0x14,0xDE,0xAF,0xDF,0xBE,0xB0,0x75,0xEE,0x35,0xE6,0xAB,0x2B,0x2B,0xAD, + 0x96,0xEE,0x76,0xEE,0xBF,0x2F,0x8F,0xEF,0xB6,0xF6,0x75,0xEE,0xAF,0xBF,0xBA,0x2A, + 0x96,0xEE,0x55,0xE6,0xFC,0x7B,0xB8,0x28,0x96,0xEE,0x55,0xE6,0x2B,0xAF,0x2B,0x00, + 0x95,0xEE,0x76,0xEE,0x6B,0xFB,0xF2,0xE2,0x96,0xEE,0x14,0xE6,0xE8,0xE0,0x62,0xF8, + 0x34,0xE6,0xF4,0xDD,0xF0,0xF8,0xFF,0xD7,0x14,0xE6,0xF4,0xDD,0x02,0xBA,0xFB,0x5D, + 0x14,0xE6,0xD3,0xDD,0xA0,0xBE,0xD7,0xD6,0xD3,0xE5,0xF4,0xDD,0x5D,0xDD,0xEF,0xFF, + 0x14,0xE6,0xD3,0xD5,0x02,0x02,0xE2,0x68,0xB3,0xD5,0xAF,0xBC,0xF0,0x78,0x58,0x5E, + 0xCF,0xBC,0x8E,0xB4,0xB8,0xA8,0xDF,0xED,0xAF,0xBC,0x4D,0xAC,0x00,0xA8,0xFA,0x58, + 0xAF,0xBC,0x0C,0xA4,0xA8,0xEA,0xEE,0x7F,0x8F,0xB4,0x0D,0xA4,0x2E,0xBD,0xB5,0xB5, + 0x11,0xC5,0x6F,0xB4,0x2A,0x2B,0x2D,0xAF,0x72,0xD5,0x10,0xC5,0xAA,0xAF,0x0D,0x35, + 0xB3,0xD5,0xF0,0xC4,0x5F,0x7E,0x7A,0xAA,0xF0,0xC4,0x0D,0xA4,0x58,0x58,0xD8,0xD8, + 0x31,0xCD,0x6E,0xB4,0x09,0x29,0x8D,0x89,0x31,0xCD,0xF0,0xC4,0xD0,0xF2,0x80,0x02, + 0x72,0xCD,0x31,0xCD,0xB5,0x0D,0x2D,0x2F,0x92,0xD5,0x51,0xCD,0xBF,0xEA,0xFB,0xFF, + 0x92,0xD5,0x51,0xCD,0xA3,0xDA,0xDE,0xAC,0x71,0xD5,0x51,0xCD,0xF8,0xF8,0xEC,0x30, + 0xA7,0x7A,0x46,0x7A,0xBB,0x28,0x92,0x82,0xA7,0x7A,0x45,0x72,0xEA,0x10,0xAA,0xAA, + 0xA7,0x7A,0x45,0x72,0xAA,0x85,0xAA,0xA2,0xA7,0x7A,0x45,0x6A,0xFE,0xDC,0xB2,0xAA, + 0xA7,0x7A,0x66,0x72,0x69,0xE9,0xA6,0x9A,0xA7,0x7A,0x46,0x72,0xAB,0xBA,0x6B,0x8F, + 0xA7,0x7A,0x46,0x72,0x57,0x5B,0xF7,0xD7,0x87,0x7A,0x46,0x72,0x55,0x6B,0xFA,0xA2, + 0x66,0x72,0x25,0x6A,0x9F,0x7E,0x5B,0x28,0xA7,0x7A,0x25,0x6A,0x0A,0xAD,0xFD,0xFF, + 0xC7,0x82,0x25,0x6A,0x00,0x8A,0xBF,0x57,0xE8,0x8A,0x66,0x72,0x8A,0xA0,0xEE,0xF5, + 0xE8,0x82,0xA7,0x7A,0xEC,0x1D,0xBD,0x55,0x08,0x8B,0xA7,0x7A,0xFF,0xDF,0xAB,0xBA, + 0xE8,0x82,0xA7,0x82,0x09,0x0B,0xC2,0x9F,0xE8,0x82,0xA7,0x7A,0xAA,0xBD,0xEB,0xA3, + 0x09,0x83,0xA7,0x7A,0xE8,0xFA,0xBF,0xBB,0xE9,0x82,0xC8,0x82,0x0F,0xD5,0x5B,0x42, + 0x09,0x8B,0xA7,0x7A,0xE2,0xEA,0xD8,0xDF,0xE8,0x8A,0xA7,0x7A,0x2B,0xBB,0x3D,0xAF, + 0xE8,0x8A,0xC8,0x82,0xBC,0x96,0xEE,0xFC,0x08,0x8B,0xC8,0x82,0x77,0xD4,0x5D,0xB7, + 0x09,0x8B,0xC8,0x82,0x95,0xD8,0xF8,0xFF,0x09,0x8B,0xA7,0x82,0xBE,0xFA,0xF8,0xDE, + 0xE8,0x8A,0xA8,0x82,0xBA,0xEA,0xAB,0x0A,0x09,0x8B,0xA7,0x82,0xBC,0xBB,0x6B,0xAB, + 0x08,0x83,0xA7,0x7A,0xFF,0x7F,0xFF,0xF8,0xA7,0x7A,0x84,0x51,0xF8,0x7A,0x78,0x5E, + 0xA4,0x59,0x23,0x41,0x78,0xFA,0xFF,0x57,0x84,0x49,0x23,0x49,0xAB,0x2D,0x9C,0xFD, + 0xC5,0x59,0x64,0x51,0xBA,0xBF,0x3B,0xFD,0xC5,0x61,0x84,0x59,0x3E,0xBF,0xAB,0xBB, + 0x26,0x72,0xC5,0x61,0xA5,0xAB,0x09,0x09,0xE8,0x8A,0x26,0x72,0xBD,0xAF,0x0F,0xAB, + 0xE9,0x92,0xA8,0x8A,0x2B,0x83,0xAA,0xEC,0xC8,0x92,0x46,0x7A,0xE8,0xF8,0xFE,0x7E, + 0x88,0x82,0x05,0x72,0xB0,0xDE,0x7F,0xFE,0x46,0x7A,0xE5,0x69,0xEA,0xBA,0x7F,0xEC, + 0x26,0x72,0xC5,0x69,0x00,0x0A,0x3E,0xDE,0x26,0x72,0xC5,0x61,0x88,0xE8,0xFA,0xBF, + 0x26,0x72,0x84,0x59,0x00,0xFE,0xFB,0x7E,0x26,0x72,0x84,0x59,0xE8,0xBE,0x5F,0x5D, + 0xA5,0x59,0x23,0x49,0xAA,0xFC,0x78,0xEA,0x64,0x51,0x02,0x49,0x48,0xEA,0xCF,0x80, + 0x84,0x51,0x03,0x49,0xDD,0xBB,0xEA,0x2A,0x64,0x49,0x23,0x49,0xFF,0x5C,0xDF,0x97, + 0x43,0x49,0x02,0x49,0x28,0xE8,0xEA,0x00,0xC5,0x59,0x23,0x49,0xAF,0x2D,0xBF,0x09, + 0x27,0x6A,0xA4,0x59,0xFD,0xBD,0xA9,0x2E,0x47,0x6A,0xE5,0x61,0x8D,0x02,0xB0,0xFF, + 0x67,0x72,0xE5,0x61,0x80,0xF2,0x7B,0xDD,0x46,0x72,0xC5,0x61,0x7E,0xE2,0xAA,0xFA, + 0xA5,0x59,0x43,0x49,0x7E,0xD8,0x50,0x70,0xA5,0x59,0x02,0x41,0xFF,0xB7,0x2F,0x0B, + 0xC5,0x61,0x44,0x51,0xAD,0xAB,0xA2,0x08,0x67,0x7A,0xA5,0x61,0x2D,0x0D,0xBD,0xB9, + 0x87,0x82,0x26,0x72,0x5F,0x57,0xAF,0x81,0x2A,0x93,0x26,0x72,0xAD,0x2D,0x2D,0xAF, + 0x2A,0x93,0xC7,0x8A,0xEA,0x60,0xE8,0x62,0xC8,0x8A,0x27,0x72,0xFE,0xF8,0xF8,0x58, + 0xE9,0x8A,0x47,0x7A,0xBD,0x35,0x2D,0x3D,0xE9,0x8A,0x46,0x72,0xBF,0xFE,0xF8,0x60, + 0xA8,0x82,0x06,0x6A,0x20,0x22,0xBA,0x5F,0xA8,0x7A,0xC5,0x61,0x88,0xAA,0xEE,0xD5, + 0xC8,0x82,0x06,0x6A,0x02,0x02,0x2B,0xB5,0x2A,0x8B,0x87,0x7A,0x2E,0x2E,0x3F,0x95, + 0xB3,0xDD,0x6B,0x93,0x0B,0x2D,0x35,0xF5,0x56,0xEE,0x93,0xDD,0x00,0x02,0x0B,0x09, + 0x76,0xEE,0x35,0xE6,0xBA,0xF8,0xB8,0xFE,0xB7,0xF6,0x55,0xEE,0x2D,0x2D,0x2D,0xAD, + 0xF7,0xFE,0xB7,0xF6,0x02,0x0B,0x03,0x8B,0xD6,0xFE,0xF8,0xF6,0xFD,0xD5,0x7D,0xFD, + 0x18,0xFF,0xF8,0xF6,0x02,0x0A,0x0D,0x2D,0x18,0xFF,0xF8,0xF6,0x00,0x80,0x80,0xA0, + 0x18,0xFF,0xF8,0xF6,0x82,0xA0,0xCA,0xAA,0x18,0xFF,0xF8,0xF6,0xFF,0xD7,0xFD,0x7F, + 0x18,0xFF,0xF8,0xF6,0x5E,0x5B,0xDF,0xD5,0xD7,0xFE,0xF8,0xF6,0x5B,0x5F,0x57,0x75, + 0xF7,0xF6,0xD8,0xF6,0x9C,0xA0,0x2A,0xAA,0xD7,0xFE,0xF7,0xF6,0xDF,0xDD,0xDF,0xFF, + 0xD8,0xFE,0xF7,0xF6,0x57,0x5D,0x5F,0xFF,0x18,0xFF,0xF7,0xF6,0x55,0xD5,0xFF,0xFD, + 0x18,0xFF,0xF7,0xF6,0x57,0xDD,0x36,0xAF,0x18,0xFF,0xF8,0xF6,0xE3,0xAA,0xEC,0xFA, + 0x18,0xFF,0xF8,0xF6,0xAF,0xAB,0xAB,0xAB,0x18,0xFF,0xF8,0xF6,0xFF,0xDE,0xFF,0xEA, + 0x18,0xFF,0xF8,0xF6,0xFF,0x7F,0x5F,0xFE,0x18,0xFF,0xD8,0xF6,0xAA,0xBA,0xF2,0xFA, + 0xF8,0xF6,0xD7,0xF6,0x20,0xB8,0xFB,0x5F,0xF8,0xF6,0xB7,0xEE,0xA0,0xCA,0xEE,0x5E, + 0xD7,0xF6,0x96,0xEE,0x78,0xFA,0xFE,0xFE,0xB6,0xF6,0x76,0xEE,0xFA,0xEE,0xFA,0xDE, + 0x96,0xEE,0x55,0xE6,0xE8,0xEA,0x78,0x7E,0x96,0xEE,0x55,0xE6,0xEA,0xFA,0xAF,0x2D, + 0x96,0xEE,0x76,0xEE,0xFD,0xFD,0xE7,0x7B,0x76,0xEE,0x55,0xEE,0x30,0xA0,0x20,0xAE, + 0x76,0xEE,0x56,0xEE,0xFB,0xAA,0xF8,0xBC,0x76,0xEE,0x55,0xEE,0xAF,0xB7,0xEA,0xE8, + 0x76,0xEE,0x55,0xEE,0x82,0x80,0x3B,0x2D,0x76,0xEE,0x55,0xEE,0xD7,0x52,0x68,0x98, + 0x55,0xEE,0x35,0xE6,0x58,0x72,0xE0,0x20,0x55,0xEE,0x14,0xE6,0x0B,0x15,0x9F,0x9C, + 0x96,0xEE,0x35,0xEE,0xA2,0xAB,0xFF,0xE7,0xB7,0xF6,0x34,0xE6,0x82,0xAE,0x7F,0x55, + 0xB7,0xF6,0x35,0xE6,0x2A,0xAE,0xFD,0x55,0x96,0xEE,0x55,0xEE,0x20,0xA0,0xD7,0xD5, + 0x96,0xEE,0x55,0xEE,0x22,0x2E,0x2F,0x2A,0x96,0xF6,0xF3,0xDD,0x68,0x68,0x68,0xF8, + 0x14,0xE6,0xD3,0xDD,0xB7,0xEF,0xAB,0xAA,0x14,0xE6,0xD3,0xDD,0xFF,0xDB,0xE6,0xFB, + 0x14,0xE6,0xD3,0xDD,0xF7,0x75,0xF5,0xAE,0x14,0xE6,0xF4,0xDD,0x79,0xC3,0xE9,0x6B, + 0xF4,0xE5,0x31,0xCD,0x80,0xE0,0x70,0x70,0x31,0xC5,0xAF,0xBC,0x58,0x5F,0xB7,0xFE, + 0xF0,0xC4,0x8E,0xB4,0x57,0xFB,0xAE,0x82,0xF0,0xC4,0x4D,0xAC,0xDE,0xFF,0xEA,0xE2, + 0xAF,0xBC,0x0C,0xA4,0x5F,0xF6,0x88,0x00,0x8E,0xB4,0xAB,0x9B,0xBF,0x2E,0x28,0xA8, + 0xD0,0xBC,0x8E,0xB4,0xE3,0xAB,0xFB,0xBF,0x31,0xC5,0x8E,0xB4,0x2A,0xAD,0xFD,0xD7, + 0x71,0xCD,0x6E,0xB4,0x00,0x80,0xFF,0x5F,0x10,0xC5,0x2C,0xAC,0x78,0xDC,0x57,0x95, + 0x31,0xCD,0x8E,0xB4,0x29,0x89,0x0B,0x0B,0x31,0xCD,0x10,0xC5,0x3C,0x17,0xD7,0xAF, + 0x92,0xD5,0x31,0xCD,0x8F,0x2D,0xA7,0xA5,0x92,0xD5,0x51,0xCD,0xBB,0x18,0xBA,0xAE, + 0x92,0xD5,0x51,0xCD,0xAA,0xEF,0x8E,0xF2,0x92,0xD5,0x51,0xCD,0x9E,0xDE,0xFB,0xE2, + 0xC7,0x7A,0x66,0x72,0x89,0xCB,0xFF,0xFF,0xA7,0x7A,0x86,0x7A,0x92,0xA2,0x9E,0x0B, + 0xA7,0x7A,0x66,0x72,0xA0,0xF0,0x38,0xF8,0x67,0x7A,0x86,0x72,0x5D,0x5B,0xDB,0x75, + 0xC7,0x7A,0x86,0x72,0x55,0xF7,0xEB,0xDF,0xA7,0x7A,0x66,0x72,0x2A,0x0A,0x28,0x3E, + 0xA7,0x7A,0x67,0x72,0x7A,0xFE,0xFF,0x88,0x86,0x7A,0x65,0x6A,0x02,0x08,0xB2,0x82, + 0xA7,0x7A,0x45,0x72,0xF7,0xD7,0xBB,0x2C,0x87,0x7A,0x46,0x72,0x7E,0x68,0xAA,0x8A, + 0x87,0x7A,0x46,0x72,0xFF,0xA3,0x08,0x08,0x86,0x7A,0x66,0x72,0xA5,0xFB,0xED,0xFF, + 0x86,0x7A,0x46,0x72,0x02,0x5F,0x57,0x7E,0xC8,0x82,0x25,0x6A,0x22,0xAF,0xBF,0xDF, + 0xE8,0x82,0x45,0x72,0x0A,0x80,0xAF,0x7D,0xE8,0x82,0x87,0x7A,0xA0,0x82,0xA2,0x3F, + 0xE9,0x8A,0xC8,0x82,0x2D,0x37,0xDF,0xDE,0xE8,0x8A,0xC8,0x82,0x62,0xC4,0x6A,0xAE, + 0x09,0x8B,0xC8,0x82,0x59,0xF3,0xED,0x16,0xE8,0x8A,0xA8,0x82,0xAF,0x2B,0xFE,0xC8, + 0xE8,0x8A,0xA7,0x82,0x3C,0x28,0x20,0xED,0xE8,0x8A,0xC8,0x82,0xB0,0xC8,0xE2,0xC1, + 0xE8,0x8A,0xC8,0x82,0x78,0x5E,0x40,0xBA,0x09,0x93,0xA7,0x82,0xDF,0xAE,0x2A,0xE6, + 0xE8,0x8A,0xA7,0x82,0x29,0x00,0x82,0x0B,0xE8,0x8A,0xC8,0x82,0x0B,0xDE,0xA6,0xE8, + 0xE8,0x82,0x66,0x72,0xE0,0x70,0x74,0x7A,0x66,0x72,0x84,0x51,0x58,0x5E,0x5A,0x78, + 0x64,0x51,0xE2,0x40,0xFC,0xF6,0x7E,0xFE,0x44,0x49,0xE2,0x38,0x02,0x3F,0xBF,0x57, + 0x84,0x51,0xE2,0x38,0x82,0x2F,0xFF,0xD5,0xA4,0x59,0x02,0x41,0x02,0x2B,0x2F,0x0D, + 0x46,0x72,0xC5,0x61,0x0D,0x0D,0x2F,0xA5,0xC8,0x8A,0x25,0x72,0x0B,0x0D,0xAF,0x25, + 0x29,0x93,0xA7,0x82,0xFB,0xBB,0x09,0xAF,0x09,0x93,0x67,0x82,0x5E,0xEA,0xA0,0xE8, + 0x88,0x82,0x06,0x72,0xEA,0xE0,0xFA,0x7C,0x67,0x7A,0x26,0x72,0x72,0xF2,0xCD,0xAD, + 0x47,0x7A,0xA4,0x61,0x7A,0x7A,0xA0,0xE8,0xE6,0x69,0x44,0x51,0x0A,0xEA,0xD8,0x7E, + 0xE5,0x69,0x43,0x51,0xA0,0xA3,0x6B,0xD5,0xA5,0x61,0x23,0x49,0xE8,0xEB,0x7B,0x5A, + 0x85,0x51,0x03,0x49,0x2A,0xBF,0xDD,0x7F,0x85,0x51,0x03,0x49,0xAA,0x0F,0xFF,0xBD, + 0x64,0x49,0x23,0x49,0xA2,0x88,0x80,0x63,0x84,0x51,0x02,0x41,0xF7,0xDF,0xFF,0x2F, + 0xA5,0x51,0x43,0x49,0xD5,0xD5,0xA7,0x88,0x06,0x62,0x84,0x51,0x25,0xBD,0xED,0x5D, + 0x06,0x62,0x64,0x51,0x20,0xB8,0xEB,0xFD,0x06,0x62,0x84,0x51,0x20,0xAB,0xA7,0xD5, + 0x06,0x62,0xA5,0x51,0xAB,0xAF,0xCF,0xDD,0x06,0x62,0x84,0x51,0x40,0xCA,0xEB,0x5F, + 0xA5,0x59,0x23,0x49,0xFA,0xFE,0x9F,0x3F,0x06,0x6A,0x64,0x51,0xB5,0xF5,0xBB,0x8B, + 0xE5,0x69,0xC5,0x61,0x5E,0x7F,0x7D,0xAE,0x67,0x7A,0xC5,0x61,0x5F,0xF5,0xBD,0x0B, + 0xA8,0x82,0x47,0x7A,0x25,0x25,0xF7,0x7A,0xE9,0x8A,0x47,0x72,0x2A,0x2A,0xBD,0xDD, + 0xE9,0x8A,0x88,0x82,0xE0,0x5A,0x58,0xCB,0xA8,0x82,0x27,0x72,0x58,0x7E,0xBC,0xFA, + 0x88,0x7A,0x26,0x72,0x2F,0xDF,0xF5,0xE5,0xA8,0x82,0xC4,0x61,0xA0,0xAA,0xEA,0x7A, + 0x06,0x6A,0xE2,0x40,0xA0,0xA8,0xFA,0x7E,0xC6,0x61,0x23,0x49,0x2A,0x0F,0x2D,0xB5, + 0x47,0x72,0xA5,0x59,0x0A,0xAF,0xDF,0xF5,0xC8,0x82,0xE5,0x61,0x0A,0x2F,0x2D,0xAD, + 0x2E,0xAC,0x88,0x7A,0x2F,0x2F,0xBD,0xF5,0xF4,0xE5,0x6A,0x9B,0x02,0x0B,0x0F,0xB5, + 0x55,0xEE,0x52,0xD5,0x00,0x00,0xAA,0xBD,0xB7,0xFE,0x14,0xE6,0x2B,0x0B,0x2F,0x2D, + 0xF8,0xFE,0xB7,0xFE,0x0B,0x2B,0x2A,0x2B,0xF8,0xFE,0xB7,0xF6,0xA8,0xAA,0x3E,0x9E, + 0x18,0xFF,0xB8,0xF6,0x0A,0x0A,0x2A,0x8B,0x18,0xFF,0xF8,0xF6,0xA2,0x80,0x80,0x80, + 0x18,0xFF,0xF8,0xF6,0xA2,0x8E,0xFA,0xEA,0x17,0xFF,0xF8,0xF6,0x7E,0xFF,0xFF,0xFF, + 0xD8,0xFE,0xF7,0xF6,0x56,0x7F,0x77,0x75,0xF7,0xFE,0xF8,0xF6,0xFF,0xFF,0xEF,0xFB, + 0xF7,0xF6,0xD7,0xF6,0xAB,0x8B,0xE2,0xB0,0xF7,0xF6,0xD8,0xF6,0xA8,0x0E,0x2A,0x8E, + 0xF8,0xFE,0xF7,0xF6,0xFF,0xFF,0xBF,0xFF,0x18,0xFF,0xD7,0xF6,0xFF,0xEB,0xEA,0xAA, + 0x18,0xFF,0xF7,0xF6,0xFB,0xFD,0xFF,0x7F,0xF8,0xFE,0x18,0xF7,0xAE,0xAA,0xEA,0xBE, + 0x18,0xFF,0xF8,0xF6,0xFB,0xFE,0xFE,0xDF,0xF8,0xFE,0x18,0xF7,0xAA,0xB8,0xAA,0xAA, + 0x18,0xFF,0xF8,0xF6,0xFF,0x7F,0x5E,0x76,0x18,0xFF,0xD7,0xF6,0xFA,0xFA,0xFE,0xEF, + 0xF7,0xF6,0xD7,0xF6,0x76,0x7E,0xBF,0x77,0xD7,0xF6,0xB7,0xF6,0x7C,0x70,0xA0,0xF8, + 0xB7,0xF6,0x96,0xEE,0xE8,0xEE,0x78,0xF0,0x96,0xEE,0x76,0xEE,0xD8,0xF0,0x7B,0x56, + 0x75,0xEE,0x35,0xE6,0xF8,0x7E,0xEA,0xFA,0x75,0xEE,0x35,0xE6,0x0B,0xAB,0xBF,0xFD, + 0x55,0xEE,0x76,0xE6,0xBD,0x02,0x02,0x22,0x76,0xEE,0x55,0xEE,0xCE,0xDE,0xD5,0xD5, + 0x76,0xEE,0x55,0xEE,0xFF,0x87,0x3A,0xF2,0x75,0xEE,0x56,0xEE,0xFB,0xEF,0xF7,0x55, + 0x76,0xEE,0x55,0xEE,0xAD,0xBD,0xF9,0xB0,0x76,0xEE,0x55,0xEE,0x68,0xEB,0x2A,0xBE, + 0x76,0xEE,0x14,0xE6,0xEA,0xA0,0x2A,0x20,0x55,0xEE,0x14,0xE6,0xE0,0xF0,0xF0,0xF0, + 0x55,0xEE,0x14,0xE6,0xAB,0xF9,0xD5,0xFF,0x35,0xE6,0x14,0xE6,0xFA,0xD7,0xB4,0xF8, + 0x55,0xEE,0x14,0xE6,0xBB,0x3F,0xBB,0x3F,0x96,0xF6,0x55,0xE6,0x9D,0xAF,0x0B,0x22, + 0x96,0xF6,0x75,0xEE,0x89,0xAB,0xC0,0xE0,0x96,0xF6,0xF3,0xDD,0x78,0x5E,0x5C,0x5E, + 0x14,0xE6,0xD3,0xDD,0xAF,0x3F,0x95,0xAD,0x34,0xE6,0xF4,0xE5,0xDD,0x8B,0x8F,0xB7, + 0x35,0xE6,0xF3,0xDD,0xFE,0xEE,0xB8,0x7A,0x14,0xE6,0xF4,0xDD,0xB2,0x20,0x20,0xF9, + 0x14,0xE6,0x31,0xCD,0x78,0x68,0xF8,0x78,0x51,0xCD,0xF0,0xC4,0x5F,0x55,0x5C,0x7A, + 0xF0,0xC4,0xCF,0xBC,0x0A,0x03,0x69,0x42,0xF0,0xC4,0xAF,0xBC,0xEA,0xEF,0xF4,0x77, + 0xD0,0xC4,0xAE,0xB4,0xBD,0x2F,0x2A,0x83,0xCF,0xBC,0xEC,0xA3,0xF8,0x58,0x78,0x60, + 0xCF,0xBC,0xEC,0xA3,0x82,0xAB,0xAF,0xAD,0xAF,0xBC,0x2D,0xAC,0xA8,0xEE,0x7F,0x5F, + 0x8E,0xB4,0xEC,0xA3,0xA0,0xEB,0xFE,0x77,0xCF,0xBC,0xEC,0x9B,0xBF,0xBD,0x3F,0x3D, + 0x31,0xCD,0xD0,0xBC,0x2D,0x2B,0x8B,0x8E,0x31,0xCD,0x10,0xC5,0x24,0xF4,0xD7,0x6B, + 0x72,0xD5,0x10,0xC5,0x2B,0x2B,0xFD,0xFF,0x72,0xD5,0x31,0xCD,0xA8,0xA2,0xA4,0xFF, + 0x92,0xD5,0x31,0xCD,0xAA,0x83,0xFE,0xDB,0x92,0xD5,0x31,0xCD,0xA2,0xFA,0xAD,0xF9, + 0xA7,0x7A,0x45,0x6A,0x28,0xAF,0x3F,0xD5,0xC7,0x7A,0x65,0x6A,0x2A,0xBA,0xAE,0xDB, + 0xA7,0x7A,0x66,0x72,0xA8,0xEA,0xAA,0xED,0xA7,0x7A,0x86,0x72,0x56,0xBF,0xA2,0xC2, + 0xC7,0x7A,0x86,0x72,0xFF,0x7E,0xFB,0xAB,0xC7,0x7A,0x66,0x72,0xB7,0xB3,0xBB,0xDE, + 0xA7,0x7A,0x87,0x72,0xAA,0x38,0xBA,0xBE,0xC8,0x82,0x66,0x72,0xE5,0xBF,0x0B,0xAA, + 0xA7,0x7A,0x66,0x72,0xFF,0xE2,0xF0,0x0A,0xC7,0x82,0x66,0x72,0xFE,0xE2,0xEB,0xB6, + 0xA7,0x7A,0x46,0x72,0x8E,0xEB,0xAA,0x9A,0xA7,0x7A,0x66,0x72,0xD3,0xD7,0xBB,0xAE, + 0x87,0x7A,0x45,0x72,0x6A,0xB8,0x28,0x00,0x87,0x7A,0x45,0x72,0x7B,0xE3,0x72,0xC0, + 0x86,0x7A,0x45,0x72,0xFD,0x25,0xFB,0xDF,0x87,0x7A,0x25,0x6A,0x3F,0xB7,0xA7,0xA2, + 0xC8,0x82,0x45,0x72,0x03,0x27,0xF5,0xF7,0xE8,0x8A,0x46,0x72,0x88,0xAA,0x3F,0x55, + 0xE8,0x8A,0x66,0x72,0x2A,0xA0,0xAA,0xBD,0xE8,0x82,0xA7,0x82,0x8A,0x6F,0x89,0xBB, + 0xE8,0x82,0xA7,0x7A,0x77,0x6D,0x2B,0xAA,0x08,0x8B,0xA7,0x82,0xFD,0xF5,0xBF,0x1E, + 0xE8,0x8A,0xC8,0x82,0xFB,0x5E,0xEB,0x62,0x08,0x8B,0xA7,0x82,0xA6,0x8B,0xAB,0x6D, + 0xE8,0x82,0xA8,0x82,0xAC,0xBB,0xFA,0xFA,0xE8,0x82,0x87,0x7A,0x6A,0x68,0x2A,0x02, + 0xE8,0x82,0x86,0x72,0x7F,0xEA,0xFC,0xE8,0xA7,0x7A,0x83,0x51,0x7E,0x78,0x78,0x78, + 0x43,0x49,0xE2,0x38,0xFE,0xFC,0x7A,0xFC,0x03,0x41,0xE2,0x38,0xFE,0x9E,0x5D,0x77, + 0xE2,0x38,0x81,0x30,0xAA,0xDA,0xAA,0xAC,0x64,0x51,0xC2,0x38,0x0F,0x2D,0xF5,0x55, + 0xE5,0x69,0x03,0x49,0x02,0x0A,0xAF,0xBD,0x87,0x82,0xA4,0x61,0x2B,0xAF,0xF5,0x55, + 0x09,0x93,0x26,0x72,0x2A,0x2B,0xFF,0xD5,0x09,0x93,0x27,0x7A,0xE8,0x6A,0xDF,0x57, + 0x88,0x82,0x06,0x72,0xFE,0xDD,0x9E,0x22,0x67,0x7A,0x06,0x6A,0xEF,0xFF,0x7E,0x58, + 0x06,0x6A,0xC5,0x69,0x68,0x5C,0x7F,0x97,0x26,0x72,0x84,0x59,0x57,0x7F,0xBA,0x0A, + 0xE5,0x69,0x43,0x51,0xF5,0xBF,0xBA,0xA0,0xC5,0x61,0x23,0x49,0x7E,0xFE,0xF8,0xE8, + 0x43,0x49,0x03,0x49,0xEA,0xAE,0xEC,0x9E,0x43,0x49,0x02,0x41,0x0D,0x8A,0x0A,0x00, + 0x64,0x49,0x23,0x49,0xEB,0xAB,0x3A,0x8A,0x85,0x51,0x23,0x41,0x2B,0x0E,0xBE,0x57, + 0xA5,0x59,0x03,0x41,0x80,0xA2,0xFE,0x75,0x64,0x49,0x23,0x41,0x00,0xF4,0x7F,0x65, + 0x84,0x51,0x23,0x41,0xF2,0xEF,0xBF,0xDD,0x84,0x51,0x23,0x41,0x0A,0x7E,0xDE,0xFF, + 0xA5,0x59,0x23,0x41,0x0A,0x2A,0xD7,0x55,0xC5,0x59,0x03,0x41,0xC8,0xFA,0xF5,0x55, + 0xE6,0x61,0x43,0x49,0xB5,0x3F,0x3D,0x2D,0x67,0x7A,0xE6,0x69,0xAF,0x0D,0xA8,0xB9, + 0x67,0x7A,0x06,0x6A,0x5F,0xEC,0x8B,0xA0,0xC8,0x82,0x26,0x72,0xBD,0xBD,0x2D,0xEA, + 0xEA,0x8A,0x47,0x72,0x7A,0xFA,0xE8,0xF8,0x67,0x7A,0xC6,0x69,0x8A,0xBB,0xF8,0x78, + 0xC9,0x8A,0xE5,0x69,0x8A,0xAB,0xDF,0x75,0x68,0x7A,0xC5,0x61,0x00,0x00,0x8A,0xFD, + 0x68,0x7A,0xC5,0x59,0x88,0xE0,0xEA,0x7E,0x47,0x72,0x03,0x49,0xA0,0xEA,0xFA,0x5F, + 0x64,0x51,0x02,0x41,0x58,0x7E,0xEE,0xBF,0xA5,0x59,0x03,0x49,0xAD,0x2D,0x2F,0x2F, + 0xE5,0x61,0x85,0x51,0xEF,0xA5,0x2B,0xAA,0x47,0x72,0xC4,0x61,0x09,0x8F,0xEE,0xBA, + 0xA8,0x7A,0x05,0x6A,0x0B,0xFF,0xF5,0xBD,0xAC,0xA3,0x46,0x72,0x2F,0xBD,0xFD,0xFF, + 0x11,0xCD,0x46,0x72,0x02,0xAF,0xFF,0x5F,0x93,0xDD,0x87,0x7A,0x00,0x2A,0xFF,0x55, + 0xB7,0xFE,0x6A,0x9B,0x00,0xAA,0xFF,0x55,0x97,0xF6,0x4D,0xB4,0x00,0x00,0xBF,0xD5, + 0xF8,0xFE,0x92,0xD5,0x00,0x02,0x0B,0x2D,0x18,0xFF,0xF8,0xFE,0xBF,0xBE,0xB7,0xD5, + 0x18,0xFF,0xF8,0xF6,0xEA,0xEA,0xBE,0xB7,0x18,0xFF,0xF8,0xF6,0xF7,0xFF,0xFA,0xAE, + 0xF8,0xFE,0xF7,0xF6,0xFF,0xBF,0xFF,0xFF,0x18,0xFF,0xD8,0xF6,0xEA,0xEE,0xFA,0x6E, + 0xF8,0xF6,0xD7,0xF6,0xA8,0xBE,0xAE,0xAE,0xF7,0xF6,0xD7,0xF6,0x3B,0xAB,0xAC,0x22, + 0xD8,0xFE,0x17,0xF7,0xEA,0xFA,0xBF,0xFF,0x18,0xFF,0xF7,0xF6,0xD7,0xBD,0xAF,0xAB, + 0x18,0xFF,0xF8,0xF6,0xFF,0xFA,0xEB,0xEA,0x18,0xFF,0xF8,0xF6,0xFE,0xFE,0xBF,0xF7, + 0x18,0xFF,0xF8,0xF6,0xFF,0x78,0xEA,0x6A,0xF8,0xFE,0x18,0xF7,0xAB,0xAE,0x8A,0xA8, + 0x18,0xFF,0xD8,0xF6,0xA9,0xAE,0xAE,0xEA,0xF7,0xF6,0xB7,0xF6,0xA0,0xE8,0x68,0x7A, + 0xD7,0xF6,0xB7,0xF6,0x00,0xA2,0xA9,0x0D,0xD7,0xF6,0xB7,0xF6,0xDC,0x55,0x76,0x56, + 0xB6,0xF6,0x96,0xEE,0xF8,0xFC,0x7E,0x56,0x96,0xEE,0x76,0xEE,0x5E,0xBA,0x80,0xA8, + 0x96,0xEE,0x55,0xE6,0x5F,0xFF,0xAE,0xA2,0x55,0xEE,0x35,0xE6,0xFE,0xFF,0xFE,0x18, + 0x76,0xEE,0x55,0xEE,0xEF,0xEA,0xAA,0x01,0x76,0xEE,0x55,0xEE,0xAD,0x29,0x00,0xA0, + 0xB5,0xF6,0x56,0xEE,0x5F,0xFF,0x7D,0xEF,0x76,0xEE,0x55,0xEE,0x95,0x55,0x7D,0xF7, + 0x76,0xEE,0x55,0xEE,0xFA,0xF8,0x27,0x37,0x76,0xEE,0x55,0xEE,0x9A,0xB2,0xBA,0xAA, + 0x76,0xEE,0x55,0xEE,0xF8,0x78,0xFB,0xD7,0x75,0xEE,0x15,0xE6,0xEA,0xAA,0xA8,0x08, + 0x55,0xEE,0x15,0xE6,0xFA,0xFE,0xFC,0xBE,0x55,0xEE,0x35,0xE6,0x5D,0xEB,0x2F,0x3F, + 0x55,0xEE,0x34,0xE6,0x15,0xE5,0xE0,0x40,0x96,0xF6,0x35,0xE6,0x03,0xAB,0x29,0xE5, + 0x96,0xF6,0x35,0xE6,0x88,0xF2,0xFA,0x7F,0x75,0xEE,0xD3,0xDD,0x58,0x7A,0x5E,0x56, + 0x14,0xE6,0xB3,0xD5,0xAB,0x3D,0xAF,0xDF,0x34,0xE6,0xF4,0xE5,0xFF,0xEB,0xAF,0xAD, + 0x35,0xE6,0xD3,0xDD,0x7A,0x7A,0x7A,0x8A,0x15,0xE6,0xB3,0xD5,0xBB,0xD5,0xF7,0xE8, + 0xD3,0xDD,0x30,0xCD,0xE0,0x60,0x78,0x60,0x51,0xCD,0xF0,0xC4,0xE8,0x7E,0x7F,0xFE, + 0x10,0xC5,0xAE,0xBC,0xFB,0xFF,0x5F,0xB8,0xF0,0xBC,0xAF,0xBC,0xD5,0x9E,0xA3,0xAE, + 0x10,0xC5,0xCF,0xBC,0xFB,0xF9,0xA9,0x92,0x31,0xCD,0x2D,0xAC,0x7A,0xE2,0x82,0x00, + 0x11,0xC5,0xAB,0x9B,0xB7,0xFF,0x7A,0x60,0x2D,0xAC,0x09,0x8B,0x80,0xAA,0xFF,0xF7, + 0xEC,0xA3,0x4A,0x8B,0xE8,0xFA,0xDF,0x55,0xD0,0xBC,0x8C,0x9B,0x2D,0x2D,0x0D,0x2D, + 0x10,0xC5,0xCF,0xBC,0x02,0x0B,0x0B,0x9D,0x10,0xC5,0xF0,0xC4,0x02,0x8C,0x76,0x67, + 0x51,0xCD,0xF0,0xC4,0xBA,0x2F,0x3F,0xBD,0x51,0xCD,0x31,0xCD,0x83,0xA7,0xD7,0xB7, + 0x72,0xD5,0x31,0xCD,0xA2,0xEF,0xDF,0x77,0x72,0xD5,0x30,0xCD,0xBB,0xEA,0xFE,0x55, + 0x46,0x6A,0x05,0x6A,0x2B,0xAB,0xAB,0xFF,0x86,0x72,0xE4,0x61,0x3E,0xB7,0xFF,0xFE, + 0xA7,0x7A,0x05,0x6A,0x8A,0xCF,0x7F,0x7D,0xA7,0x7A,0x05,0x62,0x82,0x22,0xAB,0xFD, + 0xA7,0x7A,0x46,0x6A,0x02,0x20,0xB2,0x3D,0xC7,0x7A,0x67,0x72,0xB4,0x9A,0xFC,0xEA, + 0xA7,0x7A,0x46,0x72,0x02,0x00,0xA2,0x60,0xC8,0x7A,0x66,0x72,0xF8,0xFA,0x7F,0xFB, + 0xC7,0x82,0x66,0x72,0xBF,0xA7,0x3F,0xBF,0xC7,0x7A,0x86,0x7A,0xD5,0x79,0x77,0xF7, + 0xA7,0x7A,0x46,0x72,0x9F,0xEE,0x80,0x28,0xA7,0x7A,0x66,0x72,0xBA,0xE7,0x1F,0x23, + 0xA7,0x7A,0x87,0x7A,0x3E,0x9C,0x9B,0xE9,0xA7,0x7A,0x66,0x72,0x7A,0x57,0xBC,0xB4, + 0x66,0x7A,0xA7,0x72,0x2E,0xBE,0xBE,0xAE,0xC7,0x82,0x46,0x72,0x5F,0xEF,0xAB,0x2B, + 0xA7,0x7A,0x66,0x72,0x5F,0xDE,0xDC,0xC2,0x87,0x7A,0x46,0x72,0x7A,0x78,0xFF,0xA3, + 0xA7,0x82,0x46,0x72,0xBD,0xD7,0xAF,0x8A,0xA7,0x82,0x46,0x72,0x22,0xBB,0x7F,0xF9, + 0xE8,0x8A,0x46,0x72,0x02,0xAE,0xF7,0x75,0x09,0x8B,0x66,0x72,0x82,0xAA,0xBB,0xD5, + 0x09,0x8B,0x87,0x7A,0x8A,0xEF,0xAF,0xFD,0xE8,0x82,0xA7,0x7A,0x7E,0x2F,0x0B,0x0B, + 0x29,0x8B,0xC8,0x82,0xD5,0x9D,0xBF,0xF2,0x08,0x8B,0xA7,0x7A,0xAA,0xA2,0xE0,0xDA, + 0xE8,0x82,0xA7,0x7A,0xE8,0xBF,0xAE,0xBE,0xC7,0x7A,0xA3,0x59,0x78,0xE0,0xA0,0x80, + 0x05,0x62,0xE2,0x40,0x5E,0x5E,0x5A,0xF8,0x03,0x41,0xE2,0x38,0x77,0x0E,0xBE,0xFD, + 0x02,0x41,0xA1,0x30,0xFE,0xFC,0xF6,0xFE,0xE2,0x38,0x81,0x30,0xAA,0xAF,0xFF,0xDB, + 0x44,0x51,0xA2,0x38,0x0B,0xAF,0xBD,0xF5,0x84,0x61,0xC2,0x40,0x00,0xAB,0xFF,0x55, + 0xC5,0x69,0x03,0x49,0x02,0xBB,0xDF,0xE5,0x47,0x7A,0x84,0x61,0x3B,0x3F,0x35,0x2D, + 0x88,0x82,0x26,0x72,0x8E,0xA7,0xAE,0x08,0xA8,0x82,0xC5,0x69,0x7E,0x7A,0xBA,0x00, + 0x88,0x82,0xE5,0x69,0x55,0x57,0xBF,0x28,0x67,0x7A,0xE5,0x69,0xBD,0x5D,0xB7,0x00, + 0xA8,0x82,0xE5,0x61,0x57,0xFF,0xAB,0x82,0x87,0x7A,0x63,0x51,0x5F,0x7E,0xFA,0xA8, + 0xA5,0x59,0x23,0x49,0xD7,0xFF,0xFA,0xE0,0x64,0x51,0x43,0x49,0x65,0xFA,0xF8,0x7D, + 0x64,0x51,0x03,0x41,0xA0,0xA2,0xF2,0x7E,0x23,0x49,0xC2,0x30,0xB8,0xFA,0x5A,0xFA, + 0x23,0x41,0xE2,0x38,0x2B,0x2B,0x8B,0xA5,0x64,0x49,0x03,0x41,0x3F,0xED,0xFA,0x7B, + 0x43,0x49,0xE3,0x38,0x28,0xA2,0xFA,0x7E,0x23,0x41,0xA1,0x30,0x80,0xFA,0x76,0x5F, + 0x03,0x41,0x81,0x28,0x28,0xAF,0xA5,0x25,0x44,0x49,0xC2,0x38,0xFF,0xF5,0xAF,0x0A, + 0xE6,0x61,0x03,0x41,0x29,0x3D,0x2F,0x2F,0x67,0x7A,0x06,0x6A,0x9D,0xBF,0xC2,0x63, + 0x67,0x7A,0x27,0x72,0x20,0x08,0xBF,0x75,0x68,0x7A,0x06,0x6A,0xA0,0xE0,0x6C,0xAA, + 0x47,0x7A,0xE5,0x69,0xA0,0xFE,0x5F,0x5E,0x06,0x72,0x84,0x59,0xE0,0xE8,0xFE,0x7E, + 0xE5,0x61,0x84,0x59,0x2D,0x35,0xFF,0xBD,0xE6,0x69,0x84,0x59,0x28,0x0A,0xFB,0x5E, + 0xE6,0x61,0x84,0x59,0xA0,0x80,0xAD,0x7D,0xA4,0x59,0x03,0x41,0xFE,0x7E,0x7C,0x7E, + 0x23,0x49,0x03,0x41,0x2B,0xD5,0xDF,0xDB,0x84,0x51,0x23,0x49,0xBD,0x25,0x25,0x25, + 0x47,0x72,0xA5,0x59,0xBD,0x09,0x2B,0x2B,0x47,0x72,0xA4,0x61,0xAA,0xF8,0x7C,0x5C, + 0x88,0x7A,0xE5,0x69,0x2B,0x0D,0x2D,0x25,0x0A,0x8B,0xA8,0x82,0xE5,0x8B,0x8B,0x2A, + 0xE9,0x8A,0x26,0x72,0xF2,0xEA,0x78,0x78,0x87,0x7A,0x05,0x6A,0x08,0x2F,0xBF,0xBD, + 0x4A,0x93,0x67,0x7A,0x0B,0x2F,0xF5,0xD5,0x2D,0xAC,0xC8,0x82,0x2F,0xBF,0xD5,0xF5, + 0xB7,0xF6,0xCC,0xA3,0x0B,0x2B,0x2D,0xAD,0xD8,0xFE,0x51,0xD5,0x00,0x00,0xA2,0x5F, + 0xD7,0xF6,0x72,0xD5,0x00,0x00,0x02,0xAD,0xF8,0xFE,0x96,0xEE,0x00,0x08,0x2A,0xFD, + 0xF8,0xFE,0xD7,0xF6,0xAA,0xA8,0xBB,0xA5,0xF8,0xFE,0xD7,0xF6,0xAA,0xAA,0xBE,0xAE, + 0xF8,0xFE,0xD7,0xF6,0xDB,0xFF,0xFA,0xDA,0xF8,0xFE,0xD7,0xF6,0xAA,0xAE,0xAF,0x9B, + 0xF8,0xFE,0xF7,0xF6,0xBF,0xEB,0xAA,0x82,0xD8,0xFE,0x17,0xF7,0xFF,0xEE,0xAA,0x8A, + 0x18,0xFF,0xF8,0xF6,0xEA,0xFE,0xBB,0xFF,0xF8,0xFE,0x18,0xF7,0xAA,0xAE,0x0A,0xA2, + 0xF8,0xFE,0x18,0xF7,0xBE,0xAA,0x00,0x00,0xF8,0xFE,0x18,0xF7,0xAA,0xAA,0x08,0x22, + 0x18,0xFF,0xD7,0xF6,0xEA,0xBA,0xFD,0xBB,0x18,0xFF,0xB7,0xF6,0x7F,0x7F,0x76,0x7F, + 0xD8,0xFE,0xB7,0xEE,0xAA,0xEA,0x7A,0x7F,0xB6,0xF6,0x96,0xEE,0xA8,0xEA,0xE0,0xEA, + 0xB6,0xF6,0x96,0xEE,0x5F,0xDE,0x7E,0x7B,0x96,0xEE,0x76,0xEE,0xA0,0x28,0x5D,0x5F, + 0x96,0xF6,0x76,0xEE,0x5A,0xF4,0xED,0xEF,0x96,0xF6,0x55,0xEE,0x55,0x7E,0xE2,0x80, + 0x76,0xEE,0x55,0xEE,0xA9,0xEF,0xE8,0xF0,0x75,0xEE,0x56,0xEE,0xAA,0xDF,0x55,0x97, + 0x97,0xF6,0x56,0xEE,0xFE,0xEE,0xEB,0xFE,0x76,0xEE,0x35,0xE6,0x8F,0x2E,0x0E,0x02, + 0x76,0xEE,0x55,0xEE,0x2D,0xF7,0xBE,0x00,0x76,0xEE,0x55,0xEE,0xFE,0xFC,0xFF,0xBE, + 0x76,0xEE,0x55,0xEE,0xDE,0xDB,0xAB,0xA2,0x76,0xEE,0x55,0xEE,0x0D,0x2E,0xBA,0xB6, + 0x75,0xEE,0x35,0xE6,0x76,0x5C,0xBC,0xEE,0x75,0xEE,0x34,0xEE,0xB5,0xAF,0xAB,0x22, + 0x75,0xEE,0x55,0xEE,0x62,0xC5,0x20,0xFA,0x55,0xEE,0x14,0xE6,0xAB,0xBF,0xFC,0x9A, + 0x75,0xEE,0x34,0xE6,0xE9,0xEB,0x7B,0x7F,0x14,0xE6,0xB3,0xD5,0xF8,0xF8,0x7C,0x78, + 0xF3,0xDD,0xB3,0xD5,0xD6,0xB7,0xED,0xAB,0x34,0xE6,0xD3,0xDD,0x2B,0x2D,0xAD,0xAD, + 0x35,0xEE,0x14,0xE6,0x2D,0x2B,0x2A,0x09,0x34,0xE6,0xF3,0xE5,0x78,0xB8,0x20,0x00, + 0x55,0xEE,0x51,0xCD,0x7F,0x7A,0x7A,0xE0,0x72,0xD5,0xF0,0xC4,0x5F,0xFB,0xFA,0xA8, + 0x31,0xC5,0xAF,0xBC,0xFE,0xDA,0xFC,0xFA,0x10,0xC5,0xD0,0xBC,0xF5,0xAD,0x8B,0x00, + 0x31,0xC5,0xF0,0xC4,0xB5,0xA5,0xA2,0x2A,0x52,0xCD,0x10,0xC5,0xE9,0x7F,0xBF,0x0A, + 0x31,0xCD,0x8F,0xBC,0x60,0x82,0x00,0x00,0xD0,0xBC,0xC8,0x82,0x5F,0x5E,0x7C,0x78, + 0x6B,0x93,0xA8,0x7A,0x3F,0xBD,0x35,0xB5,0xAF,0xBC,0x8B,0x93,0x09,0x29,0x0B,0x09, + 0xF0,0xC4,0xAE,0xB4,0x03,0x0B,0xEF,0xE7,0xF0,0xC4,0xCF,0xBC,0x28,0x60,0x8A,0xD8, + 0x30,0xCD,0xD0,0xBC,0x3B,0xAB,0xFF,0x7F,0x51,0xCD,0xF0,0xC4,0xAA,0x8B,0xEF,0xE5, + 0x51,0xCD,0xF0,0xC4,0xA8,0xEA,0xDF,0x7F,0x51,0xCD,0xF0,0xC4,0xAB,0xA3,0xFE,0x7E, + 0x45,0x6A,0xE4,0x69,0xEB,0xFF,0x6E,0xB8,0x45,0x6A,0x05,0x62,0xFF,0x7F,0xDF,0xAA, + 0x45,0x6A,0x05,0x6A,0x9A,0xFB,0xEA,0xBA,0x46,0x6A,0xE5,0x61,0x52,0x7A,0xBE,0xB8, + 0x66,0x6A,0x05,0x6A,0x2D,0xEF,0x55,0x76,0xA7,0x7A,0x05,0x62,0x0A,0xBB,0xF5,0xF5, + 0x87,0x7A,0x25,0x6A,0x02,0x00,0x2E,0x57,0xA7,0x7A,0x26,0x6A,0x80,0x00,0x2A,0xBD, + 0xC7,0x7A,0x87,0x7A,0xB5,0xFF,0x9D,0x57,0xA7,0x7A,0x87,0x7A,0x09,0xD3,0x14,0x13, + 0xC7,0x82,0x66,0x7A,0x7E,0xEB,0xEE,0xFA,0xA7,0x7A,0x67,0x7A,0x2A,0xB3,0xAB,0xBE, + 0xA7,0x7A,0x87,0x7A,0xAF,0xB7,0x27,0xB5,0xA7,0x7A,0x87,0x7A,0x57,0xF4,0xC3,0xAB, + 0xC7,0x82,0x66,0x72,0xBE,0xAF,0xAD,0xBE,0xA7,0x7A,0x66,0x7A,0x2D,0x88,0x00,0x0C, + 0xC7,0x82,0x87,0x7A,0x77,0xFC,0xEA,0xAE,0xA7,0x7A,0x46,0x72,0xAB,0x89,0x02,0x08, + 0xA7,0x7A,0x66,0x72,0x57,0xEE,0x88,0x02,0xA7,0x7A,0x66,0x72,0x77,0xFF,0xFA,0xF2, + 0xC7,0x82,0x46,0x72,0xDF,0xDF,0xFB,0xB8,0x86,0x7A,0x24,0x6A,0xA6,0x8A,0x8A,0xB0, + 0x87,0x7A,0x46,0x72,0x8D,0x6B,0x68,0xCB,0xE8,0x82,0x45,0x72,0x2B,0xAF,0xD7,0x5F, + 0x08,0x8B,0x66,0x72,0x02,0xA2,0xAF,0x57,0xE8,0x82,0xA7,0x7A,0xA0,0x00,0x0E,0x35, + 0xE8,0x82,0xA7,0x82,0x2F,0x08,0x20,0xE8,0xE8,0x82,0xA6,0x7A,0xEA,0xFA,0x02,0xCE, + 0xC7,0x7A,0x63,0x51,0x5A,0x58,0xE8,0x80,0xA4,0x59,0xC2,0x38,0xD7,0xD7,0x7E,0xF8, + 0xE2,0x40,0xC2,0x38,0x57,0x57,0x5E,0x60,0xE2,0x38,0x81,0x38,0x7A,0xFA,0xA8,0xA0, + 0xE3,0x40,0x81,0x38,0x2D,0x0F,0xAB,0x02,0x44,0x59,0xC2,0x40,0x95,0xB9,0x0B,0x2F, + 0xA5,0x61,0x23,0x51,0xBD,0xAF,0x2F,0x2B,0x47,0x7A,0xC5,0x69,0xBD,0x2D,0xA9,0x85, + 0xA8,0x82,0x47,0x7A,0x03,0x5B,0x7D,0xF5,0xC9,0x82,0x47,0x72,0xA2,0x7B,0x7D,0xBF, + 0x88,0x82,0x06,0x6A,0x08,0xE8,0x5F,0xEC,0xA8,0x82,0xC4,0x69,0x00,0x02,0xBD,0xB7, + 0xE9,0x8A,0x27,0x72,0x82,0x02,0xAF,0x7F,0x67,0x7A,0xC5,0x59,0xA8,0xDC,0x78,0xFE, + 0x27,0x6A,0x44,0x49,0x68,0xE0,0xEB,0x57,0x64,0x51,0xC2,0x38,0xA8,0xFC,0xFE,0x7F, + 0x23,0x41,0xC2,0x38,0xA0,0xAA,0x7D,0x5B,0x03,0x39,0xC2,0x38,0xAA,0xAF,0xAD,0xAD, + 0x03,0x41,0xE2,0x38,0x37,0xF6,0x32,0xBE,0x24,0x41,0xE3,0x38,0xC0,0xE2,0x7B,0x57, + 0xE3,0x38,0xA2,0x30,0xE0,0x48,0xAC,0x80,0xC2,0x38,0x81,0x30,0xDE,0xDF,0xCA,0x80, + 0x44,0x49,0xA1,0x30,0xB5,0xF5,0x3D,0x0B,0xA5,0x59,0x03,0x41,0xAD,0xAD,0x2F,0x0A, + 0xC6,0x61,0x64,0x51,0x25,0xBF,0xFE,0xFA,0x26,0x72,0x84,0x59,0x22,0x89,0xBD,0xB5, + 0x67,0x7A,0xE6,0x69,0xA9,0x0B,0x23,0xFD,0x88,0x82,0x26,0x72,0xE0,0xE0,0xFA,0xFD, + 0x26,0x72,0xA4,0x61,0xA0,0x88,0x80,0x7A,0xE6,0x69,0x84,0x59,0xD8,0xDA,0xD6,0x55, + 0xC5,0x59,0x84,0x59,0xB7,0xB5,0x2D,0x09,0xE6,0x61,0x85,0x59,0xFA,0xA3,0xEB,0xDE, + 0xA5,0x59,0x44,0x49,0xE8,0x80,0xE8,0x7E,0x64,0x51,0x03,0x41,0x68,0x7A,0x7A,0x7A, + 0x24,0x49,0xE3,0x40,0xAF,0xBF,0xFB,0xBF,0xE6,0x61,0x03,0x49,0xAD,0xA5,0xAF,0x2F, + 0x47,0x72,0xE6,0x61,0xA5,0xA3,0x8F,0xE3,0x68,0x7A,0xC5,0x61,0x5B,0xB7,0x2F,0x2F, + 0xA8,0x82,0x26,0x72,0xAD,0x8E,0x02,0x8A,0xC9,0x8A,0x26,0x72,0x02,0xA8,0xFE,0x7E, + 0x88,0x82,0x26,0x72,0x60,0xA2,0xAE,0x27,0xC8,0x8A,0x26,0x72,0x95,0x3E,0x0A,0x08, + 0x09,0x8B,0x66,0x7A,0xFD,0xAF,0xAE,0x2A,0x0A,0x8B,0xA8,0x82,0x2F,0x2E,0xAA,0x78, + 0x2E,0xB4,0x88,0x7A,0x0B,0xBF,0x55,0x55,0x4D,0xB4,0xA7,0x82,0x00,0xBE,0x75,0x55, + 0x31,0xCD,0x09,0x8B,0x2A,0xBF,0xFD,0x55,0x15,0xE6,0x2A,0x93,0x00,0x2A,0xAF,0xF5, + 0xD7,0xFE,0xD0,0xC4,0x00,0x0A,0x2B,0xFD,0xD7,0xFE,0x11,0xCD,0x00,0x00,0xAA,0xD5, + 0xD7,0xFE,0x94,0xDD,0x00,0x00,0x02,0xBD,0xF8,0xFE,0x96,0xF6,0xAA,0x2A,0xBB,0xF5, + 0xF8,0xFE,0xD7,0xF6,0x82,0xA0,0xA0,0x5B,0xF8,0xFE,0xB7,0xF6,0x32,0xA2,0x8A,0xFF, + 0xF8,0xFE,0xD7,0xF6,0x28,0x2E,0x8A,0xE5,0x18,0xFF,0xD7,0xF6,0xAA,0xBA,0xAB,0xFF, + 0xF8,0xFE,0xD8,0xF6,0xEA,0xAA,0xAA,0xB8,0xF8,0xFE,0xD7,0xF6,0x0A,0xA8,0x82,0xAA, + 0xF8,0xFE,0xB7,0xF6,0xA0,0xFA,0xE8,0x7A,0xD7,0xF6,0xB7,0xF6,0x7C,0xFE,0x5F,0x55, + 0xB7,0xF6,0x96,0xEE,0xE0,0xE8,0xF2,0x7A,0xB7,0xF6,0x76,0xEE,0xAA,0xFA,0x5B,0x7F, + 0x96,0xEE,0x55,0xEE,0x00,0x8A,0xDD,0xF7,0x76,0xEE,0x55,0xEE,0x20,0x00,0xA2,0xBF, + 0x55,0xF6,0x76,0xEE,0x55,0x5F,0x77,0xFE,0x96,0xF6,0x76,0xEE,0xE2,0xFF,0x7D,0x5D, + 0x76,0xEE,0x55,0xEE,0xE8,0xCA,0xB7,0x43,0x96,0xF6,0x56,0xEE,0xF5,0xFD,0xAF,0x2B, + 0x96,0xF6,0x56,0xEE,0x5E,0x7E,0xEA,0xE8,0x55,0xF6,0x76,0xEE,0x75,0x55,0x76,0xFE, + 0x96,0xF6,0x76,0xEE,0x7F,0xFE,0xEA,0x6A,0x56,0xF6,0x76,0xEE,0xF7,0xFD,0xDD,0xD5, + 0x75,0xEE,0x56,0xEE,0xA8,0x9A,0xFA,0xFB,0x76,0xEE,0x55,0xEE,0x26,0xFE,0xEA,0x28, + 0x76,0xEE,0x55,0xEE,0xFE,0xBE,0x3F,0xD5,0x75,0xEE,0x55,0xEE,0xFE,0x0C,0x80,0xCB, + 0x76,0xEE,0x34,0xE6,0xAA,0xBA,0x7E,0xFF,0x55,0xEE,0x14,0xE6,0xB2,0xA8,0xEA,0xAE, + 0x55,0xEE,0x34,0xE6,0x70,0x6B,0x61,0x7F,0x14,0xE6,0x92,0xD5,0xFC,0xF8,0x7E,0xDE, + 0xF3,0xDD,0xB3,0xD5,0x0B,0x2F,0xBD,0xB5,0x14,0xE6,0xD3,0xDD,0x2B,0x2E,0xBB,0xAD, + 0x55,0xEE,0xF4,0xDD,0xCB,0xAB,0x2F,0xB9,0x75,0xEE,0x34,0xE6,0x15,0xA5,0x0B,0xA2, + 0x75,0xEE,0x35,0xE6,0x60,0xEA,0xF6,0xB5,0x55,0xEE,0x93,0xD5,0x5F,0xFE,0xE0,0xA0, + 0xD3,0xDD,0xF0,0xC4,0x5F,0x7A,0xA8,0x80,0x72,0xCD,0x10,0xC5,0x9D,0xF5,0xBF,0xE0, + 0x51,0xCD,0x11,0xC5,0xBF,0xBE,0xA2,0x00,0x72,0xCD,0x51,0xCD,0xED,0x6D,0x9D,0x55, + 0x72,0xCD,0x31,0xCD,0x7F,0x5A,0xEA,0x8F,0x11,0xC5,0x2B,0x8B,0x78,0xE0,0xE0,0x80, + 0x4A,0x8B,0x67,0x72,0xBF,0xBE,0xBC,0xDC,0x8E,0xB4,0x09,0x83,0x0B,0x2F,0xFD,0xD5, + 0xAE,0xB4,0x8B,0x93,0x00,0xA8,0xAA,0xFD,0xD0,0xC4,0x6E,0xAC,0x2A,0xBB,0xAF,0x95, + 0xF0,0xC4,0xAF,0xBC,0xFA,0xDB,0xFD,0x75,0x31,0xCD,0xAF,0xBC,0x0F,0xAF,0xFF,0xF5, + 0x31,0xCD,0xCF,0xBC,0x2E,0xBE,0x6F,0xFD,0x10,0xC5,0xCF,0xBC,0xE0,0xA8,0xEF,0xD5, + 0x46,0x6A,0xE5,0x69,0x0A,0xBA,0x88,0xA0,0x46,0x6A,0x25,0x6A,0xF8,0xAA,0x35,0x17, + 0x46,0x72,0x05,0x62,0xDB,0xEF,0xAA,0x0A,0x66,0x72,0x05,0x6A,0xBA,0xFA,0x5E,0xF3, + 0x46,0x72,0x05,0x6A,0x7E,0xEF,0x5E,0x2A,0x46,0x72,0x05,0x6A,0xA9,0x2A,0x9A,0xC8, + 0x46,0x72,0x05,0x6A,0xF5,0x5A,0x73,0xF2,0x45,0x72,0xE4,0x69,0x2A,0xFE,0xFB,0xFA, + 0x87,0x7A,0x05,0x6A,0x2A,0xF5,0x75,0xFF,0xA7,0x82,0xE5,0x69,0x22,0x0A,0xFB,0xDF, + 0xA7,0x7A,0x26,0x72,0x20,0x00,0x8A,0xFD,0xC8,0x82,0x87,0x7A,0x57,0x6F,0xF5,0x9D, + 0xA7,0x7A,0x66,0x7A,0xC2,0x02,0x84,0x88,0xA7,0x7A,0x66,0x72,0x82,0xA8,0x8D,0x0E, + 0xC7,0x82,0x66,0x72,0x9B,0x1B,0xAB,0xE9,0xC7,0x7A,0x87,0x7A,0xF6,0x76,0x55,0xD7, + 0xA7,0x7A,0x86,0x7A,0x3E,0x25,0x3B,0xF5,0xC7,0x82,0x87,0x7A,0xDF,0xFB,0xAF,0xEB, + 0xA7,0x7A,0x45,0x72,0x0A,0xDA,0x8E,0x0B,0xA7,0x7A,0x45,0x72,0xA0,0xDE,0xEC,0x8A, + 0xA7,0x7A,0x87,0x7A,0xF8,0xBF,0xD5,0x35,0xA7,0x7A,0x87,0x7A,0xB7,0xDA,0xBE,0x2F, + 0xA7,0x82,0x46,0x72,0x70,0xB2,0x8A,0xB8,0xA7,0x7A,0x66,0x7A,0x56,0xE0,0xFE,0xB4, + 0xA7,0x7A,0x45,0x72,0x77,0xAF,0xAA,0x28,0xC7,0x82,0x66,0x72,0x25,0x5D,0xEF,0xFD, + 0xC8,0x82,0x66,0x72,0x03,0xB5,0x55,0xFF,0x08,0x8B,0x66,0x72,0xA8,0x2F,0xFD,0xDD, + 0xE8,0x82,0x65,0x72,0xE2,0x8A,0x2B,0xAD,0x86,0x72,0x03,0x49,0x7E,0xF8,0xE0,0x80, + 0xA4,0x59,0xE2,0x40,0x55,0x57,0x5E,0xF8,0x03,0x49,0xC2,0x40,0x7E,0x5A,0xF8,0x80, + 0x43,0x49,0xE3,0x40,0xDD,0x15,0xBD,0xF5,0x84,0x59,0x03,0x49,0xFD,0xAE,0xAA,0x8B, + 0x84,0x59,0xE2,0x48,0x0A,0xB7,0x5E,0x7E,0xE6,0x69,0xE3,0x48,0x0A,0xAF,0xFD,0x75, + 0x27,0x72,0x23,0x51,0x08,0xBF,0xF5,0xD5,0xA9,0x82,0x44,0x59,0x0A,0xAA,0xFF,0x5D, + 0x88,0x7A,0x85,0x61,0x00,0x08,0x8B,0xF5,0x88,0x82,0xC5,0x61,0xAA,0x00,0xA2,0x55, + 0x87,0x7A,0xC5,0x61,0xE2,0xE8,0x7A,0x55,0x06,0x6A,0x64,0x51,0x80,0xAE,0x5F,0x77, + 0xA5,0x59,0x03,0x41,0xFC,0xFE,0x57,0x57,0x23,0x41,0xE3,0x38,0x56,0xFA,0xFA,0xB5, + 0x03,0x39,0xC2,0x38,0xDE,0x5E,0xF8,0x28,0xE2,0x40,0x03,0x39,0x7A,0x76,0xD7,0xD5, + 0xE2,0x48,0x03,0x39,0x77,0xD7,0xFD,0x57,0x44,0x41,0xC2,0x38,0xF7,0xBA,0xAA,0xB2, + 0x03,0x39,0xA2,0x30,0xE8,0x7A,0xF0,0xE2,0xE2,0x38,0xA2,0x30,0xFD,0x37,0xFF,0xB9, + 0x44,0x49,0xC2,0x38,0x0B,0x29,0x09,0x29,0xC5,0x59,0x64,0x51,0x2B,0xC9,0x8D,0xA9, + 0xC5,0x69,0x64,0x51,0xFF,0xFF,0xFF,0x2E,0x06,0x72,0x64,0x59,0x89,0x0B,0xA9,0xFA, + 0xE5,0x69,0x84,0x59,0x00,0x00,0x08,0xDD,0x47,0x72,0xA4,0x61,0x8B,0xB7,0x97,0xD5, + 0x06,0x6A,0x64,0x59,0xE8,0xFA,0xFA,0x5E,0x85,0x59,0x64,0x51,0x0F,0xB8,0x98,0xEF, + 0xC5,0x61,0x64,0x51,0xC9,0xA7,0xBF,0xB5,0xE6,0x61,0x84,0x51,0x7F,0xE8,0x82,0xC2, + 0xA4,0x59,0x24,0x49,0xEA,0xE0,0xE8,0x7E,0x43,0x49,0x02,0x41,0x78,0xAE,0xAA,0xE2, + 0x64,0x51,0xE2,0x38,0xBD,0xAD,0x3F,0x2A,0xE6,0x61,0x44,0x49,0x2D,0x2B,0xAB,0xAF, + 0x47,0x72,0xC6,0x61,0xA2,0x8B,0x3F,0xF5,0x88,0x7A,0x26,0x6A,0xBD,0xEF,0xE8,0x01, + 0x88,0x82,0x26,0x72,0x8B,0xBA,0xDE,0xEA,0x88,0x82,0xE5,0x69,0xF0,0x7E,0xFF,0xD7, + 0x67,0x7A,0xE5,0x69,0x27,0x0D,0x88,0x02,0xE9,0x8A,0x47,0x72,0x2A,0x0F,0x2D,0xB5, + 0x2A,0x93,0xC9,0x8A,0x3B,0xAB,0xEF,0x6F,0x09,0x8B,0x67,0x7A,0xE8,0xA8,0xFA,0x5E, + 0x88,0x7A,0xE5,0x69,0xA8,0x78,0xBA,0xA7,0xC8,0x82,0x26,0x72,0x2B,0xBD,0xBF,0xBD, + 0xE9,0x8A,0x05,0x72,0x82,0xEA,0x5E,0x5E,0x6B,0x9B,0x47,0x72,0x2B,0x25,0xB5,0xF5, + 0x2D,0xAC,0x88,0x7A,0x00,0xFB,0x7F,0x5F,0x8B,0x9B,0x68,0x7A,0x08,0xDF,0x55,0x55, + 0x92,0xD5,0x88,0x7A,0x0B,0xBF,0xFD,0xD5,0x75,0xEE,0x6B,0x93,0x02,0xAB,0xFF,0x55, + 0xD7,0xFE,0x6B,0x93,0x00,0xAA,0xFF,0x55,0xB6,0xF6,0x6A,0x93,0x00,0xAA,0xFF,0xF5, + 0xB6,0xF6,0xCF,0xBC,0x00,0x0A,0xAF,0xA5,0xD7,0xF6,0xF4,0xE5,0x00,0x02,0x8A,0xFD, + 0xF8,0xFE,0x76,0xEE,0x80,0x02,0x2A,0xD5,0xF8,0xFE,0xB7,0xF6,0xE2,0xA8,0xAA,0xF5, + 0xD7,0xF6,0xB7,0xF6,0x78,0x78,0x58,0x75,0xB7,0xF6,0x96,0xEE,0x80,0x08,0xE8,0x7F, + 0xB6,0xF6,0x76,0xEE,0xAA,0xFE,0x7F,0x77,0x96,0xEE,0x55,0xEE,0xF0,0xF8,0x7A,0xBE, + 0x76,0xF6,0x55,0xE6,0xFB,0x2B,0x8A,0xAC,0x96,0xF6,0x55,0xEE,0xFF,0xFB,0xE8,0xFA, + 0x76,0xEE,0x35,0xEE,0xA8,0xE8,0xFA,0xFE,0x76,0xEE,0x35,0xEE,0x02,0x0F,0xAF,0xAA, + 0x96,0xF6,0x76,0xEE,0x75,0x5D,0xFD,0xB5,0x57,0xF6,0x75,0xEE,0x5F,0x5F,0xDD,0xFD, + 0x96,0xF6,0x56,0xEE,0xFA,0xAB,0x8B,0x8B,0x96,0xF6,0x56,0xEE,0xFD,0xEF,0xAA,0xEA, + 0x96,0xF6,0x76,0xEE,0xEF,0x3B,0x2F,0x8F,0xB6,0xF6,0x76,0xEE,0x7D,0xEF,0xEB,0x7F, + 0x76,0xEE,0x35,0xEE,0xA8,0xF0,0xB8,0xFA,0x75,0xEE,0x35,0xEE,0xAA,0x8D,0xFB,0xFF, + 0x76,0xEE,0x55,0xEE,0x55,0x55,0xE5,0x85,0x75,0xEE,0x35,0xEE,0xEE,0x88,0x22,0x23, + 0x75,0xEE,0x35,0xE6,0xFF,0xE3,0x20,0x80,0x55,0xEE,0x35,0xE6,0xEB,0xEA,0xEC,0xF4, + 0x55,0xEE,0xF4,0xDD,0xAA,0xC0,0xEA,0x6A,0xF3,0xDD,0x72,0xCD,0xDC,0xFA,0x7A,0x7E, + 0xD3,0xDD,0x72,0xCD,0x8F,0xB7,0xBF,0xAF,0x14,0xE6,0xB3,0xD5,0x0B,0x2F,0x2D,0xAB, + 0x34,0xE6,0xF4,0xDD,0x2B,0x8A,0xFF,0x77,0x55,0xEE,0xF4,0xDD,0x82,0xFF,0xFD,0xFD, + 0x76,0xEE,0x14,0xE6,0xAD,0xAF,0x2D,0x0F,0x96,0xF6,0x34,0xE6,0x7A,0xEA,0xA2,0x20, + 0x96,0xF6,0xF3,0xDD,0xDD,0xAA,0x82,0x08,0x96,0xF6,0x72,0xD5,0x5F,0xFA,0xE0,0x80, + 0x14,0xE6,0x51,0xCD,0x55,0x55,0x57,0xF8,0x72,0xD5,0x31,0xC5,0xEB,0xE7,0xEA,0xE8, + 0x72,0xD5,0x31,0xC5,0x2A,0xA3,0xAF,0xA6,0x72,0xCD,0xD0,0xBC,0x78,0xE8,0x80,0x82, + 0xD0,0xBC,0x67,0x72,0x5E,0x7C,0x78,0xC0,0xA8,0x7A,0xE6,0x61,0x8A,0x7F,0x5F,0xFE, + 0xAB,0x9B,0x05,0x62,0x0B,0xB5,0x55,0x55,0x6E,0xAC,0x47,0x72,0x02,0x0A,0xAB,0xF5, + 0xAF,0xBC,0xEC,0xA3,0x02,0x22,0xBB,0xE5,0xCF,0xBC,0x2E,0xAC,0x80,0x0A,0xBF,0x57, + 0xD0,0xBC,0x4E,0xAC,0x80,0x28,0xAA,0xA5,0x10,0xC5,0xAF,0xBC,0x9D,0x97,0x3B,0xA5, + 0x66,0x72,0x25,0x6A,0x6B,0xEA,0x7A,0xBA,0x46,0x72,0x05,0x6A,0x0D,0x82,0x00,0x2C, + 0x67,0x72,0x25,0x6A,0xE6,0xD3,0x6F,0xE7,0x66,0x72,0x25,0x6A,0x3A,0x1B,0x91,0x8F, + 0x46,0x72,0x05,0x6A,0xBA,0xFA,0xEE,0x40,0x26,0x6A,0x05,0x6A,0xA2,0x81,0x17,0xBD, + 0x46,0x72,0xE4,0x61,0xFE,0xFA,0xA2,0x2A,0x67,0x72,0xE5,0x69,0x9D,0xBF,0x2F,0xFE, + 0x46,0x72,0xE4,0x61,0xA8,0x8A,0x30,0x18,0x46,0x72,0x05,0x6A,0xFF,0xFD,0x6A,0x28, + 0x46,0x72,0x05,0x6A,0xA0,0x60,0xBE,0x3C,0x87,0x7A,0x05,0x6A,0x0B,0x57,0xD7,0xFF, + 0xA7,0x7A,0x05,0x6A,0x08,0xAA,0x67,0x57,0xA7,0x7A,0x05,0x6A,0x20,0x82,0xAB,0xBD, + 0xA7,0x82,0x46,0x72,0xC3,0x23,0x2A,0xB9,0xC7,0x82,0x87,0x7A,0xDD,0xF7,0xDF,0x79, + 0xC7,0x82,0x66,0x72,0x77,0xAE,0xEA,0xE3,0xC7,0x82,0x66,0x72,0x8B,0xAE,0xBB,0xDF, + 0xC7,0x82,0x87,0x7A,0x79,0xEA,0xE2,0x62,0xC7,0x82,0x66,0x72,0x29,0xAA,0xFF,0x7F, + 0xC7,0x82,0x87,0x7A,0xF7,0x6D,0xF9,0x7A,0xC8,0x82,0x66,0x7A,0xF9,0xBE,0xBA,0xA3, + 0xC7,0x82,0x67,0x7A,0xFF,0xAA,0x6A,0xFA,0xC8,0x82,0x87,0x7A,0xDD,0xDD,0x68,0xF6, + 0xA7,0x7A,0x86,0x7A,0x6D,0x83,0x0B,0x0E,0xC6,0x82,0x65,0x72,0xDE,0xEE,0xE8,0xB8, + 0xC7,0x82,0x66,0x72,0x56,0xFF,0xAB,0x8A,0xC7,0x82,0x66,0x72,0x77,0x7F,0xAA,0x2E, + 0xA7,0x7A,0x66,0x72,0xFD,0xFF,0x78,0xC0,0xA6,0x7A,0x66,0x72,0x5E,0x65,0xEB,0xE9, + 0x66,0x72,0x44,0x51,0x7E,0x78,0xE8,0xA0,0xA6,0x61,0xE3,0x40,0x7F,0xFA,0xE8,0xA8, + 0xA5,0x59,0x23,0x49,0x55,0x77,0xFF,0xFE,0x64,0x59,0x23,0x51,0x2E,0xBA,0xDA,0xE2, + 0x44,0x51,0x03,0x51,0x60,0x00,0xE0,0xA0,0x44,0x51,0xC2,0x40,0xFF,0x76,0xFE,0x2A, + 0x03,0x49,0xC2,0x40,0x2B,0x87,0xE7,0x0C,0x85,0x61,0x03,0x49,0xE2,0xFD,0xD9,0xFD, + 0xC6,0x61,0x24,0x49,0x2E,0xA7,0xBF,0xED,0xC6,0x61,0x24,0x49,0xA0,0xAA,0xFF,0x7F, + 0xA6,0x61,0x44,0x49,0x78,0x5E,0xFF,0xFB,0x85,0x51,0xE2,0x38,0x82,0xF8,0xDA,0x7E, + 0x03,0x41,0xA1,0x30,0x80,0xEA,0x7A,0x5F,0xE2,0x38,0xA2,0x30,0x0C,0x2B,0x2F,0x29, + 0x23,0x41,0xE3,0x38,0xF7,0xAA,0xAA,0xBA,0x44,0x41,0x03,0x41,0x55,0xF5,0x8B,0xE8, + 0x44,0x41,0x03,0x41,0xBF,0x3F,0x27,0x17,0x44,0x41,0xE2,0x38,0x6A,0xF0,0xE0,0xE0, + 0xC2,0x40,0x03,0x39,0xE7,0xAF,0xAD,0xFB,0x23,0x41,0xC2,0x38,0x65,0xBF,0x8D,0x0A, + 0x84,0x59,0x03,0x41,0x9D,0xA9,0x0F,0x0B,0xC5,0x61,0x64,0x51,0xBD,0x37,0x2A,0x2A, + 0x26,0x72,0xC5,0x61,0xE5,0xFF,0xFF,0x2F,0x06,0x72,0xA4,0x61,0x78,0x78,0x78,0xAE, + 0x06,0x72,0x84,0x59,0xF7,0xDF,0xFB,0x8A,0xE5,0x61,0xA4,0x61,0xF7,0x3D,0x2D,0xD7, + 0xC5,0x61,0x23,0x49,0xF8,0x78,0x78,0x68,0x85,0x51,0x03,0x49,0x0A,0xBB,0xFF,0xF5, + 0x64,0x51,0x23,0x49,0x20,0xB0,0xFD,0xB7,0xE6,0x61,0x64,0x51,0x83,0xBA,0xFD,0xD5, + 0x85,0x51,0x02,0x41,0x7E,0x5E,0x5C,0x78,0x43,0x49,0x03,0x41,0xA9,0xA5,0xAD,0xAD, + 0xA5,0x59,0x44,0x49,0x2D,0x0B,0x09,0xAD,0xA5,0x59,0x44,0x51,0xAA,0x6E,0x7C,0x58, + 0xE6,0x69,0x23,0x49,0x0A,0xBF,0xFF,0xFD,0x68,0x7A,0x85,0x59,0x02,0x0B,0x2D,0x2D, + 0xA9,0x8A,0x47,0x7A,0x7E,0x6A,0xF3,0xAF,0x88,0x82,0xC5,0x69,0xD5,0xFF,0xEA,0x80, + 0x67,0x7A,0x05,0x72,0x8B,0x2A,0x2B,0xE7,0xA8,0x82,0x26,0x6A,0x27,0x27,0xBA,0x7A, + 0xC9,0x8A,0x47,0x72,0x0A,0xAF,0xBB,0xA5,0xA8,0x82,0x46,0x72,0x60,0xE8,0x7E,0x57, + 0x88,0x82,0x06,0x6A,0xB7,0xB7,0xAF,0x0E,0xA8,0x82,0x47,0x7A,0xB5,0xFD,0xEA,0x80, + 0x88,0x7A,0x26,0x72,0x7C,0xFA,0xB8,0x88,0x88,0x82,0x26,0x72,0x29,0xAA,0xAE,0x82, + 0xC9,0x8A,0x47,0x7A,0xE2,0xFF,0x5D,0x77,0x88,0x7A,0x47,0x7A,0x3B,0x2B,0x0D,0x5E, + 0xA8,0x82,0x27,0x72,0x0A,0xB7,0x75,0x57,0xC9,0x82,0x06,0x6A,0x00,0xAA,0xFF,0xD5, + 0xC9,0x82,0x27,0x6A,0x80,0x2A,0x9F,0xD5,0xCC,0x9B,0x68,0x72,0x0F,0xAF,0xFD,0xD5, + 0xD0,0xBC,0x46,0x72,0x02,0x2A,0x7F,0x55,0x11,0xC5,0x46,0x72,0x00,0xBE,0xDD,0x55, + 0xF4,0xE5,0xC8,0x7A,0x02,0x2B,0xAF,0xF5,0x76,0xEE,0x4E,0xAC,0x00,0x00,0x0B,0xBD, + 0x96,0xF6,0xD3,0xDD,0x00,0x00,0xAA,0xAD,0x96,0xF6,0x55,0xEE,0x80,0x20,0xEF,0xFB, + 0x96,0xF6,0x56,0xEE,0xEA,0xFE,0x9F,0x5F,0x55,0xF6,0x76,0xEE,0x55,0x55,0xDD,0xFF, + 0x76,0xF6,0x35,0xE6,0xE0,0x7E,0xDB,0xFF,0x75,0xEE,0x34,0xE6,0xE0,0xD9,0xF7,0x57, + 0x55,0xEE,0x14,0xE6,0x88,0xAA,0xFE,0xFF,0x75,0xEE,0x34,0xE6,0xAB,0xEF,0xD5,0x55, + 0x96,0xF6,0x35,0xE6,0x2A,0xEA,0xAD,0xF5,0x75,0xEE,0x34,0xEE,0xA8,0xFA,0xFF,0x7F, + 0x96,0xF6,0x34,0xE6,0x8B,0xBB,0xF7,0x55,0x96,0xF6,0x34,0xE6,0x8A,0xAA,0xBF,0xF5, + 0x96,0xF6,0x35,0xE6,0x80,0xEA,0xFE,0x5D,0x75,0xEE,0x35,0xE6,0x88,0xFE,0xFF,0x55, + 0x75,0xEE,0x35,0xE6,0xBE,0x1A,0xAF,0xB5,0x76,0xEE,0x55,0xEE,0xDB,0xF8,0x8A,0x82, + 0x56,0xF6,0x96,0xEE,0xBE,0xFE,0xFF,0xFE,0x96,0xF6,0x76,0xEE,0x59,0xFE,0xBA,0x2A, + 0x96,0xF6,0x55,0xEE,0xFF,0xFE,0xFA,0xF8,0x55,0xEE,0x15,0xE6,0xFC,0xFC,0xB8,0xC0, + 0x55,0xEE,0xD3,0xDD,0x62,0x72,0xA8,0xA8,0xF3,0xDD,0x72,0xCD,0xFE,0xFE,0xFC,0x78, + 0xD3,0xDD,0x72,0xD5,0x0B,0x2A,0x2B,0x0D,0x14,0xE6,0xD3,0xDD,0xFD,0xDF,0xAF,0xBD, + 0x14,0xE6,0xD3,0xDD,0x9F,0x3F,0x2E,0x0A,0x55,0xEE,0x14,0xE6,0x7D,0x7F,0xFB,0xAB, + 0x75,0xEE,0x34,0xE6,0x2D,0xA9,0xA5,0x2B,0x96,0xEE,0x75,0xEE,0x8A,0xE5,0xAD,0x37, + 0x96,0xEE,0x76,0xEE,0x75,0xEF,0xFE,0xF6,0x96,0xEE,0x76,0xEE,0x57,0x55,0x5A,0x6C, + 0x55,0xEE,0x92,0xD5,0x78,0xE0,0x80,0x00,0xF4,0xDD,0x72,0xCD,0x55,0xFE,0xFA,0xE8, + 0xB3,0xDD,0x31,0xCD,0xF7,0xFE,0xEA,0x80,0x72,0xD5,0x51,0xCD,0x3C,0x2E,0x2F,0x23, + 0xB3,0xD5,0xED,0xA3,0x6A,0xE8,0xA8,0x00,0xB0,0xBC,0x27,0x6A,0x57,0x5E,0xFE,0xE8, + 0x89,0x7A,0xE6,0x61,0xDD,0xEE,0xAA,0x00,0x88,0x7A,0x06,0x6A,0x3D,0xFF,0xDE,0xA0, + 0xEC,0x9B,0x26,0x6A,0x0B,0x95,0xD5,0xD5,0x0E,0xA4,0x68,0x72,0x00,0xAA,0xFF,0x55, + 0x4E,0xAC,0x89,0x72,0x22,0x0A,0x2F,0x25,0x10,0xC5,0x8E,0xB4,0x2D,0xA9,0x0D,0xA9, + 0x66,0x72,0x26,0x6A,0x7A,0xA8,0x3A,0xF2,0x66,0x72,0x04,0x6A,0xA6,0xA3,0xFE,0xFA, + 0x66,0x72,0x25,0x6A,0xAA,0xAE,0xBB,0xFB,0x67,0x72,0x26,0x72,0xAF,0xAF,0x83,0x6E, + 0x67,0x72,0x05,0x6A,0xEE,0xAB,0x8B,0x89,0x66,0x72,0x05,0x6A,0x7A,0xFB,0xAF,0x28, + 0x66,0x72,0x05,0x6A,0xBB,0xA7,0xEE,0x32,0x66,0x72,0x05,0x6A,0xFF,0xAA,0xA8,0x9E, + 0x66,0x72,0x25,0x6A,0xDF,0xA3,0x62,0x7A,0x86,0x72,0x26,0x6A,0x5F,0x5F,0xFB,0xEB, + 0x46,0x72,0x05,0x6A,0x1E,0x2F,0xAB,0xAE,0x67,0x72,0x26,0x6A,0x9F,0xF7,0xBB,0x8F, + 0x67,0x72,0x05,0x6A,0x76,0xC7,0xEE,0xF8,0x67,0x72,0x05,0x6A,0xAD,0xFF,0xBB,0xB8, + 0x87,0x7A,0xE4,0x69,0x2D,0xAF,0xEA,0xEA,0xA7,0x7A,0x05,0x6A,0x02,0xAA,0xAD,0x7F, + 0xA7,0x7A,0x05,0x6A,0x00,0x00,0xBB,0xF5,0xA7,0x7A,0x66,0x72,0x8E,0x8A,0x0B,0x25, + 0xE8,0x82,0x86,0x7A,0xFB,0x55,0x5E,0x53,0xA7,0x82,0x87,0x7A,0x55,0x2F,0x2F,0xBB, + 0xC7,0x82,0x87,0x7A,0xFF,0x5E,0xF8,0xAA,0xA7,0x82,0x67,0x7A,0x8A,0xAE,0x3C,0xB0, + 0xC7,0x82,0x87,0x7A,0x6B,0xFA,0xFB,0xFA,0xC7,0x82,0x87,0x7A,0xCF,0x7B,0xFE,0x5F, + 0xC7,0x82,0x86,0x7A,0xBF,0xFB,0xFF,0x2E,0xC7,0x82,0x86,0x7A,0x6F,0xFF,0xB8,0x78, + 0xC7,0x82,0x86,0x7A,0x4E,0xEE,0xB7,0x35,0xC7,0x82,0xA7,0x7A,0xF5,0xB5,0xBE,0xED, + 0xA7,0x82,0x87,0x7A,0xB8,0xF3,0x88,0x0A,0xA7,0x82,0x86,0x72,0x7F,0xBC,0x22,0x00, + 0xA7,0x82,0x06,0x6A,0x7A,0xA2,0xA0,0x80,0x26,0x72,0x64,0x59,0x5E,0x5C,0x78,0xE0, + 0xC5,0x69,0x64,0x59,0x55,0x75,0xDF,0xAA,0xC5,0x61,0x23,0x51,0x7F,0xDB,0xAA,0x08, + 0xC5,0x69,0x23,0x51,0x7F,0x7B,0xA8,0xA8,0xC6,0x69,0x44,0x51,0x55,0xF5,0xBF,0x0B, + 0xA5,0x61,0x03,0x49,0x5F,0xEE,0xA0,0x80,0x85,0x59,0x23,0x49,0xAD,0xA2,0x28,0xE2, + 0x85,0x51,0x44,0x51,0x8B,0xA2,0xDC,0x56,0x85,0x51,0x23,0x49,0x7A,0xD8,0xFE,0xFF, + 0x85,0x51,0x03,0x39,0xC2,0xEA,0xFA,0x7F,0x24,0x41,0xA1,0x30,0xF8,0xF8,0xD6,0xD7, + 0xC2,0x30,0xA2,0x30,0x5F,0x35,0x25,0x08,0xE2,0x38,0xA2,0x30,0x2B,0xAB,0xA2,0xB2, + 0x44,0x41,0xE3,0x38,0x2F,0x2D,0xAF,0xFA,0x64,0x49,0x03,0x39,0xFC,0xDF,0x7F,0xF5, + 0x03,0x41,0xE2,0x38,0x28,0x60,0x78,0x6F,0x23,0x41,0xE2,0x38,0x80,0x2B,0xBD,0x0D, + 0x44,0x49,0xE2,0x38,0x75,0xAF,0xAA,0x22,0x85,0x51,0x03,0x41,0xEF,0x2D,0x8A,0xEA, + 0x84,0x51,0x23,0x49,0x3D,0xBF,0xF7,0xFD,0xC5,0x61,0x44,0x51,0x0A,0x3E,0x2D,0xFD, + 0x47,0x72,0xA5,0x61,0x0A,0x0A,0xAB,0xF9,0x68,0x7A,0xE5,0x69,0x55,0xB7,0x8F,0x09, + 0x68,0x7A,0xE5,0x69,0x5F,0xFE,0xE8,0xE0,0x06,0x6A,0x64,0x51,0xFE,0xFA,0x5C,0x5E, + 0xC5,0x61,0x03,0x41,0xE8,0xE8,0xFE,0xFF,0x44,0x49,0xE2,0x40,0x0E,0xBC,0x78,0xFE, + 0xA6,0x59,0x23,0x49,0xEF,0x8B,0xBD,0xA5,0x85,0x51,0x03,0x41,0x2A,0xBE,0x6A,0xF0, + 0xA5,0x51,0x03,0x41,0x78,0xFA,0xFF,0xD5,0x44,0x49,0x03,0x41,0x2D,0x0D,0x0A,0x2B, + 0x84,0x51,0x44,0x49,0xBF,0xBD,0x3F,0xCA,0x85,0x51,0x23,0x49,0x92,0xF2,0xE2,0x8A, + 0xC6,0x61,0x23,0x49,0xED,0xBF,0x3D,0x25,0x68,0x7A,0xC6,0x61,0x05,0x25,0xA5,0x2D, + 0x4A,0x93,0x68,0x7A,0xBF,0x2D,0xAD,0xAB,0x6B,0x9B,0xC9,0x8A,0x7F,0xEE,0xE0,0xEA, + 0xE9,0x8A,0x26,0x6A,0x7F,0xFA,0xE8,0xE2,0x26,0x72,0xE5,0x69,0x02,0xAE,0x06,0x94, + 0x67,0x72,0xE6,0x69,0x2B,0xAF,0xBD,0xBF,0x88,0x7A,0x26,0x72,0x9C,0xA5,0x37,0x3B, + 0x88,0x82,0x47,0x7A,0xAF,0xDE,0x82,0x00,0xC8,0x8A,0x67,0x7A,0xBA,0x3B,0xAF,0x95, + 0x09,0x93,0xA8,0x82,0x5D,0xBF,0xAA,0x2B,0x09,0x8B,0x67,0x7A,0xF7,0xFE,0xFA,0xA8, + 0x88,0x82,0x47,0x7A,0xFF,0x5E,0xFA,0x02,0x68,0x7A,0x27,0x72,0xB8,0xFD,0x7D,0xC3, + 0x68,0x7A,0x06,0x6A,0x57,0x5E,0xDB,0x2F,0x88,0x7A,0xE6,0x61,0x5F,0x5D,0x6E,0xA2, + 0x67,0x7A,0xC6,0x61,0xB7,0xBD,0xAB,0x2A,0x88,0x7A,0x26,0x6A,0x8B,0x86,0xAF,0x68, + 0x87,0x72,0x46,0x72,0xAC,0x82,0x3A,0xD5,0x67,0x72,0x26,0x6A,0x7E,0x7C,0xB0,0xA2, + 0xA8,0x7A,0xE6,0x61,0x0A,0xAB,0xF7,0x5F,0xF0,0xC4,0x88,0x72,0x2B,0xAD,0x95,0x55, + 0x35,0xEE,0x4A,0x93,0x02,0x0A,0x2B,0xBD,0x76,0xF6,0xD3,0xDD,0x00,0x22,0xAA,0x55, + 0x55,0xEE,0xF4,0xE5,0x00,0x00,0x8A,0x95,0x55,0xEE,0x15,0xE6,0x8A,0xE2,0x6C,0x7F, + 0x55,0xEE,0x14,0xE6,0xA2,0xA2,0x23,0xAF,0x15,0xEE,0x34,0xE6,0x79,0x7F,0x7D,0xBF, + 0x35,0xE6,0x14,0xE6,0xA0,0xB0,0x68,0x4F,0x34,0xE6,0xD4,0xE5,0xA0,0x2A,0x0A,0xBA, + 0x34,0xE6,0xF4,0xE5,0x08,0x08,0x96,0xBE,0x15,0xEE,0x34,0xE6,0x75,0xFF,0x7F,0xFF, + 0x35,0xE6,0xD3,0xDD,0xA2,0xFA,0xDE,0xF8,0x35,0xE6,0xD3,0xDD,0x2A,0xFB,0xFD,0xF7, + 0x14,0xE6,0xD3,0xDD,0xE8,0xFD,0xB5,0x2B,0x35,0xE6,0xF4,0xE5,0x03,0x2B,0x0B,0x3F, + 0x76,0xEE,0x35,0xE6,0x95,0xBD,0xAB,0xAF,0x96,0xF6,0x55,0xEE,0xEB,0xFF,0xAF,0xA5, + 0x76,0xF6,0x96,0xEE,0xE8,0xFE,0xBF,0xFB,0x96,0xF6,0x55,0xEE,0x88,0xEA,0x7A,0x5E, + 0x76,0xEE,0x35,0xE6,0xC0,0xAE,0xF5,0xDF,0x55,0xEE,0x35,0xE6,0xC0,0x62,0x8A,0x2B, + 0x55,0xEE,0xF4,0xDD,0x7A,0x7A,0xEA,0xE0,0x14,0xE6,0x72,0xCD,0x7F,0x7E,0xE8,0x00, + 0xD3,0xDD,0x72,0xCD,0x9D,0xDF,0xBE,0x08,0x14,0xE6,0xB2,0xDD,0xAF,0xA5,0x3D,0x0A, + 0x34,0xE6,0x14,0xE6,0x75,0xE5,0xF7,0x55,0x55,0xEE,0xF4,0xDD,0x8B,0xBB,0xBF,0xF7, + 0x75,0xEE,0x35,0xE6,0x0E,0x2F,0xBD,0xBD,0x96,0xEE,0x75,0xEE,0xED,0xFF,0x0A,0x0A, + 0xB6,0xF6,0x76,0xEE,0x7F,0xFB,0xFE,0xFE,0x96,0xEE,0x76,0xEE,0x7C,0xFE,0xFF,0xFE, + 0x96,0xEE,0x55,0xE6,0x7B,0xFA,0xA8,0xAA,0x75,0xEE,0xB2,0xD5,0x7F,0xD8,0xE8,0xE0, + 0xB3,0xDD,0xF3,0xD5,0xAA,0xEB,0xAB,0xAB,0xB3,0xDD,0x71,0xCD,0x7F,0x7C,0x5C,0xE0, + 0xD3,0xDD,0x71,0xCD,0x0A,0x0B,0x0F,0x25,0xF4,0xDD,0x2E,0xAC,0x78,0xA0,0x00,0x00, + 0xB3,0xD5,0xC9,0x7A,0x57,0xFA,0x80,0x00,0x10,0xC5,0xA8,0x7A,0x55,0x5D,0xFA,0x80, + 0x0D,0xA4,0x87,0x72,0x55,0x55,0xFE,0x80,0x8B,0x93,0x26,0x6A,0x5F,0xFD,0xBF,0x80, + 0xAF,0xB4,0xC9,0x7A,0x35,0x25,0x29,0x0B,0xF0,0xC4,0xAF,0xBC,0x09,0x29,0x0A,0x0E, + 0x66,0x72,0x25,0x6A,0x60,0xBA,0xD2,0xA0,0x87,0x72,0x46,0x72,0x5A,0x76,0x77,0xBA, + 0x66,0x72,0x26,0x72,0xBA,0xFF,0xEF,0xEA,0x86,0x72,0x26,0x72,0x7F,0xDF,0xED,0xD5, + 0x67,0x7A,0x26,0x6A,0xCD,0x8B,0xAC,0xAD,0x87,0x7A,0x25,0x6A,0xA5,0x9D,0xBA,0xBF, + 0x87,0x7A,0x04,0x6A,0xBB,0xFE,0xDA,0xA2,0x67,0x7A,0x25,0x6A,0x5F,0xC9,0x2F,0xBF, + 0x66,0x72,0x26,0x72,0x7D,0xFE,0x96,0xDE,0x66,0x72,0x05,0x6A,0x02,0xCA,0x27,0x01, + 0x66,0x72,0x26,0x6A,0xD6,0xAD,0xBE,0x88,0x66,0x72,0x26,0x6A,0xFF,0x3D,0xBE,0xAE, + 0x87,0x72,0x26,0x72,0xD7,0xD5,0xFF,0xFB,0x46,0x72,0x25,0x6A,0xA0,0x83,0x8A,0xEA, + 0x46,0x72,0x05,0x6A,0x82,0x0F,0x2B,0x3A,0x66,0x72,0x05,0x6A,0x6E,0xEC,0xD8,0xFE, + 0x45,0x72,0x05,0x6A,0x9D,0x90,0xC2,0x38,0x87,0x7A,0x04,0x6A,0x27,0xFF,0xDF,0x7F, + 0xA7,0x7A,0x04,0x6A,0xB0,0xBD,0xB7,0xED,0xA7,0x82,0x25,0x72,0x02,0xA0,0xFB,0x7E, + 0xA7,0x82,0x46,0x72,0x00,0xA8,0xA3,0xFD,0xA7,0x82,0x67,0x7A,0xAA,0x2A,0xFA,0x85, + 0xC8,0x82,0x86,0x7A,0xE5,0xAF,0xEA,0xDB,0xA7,0x82,0x66,0x7A,0x00,0x80,0x18,0x40, + 0xC7,0x82,0x86,0x7A,0x9E,0xBF,0x8C,0xAC,0xC7,0x82,0x87,0x7A,0xF8,0x0A,0xA2,0xD8, + 0xE8,0x8A,0x86,0x7A,0xB7,0x2F,0x3B,0xAF,0xE7,0x82,0xA7,0x82,0xDA,0xD6,0x75,0xDF, + 0xC7,0x82,0x86,0x7A,0xA6,0xF6,0xDC,0xFC,0xC8,0x82,0x87,0x82,0xBE,0x27,0x2F,0xA2, + 0xE8,0x8A,0x87,0x7A,0x5F,0x5F,0xEF,0xAB,0xA7,0x82,0xE5,0x69,0xF6,0xBE,0x28,0x28, + 0xE8,0x8A,0x26,0x72,0x55,0xEA,0x80,0xA0,0x87,0x82,0xE5,0x69,0x57,0xF7,0xA8,0x08, + 0xA7,0x7A,0xA5,0x61,0xD7,0xFE,0xAA,0xA2,0x47,0x72,0xA5,0x59,0xF7,0x7B,0x58,0x58, + 0xA5,0x59,0x44,0x51,0xE8,0xF0,0x78,0x5A,0x23,0x51,0x44,0x49,0x57,0xE7,0xDE,0x5F, + 0x44,0x49,0xE3,0x38,0x80,0x80,0x80,0x70,0x64,0x49,0xC2,0x30,0xE8,0xFF,0x7F,0x7F, + 0x23,0x41,0xA2,0x30,0x8A,0xEF,0xAD,0xAD,0x03,0x39,0xA1,0x30,0x55,0x5E,0xF8,0xFC, + 0x03,0x39,0xC2,0x30,0x55,0xD5,0x1D,0x29,0x24,0x39,0xC2,0x30,0x9F,0xBF,0xAE,0xB8, + 0x24,0x41,0x03,0x39,0x73,0xFD,0x85,0x57,0x03,0x39,0xA2,0x30,0xA8,0xD8,0xFC,0xF8, + 0x03,0x39,0xC2,0x38,0xCB,0xC5,0xB5,0xA7,0x65,0x49,0xE3,0x38,0xB5,0x3F,0x2D,0x25, + 0x85,0x51,0x44,0x49,0x5D,0x7F,0xDA,0xCF,0x64,0x51,0x23,0x41,0x62,0x63,0xEA,0xFF, + 0x64,0x51,0x24,0x49,0xA5,0xAF,0x3F,0x2D,0xA5,0x61,0x44,0x49,0xA5,0x35,0xAF,0xFE, + 0x06,0x6A,0x64,0x59,0x0B,0x0B,0xBF,0xD5,0x68,0x7A,0xC6,0x61,0x0B,0xAA,0xA9,0xAD, + 0x68,0x7A,0xC6,0x61,0x80,0xC0,0xEA,0xDF,0xE6,0x61,0x44,0x49,0x78,0x7C,0xFC,0x6E, + 0x44,0x49,0xC2,0x38,0xFF,0x5E,0x54,0xDC,0x03,0x41,0xE3,0x40,0x38,0x3D,0x1F,0xDA, + 0x85,0x51,0x03,0x41,0x2F,0x09,0x2B,0x2D,0xC6,0x59,0x03,0x41,0x7A,0xEA,0x28,0x22, + 0xC6,0x59,0x03,0x41,0x55,0x57,0x5A,0xA0,0x64,0x51,0x03,0x41,0x2B,0x2F,0x2D,0x8E, + 0xA5,0x59,0x23,0x49,0x28,0xE0,0xF6,0xD7,0x85,0x59,0x03,0x41,0xAA,0xE2,0xEF,0x7F, + 0xA6,0x59,0xE2,0x40,0x2F,0xBF,0xB7,0xF5,0x88,0x7A,0x85,0x59,0x2F,0x2B,0x0B,0xAD, + 0x29,0x8B,0xA8,0x82,0xAA,0x62,0xAF,0xF5,0x2A,0x93,0x86,0x7A,0x82,0xAA,0xEB,0x75, + 0xA8,0x82,0x05,0x6A,0xE8,0x78,0x58,0x78,0x26,0x6A,0x63,0x51,0x28,0xBA,0xBF,0xF7, + 0x47,0x72,0xA5,0x59,0x2A,0x23,0xAB,0xAD,0x47,0x72,0x06,0x6A,0x22,0xEE,0x8F,0x85, + 0x88,0x7A,0x26,0x72,0xE8,0xEF,0xF9,0x55,0xE9,0x8A,0x26,0x72,0xBF,0x3F,0x29,0xAD, + 0xE9,0x8A,0x88,0x82,0x22,0x20,0xA8,0x6E,0x2A,0x93,0xA8,0x82,0xAB,0x0B,0xBB,0xF5, + 0x0A,0x93,0xA8,0x82,0x7E,0x60,0x5E,0xFF,0xA8,0x82,0x68,0x7A,0x64,0xEE,0xF0,0x68, + 0x68,0x7A,0x26,0x72,0xAB,0xE8,0x50,0xF0,0x67,0x7A,0x06,0x6A,0x80,0x6E,0xF7,0xDF, + 0x88,0x7A,0x26,0x6A,0x2B,0x2B,0xBF,0xD5,0xA8,0x82,0x46,0x72,0x6A,0xE2,0xFF,0xF7, + 0x87,0x7A,0x26,0x6A,0x75,0xFF,0xF8,0xA2,0x67,0x6A,0x05,0x6A,0x0F,0xBB,0x97,0xB7, + 0x67,0x72,0xE6,0x61,0x72,0xA0,0x80,0xA2,0x87,0x72,0xE6,0x61,0x2E,0xBB,0xF7,0xFE, + 0xCC,0x9B,0x27,0x6A,0x2F,0xF7,0xF5,0x55,0xAF,0xBC,0x67,0x72,0x02,0xBF,0xF5,0x55, + 0x92,0xD5,0x2A,0x8B,0x02,0x2B,0xFD,0x55,0x14,0xE6,0xEC,0xA3,0x00,0x0A,0xAB,0xB5, + 0x35,0xEE,0x93,0xD5,0x02,0x08,0x2A,0xAD,0x34,0xEE,0x14,0xE6,0xF7,0x5E,0x78,0xEC, + 0x34,0xE6,0xD4,0xE5,0xA2,0xA2,0xAA,0xE0,0x14,0xE6,0xF4,0xE5,0x80,0xA2,0xFD,0xD5, + 0x14,0xE6,0xF4,0xE5,0x08,0x22,0xB6,0xA5,0x35,0xEE,0xD3,0xDD,0x22,0x0E,0xEE,0x9F, + 0x35,0xE6,0xF4,0xE5,0xAA,0xF8,0xDE,0xFF,0x34,0xE6,0xF4,0xDD,0x75,0xFA,0xFE,0xFE, + 0x14,0xE6,0xF4,0xDD,0x3F,0x37,0x35,0xD5,0x34,0xE6,0xF4,0xE5,0x3F,0xAF,0xFF,0xFF, + 0x55,0xEE,0x14,0xE6,0x8A,0xAB,0xAD,0xB9,0x96,0xF6,0x55,0xEE,0xAD,0xAF,0xD5,0xD5, + 0x97,0xF6,0x35,0xE6,0xA2,0xA8,0x6E,0x5F,0x76,0xEE,0x14,0xE6,0xE8,0xFA,0xF6,0xD5, + 0x55,0xEE,0x14,0xE6,0xA7,0x3F,0xBF,0xBF,0x55,0xEE,0x35,0xE6,0x2E,0x1C,0xDF,0xFF, + 0x55,0xEE,0x14,0xE6,0xFA,0xAC,0xFE,0x57,0x55,0xEE,0x14,0xE6,0xFF,0xE2,0xEF,0x55, + 0x55,0xEE,0xF4,0xDD,0x7F,0xAA,0x82,0xE8,0x35,0xE6,0xD3,0xDD,0xAD,0xAE,0xE8,0xB8, + 0x14,0xE6,0xF4,0xDD,0xE6,0xFA,0xA2,0x02,0x14,0xE6,0xD4,0xDD,0x0E,0x2B,0xA2,0xB6, + 0x55,0xE6,0x14,0xE6,0x29,0x2F,0x3D,0xAD,0x96,0xEE,0x55,0xE6,0x02,0x02,0x03,0x0D, + 0x96,0xEE,0x76,0xEE,0xCA,0xEA,0xA8,0xB8,0x76,0xF6,0x96,0xEE,0x9D,0xD7,0x95,0xF7, + 0x96,0xEE,0x76,0xEE,0x76,0x5F,0xFD,0x3B,0x96,0xEE,0x35,0xE6,0x7A,0x8A,0x80,0x08, + 0x96,0xEE,0xD3,0xDD,0x55,0x7E,0xFA,0xA8,0x35,0xE6,0x92,0xD5,0x5F,0x5F,0xFE,0xF0, + 0xD3,0xD5,0x72,0xD5,0x0D,0xAB,0xED,0x7F,0x14,0xE6,0xB3,0xD5,0xAA,0xAB,0x8D,0xB9, + 0x14,0xE6,0xB3,0xD5,0x7E,0x6A,0xAA,0xAB,0xF4,0xDD,0x51,0xD5,0x7E,0xAB,0xEA,0x80, + 0x92,0xD5,0x6F,0xB4,0x5E,0xA0,0x00,0x00,0xB2,0xD5,0x0D,0xA4,0x57,0xFF,0xEA,0xA8, + 0xAF,0xBC,0x0D,0xA4,0x2D,0x0A,0x2A,0x58,0xF0,0xC4,0x0D,0xA4,0x08,0x02,0x0A,0xBD, + 0x87,0x7A,0x25,0x6A,0xDF,0x1D,0xFB,0xFA,0x86,0x7A,0x25,0x6A,0x32,0xB9,0xEB,0xE7, + 0x66,0x72,0x05,0x72,0xA8,0xAE,0xAB,0xA9,0x66,0x72,0x06,0x72,0xAA,0x2A,0x02,0xE0, + 0x87,0x7A,0x46,0x72,0x55,0x15,0x97,0xEF,0x87,0x7A,0x25,0x6A,0xBD,0xBB,0x2B,0x7A, + 0x66,0x72,0x05,0x72,0x00,0x8C,0xA8,0x2A,0xA7,0x82,0x25,0x6A,0xEF,0xFB,0xFF,0x6A, + 0x86,0x72,0x26,0x72,0xFE,0xEE,0xFE,0x92,0x66,0x72,0x26,0x72,0x82,0xEB,0xAE,0xA2, + 0x66,0x72,0x26,0x72,0xA8,0xE2,0xE0,0x12,0x67,0x72,0x26,0x72,0xEE,0xBF,0x81,0x2B, + 0x66,0x72,0x25,0x72,0x76,0xBF,0x3F,0x5D,0x87,0x7A,0x25,0x6A,0x5F,0xDF,0xD2,0x38, + 0x66,0x72,0x05,0x6A,0xBE,0xEE,0xFE,0xB0,0x66,0x72,0xE5,0x69,0xA6,0x28,0xAA,0x82, + 0x66,0x72,0x05,0x72,0x2A,0x02,0x8E,0xAA,0x66,0x72,0x25,0x72,0xFE,0xD0,0xA8,0x9B, + 0x66,0x72,0x05,0x6A,0xEF,0xE8,0xFA,0xEE,0x46,0x72,0x05,0x6A,0xE0,0xA8,0x37,0x0A, + 0x66,0x72,0x25,0x6A,0xFA,0x5F,0x75,0x9F,0x87,0x7A,0x25,0x6A,0x8B,0xBD,0xF7,0x56, + 0xC7,0x82,0x05,0x6A,0x0A,0x2A,0xBB,0xF5,0xC7,0x82,0x45,0x72,0x02,0xA0,0xBB,0xFD, + 0xC8,0x82,0x66,0x7A,0xAA,0xAA,0x2B,0x2D,0xC8,0x82,0x86,0x7A,0x7E,0xF7,0xEC,0xB8, + 0xC7,0x82,0x87,0x7A,0x8B,0xAA,0x8B,0xBE,0xC8,0x82,0xA7,0x82,0x0F,0xCA,0xE8,0x33, + 0xE7,0x8A,0xA7,0x82,0xF5,0xF5,0xED,0x6A,0xE8,0x8A,0xA7,0x82,0xAB,0xEA,0xFB,0xFB, + 0xE8,0x8A,0xA7,0x82,0xBF,0xAD,0xEB,0x2B,0xE8,0x8A,0x66,0x7A,0x9F,0x7E,0xF8,0xE8, + 0xE8,0x8A,0x87,0x7A,0xA3,0x8B,0xED,0xCB,0xC8,0x8A,0x46,0x72,0xD6,0xFC,0xF8,0xA8, + 0xA7,0x7A,0x26,0x72,0xF2,0x78,0x7E,0x5E,0x26,0x72,0x44,0x51,0xF8,0x7A,0x7C,0x7A, + 0x64,0x51,0xE3,0x38,0x80,0x2A,0xEA,0x7A,0x64,0x51,0xE3,0x38,0x82,0xA8,0x5E,0x57, + 0x44,0x49,0xA1,0x28,0xF8,0xF8,0xDF,0x57,0xE3,0x38,0x81,0x28,0x8B,0x8F,0x9F,0xF5, + 0xE3,0x38,0xC2,0x30,0x39,0x3D,0x9D,0x59,0xE3,0x38,0xC2,0x28,0xA8,0xAA,0xDC,0xA7, + 0x23,0x39,0xC3,0x30,0x2D,0xAB,0xBE,0xBF,0x24,0x39,0xC2,0x30,0xFC,0xF6,0x7E,0x7E, + 0x03,0x39,0xC2,0x30,0xA2,0xDE,0x5D,0xF5,0xE2,0x38,0xC2,0x30,0x20,0x0A,0x2A,0x9D, + 0x03,0x39,0xE2,0x38,0x49,0x59,0xFD,0x97,0x64,0x49,0xE2,0x38,0x2D,0x3D,0xBD,0x2F, + 0x85,0x51,0x03,0x41,0x82,0xA0,0xA2,0x5E,0x64,0x49,0x23,0x49,0xF6,0x96,0xEB,0xAB, + 0x64,0x51,0x44,0x51,0xDD,0x9E,0x82,0x22,0xA5,0x59,0x44,0x51,0xFD,0xE9,0x0B,0x02, + 0xA5,0x59,0x65,0x59,0x95,0xDD,0x36,0x1A,0x27,0x72,0xA5,0x61,0x0D,0x0D,0x09,0x2F, + 0x07,0x6A,0x65,0x51,0x68,0x60,0xFC,0xF8,0x64,0x51,0x24,0x49,0x7B,0xFD,0xCF,0xF8, + 0x44,0x49,0xE3,0x40,0x57,0x7E,0xEA,0xF8,0x24,0x41,0xA2,0x30,0xA2,0xE2,0xFA,0xFE, + 0x85,0x51,0xC2,0x38,0xAF,0xB5,0xB5,0x2D,0xE6,0x59,0x84,0x51,0xA7,0xBD,0xFD,0x2A, + 0xE6,0x61,0x85,0x51,0xE2,0xF2,0x7B,0x5E,0x85,0x51,0x24,0x49,0xAE,0xC8,0xFE,0xDF, + 0x65,0x51,0x03,0x41,0x58,0x7A,0x6F,0x5F,0x23,0x49,0xE3,0x38,0xA0,0xFA,0xBB,0xBD, + 0xE3,0x40,0x02,0x39,0x0A,0x00,0x80,0xE2,0x46,0x72,0x23,0x49,0x29,0xF5,0xF5,0xD5, + 0x86,0x7A,0xC5,0x59,0x0A,0xAB,0xFD,0x55,0x66,0x72,0x64,0x51,0x80,0xE8,0xFF,0x5F, + 0x25,0x6A,0x64,0x51,0xA0,0xAB,0xF5,0xD5,0xC5,0x61,0x64,0x51,0x5C,0xFA,0xFD,0xFE, + 0xC6,0x61,0x64,0x51,0x0B,0xAD,0xFF,0xF7,0x06,0x6A,0x85,0x59,0x2A,0xB7,0xF5,0x55, + 0x26,0x72,0x84,0x59,0x28,0x2F,0xBD,0x95,0x88,0x7A,0xE5,0x69,0x0A,0x2A,0xAB,0xBD, + 0xA8,0x82,0x67,0x7A,0xA2,0xCB,0x61,0x6E,0xE9,0x8A,0x46,0x72,0x0A,0x09,0xA7,0x55, + 0xE9,0x8A,0x67,0x7A,0xA0,0x88,0xEB,0xFD,0xC9,0x8A,0x67,0x7A,0x9E,0xDF,0xAB,0xA2, + 0xE9,0x92,0x47,0x72,0x5F,0x6F,0xA2,0xA0,0xA8,0x7A,0x06,0x72,0xF7,0xF7,0xFE,0xF8, + 0x47,0x72,0xE5,0x69,0x3A,0xAE,0xFE,0xF5,0x67,0x7A,0xC5,0x61,0x00,0xBA,0x5F,0x5F, + 0x67,0x72,0xC5,0x61,0x00,0x0B,0xA5,0x55,0x87,0x72,0x06,0x6A,0xFE,0x82,0xCA,0xFD, + 0x67,0x72,0xE5,0x61,0xEA,0xE8,0xF2,0xD7,0x46,0x6A,0xC5,0x59,0xBA,0xB8,0x7C,0x5F, + 0x27,0x6A,0x84,0x59,0x00,0x0A,0xAA,0xDF,0x68,0x72,0xC5,0x61,0x0A,0x2E,0xFB,0x7D, + 0xC8,0x82,0x26,0x6A,0x00,0x2A,0xAF,0xA5,0xAF,0xBC,0xC8,0x7A,0x2D,0x2D,0xF5,0xF5, + 0xF4,0xE5,0xEC,0xA3,0x02,0x0A,0x0B,0xBD,0x35,0xEE,0xD3,0xE5,0x02,0x02,0x82,0x29, + 0x34,0xEE,0xF4,0xE5,0xE2,0xEA,0xFA,0xF2,0x14,0xE6,0xD3,0xDD,0xBE,0xFB,0xF8,0xFA, + 0xF4,0xE5,0xD3,0xDD,0x28,0x8A,0x2F,0x0B,0xF4,0xDD,0xB3,0xDD,0xE8,0x78,0x7E,0xB0, + 0x14,0xE6,0xB3,0xDD,0x2A,0x2B,0xAD,0xFE,0x14,0xE6,0xD3,0xDD,0xE8,0x7A,0xFA,0xFF, + 0xF4,0xE5,0xD3,0xDD,0xFE,0xFB,0x5B,0xDF,0x14,0xE6,0xD3,0xDD,0xCF,0xAD,0xD5,0xB5, + 0x34,0xE6,0xF3,0xE5,0x0B,0x2B,0x2F,0x2A,0x55,0xEE,0x35,0xE6,0x02,0x82,0x77,0x57, + 0x56,0xEE,0x14,0xE6,0xAC,0xDE,0xFE,0x55,0x35,0xE6,0x14,0xE6,0xFC,0x38,0x2F,0xBD, + 0x55,0xEE,0x14,0xE6,0xBE,0xAA,0x3E,0xFF,0x55,0xEE,0x35,0xE6,0xEE,0xBB,0x7E,0xF7, + 0x35,0xE6,0xD3,0xDD,0xF8,0x78,0x7A,0xA8,0x14,0xE6,0xD3,0xDD,0x2B,0x37,0xBF,0xAF, + 0xF4,0xE5,0x35,0xDE,0xAB,0x22,0xA0,0xFA,0x34,0xE6,0xF4,0xE5,0xFF,0xA9,0x2B,0x2B, + 0x35,0xE6,0xF4,0xDD,0xAF,0xEE,0x6E,0xFA,0x34,0xE6,0xF4,0xDD,0xF7,0xBF,0x2D,0xAF, + 0x76,0xEE,0x15,0xE6,0x3D,0xAF,0xBF,0xFD,0xB6,0xF6,0x56,0xE6,0xB9,0xAF,0xBB,0x0F, + 0xB6,0xF6,0x76,0xEE,0xF7,0xB5,0xBF,0xF8,0x76,0xF6,0x96,0xEE,0xDD,0xFD,0xFF,0xF5, + 0x76,0xF6,0x96,0xEE,0x5D,0xF7,0xFF,0x56,0x96,0xEE,0x76,0xEE,0x6A,0xFD,0xFA,0x70, + 0x96,0xEE,0x35,0xE6,0xEA,0xA8,0x22,0x88,0xB6,0xEE,0x14,0xE6,0x7F,0xFA,0xAA,0xAA, + 0x55,0xEE,0xB3,0xD5,0x57,0x5A,0xA0,0x00,0x35,0xE6,0x92,0xD5,0xBD,0xF5,0xFF,0xFC, + 0x14,0xE6,0xB3,0xD5,0x2E,0xAA,0x2F,0xAD,0x14,0xE6,0xD3,0xDD,0xFB,0xCA,0x6A,0xFA, + 0xF3,0xDD,0xB3,0xD5,0x7F,0xC2,0x08,0x20,0xF4,0xDD,0x51,0xCD,0x5E,0xE8,0x80,0x00, + 0xD3,0xDD,0x8F,0xB4,0x5E,0xEA,0x20,0x00,0x72,0xCD,0x6A,0x93,0xD7,0x5E,0xF8,0xC0, + 0x87,0x7A,0x46,0x72,0x7E,0x7A,0x5E,0x75,0x66,0x72,0x25,0x6A,0xE6,0x2A,0x0A,0x32, + 0x86,0x7A,0x46,0x72,0xF5,0xDB,0xBB,0x7A,0x66,0x72,0x25,0x72,0x3A,0xAA,0x20,0x2F, + 0x66,0x72,0x25,0x6A,0xE0,0x18,0xD2,0x3A,0x87,0x7A,0x26,0x6A,0x7E,0xEA,0xAF,0xEC, + 0x87,0x7A,0x46,0x72,0xD1,0x7B,0xEA,0x69,0x66,0x72,0x26,0x72,0x6A,0xAA,0x82,0x23, + 0x66,0x72,0x25,0x72,0xAE,0x3E,0x3F,0xEA,0x86,0x72,0x25,0x6A,0xEA,0xEF,0xF4,0xB7, + 0x87,0x7A,0x46,0x72,0xDD,0xFB,0xBF,0x8D,0x66,0x72,0x25,0x72,0xE0,0xCE,0x2C,0xAC, + 0x66,0x7A,0x25,0x6A,0x69,0xE9,0xB2,0x82,0x87,0x7A,0x46,0x72,0x9F,0xE5,0x45,0xFD, + 0x87,0x7A,0x25,0x6A,0xDA,0x8B,0xCD,0xAB,0x87,0x7A,0x25,0x6A,0xEF,0xFA,0x9A,0xD8, + 0x67,0x72,0x26,0x72,0xA3,0x36,0xDE,0x98,0x66,0x72,0x05,0x6A,0xAA,0xC0,0xE8,0xF8, + 0x66,0x72,0x25,0x72,0x4A,0xCB,0xCA,0xCB,0x46,0x72,0x25,0x6A,0x87,0x2B,0x01,0x03, + 0x87,0x7A,0x25,0x6A,0x57,0x77,0x6B,0xF2,0x66,0x72,0x05,0x6A,0x7B,0xE2,0xA0,0x0A, + 0x67,0x7A,0x05,0x6A,0x2D,0x2B,0xAA,0x2A,0x67,0x7A,0x26,0x72,0x7E,0xFE,0xBE,0xC8, + 0x87,0x7A,0x25,0x72,0x07,0xBF,0xFF,0xFF,0xA8,0x82,0x25,0x72,0x0A,0x2D,0xF7,0x9F, + 0xC8,0x82,0x26,0x72,0x2A,0x0A,0xEB,0x67,0xC7,0x82,0x66,0x7A,0xAC,0xB8,0xAB,0xAD, + 0xC8,0x82,0xA7,0x82,0xC0,0xD7,0xD5,0x5F,0xE8,0x8A,0xA7,0x82,0x7B,0xEA,0xB2,0xF5, + 0x09,0x93,0xA7,0x82,0x8F,0x8B,0xFB,0xDB,0x09,0x93,0xC8,0x8A,0x5F,0xAD,0x3F,0x2F, + 0x29,0x93,0xC8,0x8A,0x7D,0x7E,0x6E,0x72,0xC9,0x8A,0x06,0x6A,0xA8,0xA8,0xE0,0x78, + 0x67,0x7A,0xA4,0x59,0xE8,0xFA,0xFA,0x5F,0xE5,0x61,0x23,0x49,0x68,0x78,0x7E,0x5F, + 0x24,0x49,0xC2,0x30,0xE8,0xF8,0x7C,0x5D,0x03,0x39,0xA2,0x30,0xBF,0xFF,0xFF,0x55, + 0xC2,0x30,0x82,0x28,0xC0,0x68,0x7E,0xF7,0xC2,0x30,0x81,0x28,0x25,0x25,0x2D,0x2D, + 0xE2,0x30,0xA2,0x28,0xFE,0xF6,0xF7,0xF7,0x03,0x31,0xA2,0x28,0xBE,0x1F,0xBF,0xB7, + 0x03,0x39,0xA2,0x28,0xAA,0xA8,0xAA,0x5B,0xE3,0x30,0x82,0x28,0x20,0x2A,0xB6,0xAE, + 0xE3,0x30,0xA2,0x30,0x80,0xDE,0xFE,0xDF,0xE2,0x30,0xA2,0x30,0x1D,0xFF,0xFF,0xF5, + 0x23,0x41,0xC2,0x30,0xB5,0x95,0x35,0xB5,0xA6,0x51,0x24,0x41,0xBD,0x8B,0x81,0xEB, + 0x64,0x49,0xE3,0x40,0x58,0x7A,0x5E,0x57,0x44,0x49,0xE3,0x40,0x03,0x29,0x29,0x2D, + 0x85,0x59,0x44,0x51,0xEB,0xAA,0xF5,0x83,0xA5,0x59,0x64,0x51,0x0A,0xA6,0x77,0x55, + 0xC5,0x61,0x44,0x49,0xBC,0x28,0x3A,0xAD,0x27,0x72,0xC5,0x61,0x8D,0xE9,0xA9,0xFD, + 0xE6,0x61,0x65,0x51,0xFF,0x7E,0x78,0x5A,0x65,0x51,0xE2,0x38,0xA8,0xE8,0xBC,0x5F, + 0x64,0x49,0xE3,0x38,0x78,0x6A,0xFA,0xEB,0x24,0x41,0xC3,0x38,0x5F,0xFD,0xA7,0x2F, + 0xA6,0x59,0x03,0x41,0x25,0xAD,0xAB,0x8F,0xE7,0x61,0x44,0x49,0x02,0x0A,0xFF,0x55, + 0xE7,0x61,0x64,0x49,0xEA,0x20,0xA3,0xF5,0x85,0x51,0x24,0x41,0x7E,0xE8,0x78,0x5C, + 0x44,0x49,0xE3,0x38,0x7E,0xDC,0xDC,0xFE,0x44,0x49,0xC2,0x30,0xF7,0xFE,0xAA,0x82, + 0x65,0x49,0xE3,0x38,0xFD,0xFD,0xCB,0x82,0x44,0x49,0x03,0x41,0x2F,0x3F,0xBD,0xEF, + 0xC6,0x59,0x24,0x49,0x8A,0xA3,0xAB,0xAD,0xA5,0x59,0x43,0x49,0xE2,0x7A,0x5C,0x58, + 0x85,0x51,0x23,0x49,0xED,0xFF,0xB7,0xD7,0x85,0x51,0x23,0x49,0x00,0xE0,0xDA,0x5F, + 0x84,0x51,0x43,0x49,0xA8,0xE8,0xEB,0xD7,0xC5,0x61,0x44,0x51,0xAF,0x2F,0x2F,0xAD, + 0x26,0x6A,0x84,0x59,0x9F,0xAA,0xAA,0x7D,0x88,0x7A,0xA5,0x59,0x0B,0x2A,0x0F,0xAD, + 0xA8,0x82,0x06,0x72,0xA0,0xA2,0xAA,0x5E,0x68,0x7A,0xE6,0x69,0x8A,0xAA,0xDE,0xDF, + 0xC9,0x8A,0x46,0x7A,0xB7,0x2D,0x25,0x8D,0xC9,0x8A,0x87,0x82,0x20,0xE0,0xE0,0xFC, + 0xE9,0x8A,0x67,0x82,0x02,0x02,0xAB,0xDA,0xEA,0x8A,0x47,0x7A,0x5C,0x7C,0xE2,0xAA, + 0x88,0x82,0x26,0x72,0x55,0xBF,0xF8,0xA8,0x67,0x7A,0xC5,0x61,0x5F,0xB2,0xC0,0xE0, + 0x07,0x6A,0xA5,0x59,0x7F,0x7E,0xD8,0x6C,0x06,0x6A,0x64,0x51,0x02,0xFE,0x7F,0x57, + 0xE5,0x61,0x64,0x51,0x00,0xAB,0xBD,0xD5,0xC5,0x61,0x64,0x51,0x80,0xA8,0xFA,0xB7, + 0xC6,0x59,0x84,0x59,0xDC,0xAA,0xBF,0x2B,0x06,0x6A,0xA5,0x59,0xEB,0x2F,0xAF,0xFD, + 0x67,0x72,0xE5,0x61,0x3F,0xBF,0xAB,0xDF,0xC9,0x82,0x26,0x6A,0x0A,0xAB,0xB7,0xD7, + 0x6E,0xB4,0x47,0x72,0x2B,0xBF,0xBD,0xFD,0xD3,0xE5,0x8B,0x9B,0x02,0x0B,0xBF,0xD5, + 0x14,0xE6,0x6F,0xBC,0x00,0x02,0xAB,0xBD,0x14,0xE6,0xB3,0xE5,0xA2,0xA2,0xAA,0xAD, + 0x14,0xE6,0xF4,0xE5,0xE5,0xBF,0xFE,0x7A,0x14,0xE6,0xD3,0xDD,0xBF,0xAC,0xA0,0xA3, + 0x14,0xE6,0xD4,0xDD,0x5E,0xF8,0xE8,0xAA,0xF3,0xE5,0xB3,0xDD,0x8A,0xFF,0xFA,0x7C, + 0x14,0xE6,0xB3,0xDD,0xFB,0xDF,0x57,0x7F,0xF4,0xE5,0xB3,0xDD,0x2E,0x2F,0xAB,0xBD, + 0x35,0xE6,0xF4,0xDD,0x2F,0xAB,0x2D,0xBD,0x35,0xE6,0xF3,0xE5,0x80,0xA8,0xEA,0xFA, + 0x14,0xE6,0xD3,0xDD,0xA2,0x98,0xFE,0x7E,0x35,0xE6,0xD3,0xDD,0x2A,0xAA,0xBB,0xBD, + 0x56,0xE6,0x14,0xE6,0xB7,0x5F,0xF5,0x95,0x55,0xEE,0x15,0xE6,0xEA,0xA8,0xE0,0xF0, + 0x34,0xE6,0xF4,0xDD,0xE8,0xAE,0xFF,0x57,0x35,0xE6,0xD3,0xDD,0xFB,0xE8,0xEA,0x7E, + 0xD4,0xE5,0x14,0xDE,0xBE,0xFA,0xFE,0xFA,0x14,0xE6,0xF4,0xDD,0x23,0x28,0xEE,0xAF, + 0x55,0xE6,0xF4,0xE5,0xFF,0xF5,0xFF,0xB7,0x34,0xE6,0xF4,0xDD,0xD6,0xBA,0xEA,0xBE, + 0x55,0xEE,0x14,0xE6,0x35,0xE5,0xF5,0x55,0xB6,0xF6,0x35,0xE6,0x2B,0xAB,0xA9,0xA9, + 0xB6,0xF6,0x76,0xEE,0xEA,0xFA,0xFE,0xAA,0xB6,0xF6,0x76,0xEE,0xF7,0xEF,0xBA,0xEA, + 0x76,0xF6,0x96,0xEE,0x6F,0x5F,0xFD,0xD7,0x76,0xF6,0x96,0xEE,0xFD,0xF5,0xFF,0x67, + 0x96,0xEE,0x76,0xEE,0xFF,0xBF,0xB6,0x57,0x96,0xEE,0x35,0xE6,0xAA,0xA0,0xFA,0x5E, + 0x75,0xEE,0xF4,0xDD,0x20,0xA0,0xEA,0x7B,0x55,0xEE,0xB2,0xD5,0xF8,0xE8,0xF6,0x57, + 0xF3,0xDD,0x92,0xD5,0x2A,0xAA,0xEA,0x5F,0x15,0xE6,0xB3,0xD5,0xB2,0xBE,0xBD,0x75, + 0xF4,0xDD,0xB3,0xD5,0xAA,0xBC,0xAE,0xFF,0xF4,0xE5,0xB3,0xD5,0x28,0xAB,0xB6,0xFF, + 0xF3,0xDD,0x91,0xD5,0xA8,0xAA,0xAA,0xF6,0xD2,0xDD,0xF0,0xC4,0x68,0xE0,0xA0,0xA0, + 0x87,0x7A,0x25,0x6A,0xC9,0xAB,0xEA,0xBF,0x86,0x72,0x25,0x72,0xDA,0xBB,0xAA,0x2B, + 0x86,0x7A,0x26,0x6A,0xAA,0xBB,0x68,0xFB,0x66,0x72,0x46,0x72,0x1F,0x0B,0x3F,0xA1, + 0x87,0x7A,0x66,0x72,0x97,0xE7,0x6A,0x69,0x87,0x7A,0x46,0x72,0xF4,0xDE,0xEF,0xAE, + 0x86,0x72,0x26,0x72,0xAF,0xBF,0x1F,0xAF,0x87,0x7A,0x26,0x72,0xFB,0xC1,0xEB,0xAA, + 0x66,0x72,0x46,0x72,0x6B,0x7B,0xFD,0xFE,0x66,0x72,0x25,0x6A,0x07,0x35,0x27,0x82, + 0x86,0x7A,0x26,0x6A,0x9F,0xFB,0xEA,0xE8,0x86,0x7A,0x46,0x72,0xED,0xF7,0xDD,0xFE, + 0x66,0x72,0x25,0x72,0x8A,0x0B,0x3E,0x2E,0x66,0x72,0x25,0x6A,0xBA,0x7A,0x82,0x02, + 0x66,0x72,0x25,0x6A,0xF1,0x7B,0xAD,0x8C,0x87,0x7A,0x46,0x72,0x5E,0xED,0xAB,0xE3, + 0x87,0x7A,0x25,0x6A,0xA6,0xEF,0xAA,0xE8,0x66,0x7A,0x46,0x72,0x56,0xDF,0xE9,0x0B, + 0x87,0x7A,0x25,0x6A,0x6A,0xEA,0xAA,0x62,0x87,0x7A,0x26,0x72,0xFF,0xA2,0xB2,0x7B, + 0x66,0x72,0x26,0x72,0xBA,0xAB,0x0A,0x00,0x66,0x72,0x25,0x72,0x0B,0x0E,0xAA,0x18, + 0x66,0x72,0x26,0x72,0xA0,0xA4,0x6B,0xC2,0x86,0x7A,0x25,0x72,0xBE,0xFF,0x63,0x6A, + 0x66,0x7A,0x26,0x72,0xA8,0x62,0x01,0xB9,0x66,0x82,0x46,0x72,0xDD,0x7F,0xD7,0x59, + 0x66,0x7A,0x05,0x72,0xB6,0xB6,0xAA,0x8A,0x66,0x7A,0x25,0x72,0x0A,0x9F,0x38,0x02, + 0xA7,0x82,0x46,0x72,0xA8,0xBB,0xFF,0x97,0xC8,0x82,0x66,0x7A,0x02,0x2B,0xBF,0xD5, + 0xC8,0x82,0x66,0x7A,0x88,0xA8,0xBF,0xD5,0x09,0x8B,0xA7,0x82,0x2E,0xEA,0x02,0xC9, + 0x29,0x93,0xC8,0x8A,0xA2,0xE8,0x6A,0x62,0xA7,0x82,0xC5,0x61,0x78,0x7A,0x7C,0x5E, + 0xA5,0x59,0x03,0x41,0xE0,0xF0,0x5C,0x54,0x23,0x41,0xC2,0x38,0xA0,0xF0,0x7B,0x77, + 0xE2,0x38,0xA2,0x30,0xFC,0xDC,0xBE,0x7E,0xC2,0x30,0x81,0x28,0x58,0x7E,0xDE,0xBB, + 0xC2,0x30,0x61,0x20,0xFF,0x7E,0xAE,0xAC,0xA2,0x28,0x61,0x20,0x0B,0x0B,0x23,0xAA, + 0xC2,0x28,0xA2,0x28,0x9E,0x7D,0x63,0xB5,0xC2,0x30,0xA2,0x28,0xBA,0xF5,0x95,0xD6, + 0xC2,0x30,0xA2,0x28,0xBA,0xA6,0x06,0x0D,0xE3,0x30,0xA2,0x28,0xEB,0x8B,0x6F,0x7F, + 0xC2,0x30,0xA2,0x28,0xD8,0xEA,0xEB,0x75,0x03,0x39,0xA2,0x30,0xB5,0xBD,0xBD,0x2B, + 0x44,0x49,0xC2,0x30,0xBD,0xBD,0xBB,0x0A,0x85,0x51,0xE3,0x38,0xE2,0x7A,0x7F,0x7B, + 0x03,0x41,0xC2,0x38,0xBE,0xFF,0xDF,0x7F,0x44,0x49,0xE3,0x40,0x25,0x3F,0x2D,0xFD, + 0x85,0x59,0x23,0x41,0x82,0xBE,0xF5,0xD5,0x64,0x51,0x44,0x49,0x7B,0x7E,0xAB,0x20, + 0x64,0x51,0x23,0x49,0x0D,0x07,0x2F,0x0A,0xC6,0x61,0x44,0x49,0x0A,0xAB,0xDF,0x77, + 0xC6,0x59,0x24,0x49,0xF8,0x7E,0x6B,0x7D,0x24,0x49,0xE3,0x38,0x5E,0xF4,0x54,0x57, + 0x44,0x41,0xC2,0x38,0x8A,0xEA,0xFF,0x7D,0x24,0x41,0xE2,0x38,0x0F,0x26,0xAD,0xFD, + 0x85,0x49,0x23,0x41,0xCD,0xAD,0x35,0xF5,0x65,0x49,0x24,0x41,0x7F,0x56,0x72,0xFA, + 0x65,0x49,0xE2,0x38,0x0A,0x2B,0xAA,0x6B,0x44,0x49,0x03,0x41,0xFC,0x5C,0x54,0x55, + 0x44,0x49,0x03,0x41,0x57,0xDC,0x77,0x56,0x44,0x49,0xE2,0x38,0x0A,0x2A,0xEB,0x5E, + 0x44,0x49,0xC2,0x38,0xA8,0xB8,0xBF,0xD5,0x44,0x49,0xE3,0x38,0xAB,0x2A,0xBF,0xB7, + 0x85,0x51,0x23,0x49,0x2F,0x3D,0x3F,0x0F,0xC6,0x59,0x64,0x51,0x5F,0xEB,0xF2,0xFA, + 0xA5,0x51,0x43,0x49,0x77,0x7F,0xF8,0xBF,0x64,0x49,0x23,0x49,0x7E,0x68,0x56,0xFE, + 0x43,0x49,0x03,0x41,0x3A,0xB9,0xBB,0xDF,0xA5,0x59,0x03,0x49,0x2B,0x2F,0xAF,0xBD, + 0xA5,0x59,0x65,0x51,0xFA,0xFF,0x97,0x2E,0x26,0x72,0x84,0x59,0x25,0x95,0xB5,0xBD, + 0x06,0x72,0xA4,0x61,0x88,0xBF,0xB5,0xEE,0x27,0x72,0xE6,0x69,0xF5,0xAF,0x9A,0x5E, + 0xC8,0x8A,0x06,0x72,0x2B,0x09,0x2F,0xAF,0xE8,0x8A,0x46,0x7A,0xB8,0xF8,0x7A,0x7F, + 0xA8,0x82,0x26,0x72,0x20,0xBA,0xAF,0xB5,0xC9,0x8A,0x67,0x7A,0xE2,0xEA,0x6B,0x5F, + 0xA8,0x82,0x06,0x6A,0xA8,0xFA,0x5F,0x5D,0x47,0x72,0xC6,0x69,0xA0,0xFA,0xDF,0xBF, + 0x26,0x6A,0x84,0x59,0x5E,0x5E,0xFB,0x80,0xE5,0x61,0x64,0x51,0xD7,0xDD,0xBB,0x00, + 0xC5,0x59,0x64,0x51,0xF5,0xD7,0xB8,0x28,0xC6,0x59,0x85,0x59,0xBD,0xB5,0xE5,0x88, + 0xE6,0x61,0xA5,0x59,0xE7,0xEA,0xF9,0x7A,0xE6,0x61,0x85,0x51,0x8B,0xAE,0xEB,0xB7, + 0x06,0x62,0xA5,0x59,0xE3,0xED,0x55,0xD5,0x47,0x72,0xE5,0x61,0x3D,0xB5,0xDD,0xBD, + 0xE9,0x82,0x47,0x72,0x3F,0xA5,0xB5,0xFD,0x8B,0x9B,0x88,0x7A,0x0B,0xAB,0x5D,0xDD, + 0x2D,0xAC,0xA8,0x82,0x02,0xBF,0xF5,0x55,0x93,0xDD,0x29,0x8B,0x02,0x2F,0xAD,0xB5, + 0xF4,0xE5,0x51,0xD5,0x00,0x03,0x09,0xAD,0xF4,0xE5,0x14,0xDE,0xA8,0x88,0x00,0x00, + 0x14,0xE6,0xD4,0xDD,0x8B,0x7A,0xAE,0xEA,0xD3,0xDD,0xB3,0xDD,0x98,0xBB,0xFE,0xE5, + 0xD3,0xDD,0x92,0xD5,0x80,0x00,0xE0,0xE8,0xD3,0xDD,0xB2,0xDD,0x27,0x0F,0x0D,0xA9, + 0x14,0xE6,0xB3,0xDD,0x0A,0x0A,0xAF,0xED,0x14,0xE6,0xF4,0xDD,0xE8,0xFE,0xED,0xFF, + 0x14,0xE6,0xB3,0xDD,0xEA,0xBA,0xF8,0x6B,0x14,0xE6,0xD3,0xDD,0xB5,0xA7,0x0F,0x2F, + 0x55,0xEE,0x14,0xE6,0xB5,0x09,0x20,0x00,0x55,0xEE,0x14,0xE6,0x70,0xF2,0xEA,0xBA, + 0x35,0xE6,0xD3,0xDD,0xDF,0x57,0xDE,0xE8,0x14,0xE6,0xD3,0xDD,0xDD,0xA7,0x0B,0x02, + 0x35,0xE6,0xD3,0xDD,0xFD,0xFA,0xEA,0xBA,0x14,0xE6,0xF4,0xDD,0x8F,0x0B,0xA9,0x46, + 0x14,0xE6,0xF4,0xDD,0x0A,0x20,0x80,0x82,0x14,0xE6,0xD4,0xDD,0xFA,0x7F,0x7F,0xA8, + 0x35,0xE6,0xD3,0xDD,0x3B,0xAF,0xAD,0x3D,0x96,0xEE,0x35,0xE6,0x0F,0x29,0x29,0x0D, + 0xB7,0xF6,0x96,0xEE,0xF7,0x5D,0xEF,0x67,0xB6,0xF6,0x96,0xEE,0xDE,0xF7,0x9F,0xD5, + 0xB6,0xF6,0x76,0xEE,0xEA,0xFA,0xFA,0xFE,0x96,0xEE,0x76,0xEE,0xFE,0xDD,0xEF,0x5E, + 0x96,0xEE,0xF3,0xDD,0xA8,0xFA,0x7A,0x78,0x35,0xE6,0x93,0xD5,0x20,0xFA,0xFE,0xFF, + 0xF3,0xDD,0xB3,0xD5,0xEA,0x5F,0x57,0x57,0xD3,0xDD,0x92,0xD5,0xC8,0xEA,0xFF,0x75, + 0xD3,0xDD,0x92,0xD5,0xD7,0xA5,0xBD,0x6D,0xB3,0xDD,0x71,0xCD,0x80,0xA0,0xFF,0xB7, + 0xD3,0xDD,0x72,0xCD,0x8A,0x2A,0xEF,0xFB,0xD3,0xDD,0x92,0xD5,0xEA,0xFA,0xFB,0xFD, + 0xB2,0xD5,0x52,0xD5,0xB8,0xAE,0xEC,0xDA,0xB2,0xD5,0x72,0xD5,0xC2,0xC9,0x7D,0x75, + 0x66,0x72,0x25,0x72,0x20,0x08,0xA8,0x26,0x87,0x7A,0x46,0x72,0xF3,0x5C,0xE8,0x5F, + 0x67,0x7A,0x26,0x72,0xE6,0xAE,0x0A,0x00,0x87,0x72,0x26,0x6A,0xBA,0xFF,0xFE,0xE8, + 0x87,0x7A,0x46,0x72,0xA9,0xEF,0xEE,0x77,0x87,0x72,0x25,0x6A,0xAB,0xB7,0xFB,0xA8, + 0x87,0x7A,0x46,0x72,0xBF,0xCA,0x0A,0xFF,0x87,0x7A,0x26,0x72,0x2A,0xEA,0xA6,0x8B, + 0x86,0x7A,0x46,0x72,0x5A,0xF5,0xFD,0xFE,0x86,0x7A,0x26,0x6A,0xEB,0xF3,0xB8,0xF2, + 0xA7,0x7A,0x46,0x72,0xCF,0xE7,0xFF,0xEB,0x86,0x7A,0x46,0x72,0xA9,0xAF,0xF8,0x7C, + 0x87,0x7A,0x45,0x72,0xDC,0xE2,0xF8,0xA2,0x86,0x7A,0x46,0x72,0xE3,0xFB,0xB5,0xAD, + 0x87,0x7A,0x45,0x72,0xFD,0xE3,0xC2,0x82,0x87,0x7A,0x45,0x72,0x69,0x73,0xE3,0xF2, + 0x66,0x7A,0x45,0x72,0x50,0x6F,0xAE,0x2C,0x66,0x72,0x26,0x72,0xE2,0xE3,0x80,0xB2, + 0x87,0x7A,0x25,0x72,0x72,0xAA,0xFA,0xF8,0x87,0x7A,0x25,0x72,0xDB,0xBA,0xBA,0x9A, + 0x66,0x7A,0x46,0x72,0xB9,0xEF,0x78,0x5E,0x66,0x7A,0x46,0x72,0x98,0x80,0x40,0x62, + 0x87,0x7A,0x46,0x72,0x62,0xEA,0xEA,0x3A,0x87,0x7A,0x46,0x72,0xF1,0x05,0xA3,0x5E, + 0x87,0x7A,0x25,0x72,0xFD,0xAB,0xB8,0xA2,0xA7,0x82,0x46,0x72,0xFD,0xFB,0xDA,0xF2, + 0x87,0x7A,0x25,0x72,0xEC,0xBF,0x2B,0xA8,0x87,0x82,0x46,0x72,0xFF,0x5A,0xEA,0xB2, + 0x87,0x7A,0x25,0x72,0x8D,0xAF,0xAA,0xAF,0x87,0x82,0x25,0x72,0x5F,0xEE,0xF0,0xE2, + 0xA7,0x82,0x46,0x72,0xFF,0xD7,0xB4,0x7A,0x29,0x93,0x46,0x7A,0xFD,0xBD,0xBD,0x2D, + 0x2A,0x93,0xA8,0x82,0x6A,0x7F,0x7E,0x78,0x87,0x7A,0xC5,0x61,0x7C,0x7C,0xFE,0xFE, + 0xC4,0x61,0x02,0x41,0x5E,0xF8,0xE8,0xF0,0x23,0x41,0xC2,0x30,0x7E,0xDA,0x78,0xFA, + 0xE2,0x30,0xA1,0x30,0x7A,0x7A,0xF3,0xF7,0xC2,0x30,0x81,0x28,0xEA,0xE8,0x62,0xE2, + 0xC2,0x28,0x61,0x28,0xAA,0xAB,0x8A,0x08,0xE3,0x30,0xA2,0x28,0x57,0xF5,0xA7,0xC9, + 0xC2,0x30,0xA2,0x28,0x06,0xEA,0xEA,0xCB,0xC2,0x30,0xA2,0x28,0x57,0x55,0xA5,0x8E, + 0xC2,0x30,0xA2,0x28,0x8D,0x8F,0xAA,0x52,0xC2,0x30,0x81,0x20,0xFA,0x6A,0xEA,0xBE, + 0xC2,0x30,0x81,0x28,0x2F,0xBB,0xBF,0x2B,0x24,0x39,0xC2,0x30,0x3D,0xAD,0x2F,0xAF, + 0x64,0x49,0x24,0x41,0x0F,0x2B,0x0B,0x29,0x65,0x49,0xE3,0x38,0x5C,0x56,0x7E,0xD8, + 0x04,0x41,0xC2,0x38,0x5B,0x5E,0x7F,0x38,0x24,0x49,0xC2,0x38,0xA9,0xAB,0xAB,0x2A, + 0x64,0x51,0x03,0x41,0xBD,0x2D,0x09,0x0B,0x85,0x51,0x23,0x49,0x8A,0xAA,0xFE,0x7A, + 0xC6,0x59,0x64,0x51,0xDD,0xFD,0xEF,0xAB,0xA5,0x51,0x03,0x41,0xF8,0x7C,0x7E,0x58, + 0x44,0x49,0x03,0x41,0xEB,0xE3,0xE2,0x63,0x65,0x49,0xE3,0x38,0x7D,0xEB,0xA3,0xFF, + 0x24,0x41,0xC2,0x38,0xFD,0xFF,0xC8,0x28,0x24,0x41,0xE2,0x38,0xED,0xEB,0xAD,0x80, + 0x23,0x41,0xC2,0x38,0x2A,0xAA,0xEE,0x6A,0x44,0x41,0xC2,0x38,0xE8,0xB7,0x7D,0xD5, + 0x65,0x49,0xE3,0x38,0x5F,0xAF,0xA9,0x2F,0x65,0x49,0xE2,0x38,0xB5,0xAF,0x3E,0x0A, + 0x64,0x49,0x23,0x41,0xDF,0xBA,0x28,0xA0,0x44,0x49,0xE3,0x38,0x5E,0x5A,0x58,0x7E, + 0xE3,0x38,0xA2,0x30,0x36,0xFE,0xDE,0x9E,0x24,0x41,0xC2,0x38,0xAF,0xBD,0x2F,0xAB, + 0xA5,0x51,0x44,0x49,0xAD,0x09,0x09,0xA5,0x06,0x62,0x84,0x51,0x5F,0x7D,0xF3,0xAB, + 0xC5,0x59,0x23,0x41,0xBF,0xDF,0x5E,0x7C,0x44,0x49,0x03,0x41,0xE0,0x7C,0x7F,0x7E, + 0x23,0x49,0xE2,0x40,0xAF,0x2D,0x35,0x25,0x84,0x51,0x23,0x49,0x25,0x3D,0x35,0xB7, + 0x67,0x72,0xA5,0x59,0xF5,0xFD,0xB5,0x2D,0x67,0x7A,0xC5,0x61,0xDD,0xBF,0xAA,0x80, + 0x26,0x6A,0xE5,0x69,0xD5,0x6E,0x64,0xE8,0x06,0x6A,0xA5,0x61,0xE8,0xF2,0xF2,0x78, + 0x47,0x72,0xA4,0x61,0x03,0xFD,0xF5,0x55,0x47,0x7A,0xA4,0x61,0x20,0xAB,0xF7,0x5D, + 0x46,0x7A,0xA4,0x61,0x2A,0xAA,0xAD,0xFD,0x67,0x7A,0x26,0x72,0x00,0x00,0xAB,0x5D, + 0x67,0x72,0xC5,0x61,0xDA,0xAA,0xA8,0xE2,0x07,0x6A,0xA4,0x59,0x02,0xAA,0xFC,0x7E, + 0x47,0x72,0xA4,0x59,0x08,0xAB,0x2F,0xB5,0x26,0x6A,0xA5,0x59,0xEE,0xD8,0x5A,0x78, + 0xE6,0x61,0xA5,0x59,0xFF,0xF0,0x7E,0x75,0xC6,0x59,0x64,0x51,0xA2,0xA2,0xDA,0x5B, + 0x07,0x62,0x64,0x51,0xA2,0x02,0xBB,0x75,0xE6,0x59,0x64,0x51,0xBE,0xB2,0xF2,0xFD, + 0xA5,0x59,0x43,0x49,0x80,0x9A,0x38,0x38,0x06,0x62,0xA5,0x59,0x2F,0x25,0xF5,0xF7, + 0x47,0x72,0xA4,0x59,0x08,0xBF,0xDD,0x5F,0xC9,0x82,0xE6,0x61,0x22,0x2B,0xAD,0xF5, + 0xC9,0x82,0x67,0x7A,0xFB,0xCE,0x6B,0xF9,0x2D,0xAC,0x67,0x7A,0x2F,0xBD,0xF5,0xFD, + 0x72,0xD5,0x8B,0x9B,0x02,0x0F,0x2D,0xB5,0xF4,0xE5,0x72,0xD5,0x00,0xA2,0xAB,0xAD, + 0xF4,0xE5,0xB3,0xDD,0x20,0xA2,0xA3,0xE9,0xD3,0xDD,0xB3,0xDD,0x76,0xF0,0x20,0x80, + 0xF3,0xDD,0xB3,0xDD,0x6B,0xEF,0x7A,0x5E,0xB3,0xDD,0x72,0xD5,0x02,0x08,0xFE,0x7F, + 0xD3,0xDD,0x92,0xD5,0x0A,0x2D,0x95,0x55,0xF4,0xDD,0x92,0xD5,0x00,0x08,0x8F,0xAD, + 0xD3,0xE5,0x14,0xDE,0xAA,0xAA,0xAE,0xFE,0x55,0xEE,0xD3,0xDD,0xB5,0x29,0x2B,0x2A, + 0x55,0xEE,0xF4,0xDD,0x80,0xB0,0x7C,0x5A,0x35,0xEE,0x92,0xD5,0xA0,0x20,0xFE,0x5F, + 0x35,0xE6,0xB3,0xD5,0x20,0x00,0x00,0x09,0x55,0xEE,0x14,0xE6,0xD7,0x7E,0xFE,0xE3, + 0x35,0xEE,0x14,0xDE,0xD7,0xFF,0xB6,0xA2,0x35,0xE6,0xF4,0xDD,0xEB,0xEF,0xEA,0x60, + 0x35,0xE6,0xF4,0xE5,0xAB,0xAF,0x8A,0x2A,0x35,0xE6,0xF4,0xE5,0xFB,0xEA,0xA8,0x82, + 0x35,0xE6,0xD4,0xDD,0xBA,0x2A,0x2A,0x0A,0x96,0xEE,0x35,0xE6,0x09,0x0B,0x0B,0x0B, + 0xB6,0xF6,0x76,0xEE,0xCA,0x6A,0xEA,0xAA,0xB6,0xF6,0x75,0xEE,0x6B,0xEF,0xAB,0xEA, + 0x76,0xF6,0x96,0xEE,0xD5,0xF5,0xFF,0xDD,0x96,0xEE,0x76,0xEE,0xD8,0xCA,0x3E,0xA8, + 0x76,0xEE,0x14,0xE6,0x60,0xC0,0xC0,0x00,0x35,0xE6,0xB3,0xD5,0x7F,0xDC,0x5A,0x78, + 0xD3,0xDD,0x93,0xD5,0xBE,0xFF,0xAA,0xAA,0xD3,0xDD,0x92,0xD5,0x7E,0xBE,0xFE,0x5A, + 0xB2,0xD5,0x92,0xD5,0x65,0x75,0x75,0xFD,0xB2,0xD5,0x72,0xCD,0xF7,0xBA,0xEA,0xEE, + 0x92,0xD5,0x72,0xCD,0x80,0xAA,0xE2,0xBE,0x92,0xD5,0x51,0xCD,0x02,0x2B,0x2A,0xEA, + 0x92,0xD5,0x51,0xCD,0xF8,0xFA,0x9F,0x57,0x92,0xD5,0x51,0xCD,0x7F,0x77,0xEF,0x9D, + 0x67,0x7A,0x46,0x72,0x3D,0xAA,0xCF,0x9A,0x67,0x7A,0x46,0x72,0xB4,0x50,0xFE,0x0A, + 0x87,0x7A,0x47,0x72,0xDA,0xBF,0xEF,0xBB,0x67,0x7A,0x46,0x72,0xDB,0x82,0xC2,0x8B, + 0x67,0x72,0x46,0x72,0x3A,0x7A,0xFA,0x97,0x87,0x7A,0x46,0x72,0x7C,0x6B,0x43,0xF2, + 0x87,0x7A,0x46,0x72,0x7F,0xA1,0xBE,0xAD,0x87,0x7A,0x25,0x6A,0x2A,0xAA,0xE6,0xF8, + 0xA7,0x7A,0x26,0x6A,0xEE,0xBE,0xB6,0x2B,0x46,0x7A,0x66,0x72,0x7D,0xD5,0xBD,0x77, + 0x87,0x7A,0x46,0x72,0x0E,0xAB,0xBB,0xB5,0x86,0x7A,0x45,0x72,0xDE,0xAC,0x2A,0xA2, + 0x86,0x7A,0x46,0x72,0xA8,0xAA,0xBD,0xAA,0x86,0x7A,0x46,0x72,0xBF,0xEC,0xE2,0xA2, + 0x86,0x7A,0x46,0x72,0xD7,0x45,0x8F,0xBE,0x86,0x7A,0x46,0x72,0xEF,0xB7,0xAA,0xAA, + 0x87,0x7A,0x45,0x72,0xAF,0xBF,0xAF,0x8A,0x86,0x7A,0x46,0x72,0xFB,0xEA,0xEA,0x9C, + 0xA7,0x7A,0x67,0x72,0xFF,0x7D,0xFB,0xB3,0x86,0x7A,0x46,0x72,0xAE,0xFE,0xF6,0xD6, + 0x87,0x7A,0x46,0x72,0xA5,0xAE,0xFE,0xAA,0x67,0x7A,0x46,0x72,0xB7,0xAB,0x3E,0x22, + 0x87,0x82,0x46,0x72,0xFF,0xDA,0x98,0x3F,0x87,0x7A,0x46,0x7A,0xAA,0x83,0xEA,0x60, + 0x87,0x7A,0x46,0x72,0xBA,0xF8,0x1D,0x9B,0x86,0x7A,0x45,0x7A,0x8A,0xE8,0x2C,0xB9, + 0x87,0x7A,0x46,0x7A,0xBE,0xAF,0xAA,0xA2,0x87,0x7A,0x26,0x7A,0xAC,0xA8,0xA8,0x82, + 0x87,0x7A,0x25,0x72,0xA9,0xFA,0xBA,0x28,0xA7,0x82,0x66,0x7A,0x57,0xF5,0xAD,0xB9, + 0xC8,0x8A,0x46,0x72,0x7F,0x7E,0xFF,0x3B,0xCB,0xA3,0xA8,0x82,0xF5,0xA5,0x0D,0x0B, + 0xCB,0xA3,0xA7,0x82,0x7E,0x5E,0x78,0x7C,0x87,0x82,0xE5,0x61,0x7E,0x7C,0x7C,0x58, + 0xE5,0x61,0x43,0x49,0x7E,0x5E,0x7C,0x5C,0x03,0x41,0xC2,0x30,0xE4,0x56,0x5E,0x54, + 0xC2,0x30,0xA1,0x28,0x36,0x8F,0xC6,0x80,0xC2,0x30,0xA2,0x28,0x58,0x5F,0x5F,0x95, + 0xE3,0x30,0xA2,0x28,0xB7,0xB7,0xAE,0x8F,0x03,0x31,0xA2,0x28,0xAD,0xD7,0xAE,0xB2, + 0xE3,0x30,0xA2,0x28,0xE9,0xE8,0xC2,0x80,0xC2,0x30,0xA2,0x28,0x0B,0x2F,0x35,0x88, + 0xE3,0x30,0xA2,0x28,0x7E,0xEE,0x7D,0x57,0xC2,0x30,0x82,0x28,0xFF,0xFF,0xFB,0x23, + 0x03,0x39,0xA2,0x28,0x95,0xA5,0xB7,0x2A,0x43,0x41,0xE3,0x38,0xE5,0xAD,0xAF,0x8F, + 0x85,0x49,0x23,0x41,0x2D,0xAD,0xED,0x77,0x64,0x49,0xC2,0x38,0xF8,0x78,0x7A,0x7F, + 0x23,0x41,0xC2,0x38,0xBE,0x3D,0x0D,0x8F,0xA6,0x51,0x44,0x49,0x7D,0x8D,0x0D,0x89, + 0xA6,0x51,0x24,0x49,0xF5,0x7E,0x68,0x68,0x64,0x49,0x24,0x41,0xAE,0x0B,0x0F,0xC5, + 0xA5,0x59,0x03,0x41,0x0A,0x8A,0xEE,0x5F,0xC5,0x59,0xE3,0x38,0xF8,0xF2,0xFF,0x7D, + 0x24,0x41,0xC2,0x38,0xE8,0x58,0xDA,0xF2,0x03,0x39,0xC2,0x38,0x0E,0xAD,0x17,0xB5, + 0x24,0x41,0xE3,0x38,0x03,0x23,0x3D,0x5D,0x65,0x49,0x03,0x41,0xEA,0x3A,0x9A,0x5F, + 0x64,0x49,0xC1,0x38,0x6A,0xF0,0xE8,0xAB,0x03,0x41,0xC2,0x30,0xD5,0xA9,0xAA,0x80, + 0x23,0x41,0xE3,0x38,0x2B,0x23,0x3F,0x2B,0x85,0x51,0x03,0x41,0x8B,0x2B,0x2D,0xAD, + 0xA6,0x51,0x23,0x41,0xFC,0xFE,0x7E,0x5F,0x45,0x49,0xC2,0x38,0x7F,0x76,0xFA,0x82, + 0x03,0x39,0xC2,0x38,0xD5,0xF7,0xA6,0xBE,0x03,0x41,0xC2,0x38,0x2F,0xEF,0xBE,0x82, + 0x85,0x49,0x03,0x41,0x2D,0xFD,0xFD,0xD5,0xC6,0x59,0x23,0x41,0x22,0x2F,0xB5,0xD5, + 0xC5,0x51,0x24,0x49,0xF8,0x6E,0xFF,0x7F,0x44,0x49,0x03,0x41,0x7A,0x50,0x72,0xB1, + 0x64,0x49,0x03,0x41,0xB5,0xBD,0x9D,0x2A,0xE5,0x61,0x64,0x51,0x55,0xDD,0xAF,0x2D, + 0x26,0x6A,0x84,0x59,0x2D,0xF5,0xFE,0xAB,0x47,0x72,0xA4,0x59,0x80,0x02,0xAB,0xB7, + 0x26,0x6A,0x84,0x59,0xA8,0xF0,0x60,0x78,0xE5,0x61,0x64,0x51,0xE8,0xBB,0xFF,0x7F, + 0xC5,0x61,0x43,0x51,0x22,0xAA,0xB7,0xD5,0xC5,0x61,0x84,0x59,0xF2,0xFA,0x6B,0xFB, + 0xC5,0x61,0x84,0x59,0xB2,0x0D,0x37,0x3D,0x27,0x72,0x84,0x59,0xAB,0xFF,0x7A,0x70, + 0x27,0x6A,0x84,0x59,0xEA,0x8B,0x2D,0xFF,0x06,0x6A,0x64,0x51,0xFA,0x7A,0x7C,0x7A, + 0xA4,0x59,0x44,0x51,0x2B,0x37,0x57,0x7D,0xE6,0x61,0x44,0x49,0xA0,0xAF,0x57,0x55, + 0xA5,0x59,0x44,0x49,0x08,0x8B,0xFA,0xFF,0x85,0x51,0x44,0x49,0xFE,0x70,0x6A,0x7B, + 0x85,0x51,0x23,0x49,0x2F,0xB7,0xBD,0x5F,0xC6,0x59,0x64,0x49,0xF5,0x8B,0x0D,0x25, + 0x06,0x62,0x64,0x51,0x7F,0xEA,0xAA,0x0A,0x06,0x62,0x84,0x51,0xBF,0xF7,0x77,0xD8, + 0x06,0x62,0x84,0x51,0xAA,0x2F,0xBD,0xD7,0xE5,0x61,0x84,0x59,0x22,0xFA,0x62,0xAF, + 0x67,0x72,0xA5,0x59,0x02,0x09,0xAD,0x55,0xE9,0x8A,0x47,0x72,0x0B,0xA5,0xBD,0xD5, + 0x4D,0xB4,0xE9,0x8A,0x2B,0x2F,0xBD,0xB5,0x92,0xDD,0xEC,0xA3,0x02,0x2B,0x2B,0x25, + 0xF4,0xE5,0xB3,0xDD,0xA3,0x8B,0x2B,0x2D,0xF4,0xE5,0x92,0xD5,0xAA,0xBA,0x7A,0xFC, + 0xB3,0xDD,0x51,0xCD,0xA0,0xF8,0xDA,0xFA,0x92,0xD5,0x72,0xD5,0x6F,0xAF,0xF5,0xF5, + 0xD3,0xDD,0x72,0xCD,0xAD,0xB7,0x2F,0x0F,0xF4,0xDD,0x92,0xD5,0xA9,0x0B,0xAA,0x2B, + 0x34,0xE6,0xF4,0xDD,0xFD,0x2D,0xAF,0xF5,0x35,0xE6,0xD3,0xDD,0x02,0xFA,0xFE,0x55, + 0x14,0xE6,0xD3,0xDD,0xE0,0xB7,0x7F,0xDD,0xD3,0xDD,0x72,0xCD,0xD8,0x78,0x58,0x5E, + 0x14,0xE6,0x92,0xD5,0x0B,0x0D,0x0D,0x29,0x35,0xE6,0xF4,0xDD,0x80,0x7B,0xFE,0xBE, + 0x55,0xEE,0x14,0xE6,0x87,0x0D,0x03,0x02,0x76,0xEE,0x14,0xE6,0xDE,0xA2,0x8A,0x8A, + 0x55,0xEE,0x35,0xE6,0x75,0xF2,0xC0,0x50,0x14,0xEE,0x35,0xE6,0xD5,0xF7,0xB5,0xAD, + 0x35,0xE6,0x14,0xE6,0x3F,0xB9,0x23,0xBB,0xB7,0xF6,0x55,0xE6,0xFD,0x3D,0x29,0x0B, + 0xB6,0xF6,0x96,0xEE,0x7A,0xE8,0x7A,0x7E,0x76,0xFE,0x96,0xEE,0xD5,0xDF,0x75,0x77, + 0x96,0xEE,0x76,0xEE,0x08,0xA0,0xB2,0x66,0x96,0xEE,0x76,0xEE,0xA2,0xEA,0xDE,0x7B, + 0x76,0xEE,0x56,0xE6,0x08,0x00,0x00,0xA0,0x76,0xEE,0xD3,0xDD,0x5E,0xE0,0xE8,0x88, + 0x14,0xE6,0xB3,0xD5,0x5F,0x5F,0xFE,0x60,0xD3,0xDD,0x92,0xD5,0xFC,0xFF,0xEE,0xB8, + 0xB2,0xD5,0x52,0xCD,0xAA,0xAA,0xA8,0xE0,0x92,0xD5,0x72,0xCD,0x08,0x0A,0x98,0x88, + 0xB2,0xD5,0x72,0xCD,0xF6,0x7A,0xFB,0xFE,0x92,0xD5,0x71,0xCD,0x67,0xFE,0x6F,0x7A, + 0x71,0xCD,0x51,0xCD,0x77,0x5E,0x5F,0x9A,0x71,0xCD,0x31,0xC5,0xAB,0xFB,0xFB,0xAA, + 0x67,0x7A,0xA4,0x61,0x02,0x0A,0xAA,0xD5,0x88,0x7A,0xE5,0x69,0x8A,0xAE,0x0E,0x2D, + 0x67,0x72,0x26,0x72,0xC2,0x8A,0x27,0xAC,0x67,0x7A,0x46,0x72,0x06,0xEA,0x50,0x50, + 0x67,0x7A,0x46,0x72,0x57,0x70,0x7A,0xE3,0x87,0x72,0x25,0x6A,0x82,0xAB,0xE7,0xAA, + 0x86,0x7A,0x46,0x72,0x76,0xA5,0xAB,0xF5,0x87,0x7A,0x46,0x72,0xBF,0xAA,0xCF,0xEF, + 0x87,0x7A,0x46,0x72,0xF9,0x78,0x80,0x00,0x87,0x7A,0x46,0x72,0xB9,0xA3,0x89,0x3E, + 0xA7,0x7A,0x46,0x72,0x74,0x77,0xDF,0xDE,0x86,0x7A,0x46,0x72,0x8F,0xAB,0xFB,0xFD, + 0x86,0x7A,0x46,0x72,0x88,0x8B,0x0A,0x89,0xA7,0x7A,0x45,0x72,0xEA,0x78,0xAA,0xBF, + 0x86,0x7A,0x66,0x72,0xC3,0xBB,0xBE,0x57,0x86,0x7A,0x45,0x72,0xA2,0xB8,0x0D,0x88, + 0xA7,0x7A,0x66,0x72,0xFA,0xE2,0x56,0xDF,0x86,0x7A,0x66,0x72,0xDE,0xE6,0x8B,0xA6, + 0xA7,0x7A,0x66,0x72,0xF4,0xD7,0x7D,0x7B,0x86,0x7A,0x46,0x72,0xBE,0xFA,0x6E,0xD5, + 0xA7,0x82,0x66,0x7A,0xE5,0x75,0x75,0x75,0x87,0x7A,0x46,0x7A,0xB9,0x33,0x0B,0xAB, + 0x87,0x7A,0x25,0x7A,0xAA,0x62,0xAA,0xAA,0x87,0x7A,0x46,0x72,0xCD,0xA5,0xBF,0x3E, + 0xA7,0x7A,0x66,0x7A,0x75,0x75,0x6B,0xEB,0xC8,0x82,0x45,0x72,0xF5,0xED,0x2B,0x8B, + 0xA7,0x82,0x66,0x7A,0xFA,0xB6,0xE4,0x67,0xA7,0x82,0x46,0x72,0x8B,0x2F,0xB7,0xBA, + 0xA7,0x82,0x66,0x7A,0x9E,0xAB,0xAA,0xAA,0xA7,0x7A,0x46,0x72,0xAC,0xBF,0xE6,0xEB, + 0x2A,0x93,0x86,0x7A,0x17,0xA5,0x2D,0x2D,0x0D,0xAC,0x29,0x93,0x29,0x2B,0x0B,0x0A, + 0xEC,0xAB,0xE8,0x8A,0x78,0x78,0xF8,0x78,0xC8,0x82,0xC6,0x61,0x7A,0x7A,0xF8,0x7C, + 0xC5,0x61,0x03,0x41,0x78,0x60,0xE8,0xEC,0x23,0x41,0xC2,0x38,0xD7,0xAA,0xAA,0x00, + 0x03,0x39,0xA2,0x28,0xDF,0x6E,0x6A,0xF0,0xA2,0x30,0xC2,0x28,0x4A,0x6E,0xFF,0xBA, + 0xE3,0x30,0xA2,0x28,0x8A,0xF3,0xF9,0x75,0xE3,0x30,0xA2,0x28,0x3A,0xAB,0xBF,0xFF, + 0xE3,0x30,0xA2,0x28,0xA0,0xEA,0xF8,0x7A,0xC2,0x30,0xA2,0x28,0xE0,0x42,0xC2,0x61, + 0xC2,0x28,0x82,0x20,0xB0,0x2A,0xBF,0xBD,0xE3,0x30,0xA2,0x28,0xA5,0x2F,0x2E,0x2B, + 0x44,0x41,0xE3,0x30,0xF5,0xBD,0xEF,0x2A,0x44,0x41,0x03,0x39,0x29,0x83,0x0B,0x00, + 0x44,0x49,0xC2,0x30,0xE8,0xB2,0xFE,0x5E,0x03,0x39,0xC2,0x38,0xBE,0xBE,0x3F,0x0B, + 0x44,0x41,0xE2,0x38,0xB7,0x2F,0x3B,0xAD,0xA5,0x51,0x24,0x41,0x83,0xAB,0xBD,0xF5, + 0x85,0x51,0x24,0x41,0x62,0xE8,0x68,0x6B,0x23,0x41,0xC2,0x38,0x8A,0xFC,0x78,0x7E, + 0x03,0x41,0xA2,0x30,0x20,0xBA,0xFB,0x77,0xC2,0x40,0x03,0x39,0xFB,0xEE,0xFA,0xEF, + 0x24,0x41,0xC2,0x38,0xBE,0xBB,0xEF,0x7B,0x03,0x39,0xA2,0x30,0x0A,0x20,0xBE,0x97, + 0x24,0x41,0xC3,0x30,0x7F,0xFA,0x8A,0xAF,0x24,0x41,0xC2,0x38,0xF2,0xFD,0xB5,0xF7, + 0x24,0x41,0xE3,0x38,0x0D,0xBF,0x7B,0xED,0x23,0x41,0xE2,0x38,0xA0,0xAC,0xA7,0x0F, + 0x44,0x41,0x03,0x41,0xDF,0x83,0xE1,0x2B,0x44,0x41,0x03,0x41,0x37,0x35,0x57,0x56, + 0x64,0x49,0x23,0x41,0xDA,0x03,0xE1,0x7F,0x85,0x51,0x24,0x41,0x7B,0x8A,0xAA,0xFB, + 0x65,0x49,0x03,0x41,0x55,0x5E,0xFA,0xF8,0x65,0x49,0x03,0x39,0x57,0x7F,0x6B,0x23, + 0x85,0x49,0x03,0x41,0xDD,0xE5,0xA9,0xA2,0x85,0x51,0x24,0x41,0xB5,0x37,0xBE,0xFD, + 0x85,0x51,0x24,0x49,0x6A,0x6A,0xFA,0xAE,0x84,0x51,0x03,0x41,0xBD,0xAF,0xBA,0x82, + 0x85,0x51,0x23,0x49,0xAB,0xAF,0x2F,0xA4,0xE6,0x61,0x84,0x51,0xA5,0x25,0xAD,0x0B, + 0x26,0x62,0xC5,0x61,0xAF,0x3F,0xFF,0xB5,0x06,0x6A,0xA4,0x59,0x2E,0x78,0x7E,0x5A, + 0xE5,0x69,0x64,0x51,0xF8,0xFB,0xD5,0xF7,0xC5,0x61,0x64,0x51,0xFF,0x72,0xA8,0xA3, + 0xA5,0x59,0x23,0x51,0xD6,0x97,0xE2,0xA0,0xE6,0x69,0x84,0x59,0xFD,0xF9,0xBD,0x25, + 0x07,0x6A,0xA5,0x61,0xDD,0xDF,0x29,0x0A,0x47,0x72,0xA5,0x61,0x7A,0xCA,0xEB,0xE8, + 0xA5,0x59,0x44,0x51,0xF0,0xFE,0x9F,0xA8,0xC5,0x61,0x44,0x49,0xE8,0xAB,0xEB,0xF7, + 0x85,0x51,0x23,0x51,0x6A,0xAB,0x0B,0x02,0x84,0x51,0x44,0x49,0x75,0xFF,0x6F,0xFC, + 0x64,0x49,0x23,0x49,0x8A,0xEB,0x67,0x88,0x85,0x51,0x23,0x49,0x8B,0x2B,0xBD,0xE5, + 0x85,0x51,0x23,0x49,0x7E,0xAE,0x02,0x0B,0xC6,0x59,0x64,0x49,0x2D,0x2D,0xBF,0xFF, + 0x06,0x62,0xA5,0x51,0x8A,0xAA,0xEB,0xEF,0x06,0x62,0x84,0x51,0xA8,0xCA,0xEB,0x6D, + 0xE6,0x61,0xA5,0x59,0x76,0x7A,0xED,0x05,0xE6,0x61,0x84,0x51,0x2D,0xAF,0xA6,0xFA, + 0x27,0x72,0xA5,0x59,0xDD,0xBA,0xAA,0x2F,0x88,0x7A,0xE6,0x69,0x2D,0xAD,0x2B,0x2B, + 0x49,0x93,0xA8,0x7A,0x2D,0x35,0xBD,0xBD,0x4D,0xB4,0xE9,0x8A,0x0B,0xAF,0xFF,0xDD, + 0x93,0xDD,0xEC,0xA3,0x02,0x0F,0xAD,0xB5,0xF3,0xE5,0x72,0xD5,0xFA,0xAA,0xAB,0xB5, + 0xD3,0xDD,0x72,0xD5,0x5F,0x5E,0x7C,0xFE,0x92,0xD5,0x71,0xD5,0x0B,0x09,0xA9,0x00, + 0xD3,0xDD,0x92,0xD5,0xAD,0xAB,0xA5,0x2D,0x14,0xE6,0xB3,0xD5,0xAF,0xED,0xBF,0x8B, + 0xF4,0xDD,0xB2,0xDD,0x88,0xBE,0x20,0x20,0x14,0xE6,0xD3,0xDD,0xD5,0xD5,0xAE,0x08, + 0x14,0xE6,0xD3,0xDD,0x7F,0xEB,0x62,0x60,0x92,0xD5,0xF0,0xBC,0x30,0xB8,0xF8,0x5E, + 0x14,0xE6,0x10,0xC5,0x2B,0xAF,0xF5,0xD5,0x35,0xE6,0x92,0xD5,0x88,0x02,0x0B,0x09, + 0x76,0xEE,0x14,0xE6,0x2B,0x22,0xAA,0xAA,0x55,0xEE,0x35,0xE6,0x80,0xF4,0x57,0x5E, + 0x55,0xEE,0x15,0xE6,0xD2,0xBA,0xFB,0xEB,0x35,0xE6,0x14,0xE6,0xF8,0xBE,0xF8,0x5A, + 0x55,0xE6,0x14,0xE6,0xD7,0x95,0x35,0x0D,0xB7,0xF6,0x55,0xE6,0x2F,0x29,0x2B,0xAB, + 0xB6,0xF6,0x76,0xEE,0xA2,0xEA,0x7A,0xFE,0x96,0xEE,0x55,0xEE,0x08,0xE8,0xEA,0xFA, + 0x96,0xEE,0x55,0xE6,0xEA,0xAB,0xAD,0xFD,0x76,0xEE,0x55,0xE6,0x02,0x0E,0x8E,0x4E, + 0x75,0xEE,0x55,0xE6,0xE8,0xC2,0x2F,0xFB,0x35,0xEE,0x75,0xE6,0xAF,0xAF,0xB7,0xBE, + 0x55,0xEE,0x14,0xE6,0x6B,0xA8,0x7A,0xFA,0x14,0xE6,0xB3,0xD5,0x5C,0x58,0x78,0x5A, + 0xB2,0xD5,0x72,0xCD,0xF8,0xFC,0x2A,0x28,0xB2,0xD5,0x73,0xCD,0xBA,0xDA,0xAE,0x2B, + 0xB2,0xD5,0x71,0xCD,0x6A,0xBA,0xF7,0xED,0x92,0xD5,0x72,0xCD,0x56,0x5E,0x75,0x6F, + 0xB2,0xD5,0x51,0xCD,0x5B,0xFF,0xEF,0x3B,0x72,0xCD,0x10,0xC5,0xFB,0xFF,0xB4,0xF8, + 0x83,0x59,0x43,0x59,0x6A,0xAF,0x2F,0x02,0x06,0x6A,0x63,0x59,0x29,0xFD,0xD5,0x55, + 0x46,0x72,0x63,0x59,0x00,0xAF,0xDD,0x55,0x87,0x7A,0x84,0x61,0x08,0xA2,0xA9,0xF5, + 0x66,0x72,0x25,0x6A,0x0B,0x0F,0x89,0xED,0x87,0x7A,0x46,0x72,0xFB,0xA7,0xA7,0x25, + 0xA8,0x7A,0x46,0x72,0x55,0xEF,0x8A,0xFA,0x87,0x7A,0x46,0x72,0xA8,0xAB,0x52,0x62, + 0x87,0x7A,0x46,0x72,0xAA,0xFA,0xEE,0xBB,0x87,0x7A,0x46,0x72,0x8E,0x0B,0xBF,0xBE, + 0x87,0x7A,0x46,0x72,0x7A,0xFA,0xAA,0x83,0x87,0x7A,0x46,0x72,0xFF,0xBB,0x1E,0xDE, + 0xA7,0x7A,0x46,0x72,0x2D,0xA7,0xBD,0xBF,0xA7,0x7A,0x66,0x72,0xBF,0xB9,0xBB,0xAD, + 0xA7,0x7A,0x66,0x72,0xD5,0x57,0xBE,0xFC,0xA7,0x7A,0x66,0x72,0xEF,0xED,0xEA,0xDE, + 0xA7,0x7A,0x66,0x72,0xD7,0xB7,0xB4,0x9E,0x86,0x7A,0x46,0x72,0xA8,0x0F,0x0A,0x00, + 0x86,0x7A,0x66,0x72,0xC2,0xAC,0xCC,0x20,0x87,0x7A,0x45,0x72,0xB5,0x2A,0xF0,0xE2, + 0xA7,0x82,0x45,0x72,0x6F,0x8F,0xBE,0xAB,0x87,0x7A,0x46,0x72,0xEB,0x72,0xBE,0xA7, + 0x87,0x82,0x67,0x7A,0xD2,0xC2,0x6C,0x7F,0xA8,0x82,0x46,0x72,0x7F,0x7F,0x9D,0x3B, + 0xA7,0x7A,0x66,0x7A,0xE9,0xBD,0xDC,0xBE,0xA7,0x82,0x46,0x72,0xAA,0x27,0xAA,0xAA, + 0xA7,0x82,0x66,0x7A,0x55,0x7E,0x9E,0x58,0xA8,0x82,0x67,0x7A,0xDB,0x7F,0xCB,0xEF, + 0x87,0x82,0x66,0x7A,0xCC,0xF5,0xDD,0xC5,0xE8,0x8A,0x66,0x7A,0xD7,0xFD,0xBF,0x3F, + 0xCC,0xA3,0xA7,0x82,0x3D,0x2D,0x2B,0x0B,0x0E,0xB4,0x8B,0x9B,0x0A,0xAE,0xE2,0x70, + 0xEC,0xAB,0xA7,0x82,0xF8,0x78,0x7A,0x7A,0xC8,0x82,0xC5,0x61,0x58,0x7E,0xDE,0xFE, + 0x06,0x62,0x64,0x51,0x5F,0xFA,0xE8,0xE8,0x85,0x51,0x03,0x41,0xFE,0xFA,0x7C,0x58, + 0x23,0x41,0xE2,0x38,0x7C,0xE8,0x6E,0x4B,0xC2,0x30,0xA2,0x28,0xEC,0x20,0xF2,0xF0, + 0xC2,0x30,0xA2,0x28,0xE9,0xAA,0xEB,0x6B,0xE3,0x30,0xA2,0x28,0xB5,0xF5,0xBF,0x95, + 0xC2,0x28,0xA2,0x28,0x70,0x62,0x58,0x54,0xA2,0x28,0x81,0x28,0x38,0x22,0xB0,0xB0, + 0xA2,0x28,0x82,0x28,0x3C,0xE8,0xFE,0x38,0x03,0x39,0xA2,0x28,0x2D,0x85,0xBF,0xFF, + 0x44,0x41,0xE2,0x30,0xAA,0xAE,0xF3,0xE5,0x44,0x41,0xE3,0x38,0xE8,0xFA,0xFF,0xD7, + 0x23,0x41,0xA1,0x30,0x7C,0x7F,0xFF,0x3E,0x03,0x39,0xC2,0x38,0x02,0xEB,0xEF,0xC0, + 0x24,0x41,0xC2,0x30,0x2F,0xAF,0xB7,0xBD,0x44,0x49,0xE3,0x38,0xAA,0xBF,0xDF,0xDF, + 0x65,0x49,0xE3,0x38,0xC2,0xEA,0x7E,0x55,0x23,0x41,0xC2,0x38,0x78,0xF8,0x7B,0xFF, + 0xE2,0x38,0xA2,0x30,0xBF,0xFA,0x78,0xFC,0x23,0x39,0xC2,0x30,0xF2,0xAB,0xAB,0xAB, + 0x24,0x41,0xE3,0x38,0x77,0xFF,0x8B,0x06,0x04,0x41,0xA2,0x30,0x5F,0xFE,0xFA,0xB8, + 0xE3,0x38,0x81,0x28,0x2B,0x2F,0xFF,0xF7,0xE3,0x38,0x82,0x30,0xAA,0xA8,0xDB,0xFF, + 0x03,0x39,0xC2,0x30,0x03,0x09,0xAD,0x09,0x23,0x41,0x03,0x39,0x35,0xAF,0x3F,0x2F, + 0x44,0x41,0x03,0x41,0x2F,0x2D,0x2B,0x0E,0x44,0x41,0xE3,0x38,0xAC,0xE0,0xDA,0xDA, + 0x44,0x49,0xE3,0x38,0xAA,0x2E,0x0E,0xB7,0x64,0x49,0x24,0x41,0xF2,0xF8,0xFA,0x7F, + 0x44,0x49,0x03,0x41,0xFC,0xEA,0xFE,0xFE,0x85,0x51,0x24,0x41,0x2B,0x2D,0x3B,0x0B, + 0xA6,0x51,0x44,0x49,0xEE,0xEA,0xEA,0x50,0x64,0x49,0x03,0x41,0xA8,0x60,0xFE,0xB6, + 0x64,0x49,0x03,0x41,0x2E,0xA9,0xBB,0x82,0x85,0x51,0x24,0x49,0x20,0x2A,0xFB,0xD8, + 0x84,0x51,0x23,0x49,0xAA,0x2A,0xEE,0x7D,0x06,0x62,0x65,0x51,0x09,0x27,0xAD,0xA9, + 0xE6,0x61,0x84,0x51,0xA8,0xB8,0xFE,0xDF,0xA5,0x59,0x63,0x51,0xC0,0xCB,0x8A,0xFC, + 0xA5,0x59,0x43,0x51,0xAA,0x29,0x8A,0xB0,0xE5,0x61,0x44,0x51,0xAB,0xAF,0x2F,0xF7, + 0xE6,0x61,0x84,0x59,0x7F,0xDA,0xEA,0x8A,0x06,0x62,0x84,0x59,0x29,0xAF,0xB5,0xFD, + 0x27,0x6A,0xC6,0x61,0x82,0x00,0x2F,0xB9,0x27,0x6A,0xC6,0x61,0xFA,0x7A,0xE8,0xC0, + 0xC6,0x59,0x23,0x49,0xFA,0x7A,0x7A,0x68,0x64,0x51,0x03,0x41,0x2A,0xFA,0x5D,0x57, + 0x85,0x51,0x23,0x49,0x02,0xA2,0x0C,0x3D,0x85,0x51,0x44,0x49,0xB8,0xBA,0x70,0x28, + 0x64,0x51,0x44,0x49,0xA8,0xAC,0xB6,0x25,0xA6,0x51,0x23,0x49,0xEF,0xEB,0xF9,0xF8, + 0xE6,0x59,0x44,0x49,0xB7,0xA9,0x22,0x2D,0xC6,0x59,0x43,0x49,0xFB,0xB6,0xF8,0xE0, + 0xC6,0x59,0x65,0x51,0xB2,0x7A,0xB7,0xF7,0xA5,0x51,0x64,0x51,0x62,0xFA,0x79,0x65, + 0xE6,0x59,0x43,0x49,0x2A,0xAF,0xB7,0xD5,0xE6,0x59,0x84,0x51,0x40,0xA2,0x3A,0x7D, + 0x47,0x72,0xC6,0x59,0x25,0xAD,0x2F,0x29,0x87,0x7A,0x27,0x6A,0x0F,0x03,0xAA,0x21, + 0xE9,0x82,0x87,0x7A,0x0B,0x22,0x89,0x7F,0x6B,0x93,0xC8,0x82,0x0B,0x7F,0x7F,0x7D, + 0x8F,0xBC,0xE8,0x8A,0x2F,0xBD,0xFD,0x55,0xB3,0xDD,0x8B,0x9B,0x22,0x0B,0x2F,0xAD, + 0xF4,0xE5,0x92,0xD5,0x7B,0xFB,0xAF,0x29,0xF4,0xDD,0x72,0xD5,0x5F,0x7F,0xB8,0x80, + 0x14,0xE6,0x92,0xD5,0xBD,0xAD,0x0F,0x0A,0x35,0xEE,0xF4,0xDD,0xEF,0xAF,0xA2,0xAA, + 0x35,0xE6,0xF4,0xDD,0xDB,0xBE,0xAB,0x2A,0x35,0xE6,0xD3,0xDD,0xAB,0xB7,0x2A,0x82, + 0x14,0xE6,0x72,0xCD,0xC0,0x78,0x70,0x70,0x31,0xC5,0xCF,0xBC,0xFC,0xF7,0xDE,0x3A, + 0x72,0xCD,0xF0,0xC4,0xB5,0xBD,0xAB,0x2A,0x55,0xEE,0x92,0xD5,0x2D,0x25,0x2D,0x2D, + 0x75,0xEE,0x35,0xE6,0xE0,0xA2,0xE8,0xEA,0x55,0xEE,0x14,0xE6,0xFE,0x7E,0xE2,0x78, + 0x35,0xE6,0x14,0xE6,0xC0,0x3B,0x7F,0x75,0x35,0xE6,0x14,0xE6,0x96,0x9F,0x25,0x05, + 0x96,0xEE,0x35,0xE6,0xB5,0x2D,0x3F,0x2A,0x76,0xF6,0x96,0xEE,0xD6,0xF5,0xFF,0xF7, + 0x96,0xEE,0x35,0xE6,0x80,0xA8,0xAA,0xAA,0x95,0xEE,0x55,0xE6,0xF4,0xFF,0x57,0x55, + 0x75,0xEE,0x55,0xE6,0xBF,0x17,0x97,0xDF,0x75,0xEE,0x55,0xE6,0xFE,0xA8,0xFB,0xBF, + 0x75,0xEE,0x55,0xE6,0xAF,0xAB,0xB9,0xFF,0x76,0xEE,0x55,0xE6,0xF2,0xEA,0xB2,0xFB, + 0x55,0xEE,0x35,0xE6,0x7A,0x78,0xFA,0xBA,0x75,0xEE,0xB3,0xD5,0x5E,0x7A,0xAA,0xAA, + 0x14,0xE6,0x92,0xD5,0x77,0xFF,0x68,0x80,0xB3,0xDD,0x72,0xD5,0xEA,0xEE,0xDB,0xF8, + 0xB3,0xD5,0x71,0xD5,0x3B,0x2A,0x8B,0x60,0xB3,0xD5,0x72,0xD5,0xB2,0xA0,0xAA,0x7F, + 0xB2,0xD5,0x51,0xCD,0xFF,0xF8,0xFA,0xEB,0x71,0xCD,0x51,0xCD,0x6F,0xAB,0xE7,0xAF, + 0x83,0x61,0x43,0x59,0xF8,0xFA,0xAF,0xC9,0xA4,0x61,0x63,0x59,0x5F,0x37,0x5F,0x95, + 0x84,0x59,0x43,0x59,0xAF,0xB6,0xEB,0xBE,0xC5,0x69,0x44,0x59,0x0F,0xEB,0xFF,0x6F, + 0xE5,0x69,0x43,0x59,0x0A,0xAF,0xF7,0xF5,0x67,0x7A,0xA4,0x61,0x0A,0xBF,0x55,0x55, + 0x87,0x7A,0xA4,0x61,0xA0,0xAA,0xBF,0xD5,0x66,0x72,0x05,0x6A,0x02,0x0A,0xFE,0xB5, + 0x66,0x72,0x25,0x72,0x82,0x02,0x37,0x2B,0xA7,0x7A,0x45,0x72,0xFE,0x77,0x6E,0x3E, + 0x87,0x7A,0x25,0x72,0x0B,0x8B,0xAF,0xA5,0x87,0x7A,0x66,0x72,0xDF,0xD1,0xF3,0x8B, + 0xA7,0x7A,0x46,0x72,0xFF,0xAB,0x3B,0x2F,0x86,0x7A,0x46,0x72,0x2E,0xAA,0xF2,0xC8, + 0xA7,0x7A,0x46,0x72,0xE8,0x6A,0xEB,0xF2,0xA7,0x7A,0x66,0x72,0x5D,0xE9,0x29,0xFB, + 0xA7,0x7A,0x66,0x72,0x6D,0x8F,0xAE,0x5C,0xA7,0x7A,0x66,0x72,0xEA,0xCF,0xF7,0xBD, + 0xA7,0x7A,0x66,0x72,0xFA,0xDF,0xD6,0x5A,0x87,0x7A,0x46,0x72,0x8A,0x00,0x89,0xB9, + 0x87,0x7A,0x45,0x72,0x0D,0x2F,0x0A,0x22,0x87,0x7A,0x46,0x72,0xF0,0x7A,0xAA,0x0A, + 0x87,0x7A,0x26,0x7A,0xCA,0xA2,0x8A,0x80,0xA7,0x82,0x66,0x7A,0x25,0xF7,0xBA,0x8E, + 0xA7,0x82,0x46,0x7A,0xA8,0xAA,0xAA,0xAD,0x87,0x82,0x66,0x7A,0x3A,0xA5,0xD5,0x57, + 0xA7,0x82,0x66,0x7A,0xDE,0xB6,0xF8,0xFF,0xA7,0x82,0x66,0x7A,0xA9,0xA1,0xEA,0x13, + 0xA7,0x82,0x66,0x7A,0x77,0x7B,0x7A,0xFE,0x6A,0x9B,0x46,0x72,0xBF,0xB5,0x2D,0x0B, + 0x0D,0xB4,0x6A,0x9B,0x2D,0x0D,0x2A,0x02,0x2D,0xB4,0xCC,0xA3,0x78,0x80,0xC0,0xDE, + 0xCC,0xA3,0x66,0x7A,0x78,0x78,0x7C,0x7A,0x46,0x72,0xE5,0x69,0xE8,0xBA,0xFC,0x5C, + 0x06,0x6A,0x63,0x49,0xF8,0x70,0x7A,0x5E,0x64,0x51,0xE2,0x38,0x70,0x68,0xEA,0x7A, + 0x03,0x41,0xE2,0x38,0x62,0xDA,0x0E,0x35,0x03,0x39,0xA2,0x30,0x5E,0xDE,0x50,0x7C, + 0xC2,0x38,0xA2,0x28,0x5E,0x57,0xD7,0xD7,0xC1,0x30,0x82,0x20,0x2F,0xFB,0xEE,0xFA, + 0xA2,0x28,0x81,0x28,0xF0,0x60,0x83,0x02,0xC2,0x28,0x82,0x28,0xFB,0xBF,0xFB,0xAA, + 0xC2,0x28,0x61,0x28,0x2A,0xAA,0x2B,0xA2,0xE3,0x30,0xA2,0x30,0x6E,0xEB,0x8A,0xEB, + 0xE3,0x30,0xA2,0x30,0x2B,0xEA,0xD8,0x7A,0xE3,0x38,0xA2,0x30,0x2E,0xA7,0xF7,0xFE, + 0x44,0x41,0xC2,0x38,0x3D,0xA5,0x2D,0xBD,0x44,0x41,0xE3,0x38,0xF8,0xE0,0x78,0xF8, + 0x03,0x39,0xC2,0x38,0x6F,0xAA,0xAE,0x2E,0x24,0x41,0xE3,0x38,0x7A,0x7C,0x2A,0x22, + 0x24,0x41,0xC2,0x30,0x7E,0xFB,0xE0,0xF0,0x44,0x41,0xC2,0x30,0xDD,0xBD,0x2F,0x2B, + 0x43,0x49,0xA1,0x30,0xDF,0x5F,0xEE,0xA0,0x24,0x41,0xE3,0x38,0xFD,0xA9,0x0B,0x80, + 0x23,0x41,0xC2,0x38,0x0E,0xBA,0xFC,0x7A,0x24,0x41,0xC3,0x38,0xF0,0xE2,0xFF,0xFF, + 0xC3,0x30,0x82,0x30,0xF6,0xFA,0xF0,0xB2,0xE3,0x38,0x82,0x30,0xFF,0xB7,0xB7,0x2B, + 0x24,0x41,0xC2,0x38,0xAD,0x3D,0x23,0xAA,0x44,0x41,0xE3,0x38,0xBF,0xBB,0xFF,0x0D, + 0x64,0x49,0x24,0x41,0xA5,0xBD,0xD7,0x5E,0x64,0x49,0x24,0x41,0x57,0x72,0xE2,0x7E, + 0x23,0x41,0xE2,0x38,0xAC,0xB0,0xE3,0xEF,0x24,0x41,0xE3,0x38,0x80,0x8A,0xFB,0x9B, + 0x44,0x49,0xE3,0x38,0xAB,0xAB,0xAF,0x15,0x85,0x51,0x24,0x41,0x8B,0x22,0xBB,0x5F, + 0xA6,0x51,0x03,0x39,0xE0,0xFB,0x7B,0xDD,0x44,0x41,0xE3,0x38,0xAE,0xBA,0x3F,0x1E, + 0x85,0x51,0x24,0x41,0xBB,0x0F,0xFF,0x77,0x65,0x51,0x03,0x41,0xEC,0xE0,0x6A,0x5D, + 0x24,0x49,0xE3,0x40,0x0A,0x2B,0xBA,0x5A,0xC6,0x59,0x23,0x49,0x8B,0xA9,0xE9,0xF5, + 0xA5,0x59,0x44,0x49,0xF8,0xFA,0x7B,0x7F,0x64,0x51,0x23,0x49,0x20,0xAA,0xA2,0xFF, + 0x64,0x51,0x03,0x41,0x80,0xBA,0x9E,0xD7,0x85,0x59,0x23,0x49,0x0E,0xA7,0xA7,0x2D, + 0xE6,0x61,0x85,0x59,0x8B,0xA1,0xBB,0xFF,0xE6,0x61,0x85,0x51,0xA8,0xAE,0x77,0x7F, + 0x06,0x62,0x84,0x51,0xA2,0xAB,0xBE,0xFD,0x27,0x6A,0x84,0x51,0x80,0xAE,0xEF,0x77, + 0xE6,0x61,0x85,0x51,0x6A,0xE0,0xEE,0x9F,0xC6,0x59,0x23,0x49,0x5F,0xEE,0xEA,0x80, + 0x64,0x51,0x02,0x41,0x3F,0xBF,0xC0,0xA8,0x85,0x51,0x23,0x41,0x0A,0xAD,0xDD,0xBF, + 0x64,0x49,0x23,0x41,0x03,0x8C,0x86,0xAA,0x64,0x49,0x44,0x49,0x20,0x1C,0x2F,0x29, + 0xC6,0x59,0x64,0x49,0x2D,0xAD,0xFD,0xFF,0xE6,0x59,0x64,0x49,0xA0,0xAA,0xD5,0x57, + 0xA5,0x51,0x44,0x49,0xEC,0xA0,0xAA,0x7F,0x85,0x51,0x23,0x41,0x8F,0xAA,0xFB,0x7E, + 0xA5,0x51,0x23,0x49,0x2E,0x2B,0x2F,0xAF,0xC5,0x51,0x64,0x51,0xFE,0xFE,0xDC,0xB7, + 0x07,0x6A,0xA5,0x59,0x27,0xA5,0xA5,0x9D,0x87,0x7A,0x06,0x62,0x2A,0xAB,0xAF,0xF5, + 0xC8,0x82,0x88,0x7A,0xBB,0xC1,0xCD,0xBD,0xE8,0x82,0xA7,0x82,0xAA,0xAF,0xB3,0x7F, + 0x29,0x8B,0xC7,0x82,0x3F,0xBF,0x75,0xE5,0x31,0xCD,0x09,0x8B,0x2F,0xBD,0xD5,0xD5, + 0xD4,0xE5,0x0D,0xAC,0x02,0x02,0x0B,0x2D,0x14,0xE6,0xD3,0xE5,0xFE,0xAA,0x22,0x8B, + 0x55,0xE6,0xF4,0xE5,0xFD,0xBD,0x8F,0xAF,0x55,0xEE,0x14,0xE6,0x57,0xD5,0x3A,0x0E, + 0x55,0xEE,0x14,0xE6,0xB5,0xAE,0xAA,0x20,0x55,0xEE,0x15,0xE6,0xFA,0xFA,0xFF,0xFC, + 0xF4,0xE5,0xD0,0xBC,0xE0,0xE0,0xE8,0x78,0x72,0xCD,0x10,0xC5,0xB7,0x27,0xAD,0xF5, + 0x72,0xCD,0x30,0xCD,0xFB,0xF8,0xAE,0xDD,0x35,0xE6,0x31,0xCD,0x0F,0x2D,0x2F,0xAD, + 0x76,0xEE,0x34,0xE6,0xFB,0xEB,0xAB,0x81,0x55,0xEE,0x15,0xE6,0x7A,0xEE,0xEA,0xA2, + 0x76,0xEE,0x14,0xE6,0xDD,0xF7,0xB7,0x2F,0x96,0xEE,0x14,0xE6,0xBD,0x2F,0xAB,0x02, + 0x96,0xEE,0x76,0xEE,0x3D,0x3F,0xA8,0x82,0xB6,0xF6,0x76,0xEE,0xFA,0xFB,0x5F,0x57, + 0x76,0xEE,0x55,0xE6,0xA0,0xE0,0x38,0xDE,0x35,0xF6,0x55,0xE6,0x55,0xDD,0x5D,0xDD, + 0x55,0xEE,0x75,0xE6,0x2E,0xEB,0xEE,0xAE,0x75,0xEE,0x35,0xE6,0x2A,0x3E,0xFE,0xAA, + 0x75,0xEE,0x35,0xE6,0x8A,0xA8,0xAA,0xB7,0x55,0xEE,0x75,0xE6,0xAA,0xA8,0xA8,0xFE, + 0x75,0xEE,0x55,0xE6,0xDE,0xDF,0xAF,0xC0,0x75,0xEE,0x35,0xE6,0x7E,0xFE,0x9E,0xBA, + 0x55,0xE6,0x14,0xE6,0xFA,0x6A,0xA0,0x00,0x55,0xEE,0xB3,0xD5,0x5E,0xEA,0xA8,0x80, + 0x15,0xE6,0x92,0xD5,0xF7,0x7F,0xFA,0xA0,0xD4,0xDD,0x92,0xD5,0x5D,0x55,0xDE,0xF9, + 0xB3,0xDD,0x71,0xD5,0x7E,0x6A,0xAB,0xB0,0x92,0xD5,0x51,0xCD,0x97,0xEE,0xAC,0x20, + 0x84,0x61,0x43,0x59,0xFD,0xEB,0x02,0xCB,0x84,0x61,0x43,0x59,0x3F,0xFE,0xDE,0xBF, + 0x84,0x61,0x43,0x59,0x8E,0xB4,0xDB,0x72,0xA5,0x61,0x43,0x59,0xF8,0x7C,0x5E,0x5F, + 0x84,0x61,0x23,0x51,0x2D,0x22,0x80,0xA2,0xA4,0x61,0x63,0x59,0xFA,0x7E,0xF7,0x69, + 0x84,0x61,0x63,0x59,0x39,0x55,0xAD,0xF9,0xE4,0x69,0x63,0x59,0x2B,0xAD,0xB5,0x79, + 0x46,0x72,0x63,0x59,0x0A,0xAB,0xFD,0x5D,0x87,0x7A,0x83,0x59,0x02,0xAA,0xBD,0x55, + 0x66,0x72,0xC4,0x61,0x28,0x80,0x2A,0xB5,0x87,0x7A,0x66,0x72,0x91,0x05,0x7A,0x79, + 0xA7,0x82,0x66,0x72,0xFA,0xF8,0xFD,0x7D,0x86,0x7A,0x66,0x72,0xE0,0x74,0xD7,0xAE, + 0xA7,0x7A,0x66,0x72,0xE6,0xAF,0xFB,0x2F,0x87,0x7A,0x46,0x72,0x8E,0xB0,0xA8,0xFE, + 0xA7,0x7A,0x66,0x72,0xFF,0x56,0xDA,0x7D,0xA7,0x7A,0x66,0x72,0xCD,0x5F,0xEF,0xF7, + 0x87,0x7A,0x46,0x72,0xC8,0xC2,0x42,0x03,0xA7,0x7A,0x46,0x72,0xBD,0x2F,0xAB,0xEB, + 0xA8,0x7A,0x66,0x7A,0xF7,0x7F,0xEA,0x57,0x87,0x7A,0x46,0x7A,0x88,0xA2,0x92,0x12, + 0xA7,0x82,0x67,0x7A,0xAF,0xB7,0xDF,0xFF,0xA7,0x82,0x67,0x7A,0xCB,0x56,0x8E,0xB2, + 0xA7,0x82,0x46,0x72,0xED,0xAF,0x2B,0xA2,0x87,0x82,0x67,0x7A,0x9F,0xBD,0x34,0x02, + 0xA7,0x82,0x67,0x7A,0xF4,0xAC,0xBF,0xF9,0xA7,0x82,0x66,0x7A,0xEA,0xAA,0xBF,0x58, + 0x29,0x93,0x87,0x7A,0x5D,0x5D,0x95,0x3D,0xEC,0xAB,0xA7,0x82,0x2D,0x2F,0x0A,0x0A, + 0x0D,0xAC,0xAB,0xA3,0x88,0xA8,0xBF,0xFF,0xEC,0xAB,0xAC,0xA3,0x80,0xE8,0xAE,0xB4, + 0xCB,0xA3,0x86,0x7A,0x58,0x78,0xF8,0xE8,0x46,0x72,0xA5,0x59,0xDC,0x5C,0x5C,0x5C, + 0xA5,0x59,0x43,0x49,0x70,0xE8,0x62,0xFE,0x64,0x49,0x02,0x41,0x5E,0xFE,0x68,0x50, + 0x03,0x41,0xE2,0x38,0x7D,0xF8,0xDE,0x55,0xE2,0x30,0xA2,0x28,0xE8,0xF0,0x6A,0x7A, + 0x82,0x30,0xA2,0x28,0xDF,0x7D,0xFB,0x7F,0xC2,0x30,0xA2,0x28,0xDF,0x7B,0xEA,0x68, + 0xC2,0x28,0x81,0x28,0xBB,0x6E,0xEB,0x83,0xC2,0x30,0xA2,0x28,0x6B,0x8D,0x2E,0x00, + 0xC2,0x30,0xA2,0x28,0x82,0x8B,0x23,0xAB,0xE3,0x30,0xA2,0x30,0xA7,0x2F,0xAB,0x02, + 0xE3,0x38,0xA1,0x28,0x5B,0xFE,0xAE,0x2A,0x03,0x39,0xA2,0x30,0xF7,0xBF,0xFF,0xA2, + 0x24,0x41,0xC2,0x30,0xED,0xAA,0x82,0x02,0x45,0x41,0x03,0x41,0xDF,0xDF,0xFB,0xAD, + 0x24,0x41,0xE3,0x38,0x36,0x85,0xBB,0xA0,0x44,0x41,0x03,0x41,0xAE,0xBF,0xFB,0xBA, + 0x65,0x49,0x03,0x39,0x53,0xE9,0xC3,0xEB,0x44,0x49,0xE3,0x38,0x2F,0xBB,0xFE,0x5A, + 0x65,0x49,0x03,0x41,0x6A,0xAA,0xAB,0x0B,0x85,0x51,0x03,0x41,0x7F,0xFB,0xEA,0x78, + 0x24,0x41,0xC3,0x38,0xDA,0xD4,0x5E,0xDF,0xE3,0x38,0xC2,0x30,0xEE,0x63,0xC1,0x00, + 0xE3,0x38,0xA2,0x30,0x55,0x9B,0xAA,0x80,0x03,0x39,0xC3,0x38,0xA5,0x2D,0x2F,0x3F, + 0x44,0x41,0x03,0x39,0x75,0xAB,0x2B,0x2B,0x85,0x51,0x03,0x39,0xF5,0xEA,0xC0,0x22, + 0x44,0x49,0x03,0x41,0xDC,0x5E,0x5E,0x5B,0x24,0x41,0x03,0x39,0xEA,0xEF,0xB9,0xC1, + 0x03,0x41,0xE3,0x38,0xBE,0xF8,0xEC,0xAA,0x24,0x41,0xE3,0x38,0xFF,0xAF,0x8B,0x0B, + 0x24,0x49,0xE3,0x38,0x05,0xFF,0xDE,0x56,0x24,0x41,0xE3,0x38,0x80,0xBB,0xF9,0x6F, + 0x44,0x41,0x04,0x41,0xF5,0xF5,0x9D,0x9F,0x44,0x41,0x03,0x41,0xD5,0x5E,0xFE,0x2A, + 0x44,0x51,0x03,0x41,0xF7,0xBF,0x2F,0x3F,0x44,0x49,0x03,0x41,0xD5,0xFE,0xE2,0xA0, + 0x24,0x49,0xE3,0x40,0x56,0x97,0xAE,0xAE,0x44,0x49,0xE3,0x40,0x0B,0xAA,0xEE,0x7E, + 0x44,0x49,0x03,0x41,0xA8,0xEA,0xAF,0xED,0x23,0x49,0xE2,0x40,0x80,0xA0,0xE8,0x55, + 0x23,0x49,0xE2,0x38,0xAA,0xFA,0xFB,0xBF,0x85,0x59,0x23,0x41,0x0D,0xBD,0xFD,0xA5, + 0xA5,0x59,0x64,0x49,0x22,0x2A,0xAB,0xFD,0xC6,0x59,0x64,0x51,0xEA,0xAA,0x3E,0x6F, + 0xA5,0x59,0x44,0x49,0x0B,0x0B,0xAA,0xBD,0x85,0x51,0x44,0x49,0x98,0xD8,0xDC,0x6F, + 0xA5,0x51,0x24,0x49,0x28,0xCA,0xFF,0xDF,0xC6,0x59,0x44,0x49,0xA0,0xEB,0xFF,0x5F, + 0x85,0x51,0x23,0x41,0xFE,0xFE,0x72,0x5E,0x85,0x51,0x23,0x49,0xAF,0xAF,0xBF,0xAD, + 0x65,0x49,0x23,0x41,0xF4,0xD8,0xD6,0x5F,0x85,0x51,0x23,0x41,0x8F,0xBB,0xAF,0xF5, + 0xA5,0x51,0x44,0x49,0x3D,0xFF,0xD7,0x57,0xA5,0x51,0x44,0x49,0xB8,0xA8,0xAF,0xD5, + 0xA6,0x51,0x23,0x41,0xDF,0xFE,0xFC,0xDF,0x64,0x49,0x23,0x41,0x5E,0xFC,0xFA,0x57, + 0x44,0x49,0x03,0x41,0x2E,0xB7,0x94,0x9A,0xA4,0x51,0x44,0x49,0xA7,0x2F,0xA7,0xEF, + 0xE5,0x61,0x84,0x51,0x3D,0x29,0xAD,0x3F,0x26,0x6A,0xE5,0x61,0xB9,0xEA,0xA1,0x89, + 0xA8,0x7A,0xC5,0x61,0x2A,0xBD,0x55,0x55,0xA7,0x82,0x06,0x6A,0x02,0xAB,0xB7,0xF5, + 0xE8,0x8A,0x87,0x7A,0x8F,0x2A,0x82,0xB5,0x09,0x8B,0xA7,0x7A,0x8E,0xFF,0xFE,0x7A, + 0x10,0xCD,0x08,0x8B,0x2D,0x2D,0xBD,0xB5,0xF4,0xE5,0x31,0xCD,0x02,0x09,0x0D,0x2D, + 0x35,0xE6,0xD3,0xDD,0x0B,0xA5,0xBF,0x0A,0x55,0xEE,0x35,0xE6,0x3B,0xBF,0x09,0xAA, + 0x55,0xEE,0x14,0xE6,0x80,0xE0,0xFA,0x5E,0x35,0xE6,0xD3,0xDD,0x20,0xA8,0x6A,0x5F, + 0xD4,0xDD,0xF0,0xC4,0x78,0x78,0x5E,0x5E,0x31,0xCD,0xF0,0xC4,0xCF,0xA9,0x23,0x22, + 0x51,0xCD,0x10,0xC5,0xF7,0xB5,0xB7,0xA7,0xF4,0xDD,0x51,0xCD,0x3D,0x35,0x35,0xBD, + 0x56,0xEE,0xF4,0xDD,0x02,0x02,0x03,0x09,0x96,0xEE,0x55,0xEE,0xD5,0xFD,0xEF,0xB5, + 0x96,0xEE,0x56,0xEE,0xB7,0x2B,0x2A,0x02,0xB6,0xF6,0x76,0xEE,0xAF,0xAB,0xAA,0xAB, + 0x96,0xEE,0x76,0xEE,0x80,0x70,0xC0,0xEA,0x55,0xEE,0x96,0xE6,0xBF,0xAB,0xEA,0xAB, + 0x75,0xEE,0x55,0xE6,0x6F,0xE0,0x80,0x2E,0x75,0xEE,0x55,0xE6,0xAD,0xC7,0xFF,0x7F, + 0x75,0xEE,0x55,0xE6,0xAA,0xF0,0x7B,0x7F,0x76,0xEE,0x35,0xE6,0xB2,0xFA,0xBB,0xBB, + 0x76,0xEE,0x35,0xE6,0xA7,0xD7,0x6E,0xEB,0x76,0xEE,0x55,0xE6,0x20,0x22,0x2F,0x3D, + 0x76,0xEE,0x55,0xE6,0xE2,0x5F,0xAE,0xCE,0x35,0xEE,0x55,0xE6,0x75,0xF5,0xFF,0x77, + 0x75,0xEE,0x55,0xE6,0x5F,0x5F,0xEF,0xFD,0x75,0xEE,0x35,0xE6,0x6B,0xFA,0xEA,0xAB, + 0x55,0xE6,0xF4,0xDD,0x72,0xA2,0x80,0xA0,0x56,0xEE,0xD3,0xD5,0x77,0x2A,0x0A,0x88, + 0x56,0xEE,0x92,0xD5,0x57,0xFE,0xE2,0x00,0x35,0xE6,0x92,0xD5,0xD5,0x77,0xBB,0x20, + 0x84,0x61,0x43,0x59,0x7E,0xEA,0xCB,0xAA,0x64,0x59,0x23,0x59,0x03,0x00,0x08,0xFC, + 0x84,0x59,0x43,0x59,0xDF,0xB5,0x15,0xF5,0xA4,0x61,0x43,0x59,0x7B,0xCA,0xEF,0xFF, + 0x84,0x61,0x43,0x59,0xE2,0x3B,0xB7,0x77,0xA4,0x61,0x43,0x59,0xF3,0xBF,0xFE,0xE6, + 0x84,0x61,0x63,0x59,0x55,0x97,0xFD,0xCA,0xA4,0x61,0x63,0x59,0xB2,0xF7,0x7F,0x7A, + 0x83,0x59,0x23,0x51,0xA8,0xAE,0xFE,0xBD,0x84,0x59,0x43,0x51,0xAE,0xBF,0xFD,0x75, + 0xC4,0x61,0x22,0x51,0x0A,0xFF,0x5F,0x7F,0x26,0x72,0x43,0x51,0x02,0xA7,0xD5,0x55, + 0x87,0x7A,0x44,0x51,0x02,0xAA,0xBD,0x75,0x87,0x7A,0xA5,0x61,0x0A,0x20,0xAB,0xFD, + 0x87,0x7A,0x26,0x72,0x08,0x82,0x0B,0xBD,0xA7,0x7A,0x46,0x7A,0xFC,0xEA,0xBA,0x7E, + 0x87,0x7A,0x46,0x72,0xCA,0xCC,0x8B,0xE9,0xA7,0x7A,0x66,0x7A,0xFE,0x77,0x6F,0x71, + 0x87,0x7A,0x46,0x72,0xAB,0x3C,0x1C,0xBA,0xA7,0x82,0x46,0x72,0xEA,0xEA,0xEA,0xDB, + 0xA7,0x82,0x67,0x7A,0xDD,0x77,0xFA,0x4B,0x66,0x82,0x87,0x7A,0xD5,0x9F,0xDF,0xB6, + 0xA7,0x82,0x67,0x7A,0xFD,0xB9,0xAF,0xEB,0xA7,0x82,0x67,0x7A,0x43,0xAB,0x2B,0xAB, + 0xA7,0x82,0x67,0x7A,0xE9,0x0B,0xAF,0xFD,0xA7,0x82,0x66,0x7A,0xFE,0x5E,0x3F,0x3E, + 0xA7,0x82,0x66,0x7A,0x97,0xF7,0xBA,0xD8,0xA7,0x82,0x67,0x7A,0xB8,0xFA,0xBE,0xBE, + 0xAB,0xA3,0x87,0x7A,0xB5,0x2D,0x2B,0x0B,0x0C,0xAC,0xAB,0xA3,0x8D,0xAF,0xBA,0xAB, + 0xEC,0xAB,0xAB,0xA3,0x20,0xB0,0xAA,0xFD,0xEC,0xAB,0xCB,0xA3,0x5E,0x0B,0xED,0x4D, + 0xCB,0xA3,0x08,0x8B,0x68,0x68,0x60,0xE8,0xA7,0x82,0xA5,0x59,0x5E,0x5C,0x7C,0x68, + 0x84,0x51,0x44,0x51,0xE4,0x38,0x9E,0x5E,0x64,0x49,0x02,0x41,0x78,0xE8,0xF0,0x68, + 0x03,0x41,0xC2,0x38,0xE2,0xCA,0xE8,0xC0,0xE2,0x38,0xC2,0x30,0x57,0x56,0x76,0x52, + 0xC2,0x30,0xA2,0x28,0x27,0x0A,0x2C,0x24,0xC3,0x38,0xA2,0x28,0xBA,0xBA,0xB0,0xAA, + 0xE3,0x30,0xA2,0x30,0xFF,0xB2,0xA0,0xE2,0xE3,0x30,0xA2,0x30,0xAB,0xEE,0xEE,0xAA, + 0x65,0x49,0xC3,0x30,0x55,0xD5,0xBD,0x2B,0x65,0x49,0xE3,0x38,0xFD,0xFF,0xEA,0xA0, + 0x44,0x41,0xE3,0x38,0x77,0xFE,0xFB,0xA2,0x24,0x41,0x03,0x39,0xF7,0xFB,0x2C,0x28, + 0x44,0x41,0x03,0x41,0xF2,0xFA,0xEF,0x8D,0x44,0x41,0x03,0x39,0x8B,0xEE,0xB7,0xA7, + 0x44,0x41,0xE3,0x38,0xF6,0xAA,0xAA,0x0A,0x44,0x41,0x03,0x41,0xF3,0x62,0x6D,0x5F, + 0x24,0x41,0xC2,0x38,0x02,0xEA,0xFA,0x7E,0x03,0x41,0xC3,0x38,0xE8,0xBF,0x2F,0x0B, + 0x85,0x49,0xE3,0x38,0x29,0xAF,0xAB,0xBF,0x85,0x49,0x03,0x41,0xF8,0x7A,0xFA,0xFA, + 0x44,0x49,0xE3,0x38,0x55,0xFF,0xEA,0x2A,0x64,0x49,0xE3,0x38,0xDD,0x95,0xF5,0xF8, + 0x43,0x49,0xE3,0x38,0x75,0x7D,0xFE,0x8A,0x23,0x41,0xE3,0x38,0x7D,0xF7,0xE2,0x80, + 0x24,0x41,0xC2,0x30,0x83,0xEA,0x7F,0xB7,0x64,0x49,0x03,0x39,0x03,0x29,0xBD,0xB5, + 0x44,0x41,0x03,0x41,0x56,0x5C,0xF7,0xEF,0x24,0x41,0xC2,0x30,0x82,0xF2,0x78,0xFE, + 0x24,0x41,0xC3,0x38,0xAC,0xBF,0xBD,0xBF,0x24,0x41,0xE3,0x38,0x0B,0x8E,0x29,0x0F, + 0x24,0x41,0xE3,0x38,0xE6,0x88,0x80,0x00,0x24,0x41,0xE3,0x38,0x8F,0xAF,0xAF,0xFB, + 0x64,0x49,0x03,0x41,0xF5,0xFD,0x0D,0x29,0x85,0x51,0x24,0x41,0xF5,0xD5,0xBE,0x2A, + 0x85,0x51,0x03,0x41,0xF7,0xFF,0xEE,0xA0,0x64,0x49,0x23,0x41,0x7E,0x52,0xDB,0x75, + 0x24,0x49,0x03,0x41,0x3D,0xFD,0x69,0xC2,0x65,0x51,0x03,0x41,0xFF,0xAD,0xA9,0xAA, + 0x44,0x49,0x03,0x41,0xEB,0xFE,0x68,0xFE,0x24,0x49,0xC2,0x38,0xF7,0xF6,0xEA,0xEA, + 0x03,0x41,0xE2,0x40,0xA5,0x05,0x25,0x3A,0x85,0x51,0x03,0x41,0xAD,0x3D,0x2D,0x35, + 0xA5,0x51,0x64,0x51,0xAF,0xE2,0x43,0xEA,0x85,0x51,0x23,0x49,0x42,0xC8,0x68,0xA8, + 0x44,0x49,0x03,0x41,0xAA,0x7D,0xD5,0xFA,0x44,0x49,0x03,0x41,0xA6,0x57,0xF7,0x97, + 0x44,0x49,0x03,0x41,0xA8,0xB9,0x7F,0x5F,0x64,0x49,0x03,0x41,0xA0,0x2F,0xAD,0x55, + 0x44,0x49,0xE3,0x38,0xF8,0xE8,0xAA,0xDF,0x64,0x49,0x03,0x41,0x0F,0x29,0x27,0xF5, + 0x64,0x49,0x23,0x41,0xFE,0xBF,0xA0,0xA0,0x64,0x49,0x24,0x41,0xB7,0xFF,0xBE,0xFA, + 0x64,0x49,0x23,0x41,0xFE,0x97,0xF7,0x5A,0x85,0x49,0x23,0x41,0xED,0xCE,0xFF,0x7D, + 0x44,0x41,0x03,0x41,0xAA,0x78,0x7A,0x6E,0x23,0x41,0xE3,0x38,0x0A,0xAF,0x8A,0x00, + 0x64,0x49,0x03,0x41,0xAE,0x89,0x2D,0xAB,0xA4,0x51,0x44,0x49,0xBD,0xF5,0x9F,0x29, + 0x06,0x6A,0x84,0x51,0x2B,0xAF,0x8D,0xAF,0x47,0x72,0xE5,0x61,0xAD,0xCB,0x2B,0x0B, + 0x67,0x72,0xE6,0x61,0x57,0x7E,0xF2,0xA2,0x66,0x72,0xE6,0x69,0x3D,0xAD,0xBF,0x2E, + 0xC8,0x82,0x46,0x72,0x29,0x29,0xAD,0x2D,0xE8,0x82,0xA8,0x82,0x5C,0x7E,0x6B,0x27, + 0x2C,0xAC,0xC8,0x82,0x3D,0xB5,0xF5,0xD5,0xB3,0xDD,0xAB,0x9B,0x02,0x0B,0x09,0x2D, + 0x55,0xEE,0xF4,0xE5,0x0A,0x2F,0xEF,0xFD,0x55,0xEE,0xF4,0xE5,0x28,0xA2,0xFB,0x5F, + 0x35,0xE6,0xB3,0xD5,0xA0,0xEA,0x7E,0x7F,0xF4,0xDD,0x52,0xCD,0xE8,0xE8,0x7A,0x7A, + 0x52,0xCD,0xF0,0xC4,0xFC,0xFA,0x7E,0xFF,0x31,0xCD,0x10,0xC5,0xB5,0xAF,0x09,0x83, + 0x51,0xCD,0x31,0xC5,0xB5,0xEB,0xBF,0x69,0xB2,0xD5,0x30,0xCD,0x2F,0xAF,0xA7,0xBD, + 0x56,0xEE,0xD3,0xDD,0x0B,0x0D,0x2D,0x35,0x96,0xEE,0x56,0xEE,0xB7,0xAB,0xAB,0x2B, + 0xB6,0xF6,0x76,0xEE,0x77,0xFD,0xFF,0x2F,0xB6,0xF6,0x96,0xEE,0xDD,0xB5,0xB7,0xF9, + 0x96,0xEE,0x76,0xEE,0x48,0xF8,0x5C,0x8A,0x96,0xEE,0x35,0xE6,0xAA,0xEA,0x2A,0xA0, + 0x55,0xEE,0x75,0xE6,0xEA,0xEE,0xEA,0xAF,0x55,0xEE,0x75,0xE6,0xAA,0xBA,0xAA,0xA2, + 0x76,0xEE,0x35,0xE6,0xAD,0xAA,0xBB,0xFE,0x55,0xEE,0x55,0xE6,0xFF,0xEF,0xFF,0xFF, + 0x56,0xEE,0x55,0xE6,0xFF,0xFF,0xBF,0x9B,0x75,0xEE,0x35,0xE6,0x8E,0xFA,0xFE,0xAA, + 0x56,0xEE,0x75,0xE6,0x9E,0xAA,0xAA,0xEB,0x76,0xEE,0x55,0xE6,0xDF,0x73,0xFA,0xA0, + 0x96,0xEE,0x55,0xE6,0x55,0x55,0xFD,0xA8,0x96,0xEE,0x35,0xE6,0xDF,0xFF,0xFA,0x82, + 0x96,0xEE,0x35,0xE6,0x5F,0xDF,0xBA,0x0B,0x76,0xEE,0x35,0xE6,0xFF,0xBF,0x20,0x00, + 0x76,0xEE,0x56,0xE6,0x75,0x8F,0x0B,0xAA,0x76,0xEE,0x35,0xE6,0x55,0xFF,0xE8,0x5C, + 0x63,0x59,0x23,0x51,0x00,0xA3,0xAB,0xBF,0x64,0x59,0x23,0x51,0x9E,0xB3,0x2E,0x0F, + 0x85,0x61,0x44,0x59,0xF9,0xDA,0xEF,0x8A,0x84,0x59,0x43,0x59,0xAF,0xCD,0xB5,0xF7, + 0x84,0x61,0x43,0x59,0xDA,0x82,0x6E,0xAB,0x84,0x59,0x43,0x59,0xD4,0xBD,0x9A,0xB8, + 0x84,0x59,0x43,0x59,0x20,0x8B,0x88,0x68,0x84,0x59,0x22,0x51,0xCA,0x7A,0x7E,0x57, + 0x43,0x51,0x22,0x51,0x8B,0xDF,0xEA,0x48,0x63,0x51,0x22,0x51,0xDE,0x5F,0xEB,0x6B, + 0x43,0x51,0x02,0x49,0xBA,0xAB,0x7F,0xD9,0x44,0x59,0x03,0x49,0x97,0x3F,0xA7,0x2F, + 0x64,0x51,0x02,0x49,0x0B,0xAE,0xEA,0x9A,0x85,0x61,0x23,0x51,0x2A,0x9F,0xBF,0x8D, + 0x26,0x72,0x43,0x59,0x02,0xEB,0xF5,0xFD,0x66,0x7A,0x84,0x61,0x80,0xAF,0xF5,0x55, + 0x66,0x7A,0xA4,0x61,0x00,0x0A,0x2B,0xF5,0x87,0x7A,0x26,0x7A,0x22,0xEA,0x0A,0xB9, + 0xA7,0x82,0x67,0x7A,0xFF,0x7E,0x77,0xD7,0x87,0x7A,0x67,0x7A,0x25,0x00,0x2B,0x59, + 0xA7,0x82,0x66,0x7A,0xEB,0x9A,0xF8,0xEB,0xA8,0x82,0x67,0x7A,0xA1,0x6F,0xA9,0x0F, + 0xA8,0x82,0x46,0x7A,0xC2,0x87,0x2E,0xFE,0xA8,0x82,0x66,0x7A,0x7E,0xEC,0xA8,0xAA, + 0xC8,0x82,0x87,0x7A,0x5D,0xFB,0xAF,0xB5,0xA7,0x82,0x87,0x7A,0xB7,0xDA,0x96,0x16, + 0xC8,0x82,0x66,0x7A,0xDC,0xFE,0xFE,0xEE,0x8B,0xA3,0x87,0x82,0xD5,0xF5,0x9D,0x3F, + 0xEC,0xAB,0x4A,0x93,0x2D,0x09,0x8B,0xA2,0xEB,0xAB,0xAB,0xA3,0xAA,0xBE,0x76,0x5F, + 0xCC,0xA3,0xAB,0xA3,0x95,0x95,0x6E,0xAB,0xEB,0xAB,0xAB,0xA3,0xCA,0xAD,0xD9,0x57, + 0xCB,0xA3,0x08,0x8B,0xE0,0xC0,0x68,0x60,0xE8,0x82,0x84,0x59,0xF8,0xF8,0x78,0x7E, + 0x84,0x59,0x23,0x49,0x7C,0xD8,0x7A,0x50,0x43,0x49,0xE2,0x40,0xE0,0xE8,0xBF,0x7F, + 0x44,0x49,0xE2,0x38,0x7E,0xAA,0x8A,0x0A,0x03,0x41,0xC2,0x30,0x57,0x7F,0x7E,0x78, + 0xC2,0x30,0xA1,0x30,0x0E,0x0B,0x3F,0x15,0xE3,0x38,0xA2,0x28,0xEF,0xBA,0xF8,0xF0, + 0xC2,0x30,0xA2,0x28,0x02,0x0A,0x2A,0x03,0x03,0x39,0xC2,0x30,0xA3,0x3B,0xBF,0xBF, + 0x44,0x41,0x03,0x39,0xAB,0xDD,0xBF,0x2B,0x44,0x49,0x24,0x41,0xC2,0x6D,0xAB,0x02, + 0x44,0x49,0x24,0x41,0xC9,0xEA,0xE0,0xC0,0x44,0x41,0x03,0x39,0xAA,0xEB,0x7F,0xEE, + 0x44,0x41,0x03,0x41,0x36,0xBC,0x2D,0x00,0x44,0x49,0xE3,0x38,0xAA,0xBA,0x68,0xAA, + 0x45,0x41,0xE3,0x38,0x8A,0xBE,0x5F,0x5F,0x24,0x41,0xC2,0x38,0xF8,0xE8,0xFA,0xA7, + 0x44,0x49,0xE3,0x38,0xF5,0xD5,0xA5,0x0F,0x64,0x49,0xE3,0x38,0xF7,0xBF,0xAA,0xAA, + 0x44,0x49,0x03,0x41,0x17,0x9A,0x58,0xFA,0x64,0x51,0x03,0x41,0xFA,0xA2,0x0F,0x0D, + 0x85,0x51,0x24,0x49,0xAD,0xBF,0xBF,0x3B,0x64,0x49,0x24,0x41,0x7E,0xEC,0x78,0x70, + 0x85,0x51,0x23,0x41,0xFB,0xEA,0x2D,0xA5,0x85,0x51,0x23,0x41,0x57,0x7F,0xEA,0xCA, + 0x24,0x41,0xC2,0x38,0xF6,0xB7,0xFE,0xE8,0x44,0x41,0xC2,0x38,0x0B,0x8A,0x0B,0xA9, + 0x44,0x41,0x23,0x41,0x57,0x5F,0xEB,0x55,0x23,0x41,0xE3,0x38,0xDC,0x68,0xFA,0xFE, + 0x24,0x41,0xE3,0x38,0xBD,0xDF,0x79,0xFA,0x24,0x41,0x03,0x39,0x0A,0x09,0x0D,0x05, + 0x45,0x49,0xE3,0x38,0xEA,0x6A,0x7B,0xF7,0x03,0x41,0xE3,0x38,0x37,0x09,0x8D,0x2F, + 0x85,0x49,0x03,0x41,0x25,0x3D,0xBD,0x27,0xC6,0x59,0x64,0x49,0xFD,0xA9,0xCB,0x03, + 0xA5,0x51,0x23,0x41,0xF0,0x7E,0xDE,0xFA,0x44,0x49,0xE2,0x40,0xDA,0x5E,0x5C,0xD8, + 0x24,0x49,0xE2,0x40,0x2B,0x37,0x3F,0xBB,0x85,0x51,0x24,0x49,0xFF,0xFD,0xAA,0x81, + 0x65,0x51,0x03,0x41,0x7A,0xC2,0xE8,0xE0,0x44,0x49,0x03,0x41,0x7E,0xDE,0xAF,0xAA, + 0x64,0x49,0x03,0x41,0xD5,0x77,0xFA,0xE2,0x85,0x51,0x23,0x49,0x1D,0xAB,0xAD,0xAD, + 0x85,0x51,0x44,0x49,0xE8,0x7A,0xDC,0xE2,0x64,0x49,0x03,0x41,0xFF,0xFF,0x7B,0xFC, + 0x64,0x49,0x03,0x41,0xAB,0x23,0x2B,0x9A,0x64,0x49,0x03,0x41,0xD7,0xFE,0x88,0xAB, + 0x23,0x41,0x03,0x39,0x80,0x82,0xEE,0xC4,0x23,0x41,0xE3,0x38,0xAE,0x9F,0xFB,0x78, + 0x23,0x41,0xC2,0x38,0xB8,0xBF,0xEF,0xA5,0x65,0x49,0xE3,0x38,0xBF,0x37,0xF5,0xD7, + 0x85,0x49,0x24,0x41,0xFA,0x2B,0xAF,0xF5,0x64,0x49,0x03,0x41,0x28,0xAA,0xEA,0xFA, + 0x64,0x49,0x03,0x39,0xB2,0xFA,0x7A,0x7D,0x44,0x41,0xE2,0x38,0x2A,0x88,0xAF,0xB7, + 0x44,0x41,0x03,0x41,0xFE,0xE2,0xEE,0x65,0x44,0x49,0x03,0x41,0xA9,0x0B,0x07,0xB5, + 0xA5,0x51,0x23,0x41,0xFD,0xBB,0x2B,0xAB,0xC5,0x59,0x44,0x49,0xA9,0x25,0xB8,0xC8, + 0x27,0x6A,0x85,0x51,0xAF,0x2B,0xBD,0xFD,0x67,0x72,0xE6,0x61,0xEB,0xAA,0x21,0x25, + 0xA8,0x7A,0x26,0x6A,0xE5,0xFF,0xAE,0x0A,0xA8,0x82,0x26,0x6A,0xD5,0xFF,0x0E,0x22, + 0xA8,0x82,0x67,0x72,0xBF,0xDB,0xFB,0x6A,0xE9,0x82,0x67,0x7A,0xAF,0xAB,0xAD,0xAF, + 0x09,0x8B,0xA8,0x82,0x0B,0x2A,0x16,0x3D,0xEF,0xC4,0x29,0x93,0x2D,0xB5,0xB5,0xF5, + 0xF4,0xE5,0x6E,0xB4,0x02,0x02,0x0B,0x2D,0x15,0xE6,0xD4,0xDD,0xE8,0xFA,0x7A,0xFB, + 0x15,0xE6,0xD4,0xDD,0x7F,0xBF,0x83,0x03,0xD4,0xDD,0x31,0xC5,0x70,0x70,0xD0,0x58, + 0x31,0xCD,0xF0,0xC4,0xAA,0xAA,0xEE,0x7D,0x31,0xCD,0xF0,0xBC,0xAA,0xEA,0x3B,0xAD, + 0x51,0xCD,0x10,0xCD,0x83,0x29,0x6E,0xAA,0x72,0xCD,0x31,0xCD,0xA7,0xCF,0xBF,0xAD, + 0x15,0xE6,0x72,0xD5,0x09,0x09,0x2D,0x25,0x96,0xEE,0x35,0xE6,0x0B,0x2A,0x0B,0x09, + 0xB6,0xF6,0x76,0xEE,0x2E,0xBF,0xB9,0xFF,0xB7,0xF6,0x96,0xEE,0xBF,0xAF,0xD5,0x55, + 0xB6,0xF6,0x76,0xEE,0xF7,0xFF,0xFF,0xAB,0x96,0xEE,0x55,0xE6,0xB0,0x6A,0x2A,0x00, + 0xB6,0xF6,0x55,0xE6,0xFF,0xFF,0xAF,0x22,0xB6,0xF6,0x55,0xE6,0xF5,0xFF,0xAA,0xA2, + 0xB6,0xF6,0x55,0xE6,0x77,0xFF,0xAA,0x20,0xB6,0xF6,0x76,0xEE,0xD5,0xBF,0xA8,0xA2, + 0xB7,0xF6,0x76,0xEE,0x57,0xBA,0xAA,0xE8,0x96,0xF6,0x76,0xEE,0x39,0xAA,0x28,0xD7, + 0xB6,0xF6,0x55,0xE6,0xBE,0x8A,0xEA,0x7E,0x96,0xEE,0x35,0xE6,0x20,0x02,0x2A,0x7D, + 0xB7,0xF6,0x15,0xE6,0x2A,0xA8,0xEA,0x7F,0xB7,0xF6,0x15,0xDE,0xA0,0xA8,0xEE,0x55, + 0x76,0xEE,0xB3,0xD5,0x00,0x00,0xAA,0x7F,0x56,0xEE,0x72,0xCD,0x00,0x20,0xFA,0x57, + 0x55,0xEE,0x93,0xCD,0x80,0xFE,0x77,0x55,0xF4,0xDD,0x72,0xCD,0xC0,0x7B,0x55,0x55, + 0x84,0x59,0x22,0x51,0xFF,0xEA,0x63,0x7B,0x64,0x59,0x22,0x51,0x3F,0x0F,0x25,0x2F, + 0x84,0x61,0x64,0x59,0xFB,0x2A,0xE9,0x7F,0x84,0x61,0x23,0x51,0xFC,0xAC,0xF8,0xE0, + 0x84,0x59,0x43,0x59,0xAA,0xAB,0x2B,0x07,0xA4,0x61,0x43,0x51,0xAA,0xAA,0x88,0x7E, + 0x84,0x59,0x22,0x51,0x6A,0xE8,0xAF,0xB9,0x84,0x59,0x22,0x51,0xD7,0xF7,0x3F,0xEF, + 0x43,0x51,0x22,0x51,0x58,0x3C,0xD8,0x20,0x43,0x51,0x22,0x49,0x78,0x7A,0x0D,0x2E, + 0x63,0x59,0x22,0x51,0x5D,0x75,0xA7,0x2A,0x64,0x59,0x23,0x51,0xFD,0xD9,0xFA,0xAA, + 0x84,0x61,0x23,0x51,0x57,0xF7,0xE7,0xAF,0x84,0x61,0x64,0x59,0x19,0xA9,0xB9,0x81, + 0xA4,0x61,0x64,0x59,0xB5,0xEF,0xFD,0xFB,0x84,0x61,0x64,0x59,0x7A,0x2E,0xB4,0x1E, + 0xA4,0x61,0x64,0x59,0xFF,0x7D,0x6E,0xEB,0x06,0x72,0x63,0x59,0x0B,0xEB,0xFD,0x75, + 0x67,0x7A,0x63,0x59,0x02,0xAB,0xF5,0x57,0x67,0x7A,0x84,0x61,0x00,0x00,0x0B,0xF5, + 0x88,0x82,0x06,0x72,0x08,0x8A,0xAA,0xA9,0x67,0x82,0x87,0x7A,0x77,0xDC,0xDE,0xFB, + 0x87,0x82,0x67,0x7A,0x5C,0xFF,0xBF,0x0B,0xA7,0x82,0x67,0x7A,0xAA,0xA5,0xB6,0xA6, + 0xA7,0x82,0x67,0x7A,0x2E,0x2A,0x6B,0xFF,0xA7,0x82,0x87,0x7A,0x2D,0x05,0xFD,0x7E, + 0x08,0x8B,0x87,0x7A,0xD5,0xFF,0xBF,0x3D,0xEC,0xAB,0xE8,0x8A,0xA5,0x2D,0x2B,0x0B, + 0xEB,0xAB,0xAB,0xA3,0x6A,0xFA,0xD0,0xBF,0xCB,0xA3,0x8A,0xA3,0xAA,0xBF,0xEF,0xA8, + 0xCB,0xA3,0x6C,0xA3,0x8A,0xA8,0x8E,0xAA,0xCB,0xA3,0x8B,0xA3,0x88,0xE9,0xAB,0x8B, + 0xCB,0xA3,0x49,0x93,0x78,0xA2,0x88,0xAA,0x29,0x8B,0x06,0x6A,0x5E,0x78,0x70,0xE0, + 0xE6,0x61,0x43,0x51,0x5E,0xEC,0xF8,0xE8,0x64,0x51,0xC2,0x38,0x7E,0x7E,0x78,0xE0, + 0x23,0x41,0xC2,0x38,0x0B,0xAF,0xAF,0xF7,0x03,0x41,0xC2,0x38,0x70,0x6F,0x7E,0x57, + 0xE3,0x38,0xA1,0x30,0x95,0xBF,0xFA,0xBA,0xE2,0x38,0xA2,0x30,0x7E,0xFF,0xAB,0x2A, + 0x03,0x39,0xA2,0x30,0xD5,0xD7,0xFB,0xBC,0x23,0x41,0xE3,0x38,0xF5,0xB5,0xAD,0xBD, + 0x64,0x49,0x03,0x41,0x2D,0x2D,0x3F,0xBF,0xA6,0x51,0x44,0x49,0x57,0x5F,0x7F,0xE3, + 0x64,0x49,0x24,0x41,0xEB,0xAA,0xBE,0xBA,0x85,0x49,0x24,0x41,0xB7,0xD7,0x8B,0x0B, + 0x85,0x51,0x24,0x41,0xFA,0x7E,0xD8,0x58,0x44,0x41,0xE3,0x40,0x8E,0x3B,0x2B,0xA9, + 0x44,0x49,0xE3,0x38,0x7E,0xD8,0xEE,0xAA,0x23,0x41,0xE2,0x38,0xA5,0x3F,0x9E,0x3F, + 0xA5,0x51,0x03,0x41,0x2D,0x2F,0x2B,0x2F,0xA5,0x51,0x23,0x49,0x78,0x78,0xE0,0xA0, + 0x64,0x51,0x03,0x49,0xFF,0xAD,0xF6,0xFC,0x85,0x51,0x24,0x49,0xF5,0x65,0xAF,0x0F, + 0xA5,0x51,0x64,0x51,0x35,0xB5,0xDF,0x98,0xA5,0x59,0x24,0x49,0x7C,0xF8,0xE2,0x8A, + 0x64,0x51,0x24,0x49,0x17,0xD7,0xBE,0xE8,0xA5,0x51,0x44,0x49,0xEF,0x2F,0x3D,0x37, + 0x85,0x51,0x03,0x39,0x5F,0x7E,0x58,0x78,0x24,0x41,0xC2,0x38,0x8A,0xAA,0xEA,0x7F, + 0x24,0x41,0xE3,0x38,0xBE,0xBD,0xF5,0xD5,0x03,0x39,0xA2,0x30,0xA0,0x08,0x2A,0x28, + 0x23,0x41,0xE3,0x38,0xDF,0xBF,0xEA,0x72,0x23,0x41,0xE3,0x38,0x6A,0xFC,0xEE,0xFF, + 0x23,0x41,0xE2,0x38,0xCF,0x03,0x8A,0xDA,0x24,0x41,0xE3,0x38,0x97,0x14,0xBB,0x79, + 0x85,0x51,0xE3,0x38,0xA7,0xBF,0xEF,0xB5,0xC6,0x59,0x65,0x49,0x2B,0xAF,0xAD,0xFF, + 0x84,0x51,0x44,0x49,0x7C,0x54,0x54,0x7F,0x44,0x49,0xE2,0x40,0xF2,0x6E,0xFE,0x7E, + 0x03,0x41,0xE2,0x40,0x02,0x02,0x3B,0xA9,0x44,0x49,0x03,0x41,0x0B,0xF6,0x5F,0x7D, + 0x64,0x49,0x24,0x49,0x58,0xEF,0xBD,0xAD,0x85,0x51,0x23,0x49,0xB9,0xA9,0x2B,0x02, + 0x85,0x51,0x23,0x41,0xF2,0xEA,0x78,0x5E,0x64,0x49,0x23,0x49,0x85,0xAD,0x0B,0x2B, + 0xA5,0x51,0x44,0x41,0xEB,0x2F,0xAD,0xF5,0x85,0x49,0x44,0x49,0x56,0x7A,0x7A,0x57, + 0x44,0x41,0x03,0x41,0xD6,0x5F,0xFE,0xAC,0x64,0x49,0x03,0x39,0x8F,0xA7,0xAD,0xB5, + 0x44,0x41,0xE2,0x38,0xE8,0xAC,0xB8,0xB4,0x23,0x41,0xE2,0x38,0x42,0xC0,0xE0,0x7E, + 0x03,0x39,0xC2,0x38,0x25,0xBF,0x2B,0x82,0x23,0x41,0x03,0x39,0xAD,0x67,0x3D,0x09, + 0x44,0x41,0x03,0x39,0xBA,0xFF,0xEB,0x22,0x44,0x41,0x03,0x41,0xA2,0xCA,0x7B,0xEA, + 0xE2,0x48,0x03,0x39,0xF5,0xDD,0x75,0xD7,0x23,0x41,0xC2,0x38,0xA7,0x2F,0xEF,0xAA, + 0x43,0x41,0x03,0x41,0x65,0xEB,0xFF,0xA9,0x64,0x49,0x23,0x41,0xB7,0x95,0xB5,0x75, + 0x64,0x49,0x23,0x41,0x02,0x00,0x02,0xAF,0xA5,0x51,0x44,0x49,0x00,0x2F,0x9E,0xB3, + 0xE7,0x61,0x85,0x51,0xDB,0xEA,0x2B,0x2B,0x27,0x6A,0xA4,0x59,0x25,0x95,0xEF,0xE2, + 0xA8,0x7A,0xC5,0x59,0x0A,0x03,0xBF,0xBD,0xC9,0x82,0x66,0x72,0x02,0x22,0xAB,0xE9, + 0xA8,0x7A,0x67,0x7A,0x68,0x6A,0x68,0x78,0xA7,0x7A,0x46,0x72,0x0A,0x2F,0x2F,0x77, + 0x09,0x8B,0xA7,0x7A,0x3D,0xEF,0xAD,0xBF,0x8B,0x9B,0xE8,0x82,0x2D,0x3D,0xFD,0x55, + 0xD3,0xDD,0x6A,0x93,0x2B,0x2D,0xAD,0xB5,0x14,0xE6,0x72,0xD5,0x8A,0x0A,0x0B,0x09, + 0x15,0xE6,0xB3,0xDD,0x02,0x80,0xA0,0x70,0xB3,0xDD,0xF0,0xC4,0x58,0x7C,0x7C,0x5E, + 0x10,0xC5,0xCF,0xBC,0xEA,0x6A,0xFE,0xB6,0x30,0xCD,0xD0,0xBC,0xAB,0xA9,0xAF,0x2B, + 0x31,0xCD,0x10,0xC5,0x42,0xC8,0xB3,0x83,0x51,0xCD,0x10,0xC5,0x0B,0x8F,0x0F,0x89, + 0x14,0xE6,0x51,0xCD,0x35,0x35,0xD5,0xD5,0x96,0xF6,0xF4,0xDD,0x0A,0x0B,0x0B,0x2D, + 0xD7,0xF6,0x76,0xEE,0xBF,0xAA,0xA8,0x75,0xB7,0xF6,0x55,0xEE,0x08,0x00,0x28,0x7F, + 0xB7,0xF6,0x35,0xE6,0x00,0x00,0xA0,0x57,0xB7,0xF6,0x35,0xE6,0x02,0xA8,0xEA,0x5D, + 0xB7,0xF6,0x14,0xDE,0x82,0xA2,0xFF,0x7D,0x96,0xEE,0xF4,0xDD,0x00,0x88,0xFE,0x77, + 0x96,0xEE,0xB3,0xD5,0x00,0x20,0xAA,0x5F,0x76,0xEE,0xB3,0xD5,0x00,0x00,0xEA,0x57, + 0x96,0xEE,0x73,0xCD,0x00,0xA8,0xAA,0x57,0x55,0xE6,0x51,0xC5,0x00,0x88,0xFA,0x57, + 0x55,0xE6,0xF1,0xBC,0x80,0xAA,0xFE,0x77,0x15,0xE6,0xD0,0xBC,0x00,0xAA,0xFF,0x55, + 0xF4,0xDD,0x8F,0xB4,0x00,0xAA,0xDF,0x55,0xF4,0xDD,0xB0,0xB4,0xA8,0xFE,0x55,0x55, + 0x72,0xCD,0x4E,0xAC,0x20,0xBA,0xF7,0xF5,0x73,0xC5,0xD0,0xB4,0x2A,0xBF,0x35,0x29, + 0x93,0xCD,0x52,0xC5,0x82,0x8F,0xB3,0x7A,0xB3,0xD5,0x11,0xC5,0xEA,0xE2,0xFA,0x7E, + 0x43,0x59,0x23,0x51,0x5A,0xFA,0xE8,0x80,0x64,0x59,0x23,0x51,0x2B,0x0A,0x09,0x00, + 0x84,0x61,0x44,0x59,0x5E,0x5E,0xBE,0x2A,0x84,0x61,0x43,0x59,0xE7,0xDE,0xF8,0xFE, + 0x84,0x59,0x43,0x51,0xBA,0xA8,0xA2,0xD0,0x64,0x59,0x23,0x51,0x60,0x7A,0xDA,0x3A, + 0x84,0x59,0x23,0x51,0x8D,0xA5,0xBD,0xDD,0x84,0x59,0x22,0x51,0x7F,0x8B,0xBE,0xFF, + 0x63,0x59,0x43,0x51,0x9D,0x6C,0xA6,0xA9,0x63,0x59,0x22,0x51,0x5B,0x5C,0x5E,0xDE, + 0x63,0x59,0x02,0x49,0x2A,0xBF,0xBD,0xFB,0x64,0x59,0x23,0x51,0x5B,0x5F,0xBF,0xA3, + 0x84,0x61,0x43,0x51,0xED,0xA9,0xAA,0xEA,0x84,0x61,0x63,0x59,0x8A,0x7A,0xF0,0x64, + 0xA4,0x61,0x63,0x59,0x5A,0x8E,0x6F,0x83,0x84,0x61,0x63,0x59,0x11,0x9F,0x2A,0x20, + 0xA4,0x61,0x63,0x59,0xDA,0xFB,0xF0,0x50,0xA5,0x61,0x22,0x51,0xEA,0xE8,0x7E,0xFA, + 0x63,0x59,0x43,0x59,0x3C,0x7A,0xE0,0xC2,0x84,0x61,0x23,0x51,0x2B,0xFF,0xFF,0x7F, + 0xE5,0x69,0x03,0x51,0x02,0xAE,0xFF,0x7F,0x67,0x7A,0x43,0x59,0x00,0x2B,0xFD,0xD5, + 0x67,0x7A,0x84,0x59,0x00,0x00,0x0A,0xFD,0xC7,0x82,0x06,0x72,0xAA,0x2B,0xBB,0xFD, + 0xA7,0x82,0x66,0x7A,0xFD,0x0B,0x8B,0xBD,0xA7,0x82,0x66,0x7A,0xEA,0xF8,0xF2,0xE0, + 0x0B,0xAC,0xC8,0x82,0xD5,0xF5,0xB5,0x2D,0xEC,0xAB,0x8A,0x9B,0x0D,0x03,0xA0,0xFA, + 0xCB,0xA3,0x6A,0x9B,0x08,0xA8,0xFC,0xE7,0xCB,0xA3,0x6A,0x9B,0x8A,0xEF,0x77,0xD7, + 0xAB,0xA3,0x6A,0x9B,0xA8,0xEB,0xCF,0xE9,0xCC,0xA3,0x6A,0x9B,0x0F,0xAB,0xEB,0x5F, + 0xAB,0xA3,0x2A,0x93,0x20,0xA8,0xFA,0x7F,0x6A,0x93,0x05,0x6A,0x78,0x78,0x58,0xFE, + 0x26,0x6A,0xA4,0x59,0x57,0x56,0xFC,0xE8,0xA5,0x59,0x02,0x41,0xDC,0x58,0x78,0xF8, + 0x03,0x41,0xA2,0x38,0xFC,0x7E,0x78,0xE8,0xE3,0x38,0xA2,0x30,0x3B,0xBD,0xAA,0xE8, + 0xE3,0x38,0xA2,0x30,0xBE,0x2A,0x0F,0x2B,0x24,0x41,0xE3,0x38,0x57,0xB7,0x2F,0x3F, + 0x24,0x41,0xC2,0x30,0xB7,0xAB,0xB2,0xA0,0xE3,0x40,0x24,0x39,0xAA,0xA7,0xBA,0xBB, + 0x44,0x41,0xE3,0x38,0x2F,0xB5,0xDF,0x3F,0x85,0x51,0x23,0x41,0x03,0x29,0xBD,0xAF, + 0x85,0x51,0x03,0x39,0xAA,0xA0,0x60,0x7A,0x44,0x49,0x03,0x41,0x08,0xBE,0xFD,0x57, + 0x44,0x49,0x03,0x41,0x78,0x56,0x55,0xFB,0x24,0x41,0xE2,0x38,0x27,0x2E,0xEB,0xE2, + 0x23,0x41,0xE2,0x38,0x80,0xE2,0xFA,0x02,0x65,0x49,0xE2,0x38,0x95,0x95,0xBD,0xAF, + 0xC6,0x51,0x44,0x49,0xA5,0x7F,0xEA,0x8B,0xA5,0x51,0x44,0x49,0xC2,0xC9,0xE3,0x6A, + 0x85,0x51,0x23,0x49,0xDE,0xBA,0x2F,0xB7,0xA5,0x59,0x64,0x49,0x9D,0xFB,0xEA,0xAB, + 0xA5,0x51,0x44,0x49,0xE8,0xFA,0xBE,0x7F,0xC5,0x61,0x44,0x49,0xAF,0x2D,0x35,0x17, + 0x06,0x6A,0x64,0x51,0x7F,0x7A,0xE2,0x0A,0xC6,0x59,0x64,0x49,0xF5,0x77,0xFE,0xF0, + 0xA5,0x51,0x03,0x41,0x58,0x72,0xBF,0xA8,0x23,0x41,0xC2,0x38,0x57,0x57,0x78,0x78, + 0xE3,0x38,0x81,0x30,0xA2,0xBA,0xBE,0xA7,0x03,0x39,0xC2,0x30,0xAF,0xF5,0xAF,0x3B, + 0x23,0x41,0xE3,0x38,0x7A,0xFB,0x77,0xFD,0x03,0x41,0xE3,0x38,0xED,0xB5,0x55,0x38, + 0x23,0x41,0xC2,0x38,0xFA,0x6B,0xAF,0x2E,0x23,0x41,0xE3,0x38,0x7B,0xAF,0x2E,0x2B, + 0x64,0x49,0xE3,0x38,0x2D,0x8F,0xAE,0xAB,0x64,0x51,0x23,0x49,0x0A,0x0E,0xAB,0x73, + 0x85,0x51,0x24,0x49,0xE2,0xEB,0x7B,0xFF,0x44,0x49,0x03,0x41,0x74,0xD4,0xAA,0x2A, + 0x44,0x49,0x03,0x41,0x75,0x6F,0x2A,0x20,0x64,0x51,0x03,0x41,0xB5,0xBD,0x3B,0x2A, + 0x84,0x51,0x44,0x49,0xBD,0xAF,0xAF,0x2E,0xA5,0x51,0x64,0x49,0xCB,0x6A,0xC2,0xC0, + 0x64,0x49,0x03,0x41,0xFC,0xF8,0xE8,0x80,0x64,0x49,0x03,0x41,0x2B,0x2B,0x09,0x3F, + 0x84,0x49,0x03,0x41,0x7F,0x7E,0x7E,0xFC,0x44,0x49,0x03,0x41,0x2E,0xFE,0x7A,0x5F, + 0x44,0x41,0xE2,0x38,0x88,0x2E,0xA7,0x57,0x44,0x41,0xE3,0x38,0xBA,0xFA,0xDC,0xFF, + 0x23,0x41,0xE3,0x38,0xFC,0x5F,0xFF,0xAF,0x44,0x41,0xE2,0x38,0xDF,0x77,0x9F,0xE2, + 0x03,0x39,0xC2,0x38,0x29,0xA6,0xAA,0x02,0x84,0x49,0x03,0x39,0xAD,0x0D,0xAD,0xE7, + 0x64,0x49,0x03,0x39,0xAE,0xA8,0x80,0xA8,0x65,0x49,0x24,0x41,0x7E,0x72,0xEB,0xFD, + 0x43,0x41,0xC2,0x38,0xFE,0xB6,0xAA,0xA8,0x65,0x49,0xE2,0x38,0x97,0xB7,0x8B,0x0F, + 0x44,0x41,0x03,0x41,0x0D,0x09,0xC0,0xA0,0x44,0x49,0x23,0x41,0xEC,0xDE,0xD7,0x96, + 0x64,0x49,0x23,0x41,0x7D,0xFF,0xEE,0xC0,0x85,0x51,0x02,0x41,0x2B,0xDD,0xF7,0x5E, + 0xC6,0x59,0x44,0x49,0x2B,0xBF,0xBD,0x95,0xE6,0x61,0x84,0x59,0x02,0xAE,0xDF,0x7A, + 0x26,0x6A,0xA4,0x59,0x2F,0x8B,0x8B,0x25,0xA8,0x7A,0x05,0x62,0x82,0xA9,0xFD,0xD7, + 0x67,0x7A,0x26,0x6A,0xA2,0xAB,0xBF,0xFB,0x47,0x72,0x06,0x6A,0xE8,0x6C,0xFC,0x54, + 0xC8,0x82,0x06,0x6A,0x0A,0x0D,0xB5,0xB5,0xE8,0x82,0x87,0x7A,0x28,0x22,0x8B,0x37, + 0x6E,0xB4,0xC8,0x82,0x2D,0xBD,0xF5,0xD5,0xD3,0xDD,0x2D,0xAC,0x02,0x0B,0x2D,0xAD, + 0xF4,0xE5,0x51,0xCD,0xA0,0xE2,0x7A,0xEA,0x52,0xCD,0xD0,0xBC,0xF8,0xFE,0xDA,0x7C, + 0x10,0xC5,0xD0,0xBC,0xF6,0xAA,0x9A,0xD7,0x10,0xC5,0xF0,0xC4,0x2D,0x0F,0x29,0x05, + 0x31,0xCD,0x10,0xC5,0x02,0x8E,0x1B,0xAB,0x51,0xCD,0x10,0xC5,0xAF,0x27,0xAF,0xAB, + 0x51,0xCD,0x31,0xC5,0x28,0x0E,0x2A,0xFC,0x35,0xE6,0x52,0xCD,0x0B,0xAF,0xAD,0xAD, + 0x35,0xE6,0x10,0xC5,0x00,0xAA,0x7F,0x5E,0x14,0xE6,0xD0,0xBC,0x00,0xAA,0xFF,0x75, + 0x14,0xE6,0xD0,0xBC,0x20,0xEA,0x7F,0x55,0xF4,0xDD,0xAF,0xBC,0x00,0xAA,0xFF,0x55, + 0xB3,0xD5,0xB0,0xBC,0x00,0xA2,0xFF,0x55,0xB3,0xD5,0x8F,0xB4,0x00,0xAA,0xDF,0x55, + 0x92,0xD5,0x6F,0xAC,0x00,0xAA,0xFF,0x55,0x72,0xCD,0x6E,0xAC,0x00,0xAA,0xFF,0x5D, + 0x52,0xC5,0x4E,0xAC,0x00,0xAA,0xFE,0x57,0x31,0xC5,0x2E,0xA4,0x2A,0xBA,0xF7,0x5D, + 0xF0,0xBC,0x2D,0xA4,0xE0,0xFA,0xFF,0xD5,0x8F,0xB4,0x2D,0xA4,0xC8,0xE8,0xBA,0xB7, + 0x52,0xC5,0x2D,0xA4,0xFD,0xBD,0xAF,0x2F,0xD4,0xD5,0xD0,0xB4,0xF5,0xAF,0x0A,0x02, + 0xD4,0xD5,0xF0,0xB4,0xD5,0xEE,0xA8,0xA0,0x93,0xCD,0x31,0xBD,0xB5,0xAF,0x8A,0xAE, + 0x73,0xCD,0xF0,0xB4,0xA0,0xE2,0xFA,0x5F,0x52,0xC5,0xB0,0xB4,0xE2,0xFA,0x7E,0x5F, + 0x84,0x59,0x43,0x59,0xD7,0xE5,0xBF,0xCD,0x84,0x59,0x43,0x51,0x81,0x02,0x8C,0xAA, + 0x84,0x59,0x64,0x59,0x41,0xE0,0x2B,0x1A,0x84,0x59,0x43,0x51,0x8A,0x8A,0xF8,0xD8, + 0x64,0x59,0x23,0x51,0x1E,0x2E,0x2A,0xFA,0x84,0x59,0x22,0x51,0xCE,0xEA,0xFA,0x97, + 0x64,0x59,0x23,0x49,0xFD,0x8A,0xCA,0xAA,0x63,0x59,0x02,0x49,0x9E,0xAB,0x02,0x0A, + 0x43,0x51,0x22,0x51,0x82,0xFF,0xF8,0xD8,0x43,0x59,0x22,0x49,0xEB,0xAD,0xEB,0xEE, + 0x63,0x59,0x23,0x51,0xD5,0xF5,0xAF,0x0B,0x84,0x61,0x43,0x59,0x87,0x23,0x8B,0xAF, + 0x84,0x61,0x43,0x59,0x4A,0x80,0xC0,0x02,0xA4,0x61,0x63,0x59,0xFF,0x5B,0xF1,0x80, + 0xA4,0x61,0x63,0x59,0xAB,0x9D,0xFF,0xFA,0xA5,0x61,0x43,0x59,0x2A,0x0E,0x28,0x28, + 0xA4,0x61,0x43,0x59,0xF8,0x7E,0x6E,0xEF,0x63,0x59,0x43,0x59,0x62,0x20,0x28,0x8A, + 0x63,0x59,0x23,0x51,0xA0,0xA0,0xA8,0x76,0x64,0x59,0x23,0x51,0x5A,0xBA,0xEE,0xE9, + 0x23,0x59,0x43,0x51,0xAA,0xDE,0xFE,0xAF,0x64,0x59,0x03,0x51,0x0A,0xEA,0xBB,0x5F, + 0x84,0x59,0x02,0x51,0xAF,0xF7,0xFF,0xFD,0xC5,0x69,0x23,0x51,0x0A,0xFF,0x55,0x57, + 0x87,0x82,0x23,0x51,0x22,0x3F,0xF5,0x55,0xC8,0x8A,0x64,0x59,0x22,0x8A,0x2F,0x25, + 0xEB,0xAB,0xE7,0x82,0x2D,0x2B,0x0B,0x0A,0xEC,0xAB,0x8A,0x9B,0xF8,0x68,0x6A,0x7E, + 0x8A,0x9B,0x6A,0x9B,0xB0,0x0C,0x07,0x7F,0xAB,0x9B,0x4A,0x9B,0xFF,0x7F,0xF6,0xAF, + 0xAB,0x9B,0x4A,0x93,0xAB,0xAF,0xBE,0x2E,0xAB,0xA3,0x6A,0x9B,0x6B,0x6E,0xDA,0x08, + 0xCC,0xA3,0x29,0x93,0x57,0xFF,0xFA,0xA8,0x29,0x93,0x66,0x72,0x7E,0x7E,0xF8,0xF8, + 0x86,0x7A,0xC5,0x61,0x5B,0x7A,0xF8,0xF8,0xE6,0x61,0x44,0x49,0x5E,0xFA,0xFA,0x78, + 0x44,0x49,0xE2,0x38,0x7A,0x78,0x5A,0x6E,0x03,0x41,0xA2,0x30,0xFE,0xEB,0xCE,0xAE, + 0x04,0x39,0xC2,0x38,0xDD,0xFD,0xF3,0xAB,0x03,0x39,0xC2,0x38,0x2B,0xBD,0x35,0x95, + 0x64,0x49,0x03,0x41,0xFF,0xFD,0xBF,0x0F,0x65,0x49,0x03,0x41,0x57,0xFA,0x7A,0xE0, + 0x23,0x41,0xE3,0x38,0x02,0x6B,0x58,0x5C,0x64,0x49,0xE3,0x38,0x0A,0xBD,0xAF,0xBF, + 0x44,0x49,0x24,0x41,0x40,0x78,0x56,0x5A,0x23,0x41,0xC2,0x38,0xAA,0x88,0x28,0x1E, + 0x44,0x49,0x03,0x41,0x7B,0xC3,0x08,0x03,0x65,0x49,0xE3,0x38,0x7F,0xDB,0xEE,0x8A, + 0x43,0x41,0x04,0x41,0xAA,0xE9,0x8A,0xAB,0x44,0x41,0x03,0x41,0xAA,0xBA,0xBF,0x55, + 0xA5,0x51,0x23,0x41,0x03,0x0B,0x2D,0xBD,0xA6,0x51,0x24,0x49,0xF8,0xF8,0xEE,0xDF, + 0xA5,0x59,0x23,0x49,0xB7,0x37,0x2F,0xBF,0x06,0x62,0x43,0x49,0x7F,0x7E,0x7A,0xA2, + 0xA5,0x59,0x23,0x49,0xD7,0xDF,0x7E,0xBC,0xE5,0x61,0x24,0x49,0x3F,0xBD,0xBD,0xFF, + 0x47,0x6A,0x64,0x59,0x8A,0x2A,0x2B,0x2D,0x27,0x6A,0xA5,0x59,0x7A,0xFA,0xF0,0x78, + 0xC6,0x59,0x24,0x49,0xFE,0xFA,0xE8,0x78,0x44,0x49,0xC2,0x38,0x7C,0x70,0x50,0x7A, + 0xE3,0x38,0xA2,0x30,0xAE,0xAA,0xAE,0x2E,0x23,0x39,0xE3,0x38,0xD5,0xE5,0xAD,0x3B, + 0x44,0x41,0xE3,0x38,0xF9,0xBF,0x2F,0xAE,0x23,0x41,0x03,0x39,0x7F,0x5A,0xB0,0x80, + 0x43,0x49,0xE3,0x40,0xF7,0xFD,0xFE,0xE8,0x03,0x41,0x23,0x39,0xE0,0xA0,0xAA,0x2C, + 0x24,0x49,0xE3,0x40,0xA2,0x78,0xEA,0xAB,0x24,0x49,0xE3,0x40,0x00,0x27,0x2B,0x0A, + 0x64,0x51,0x23,0x49,0xF9,0xB2,0xB7,0x25,0x64,0x51,0x03,0x41,0xAE,0xFB,0x9E,0xB8, + 0x65,0x51,0x23,0x41,0x5C,0x7F,0xAA,0xAB,0x64,0x49,0x23,0x49,0xA5,0x05,0x87,0xAD, + 0xA5,0x59,0x23,0x41,0x2B,0xAA,0xFE,0x56,0xA5,0x51,0x03,0x41,0xA8,0xBF,0xFF,0x5F, + 0x64,0x49,0x23,0x41,0xAB,0x0A,0x08,0x83,0x85,0x49,0x23,0x41,0xDF,0xEB,0xE0,0xEA, + 0x64,0x49,0x03,0x41,0xEA,0x4B,0x7A,0x7A,0x23,0x39,0xC1,0x38,0xA8,0x7A,0x7B,0xFA, + 0x24,0x39,0xC2,0x30,0xFE,0xFE,0xFB,0xAA,0x23,0x41,0x03,0x39,0x95,0x3D,0x29,0x0D, + 0x64,0x49,0x03,0x41,0x5D,0xFB,0xEE,0x8A,0x85,0x49,0x24,0x41,0xF8,0xAB,0xB9,0xBB, + 0xA5,0x49,0x03,0x39,0x5F,0xF6,0xEE,0xA8,0x44,0x41,0x03,0x41,0x2F,0xBB,0xB8,0xBE, + 0x44,0x49,0x03,0x39,0xAA,0xDC,0xF4,0xFE,0x44,0x41,0x03,0x41,0xAF,0x2E,0xB8,0x56, + 0x44,0x41,0x02,0x41,0xAA,0x0A,0x88,0x2E,0x64,0x49,0x23,0x41,0x2D,0x0F,0x0B,0x0A, + 0x64,0x49,0x23,0x41,0xD6,0x7E,0xF0,0xB0,0x44,0x49,0x03,0x41,0xAF,0xFF,0xFF,0xAC, + 0x85,0x51,0x03,0x39,0xAA,0x8A,0xAD,0xB5,0x64,0x49,0x03,0x41,0x78,0xA0,0xA0,0xA2, + 0x64,0x51,0x23,0x41,0xF9,0x3D,0xAA,0x3B,0xE6,0x61,0x64,0x51,0x8B,0x0F,0xA5,0xD5, + 0x46,0x72,0xC5,0x61,0xF7,0xBF,0x8B,0x2D,0x67,0x72,0x05,0x62,0xFE,0x67,0x7F,0x2A, + 0x87,0x72,0x05,0x6A,0xEB,0xAD,0xAD,0x0A,0x67,0x72,0xC5,0x61,0xFE,0xFE,0xBA,0x68, + 0x87,0x7A,0xE5,0x61,0x3F,0xAF,0xBF,0xAD,0xA8,0x7A,0x46,0x72,0x2A,0x9B,0xED,0xEB, + 0x09,0x8B,0x87,0x7A,0x26,0x36,0x3D,0xF5,0x72,0xD5,0x2A,0x8B,0x2F,0x0D,0x2D,0xBD, + 0xD4,0xDD,0x31,0xCD,0xC0,0x78,0x7A,0x7B,0x31,0xCD,0xCF,0xBC,0xFA,0x78,0xF2,0x7E, + 0xF0,0xC4,0xCF,0xBC,0xDA,0x3F,0x5D,0x7F,0x10,0xC5,0xCF,0xBC,0x2F,0x25,0x17,0x07, + 0x31,0xCD,0x10,0xC5,0x8F,0x15,0x35,0x35,0x31,0xCD,0x10,0xC5,0x20,0xEE,0x3C,0xA8, + 0x51,0xCD,0x11,0xC5,0xAA,0xAB,0xAF,0x6E,0xD3,0xDD,0x31,0xC5,0x0D,0x0D,0x25,0xB5, + 0xD3,0xDD,0xAF,0xBC,0x7C,0xF8,0x58,0x70,0xD0,0xBC,0x8F,0xB4,0xC8,0xF2,0x6F,0x57, + 0xAF,0xBC,0x6E,0xB4,0x82,0x72,0x7B,0xFF,0xAF,0xB4,0x4D,0xAC,0x80,0x70,0x7A,0xEA, + 0xAF,0xBC,0x2D,0xAC,0xA8,0xFB,0x7B,0x7F,0x8F,0xB4,0x2D,0xAC,0x22,0x7B,0x77,0x7D, + 0x6E,0xAC,0x0D,0xA4,0x28,0x0A,0xFB,0x57,0x6E,0xAC,0x0C,0xA4,0x60,0xFA,0x7E,0x5D, + 0xB0,0xB4,0x0D,0x9C,0xFF,0xD5,0xD5,0x0B,0x72,0xC5,0x0D,0x9C,0x5D,0xDD,0xBD,0x2A, + 0x93,0xCD,0x2E,0xA4,0x75,0xFD,0xAA,0x88,0x72,0xC5,0x4E,0xAC,0xD5,0xAB,0x2A,0x22, + 0x93,0xCD,0x11,0xBD,0xA5,0xAF,0x0A,0x80,0xB3,0xD5,0x53,0xC5,0x0A,0xA2,0xA2,0xFF, + 0xD5,0xD5,0x52,0xC5,0xE2,0xDE,0xFF,0x5F,0x73,0xC5,0xF1,0xBC,0x8A,0xC8,0xF6,0x56, + 0x32,0xC5,0xB0,0xB4,0xE8,0xEA,0x6A,0x6A,0xF1,0xB4,0x6F,0xAC,0xFC,0xDF,0x57,0x77, + 0x84,0x61,0x43,0x59,0xFE,0xFC,0x78,0xFD,0xA5,0x61,0x43,0x51,0xB7,0xAE,0x73,0xFA, + 0x84,0x59,0x23,0x51,0xA2,0xAA,0xAF,0xDE,0x64,0x59,0x23,0x51,0xB8,0xAE,0x7E,0x5F, + 0x64,0x59,0x23,0x51,0xFA,0xDE,0xFF,0xBE,0x84,0x59,0x22,0x51,0xE7,0xEF,0xE2,0xFE, + 0x84,0x59,0x43,0x51,0x57,0x5C,0x75,0x55,0x63,0x59,0x23,0x51,0xEE,0xAA,0xCC,0xBB, + 0x63,0x59,0x23,0x51,0xBB,0xAF,0xFF,0xFD,0x63,0x59,0x23,0x51,0xD7,0xD6,0xBC,0x3A, + 0x84,0x59,0x43,0x59,0x85,0xB5,0xFD,0xF6,0xA4,0x61,0x43,0x59,0xB5,0xAF,0xB7,0xD5, + 0xA4,0x61,0x63,0x59,0xBF,0xDE,0xFF,0x77,0xA4,0x61,0x64,0x59,0x8A,0xEF,0xFB,0xED, + 0xA4,0x61,0x43,0x59,0x82,0xCE,0xE2,0x42,0xA5,0x61,0x43,0x59,0xFC,0x5F,0x5E,0x7F, + 0x63,0x59,0x22,0x51,0x80,0xC0,0x3B,0xB6,0x84,0x59,0x23,0x51,0xEF,0xCA,0xEB,0x7A, + 0x43,0x59,0x23,0x51,0xF0,0x3F,0x38,0xEA,0x64,0x59,0x23,0x51,0xEB,0xEA,0xFA,0x6D, + 0x43,0x59,0x03,0x51,0xBA,0x5A,0x6F,0xFF,0x23,0x51,0xE2,0x48,0xBB,0xFF,0x2B,0x0A, + 0x44,0x51,0x02,0x49,0x2F,0xAE,0x7A,0xEF,0x23,0x51,0xE2,0x48,0xA0,0x40,0xA0,0xB0, + 0x63,0x59,0x03,0x51,0xD5,0xD5,0xA7,0x37,0xAB,0xA3,0x63,0x59,0xB5,0x2D,0x2D,0x0B, + 0xEC,0xAB,0x8A,0x9B,0x8D,0xEB,0xA2,0xFE,0xCC,0xA3,0x4A,0x9B,0xE8,0xE2,0xFE,0x56, + 0xAB,0xA3,0x6A,0x9B,0x57,0x7B,0xEE,0xA7,0xAB,0xA3,0x6A,0x9B,0x2B,0xFD,0x7F,0xE8, + 0xAB,0xA3,0x6A,0x9B,0xA6,0x78,0x79,0x6B,0xCC,0xA3,0x8B,0x9B,0x2E,0xAA,0xD5,0x55, + 0xCC,0xAB,0x6B,0x9B,0xE2,0x62,0xFB,0xFB,0x49,0x93,0x87,0x7A,0xFE,0x78,0xFE,0x76, + 0x86,0x7A,0xC5,0x61,0x78,0x78,0xE0,0xE0,0xC5,0x61,0x44,0x51,0xFA,0xFC,0x7C,0x7C, + 0x64,0x51,0x02,0x41,0x7E,0xE0,0xBC,0xAB,0x44,0x49,0xE2,0x38,0x5F,0xFA,0x2A,0x20, + 0x44,0x49,0xE3,0x38,0x5D,0xDF,0x76,0x78,0x23,0x41,0xA1,0x30,0xFF,0xBE,0x2E,0x2B, + 0x85,0x49,0x23,0x41,0xA9,0x35,0xBD,0xAB,0xA5,0x49,0x44,0x49,0x7F,0xEC,0xFF,0x6B, + 0x64,0x49,0xE3,0x38,0x7E,0xFA,0xF8,0xEA,0x23,0x41,0xC2,0x38,0x8B,0xFB,0xDA,0xBE, + 0x64,0x49,0x03,0x41,0xA9,0x83,0xAD,0xA5,0x44,0x41,0x03,0x41,0x56,0x56,0x9E,0x9E, + 0x85,0x51,0x23,0x41,0xAD,0xA5,0xED,0x7F,0x44,0x49,0xE2,0x38,0x88,0xFE,0xBF,0xA7, + 0x44,0x41,0x03,0x41,0xEB,0xAB,0x2B,0x5F,0x23,0x41,0x03,0x39,0x7A,0xF8,0x3C,0x3E, + 0x44,0x49,0xE2,0x38,0x8B,0xAB,0x5A,0xF7,0x44,0x49,0xE2,0x40,0xFC,0xDD,0x55,0x55, + 0x64,0x51,0xE2,0x40,0x2B,0x3D,0x3D,0xBF,0xE6,0x61,0x85,0x59,0x02,0x01,0xDB,0x6D, + 0xA5,0x59,0x24,0x49,0xB8,0xE8,0xB8,0xDA,0x64,0x51,0x23,0x49,0xE0,0xA0,0xA2,0xFE, + 0xC5,0x59,0x43,0x49,0x0F,0xA5,0xF5,0x57,0x06,0x6A,0x64,0x51,0xC2,0xEA,0xED,0xD5, + 0xC5,0x59,0x44,0x49,0x5F,0x58,0x68,0xA2,0x44,0x49,0xA2,0x30,0xFA,0x5C,0xDC,0x5C, + 0xE3,0x38,0xA2,0x30,0x2E,0xBF,0xF7,0x7D,0x24,0x39,0xC2,0x30,0xAA,0xED,0xA1,0xB1, + 0x23,0x41,0xE3,0x38,0x08,0x82,0xF6,0xBE,0x44,0x41,0x03,0x41,0xDF,0x35,0x35,0xB5, + 0x65,0x49,0x24,0x41,0xFF,0xBE,0xAE,0xE7,0x44,0x49,0x03,0x41,0xFE,0xAA,0x20,0x00, + 0x64,0x49,0x23,0x49,0x5D,0x7E,0x5F,0xFB,0x64,0x51,0x03,0x41,0xF7,0xAD,0xA2,0x82, + 0xA6,0x59,0x44,0x49,0xF5,0xBD,0xAB,0x02,0xC6,0x59,0x64,0x51,0x57,0xDF,0xFA,0x6C, + 0xA5,0x51,0x23,0x49,0xFF,0x7A,0xF8,0xF2,0x44,0x49,0x03,0x41,0x20,0x6A,0xFA,0x77, + 0x64,0x49,0x03,0x41,0xF8,0xAE,0xEB,0xF7,0x23,0x41,0x03,0x41,0x62,0xA3,0xC1,0xC2, + 0x44,0x49,0xE2,0x38,0x02,0x0F,0x2F,0xB7,0x84,0x49,0x44,0x49,0x7D,0x4F,0xDD,0x57, + 0x44,0x49,0x03,0x41,0x6E,0x36,0xBA,0xFE,0x43,0x41,0x03,0x41,0x5D,0x56,0xDE,0x5F, + 0x23,0x41,0xE3,0x38,0x37,0xBA,0xA2,0xA2,0x24,0x41,0xE3,0x38,0x0A,0x2B,0xBD,0xFF, + 0x64,0x49,0x03,0x39,0xCA,0xEB,0xAF,0xBD,0x85,0x49,0x44,0x49,0xD7,0x3D,0xB7,0xBD, + 0xA5,0x51,0x64,0x49,0xB6,0xAF,0x2B,0x2A,0x85,0x49,0x23,0x41,0x57,0xF7,0x7C,0xE0, + 0x43,0x41,0x03,0x39,0x78,0x57,0x55,0xF6,0x23,0x41,0x03,0x39,0xDF,0x35,0xA5,0x7D, + 0x64,0x49,0x03,0x39,0xA7,0x2B,0x2F,0x2D,0xA5,0x49,0x44,0x49,0xAF,0xFF,0xBD,0x3F, + 0x85,0x51,0x44,0x49,0xA6,0xBF,0xFF,0x6E,0xA5,0x51,0x44,0x49,0xDF,0xEF,0xFF,0x95, + 0x85,0x51,0x23,0x41,0xD5,0xFB,0xF8,0x00,0x85,0x51,0x23,0x41,0xBF,0xD5,0x5F,0xDC, + 0x64,0x51,0x44,0x49,0xA2,0x7D,0xD5,0x55,0x64,0x51,0x44,0x49,0x30,0x32,0x3E,0x32, + 0x06,0x6A,0x44,0x51,0x0B,0xAF,0xFF,0xF5,0x88,0x72,0x85,0x59,0xAA,0x0A,0xBF,0xF5, + 0xA8,0x7A,0x06,0x6A,0x88,0x80,0xAB,0xA9,0x87,0x72,0x26,0x6A,0x78,0xB8,0x2F,0xAE, + 0x88,0x7A,0x05,0x62,0xBD,0xAF,0x08,0x02,0xC8,0x82,0x88,0x7A,0xD5,0x1D,0x35,0xFF, + 0xE9,0x82,0x87,0x7A,0x97,0xBE,0x8A,0xAB,0x4E,0xB4,0xC8,0x82,0x2D,0x3D,0xBD,0x35, + 0xB3,0xD5,0xAF,0xBC,0xA2,0xE3,0xA9,0x89,0x31,0xCD,0xD0,0xBC,0x7E,0xDE,0x7E,0xF8, + 0xF0,0xC4,0xAF,0xBC,0xFE,0xEA,0xFB,0xFF,0x10,0xC5,0xB0,0xBC,0xAB,0xAF,0xA9,0x3B, + 0x31,0xCD,0xF0,0xC4,0xA5,0xE5,0xAF,0xAF,0x51,0xCD,0x10,0xC5,0x7F,0x6D,0xCB,0x8F, + 0x51,0xCD,0xF0,0xC4,0xA8,0xAE,0xB7,0xAA,0x92,0xCD,0xF0,0xC4,0x27,0xBF,0xFD,0x7E, + 0xD3,0xDD,0x6F,0xB4,0xF0,0x6A,0x7E,0x7F,0x8F,0xB4,0x2D,0xAC,0x0A,0xC0,0x6E,0xFF, + 0x8F,0xB4,0x2D,0xAC,0x80,0xAB,0x6F,0x7F,0x6E,0xAC,0x2D,0xAC,0x30,0x7E,0x75,0x7D, + 0x6F,0xAC,0x0D,0xA4,0xA8,0xDF,0xDD,0x5D,0x6E,0xB4,0xED,0x9B,0xEA,0xEB,0xFD,0x2F, + 0x73,0xCD,0x0D,0xA4,0x55,0x55,0xF5,0x2B,0x73,0xCD,0x2D,0xA4,0xD5,0x35,0x0B,0x00, + 0xB3,0xCD,0xF0,0xBC,0xB5,0xAB,0x2A,0xA0,0x93,0xCD,0x52,0xC5,0x23,0xC2,0xF2,0x7D, + 0x93,0xCD,0x11,0xBD,0xA0,0xE0,0x7B,0xDB,0x73,0xCD,0x11,0xBD,0x2F,0xAF,0x2F,0x0D, + 0xB4,0xD5,0x52,0xC5,0x6A,0xC3,0x8B,0xA2,0x73,0xCD,0xB0,0xB4,0xA8,0xD8,0x78,0xE8, + 0x32,0xC5,0x8F,0xAC,0x00,0x8A,0xF9,0x55,0x32,0xBD,0xD0,0xB4,0x74,0xF7,0xBB,0xA9, + 0x11,0xBD,0x90,0xAC,0xEB,0xFA,0x6C,0xFE,0xB0,0xB4,0x6F,0xAC,0xBA,0xF7,0xAF,0xBB, + 0x63,0x59,0x02,0x49,0x0A,0x78,0x02,0x08,0x84,0x59,0x43,0x51,0x7B,0x5A,0x72,0x5E, + 0x43,0x51,0x03,0x51,0x98,0x3A,0x22,0x2A,0x64,0x59,0x02,0x49,0xFC,0xDE,0xBA,0xF7, + 0x43,0x51,0xE3,0x48,0x00,0x80,0xAA,0xCA,0x43,0x51,0x23,0x51,0xE0,0xC2,0x19,0x2B, + 0x63,0x51,0x23,0x51,0xFA,0xF8,0xAE,0x73,0x64,0x59,0x23,0x51,0xBF,0xF6,0xFE,0x57, + 0x63,0x59,0x03,0x51,0xBE,0xDF,0xBF,0x28,0x84,0x61,0x43,0x59,0x0D,0x7B,0xFB,0xFB, + 0x84,0x61,0x43,0x59,0xFC,0xFE,0xBF,0xFF,0x84,0x61,0x43,0x59,0xEF,0xBD,0xBB,0xEF, + 0x83,0x61,0x64,0x59,0xFD,0xFF,0x5B,0x7F,0xA4,0x61,0x43,0x59,0xAD,0xAB,0xF2,0xBB, + 0x84,0x61,0x43,0x59,0xF0,0x5D,0x7F,0x7F,0x63,0x59,0x23,0x51,0x8E,0xAF,0x22,0x22, + 0x63,0x59,0x22,0x51,0xF2,0x80,0xC0,0xAF,0x43,0x59,0x03,0x51,0x80,0xEA,0xAE,0x00, + 0x64,0x59,0x03,0x51,0xAA,0xAA,0x6A,0xE8,0x64,0x59,0x03,0x51,0xE3,0xEA,0xFF,0x7F, + 0x23,0x51,0xE2,0x48,0x88,0xE8,0x7A,0xFA,0x43,0x51,0x02,0x49,0x25,0xD9,0xD3,0xFD, + 0x23,0x51,0x02,0x49,0x88,0xB2,0x28,0xA4,0x23,0x51,0x03,0x49,0xC2,0xB2,0xE2,0x02, + 0x29,0x93,0x43,0x59,0xD5,0xD5,0xB5,0x2D,0xEC,0xAB,0xC7,0x8A,0x2D,0x29,0x0A,0x22, + 0xCC,0xA3,0x6A,0x9B,0xA0,0xB8,0x6C,0x5E,0x6A,0x9B,0x4A,0x93,0x64,0x14,0xE5,0x22, + 0x8A,0x9B,0x49,0x93,0x35,0xED,0xFF,0x7E,0x8B,0x9B,0x6A,0x9B,0x02,0xBF,0x7D,0x55, + 0x8B,0x9B,0x4A,0x9B,0x00,0xAA,0xAF,0xBF,0x8B,0x9B,0x6A,0x9B,0x22,0x2A,0xD7,0x27, + 0xAC,0xA3,0x09,0x8B,0xE0,0xAA,0xF0,0x5C,0xE8,0x8A,0xA7,0x7A,0x7C,0x54,0xE4,0xF4, + 0xC7,0x82,0x46,0x72,0x6E,0x6C,0x78,0xE8,0x46,0x72,0x44,0x51,0x76,0x5E,0x7A,0xE0, + 0x64,0x49,0x03,0x49,0xA8,0xDF,0xFF,0xD6,0x43,0x49,0x03,0x41,0x00,0x8A,0x29,0xAF, + 0x43,0x49,0xE3,0x38,0x7A,0x7E,0xFE,0xE2,0x25,0x41,0xE3,0x40,0x35,0x95,0xB5,0xFF, + 0x84,0x51,0x24,0x41,0xAB,0xB9,0x2D,0x99,0xA5,0x51,0x44,0x49,0x6A,0x62,0xE3,0xEA, + 0x64,0x49,0x03,0x41,0xFE,0xFC,0xFE,0x5E,0x44,0x49,0xE3,0x38,0xD6,0xFE,0xBE,0x3F, + 0x44,0x49,0x24,0x41,0xF5,0x76,0x78,0x68,0x23,0x41,0xE3,0x38,0xA8,0xB8,0x8E,0xB8, + 0x44,0x49,0x03,0x41,0x7F,0x7D,0xBD,0xEA,0x23,0x41,0xE2,0x38,0xB8,0xBA,0xD8,0x5E, + 0x44,0x41,0xE3,0x38,0xFA,0xFE,0xEF,0x3F,0x44,0x41,0xE2,0x40,0xEF,0xF7,0xAB,0xA8, + 0x44,0x41,0xE2,0x38,0xD7,0x7F,0xEA,0xFA,0xE3,0x40,0x03,0x39,0xAA,0x8B,0xAF,0xFB, + 0x85,0x51,0xE3,0x40,0xBD,0x2D,0x2F,0x2F,0xE6,0x61,0x84,0x51,0x8D,0xAD,0xAF,0xA3, + 0x85,0x59,0xE3,0x40,0xF8,0xD8,0x78,0xB8,0x44,0x51,0xE3,0x40,0x0A,0x0B,0xBF,0xF7, + 0x64,0x51,0x03,0x49,0xA2,0xA0,0xA9,0x35,0x64,0x51,0x23,0x49,0x0A,0x0F,0x27,0xE5, + 0xA5,0x59,0x44,0x49,0x8A,0xA3,0x8F,0xAD,0x65,0x49,0xA2,0x30,0x5C,0x5C,0x78,0xF8, + 0xC3,0x30,0xA2,0x30,0xEF,0xBA,0xB0,0xC0,0x03,0x39,0xA2,0x28,0x2D,0xAF,0xF7,0xA7, + 0x23,0x41,0xE3,0x38,0xFA,0x3D,0xDD,0x7D,0x03,0x39,0xA2,0x30,0x00,0x88,0xA8,0xA7, + 0x65,0x49,0x03,0x39,0xAD,0xAD,0xAD,0x0D,0x64,0x51,0x23,0x49,0xEA,0xA2,0x6B,0x7A, + 0x64,0x51,0x44,0x49,0x3D,0xA1,0x02,0x01,0x85,0x59,0x64,0x51,0x69,0xB9,0xAB,0x0A, + 0xA5,0x59,0x44,0x51,0xA8,0x28,0xAA,0xB6,0xC6,0x59,0x85,0x51,0x5A,0x63,0xDF,0xD7, + 0x85,0x51,0x23,0x49,0xF8,0x5A,0x7C,0x5C,0x24,0x41,0x02,0x41,0xBB,0x3F,0x0B,0x00, + 0x44,0x49,0x03,0x41,0xFD,0xE2,0xCA,0xE8,0x44,0x41,0xE2,0x38,0xE2,0xEB,0xFB,0x5E, + 0x23,0x41,0xE2,0x38,0x2B,0xB9,0xBF,0xB9,0x44,0x41,0x03,0x41,0x2A,0xB7,0xAF,0xFB, + 0x23,0x41,0x03,0x41,0x28,0x08,0xC0,0x7B,0x23,0x41,0x03,0x39,0xFD,0xCB,0xB2,0xE3, + 0x23,0x41,0xC2,0x30,0xB8,0xFC,0xF8,0xAA,0x03,0x41,0xC2,0x38,0xA0,0xAE,0xFA,0x73, + 0x24,0x41,0xE3,0x38,0xAB,0xFF,0xB9,0xB5,0x64,0x49,0x03,0x39,0x0B,0xBF,0xBD,0xB5, + 0x84,0x49,0x23,0x41,0x32,0xBD,0xEA,0xFA,0x85,0x49,0x23,0x41,0x80,0xEA,0xDF,0x55, + 0x44,0x41,0x03,0x41,0xA8,0xA0,0xE2,0x7C,0x44,0x49,0xE2,0x38,0xEA,0xA2,0xB0,0x9F, + 0x64,0x49,0x03,0x39,0x35,0xD5,0x57,0x5F,0x64,0x49,0x02,0x39,0x00,0x3B,0xBB,0xBD, + 0x85,0x49,0x03,0x41,0x68,0x7A,0xBE,0xF7,0x64,0x49,0x03,0x41,0x2F,0x3D,0xAA,0x0A, + 0xA5,0x51,0x44,0x49,0x8A,0xFF,0xF5,0x5F,0xA5,0x51,0x23,0x49,0xDC,0xA8,0xA2,0x0A, + 0xA5,0x59,0x23,0x49,0xDF,0xFB,0xFA,0x2C,0x85,0x51,0x44,0x49,0xAB,0xBF,0x9E,0xEC, + 0xA5,0x59,0x44,0x51,0xB5,0xBF,0xAB,0xFB,0xA5,0x59,0x64,0x51,0xAB,0xFF,0x96,0xF5, + 0x06,0x6A,0x64,0x59,0x23,0x3F,0xBF,0xBB,0x67,0x72,0xE6,0x61,0x00,0x03,0x8D,0xF5, + 0xA8,0x7A,0x06,0x6A,0x0A,0xFB,0xFF,0xD5,0xC9,0x82,0x46,0x6A,0xA2,0x82,0xAF,0xB5, + 0xE9,0x82,0x88,0x7A,0x3F,0xB5,0xAF,0xBA,0x0D,0xAC,0xC8,0x82,0x35,0x35,0xFD,0x95, + 0xB3,0xDD,0x0C,0xA4,0x8A,0x03,0x09,0x0D,0x72,0xD5,0xCF,0xBC,0x7E,0x5C,0x78,0x78, + 0xCF,0xBC,0xAF,0xBC,0x98,0xBC,0xBB,0xD7,0xF0,0xC4,0xAF,0xBC,0x2B,0xAB,0xAF,0xA5, + 0x10,0xC5,0xCF,0xBC,0x2A,0x0B,0x3B,0xFF,0x31,0xCD,0xF0,0xC4,0xA8,0x8A,0xCF,0x75, + 0x31,0xCD,0xD0,0xBC,0x02,0x80,0xA8,0xAD,0x31,0xCD,0xAF,0xBC,0xE0,0xFA,0x6A,0x6A, + 0xD0,0xBC,0x2E,0xAC,0x68,0x78,0x5E,0xDF,0x4E,0xAC,0x0D,0xA4,0xAB,0xBF,0x7F,0xEF, + 0x4E,0xAC,0x0D,0xA4,0xEA,0xCB,0xA9,0xBE,0xF0,0xBC,0x2D,0xA4,0x75,0xA9,0x2F,0x0B, + 0x93,0xD5,0x4E,0xAC,0x55,0xBF,0x0A,0x0A,0xB3,0xD5,0x6F,0xB4,0xD5,0xAA,0x20,0x00, + 0xB4,0xD5,0x11,0xC5,0x29,0x0A,0x00,0x00,0xB4,0xD5,0x73,0xCD,0x22,0x0A,0x04,0xD6, + 0xD4,0xD5,0x32,0xC5,0x78,0x58,0x7C,0x58,0x52,0xC5,0x12,0xBD,0x02,0x6B,0x75,0x5D, + 0x32,0xBD,0xB0,0xAC,0xA0,0xBA,0xAE,0x77,0x93,0xCD,0x11,0xBD,0x3D,0x2F,0x0D,0x09, + 0x93,0xCD,0x32,0xC5,0x80,0x80,0x80,0x60,0x93,0xCD,0xB0,0xB4,0xE8,0xEA,0xFE,0x5F, + 0xF0,0xBC,0x8F,0xAC,0x9A,0xA8,0xFA,0xAF,0x11,0xBD,0xB0,0xAC,0x02,0xC0,0xFA,0x7C, + 0xD0,0xB4,0x6E,0xAC,0xE2,0xEC,0xFE,0xDF,0xD0,0xB4,0x8F,0xAC,0xD5,0xDF,0xE9,0x3F, + 0x84,0x59,0x23,0x51,0xA8,0xEE,0x5B,0x56,0x63,0x51,0x23,0x51,0xF8,0x95,0x95,0xA5, + 0x64,0x59,0x02,0x49,0xEA,0x6A,0x7C,0xFA,0x64,0x59,0x02,0x49,0xBD,0x22,0xEE,0xEA, + 0x64,0x51,0x03,0x51,0xEF,0x7A,0xE7,0xAF,0x64,0x59,0x23,0x51,0xBF,0xCB,0xBB,0xFA, + 0x63,0x59,0x23,0x51,0x7F,0xFD,0xAF,0xB3,0x63,0x59,0x23,0x51,0x7F,0xFD,0x8B,0x8B, + 0x84,0x61,0x43,0x59,0xA9,0x2F,0x2A,0xEA,0x84,0x61,0x43,0x59,0xF8,0x7C,0x78,0xE3, + 0x84,0x61,0x43,0x59,0xAD,0xB5,0x9F,0xD5,0x84,0x61,0x63,0x59,0xA1,0xAE,0x55,0x85, + 0x84,0x61,0x43,0x59,0xCA,0xAA,0xEA,0xFF,0x63,0x59,0x23,0x51,0x83,0xAF,0xB4,0x0E, + 0x63,0x59,0x22,0x59,0x80,0x82,0x3E,0xEE,0x63,0x59,0x23,0x51,0xA2,0xEE,0xEB,0xEF, + 0x43,0x59,0x02,0x51,0xA0,0x3E,0x3F,0xF8,0x64,0x59,0x23,0x51,0xEA,0xF2,0xF2,0xFB, + 0x43,0x59,0xE2,0x48,0xB0,0x7A,0xFE,0xAA,0x23,0x51,0xE2,0x48,0x62,0xEB,0xAF,0xAA, + 0x23,0x51,0xE2,0x48,0x37,0x8A,0x82,0x02,0x23,0x51,0xE2,0x48,0xE8,0xF0,0x6B,0x2E, + 0x23,0x51,0xE2,0x48,0x3B,0xFD,0xF5,0xBF,0xA5,0x69,0xE2,0x48,0xDF,0xBF,0xBF,0x2F, + 0x8B,0x9B,0x44,0x59,0x2D,0x2B,0x0B,0x02,0xCC,0xA3,0x8B,0x9B,0x2B,0x62,0xFA,0xDE, + 0xAC,0xA3,0x6A,0x9B,0xEC,0xA9,0x2A,0xBA,0x8B,0x9B,0x29,0x93,0x2A,0x22,0xC8,0x7C, + 0x8A,0x9B,0x29,0x93,0xE0,0xE0,0xEE,0xDD,0x49,0x93,0x09,0x93,0x80,0x8A,0xA8,0xFF, + 0x6A,0x9B,0x29,0x93,0x0A,0x8F,0xF8,0xED,0x8B,0x9B,0x4A,0x93,0xB8,0xBB,0xAF,0xAF, + 0x6A,0x9B,0xE8,0x8A,0x78,0xE0,0x68,0x60,0xC8,0x82,0x87,0x7A,0xBC,0xA8,0xA0,0x83, + 0xE8,0x82,0xA7,0x7A,0xDF,0x8F,0x0F,0xA5,0xC8,0x82,0xA5,0x61,0x7A,0xF8,0xE0,0xA8, + 0xE6,0x61,0x03,0x41,0x57,0x56,0x58,0x78,0x23,0x49,0xE3,0x40,0xAA,0x3E,0xFA,0xE0, + 0x64,0x51,0x03,0x41,0xFF,0xFF,0x35,0xB5,0x64,0x51,0x03,0x41,0x55,0xFF,0xEA,0xC2, + 0x44,0x49,0x03,0x41,0x2A,0xFF,0x72,0xEA,0x64,0x49,0x03,0x41,0x03,0xAF,0xEF,0xF5, + 0x65,0x49,0xE3,0x38,0xFC,0x5E,0x7F,0x6F,0x44,0x49,0xE2,0x38,0x37,0xB5,0x75,0x55, + 0x65,0x49,0xE2,0x38,0x2A,0x0A,0xA9,0xAD,0x64,0x49,0x23,0x41,0x5C,0xDF,0x27,0xCB, + 0x64,0x49,0x02,0x41,0xFB,0xFB,0x7A,0xCE,0x23,0x41,0xC2,0x38,0x7C,0xB8,0xBA,0xEF, + 0x03,0x41,0xC2,0x38,0x0A,0x2B,0xAF,0xBE,0x43,0x49,0xE3,0x38,0xB8,0xFF,0xED,0xFF, + 0x23,0x41,0xE2,0x38,0xAA,0x38,0xBF,0xDE,0x24,0x41,0xE3,0x38,0xB7,0x37,0x07,0xA8, + 0x85,0x51,0x24,0x49,0x27,0x0B,0x2B,0xBF,0xE6,0x61,0x85,0x59,0x2A,0x22,0x88,0xBD, + 0xE6,0x61,0x44,0x51,0x5C,0x78,0xE0,0xFE,0x85,0x51,0x04,0x49,0xDD,0xAB,0xAA,0x08, + 0x64,0x51,0x24,0x49,0xE7,0xAA,0x28,0xE8,0x85,0x51,0x23,0x49,0xE5,0x2E,0x2A,0x0B, + 0xA5,0x51,0x23,0x49,0xBF,0xFE,0xDC,0x7A,0x44,0x49,0xC3,0x38,0x78,0x58,0x5E,0x5E, + 0xC3,0x30,0xA2,0x30,0x8C,0x48,0x7E,0xDD,0xC2,0x30,0xA2,0x28,0x82,0x8A,0x95,0x2E, + 0xE3,0x38,0xC2,0x30,0x41,0x41,0xDF,0xB6,0x03,0x41,0xA2,0x30,0xAD,0xBE,0x2F,0x2F, + 0x64,0x51,0x03,0x39,0x2D,0xBD,0x0F,0x2B,0x64,0x51,0x24,0x49,0xEA,0x60,0xFC,0x7A, + 0x85,0x51,0x23,0x49,0x29,0x09,0xBD,0x3F,0xA5,0x59,0x44,0x51,0xAA,0xA3,0x6E,0x6F, + 0x85,0x59,0x24,0x49,0x2A,0xAA,0xAA,0x5B,0x85,0x51,0x44,0x49,0xBA,0xF2,0xE0,0x51, + 0x85,0x51,0x03,0x41,0xF8,0xFA,0x7E,0x5F,0x23,0x41,0x03,0x41,0x2E,0x88,0x00,0x30, + 0x23,0x41,0xE3,0x38,0xA0,0xE8,0xFA,0x7F,0x44,0x41,0xE2,0x38,0x7A,0x73,0xF5,0xD5, + 0x23,0x41,0xE2,0x38,0x15,0xD5,0xB7,0xDB,0x23,0x41,0xE2,0x38,0xA2,0x88,0xE3,0xAB, + 0x44,0x49,0xE2,0x38,0xF7,0x77,0xAE,0x22,0x44,0x49,0x03,0x39,0xD5,0xF5,0xFE,0xD8, + 0x23,0x41,0x03,0x39,0x76,0x38,0x00,0x0B,0x23,0x41,0xE2,0x38,0xFD,0xE0,0xE0,0x80, + 0x23,0x41,0xE2,0x38,0x17,0xFE,0xDA,0x3F,0x44,0x41,0x03,0x41,0x27,0x09,0x27,0x9F, + 0x44,0x41,0x23,0x41,0x72,0xE0,0x08,0xE0,0x44,0x41,0x03,0x39,0xFA,0x7A,0x7E,0x5F, + 0x44,0x41,0xE2,0x38,0xFE,0xD5,0x55,0xDD,0x23,0x41,0xC2,0x30,0x3A,0xAA,0xDA,0xF8, + 0x43,0x41,0x03,0x39,0x7A,0xFB,0xF5,0x7D,0x43,0x41,0x03,0x39,0x29,0xEF,0xEB,0xF9, + 0x23,0x41,0x03,0x41,0x08,0xF7,0xFE,0xFA,0x64,0x49,0x03,0x41,0x02,0x29,0xFD,0x55, + 0x85,0x51,0x23,0x41,0xFA,0xE2,0xA3,0xA9,0x85,0x51,0x24,0x49,0xAF,0xB5,0xBE,0xBA, + 0xA5,0x51,0x24,0x49,0x8A,0xAA,0xEB,0xDF,0xA5,0x59,0x44,0x49,0xFA,0xA2,0x2B,0xAD, + 0xE6,0x61,0x64,0x51,0xD7,0xFE,0x3F,0x2A,0x27,0x6A,0x64,0x51,0xD5,0xFF,0x3F,0x0A, + 0x26,0x6A,0x84,0x59,0xBD,0xFB,0xEC,0xE8,0x26,0x6A,0xC5,0x61,0xF7,0xEE,0xA5,0x3D, + 0x27,0x6A,0xC5,0x61,0xFA,0xD6,0x9A,0xC0,0xA8,0x7A,0x06,0x62,0x2D,0x3D,0xD5,0xF5, + 0xC9,0x82,0x67,0x72,0x0A,0xAA,0x5F,0xDD,0x0A,0x8B,0x67,0x72,0x3B,0xBD,0xBD,0x77, + 0x52,0xCD,0xE9,0x82,0x0B,0x0D,0x2D,0xB5,0x72,0xD5,0xD0,0xBC,0x78,0x78,0x68,0xEA, + 0xF0,0xC4,0x8F,0xB4,0xFE,0x7E,0x6A,0x60,0xCF,0xBC,0x6E,0xB4,0x0A,0x2A,0x2F,0xB9, + 0xF0,0xC4,0x8F,0xB4,0xA8,0xAA,0x2B,0xBD,0xF0,0xC4,0xCF,0xBC,0x09,0x2F,0xF5,0x56, + 0x10,0xC5,0xAF,0xBC,0x02,0xE8,0xFE,0x5D,0xF0,0xBC,0x4E,0xAC,0xE8,0xFA,0xFE,0x7A, + 0x8F,0xB4,0x2D,0xAC,0xDF,0x77,0xF5,0x2A,0xD0,0xBC,0x0D,0xA4,0x5D,0xDD,0xFD,0x2A, + 0x31,0xC5,0x0D,0xA4,0xD5,0xF7,0xAF,0x02,0x52,0xCD,0xAF,0xB4,0xAD,0x0B,0x0A,0x00, + 0x72,0xCD,0x32,0xC5,0x07,0x08,0x0A,0xFB,0xD4,0xD5,0x52,0xC5,0x0A,0x2B,0xBD,0x75, + 0xD4,0xD5,0x93,0xCD,0xE2,0x28,0xED,0xFD,0xB4,0xD5,0x52,0xC5,0xAE,0xFA,0x7C,0xE0, + 0x93,0xCD,0xD0,0xB4,0xE0,0x6A,0xF8,0x78,0x12,0xBD,0x90,0xAC,0xE8,0x7A,0x7E,0x7F, + 0xAF,0xAC,0x6F,0xAC,0x82,0x9B,0x97,0xBD,0x93,0xCD,0xD0,0xB4,0x0D,0x8F,0x2D,0xAD, + 0x93,0xCD,0xD1,0xB4,0x80,0xE0,0x7A,0x57,0xF1,0xBC,0x6F,0xA4,0x78,0xD8,0xDE,0xF7, + 0xD0,0xB4,0x90,0xAC,0x0A,0x03,0x03,0x0A,0xF0,0xB4,0x8F,0xAC,0xEC,0x7A,0xFA,0xFA, + 0xB0,0xB4,0x4F,0xA4,0xA8,0xAA,0x26,0x80,0xF1,0xB4,0x8F,0xAC,0x37,0x2D,0x0F,0x2B, + 0x64,0x59,0x03,0x49,0xF8,0xAF,0xEF,0xFD,0x64,0x59,0x23,0x51,0xFB,0xD9,0xFF,0x5F, + 0x43,0x51,0x03,0x49,0xA0,0x6B,0xA8,0x0A,0x43,0x51,0x02,0x49,0xB8,0x3E,0x2F,0x08, + 0x64,0x59,0x23,0x51,0x9E,0xD1,0xA9,0xE3,0x84,0x59,0x23,0x51,0xF8,0x7B,0xFF,0xAB, + 0x63,0x59,0x23,0x51,0xB3,0xBE,0xBE,0xFE,0x64,0x59,0x43,0x59,0x8D,0x0A,0xFE,0xD8, + 0x84,0x61,0x43,0x59,0xEB,0xB3,0x6D,0x69,0xA4,0x61,0x43,0x59,0xE3,0x7B,0xFD,0xF5, + 0x84,0x61,0x43,0x59,0x7A,0x7B,0x7B,0x89,0x84,0x59,0x43,0x59,0xAF,0xD9,0x7F,0x7E, + 0x63,0x59,0x43,0x59,0xE8,0x5A,0x77,0x65,0x63,0x59,0x02,0x51,0x08,0xBA,0x7A,0x6A, + 0x64,0x59,0x23,0x51,0xAA,0x8B,0x3D,0x35,0x64,0x59,0x23,0x51,0xEA,0xFA,0x7E,0xFE, + 0x43,0x59,0x23,0x51,0x63,0xAA,0xF7,0x73,0x44,0x59,0x03,0x51,0x02,0xA2,0xBA,0x63, + 0x23,0x51,0x02,0x49,0xCA,0x6A,0x6F,0x59,0x43,0x51,0x02,0x49,0x7F,0xDA,0xA3,0xBB, + 0x23,0x51,0x03,0x49,0xBD,0xB5,0x34,0xAD,0x23,0x51,0x03,0x49,0xFF,0xBB,0xFB,0x43, + 0x42,0x51,0x02,0x49,0xF5,0x7F,0xBF,0xBF,0x4A,0x93,0x43,0x59,0xF5,0xB5,0x2D,0x2B, + 0xCC,0xA3,0x29,0x93,0x0D,0x03,0x02,0xA2,0xCC,0xA3,0x4A,0x9B,0xE0,0xE8,0xFC,0xDE, + 0x8B,0x9B,0x29,0x93,0xA8,0xAC,0xFA,0x7A,0x6A,0x9B,0x2A,0x93,0x72,0xAA,0xBF,0x9D, + 0x6B,0x9B,0x29,0x93,0xFF,0xCB,0xE7,0x57,0x29,0x93,0x09,0x8B,0xFA,0x38,0x38,0x20, + 0x6B,0x9B,0x29,0x93,0xED,0xF5,0x3D,0xAD,0x8B,0x9B,0x4A,0x9B,0xEF,0xAB,0x0B,0x83, + 0x6A,0x9B,0xC8,0x82,0x60,0x60,0xF0,0xF8,0xC8,0x82,0x87,0x7A,0xE8,0x74,0x5E,0xD6, + 0xC8,0x82,0x66,0x72,0x0A,0xBB,0xFF,0xFD,0xA8,0x7A,0x67,0x72,0xF7,0x7F,0xEC,0x36, + 0x68,0x7A,0x44,0x49,0x7A,0xE8,0x80,0xA0,0xC5,0x61,0x03,0x49,0x55,0x5F,0x56,0x58, + 0x23,0x49,0xE3,0x40,0x8F,0x97,0x37,0xEB,0x64,0x49,0x23,0x49,0x0D,0x85,0xB5,0xB5, + 0x64,0x51,0x03,0x41,0x7E,0x5A,0xF8,0xE0,0x23,0x41,0x03,0x41,0xF6,0x21,0x41,0x5F, + 0x03,0x41,0xE2,0x38,0xF8,0xE8,0x5C,0x56,0x03,0x41,0xC2,0x38,0xEF,0xFA,0x35,0xBE, + 0x44,0x49,0xE2,0x38,0xAD,0x3F,0xDE,0xAB,0x64,0x49,0x23,0x41,0x8B,0xF9,0xF5,0xAD, + 0x44,0x41,0x03,0x41,0xC6,0x57,0xF6,0xE8,0x03,0x41,0xC2,0x38,0xFE,0xA0,0x80,0x70, + 0x03,0x41,0xC2,0x38,0xAA,0xAE,0xEF,0xB7,0x24,0x41,0xE3,0x38,0x5E,0xDF,0x1F,0xED, + 0x24,0x41,0xE3,0x38,0x9B,0xB6,0xAC,0xAA,0x45,0x41,0x04,0x41,0xEF,0xFA,0x5F,0x77, + 0x85,0x51,0x24,0x49,0xFF,0xDD,0xDB,0x55,0x85,0x59,0x24,0x49,0x02,0xAB,0x2F,0xDD, + 0x85,0x59,0x24,0x49,0x2A,0xE8,0xDE,0xFF,0xC6,0x59,0x44,0x51,0x0B,0x2B,0x2D,0xBD, + 0xC6,0x61,0x23,0x49,0x7E,0x78,0xC8,0xA2,0xA5,0x59,0x24,0x49,0x29,0xB9,0xA9,0xAB, + 0xA6,0x59,0x23,0x41,0x6A,0x60,0xFA,0x6E,0x23,0x49,0xA3,0x30,0x7A,0x6E,0xFC,0xFE, + 0xC2,0x30,0x83,0x30,0x2B,0xAA,0xAF,0x2D,0x03,0x39,0xA2,0x30,0xF7,0xA7,0x2B,0x0D, + 0x24,0x41,0xE3,0x38,0xFD,0xEF,0xAA,0x8E,0x24,0x41,0xE3,0x38,0xBF,0xBB,0xBF,0xB7, + 0xA5,0x59,0x24,0x41,0xAD,0xEB,0x0D,0x21,0xA6,0x59,0x23,0x49,0xFF,0xF6,0xDE,0x38, + 0xA5,0x59,0x44,0x51,0xB7,0x3D,0x27,0xBB,0xA5,0x59,0x44,0x51,0xFA,0x6E,0xEA,0x88, + 0x64,0x51,0x03,0x49,0x5C,0x56,0x5E,0x58,0x24,0x49,0xE3,0x40,0x22,0xFD,0xA3,0x02, + 0x44,0x49,0x03,0x39,0xE8,0xAA,0x4A,0xEA,0x23,0x41,0xC2,0x38,0xF8,0xEB,0xFB,0x7E, + 0x03,0x39,0xC2,0x38,0xEE,0x97,0x17,0x27,0x03,0x41,0xE3,0x38,0x2B,0x2F,0xFE,0xFE, + 0x44,0x41,0x03,0x41,0x57,0xA1,0x0B,0xA9,0x64,0x49,0x23,0x41,0x5D,0x7F,0x62,0xC2, + 0x64,0x49,0x23,0x41,0x29,0x0D,0xB5,0x95,0x85,0x49,0x23,0x41,0x58,0x52,0x5A,0x5E, + 0x23,0x41,0xE2,0x38,0xEA,0xFE,0xEF,0xFF,0x24,0x41,0xE2,0x38,0x99,0xB9,0xAF,0xE7, + 0x44,0x41,0xE2,0x38,0xF7,0x7E,0xFA,0xAF,0x44,0x41,0xE2,0x38,0x3F,0xAD,0xBF,0xBE, + 0x44,0x41,0x03,0x39,0xA0,0xAB,0x77,0x7A,0x23,0x41,0xE2,0x38,0xE8,0x78,0x6A,0x72, + 0x03,0x39,0xE3,0x38,0xFB,0xEF,0x3F,0x2D,0x23,0x39,0xE2,0x38,0xAA,0xA8,0x43,0x83, + 0x23,0x39,0xE2,0x38,0x8B,0xAD,0xE5,0x5D,0x23,0x41,0xE3,0x38,0x8A,0xBE,0xAA,0xA2, + 0x44,0x49,0xE3,0x38,0xFB,0x6F,0xFA,0x02,0x44,0x49,0xE3,0x40,0xF7,0xEF,0x3F,0xAA, + 0x64,0x49,0x23,0x41,0xCB,0xA9,0xBB,0x3A,0xA5,0x51,0x44,0x49,0xFB,0xEA,0xAB,0x37, + 0xA5,0x59,0x44,0x49,0xDF,0x7F,0xD6,0x7C,0xA5,0x59,0x23,0x49,0x2F,0xBF,0xFF,0xD7, + 0xC5,0x61,0x64,0x49,0xAA,0xAF,0x27,0x25,0x67,0x72,0xC5,0x59,0x29,0x25,0xD5,0x55, + 0x88,0x72,0xE5,0x61,0x7E,0xC8,0x8B,0xB5,0x67,0x72,0xA4,0x59,0xDD,0xFB,0xF8,0x88, + 0x47,0x72,0xE6,0x61,0x8A,0xBF,0x3F,0xFF,0xC9,0x82,0x26,0x6A,0xB5,0x2D,0x2B,0x2D, + 0x0A,0x8B,0x67,0x72,0x57,0x7B,0xEE,0xA8,0xA8,0x7A,0x27,0x72,0xE7,0xA9,0xAA,0xA8, + 0xED,0xA3,0x88,0x7A,0x3D,0xB5,0xF5,0xFF,0x51,0xCD,0xED,0xAB,0xA2,0x03,0x09,0x09, + 0x10,0xC5,0xAF,0xBC,0x7E,0x7A,0x6A,0xA0,0xCF,0xBC,0x6E,0xB4,0x77,0x57,0xF7,0x5C, + 0xCF,0xBC,0x6E,0xB4,0x2D,0xBF,0xFF,0x7D,0xCF,0xBC,0x6E,0xB4,0x80,0xA8,0xF3,0xD7, + 0xAF,0xB4,0x6F,0xB4,0xA0,0xDC,0xDF,0x7E,0x31,0xCD,0x8F,0xB4,0x77,0xAD,0x2F,0x29, + 0x52,0xCD,0xAF,0xBC,0xFD,0xAB,0x8A,0x20,0x51,0xC5,0xF0,0xC4,0x55,0xB6,0x8E,0xA2, + 0x72,0xCD,0xF0,0xBC,0xA7,0x37,0xAF,0x2A,0xB3,0xD5,0x72,0xCD,0x55,0xAB,0x83,0x8B, + 0xB3,0xD5,0x10,0xBD,0x7F,0xFA,0xFA,0xE0,0x52,0xC5,0x11,0xBD,0x0D,0x2F,0xED,0x7E, + 0x93,0xCD,0x11,0xBD,0x82,0x3F,0xFF,0xF5,0xB3,0xCD,0x52,0xC5,0x00,0x02,0xAA,0xD7, + 0x93,0xCD,0xD1,0xB4,0x78,0xA0,0x00,0x00,0x73,0xCD,0xB0,0xB4,0x55,0x5F,0x7C,0x60, + 0xD1,0xB4,0x2F,0xA4,0xBE,0xBF,0x3F,0x28,0x32,0xC5,0x90,0xAC,0x03,0x82,0x42,0x62, + 0xD0,0xB4,0xCD,0x93,0xA8,0xFA,0x7F,0x57,0xF1,0xB4,0x0E,0x9C,0xBA,0x2B,0x2D,0xAF, + 0xF1,0xB4,0xB0,0xB4,0xBD,0xB6,0xF5,0xD5,0xD0,0xB4,0x90,0xAC,0xBA,0xC8,0xEA,0x7A, + 0xD0,0xB4,0x8F,0xAC,0x2E,0xB6,0x57,0xD7,0x11,0xBD,0x90,0xAC,0x2F,0xAF,0xB9,0x6F, + 0x43,0x51,0x02,0x49,0xBD,0xFF,0x5A,0x72,0x43,0x51,0xE2,0x48,0xA2,0xF8,0xFF,0xAE, + 0x64,0x59,0x23,0x51,0x75,0xF5,0xEF,0x8F,0x64,0x59,0x43,0x51,0xFD,0xDD,0x75,0x5E, + 0x64,0x59,0x02,0x49,0x6B,0x6A,0xAA,0x22,0xA4,0x61,0x02,0x49,0xEF,0xAD,0xAF,0x8A, + 0xA4,0x61,0x44,0x59,0xD7,0xBD,0xFF,0xD5,0x84,0x61,0x23,0x51,0xF8,0xBA,0x7E,0xFF, + 0x84,0x61,0x23,0x51,0x2A,0x2E,0x2F,0x0B,0x84,0x59,0x43,0x59,0xAD,0x8A,0xAE,0xEE, + 0x84,0x61,0x23,0x51,0x88,0xC2,0xAA,0x7E,0x63,0x59,0x03,0x51,0xA0,0x82,0x98,0xAE, + 0x43,0x59,0x23,0x51,0x08,0x36,0x28,0x20,0x64,0x59,0x23,0x51,0x9B,0xDF,0xBB,0xF8, + 0x64,0x59,0x02,0x51,0x3F,0x3B,0xDF,0xBA,0x64,0x59,0x23,0x51,0x7E,0xEE,0xBA,0xFB, + 0x64,0x59,0x23,0x51,0xF9,0x6B,0x6C,0x55,0x44,0x59,0x03,0x49,0xC2,0xD2,0xBC,0xD6, + 0x43,0x51,0xE2,0x48,0xFF,0xAE,0x7F,0xB2,0x23,0x51,0xE2,0x48,0x82,0xAA,0xED,0xF6, + 0x43,0x51,0x03,0x49,0xF7,0x75,0x7D,0xFB,0x43,0x51,0x03,0x49,0xFB,0xAB,0x8B,0x2E, + 0x68,0x7A,0x23,0x51,0xD5,0xD5,0x35,0x2D,0xAB,0xA3,0x27,0x72,0x2D,0x29,0x0B,0x0A, + 0xCC,0xA3,0x8B,0xA3,0xAB,0x00,0x68,0x58,0x8B,0xA3,0x4A,0x93,0x6C,0x2C,0xFF,0xDF, + 0x6A,0x9B,0x29,0x93,0xBA,0xBE,0xF8,0x72,0x4A,0x93,0x09,0x93,0xF8,0x72,0xEA,0x20, + 0x4A,0x93,0x09,0x8B,0x38,0x95,0x27,0xB4,0x6A,0x9B,0x29,0x93,0x6B,0xAB,0xBB,0x27, + 0x6A,0x93,0x09,0x93,0x8D,0xBE,0xEE,0xEA,0x8B,0x9B,0x4A,0x93,0xB2,0xAF,0xBF,0xFD, + 0x8B,0x9B,0xA7,0x82,0xFA,0x7A,0x7A,0x7A,0xA7,0x82,0x87,0x7A,0x3F,0xF0,0xC8,0xC8, + 0xA8,0x82,0x67,0x7A,0xBE,0xE2,0xFF,0x7F,0xA7,0x7A,0x67,0x7A,0xBC,0xDA,0x69,0x5F, + 0x87,0x7A,0x26,0x6A,0x5C,0x7E,0xFA,0xFA,0x26,0x6A,0x64,0x51,0x5C,0x78,0xE0,0x80, + 0x85,0x59,0xE3,0x40,0x77,0x5F,0xDE,0xC0,0x44,0x49,0xE3,0x40,0x0A,0x29,0x2B,0xA2, + 0x64,0x49,0x23,0x49,0x80,0xCA,0xBE,0xDD,0x44,0x49,0xC2,0x38,0xFA,0x7E,0x76,0xE8, + 0x03,0x39,0xC2,0x38,0xBF,0xBF,0x89,0xAA,0x03,0x39,0xC2,0x38,0x80,0xA8,0xAE,0xD6, + 0x44,0x49,0xE3,0x38,0x8B,0xAB,0xBF,0xF5,0xA5,0x51,0x23,0x41,0xF5,0xE5,0xA5,0x3D, + 0x85,0x51,0x23,0x41,0x7A,0x7A,0x72,0xE0,0x23,0x41,0xC3,0x38,0x73,0xEA,0xB8,0xFA, + 0x03,0x41,0xC2,0x38,0xEF,0xAA,0xF0,0x70,0x23,0x41,0xE3,0x38,0xBB,0xAB,0xAB,0xDD, + 0x24,0x41,0xE3,0x38,0xCA,0xFA,0xF8,0xEA,0x03,0x41,0x23,0x39,0x2A,0xA0,0x80,0x88, + 0x44,0x49,0xE3,0x38,0xAA,0xAA,0x2B,0xA7,0x64,0x51,0x24,0x49,0xF5,0xB9,0xCE,0xFF, + 0x85,0x51,0x44,0x51,0x7B,0xF9,0x89,0x87,0x85,0x59,0x65,0x51,0x25,0x0D,0xAB,0xC9, + 0xE6,0x61,0x85,0x59,0xE1,0xE3,0x7D,0x55,0xC6,0x59,0x65,0x51,0xB7,0xBA,0xE3,0xCD, + 0x85,0x51,0x44,0x49,0x6A,0x68,0xE2,0x5C,0x44,0x49,0xC2,0x30,0x7E,0xF4,0x7E,0x5F, + 0xC2,0x30,0xA2,0x30,0xBF,0x98,0x20,0x22,0x24,0x39,0xC2,0x30,0xA5,0x3D,0xA5,0xFD, + 0x24,0x41,0xE3,0x38,0xAA,0x9E,0xEE,0xE7,0x03,0x41,0xE3,0x38,0x27,0x2B,0xE0,0xEA, + 0xA5,0x59,0x03,0x41,0x09,0x2D,0x0F,0x3D,0x07,0x62,0x85,0x59,0xDF,0x7B,0xB3,0xBB, + 0x07,0x6A,0x85,0x59,0x57,0x7F,0xF2,0xE8,0xC6,0x59,0x44,0x51,0x29,0xAA,0xE2,0xEA, + 0xA5,0x59,0x03,0x41,0x58,0x78,0x7A,0x7A,0x24,0x49,0x03,0x41,0x8A,0xAA,0xF5,0x55, + 0x24,0x41,0x03,0x41,0x60,0xE0,0x60,0x63,0x03,0x41,0xC2,0x38,0x7A,0x6A,0xEE,0xBA, + 0x24,0x41,0xE3,0x38,0xA5,0xA5,0xAF,0xAD,0x23,0x41,0x03,0x39,0xB7,0xAF,0x3F,0x35, + 0x64,0x49,0x24,0x41,0x6D,0xA9,0xAD,0xBD,0x64,0x49,0x23,0x41,0x09,0xAF,0xA2,0x8A, + 0x65,0x49,0x03,0x41,0xBF,0xDF,0xBA,0x8A,0x64,0x49,0x03,0x39,0x78,0xEC,0x7F,0x7E, + 0x23,0x41,0xE3,0x38,0xFF,0x5F,0x7F,0x2A,0x03,0x41,0xC2,0x30,0xAE,0xAF,0x5D,0xFC, + 0x44,0x41,0xE2,0x38,0x2B,0x8E,0x75,0xD5,0x23,0x41,0xE2,0x30,0x3A,0x3B,0xFF,0xAF, + 0x24,0x39,0x03,0x39,0x68,0x56,0xFF,0xF5,0x44,0x41,0xE3,0x38,0x7B,0xFF,0xE8,0xAA, + 0x23,0x39,0xE3,0x30,0xE7,0xD7,0xF7,0xEA,0x23,0x39,0xE3,0x30,0xAC,0x3E,0xFB,0xF2, + 0x03,0x39,0xE2,0x30,0xDF,0x3E,0xBA,0xF8,0x44,0x41,0xE2,0x38,0xF5,0xF6,0xF7,0x35, + 0x85,0x49,0x03,0x39,0xAD,0x2D,0xA5,0xF5,0x64,0x49,0x03,0x41,0xF8,0xDE,0xFA,0xAA, + 0x44,0x49,0x23,0x39,0x02,0x82,0x02,0x20,0x85,0x51,0x23,0x49,0xB7,0xBF,0xE2,0xE2, + 0x85,0x51,0x23,0x49,0x58,0x7F,0xD7,0x7F,0x64,0x49,0x23,0x49,0xAB,0xB5,0xB5,0x5F, + 0xA5,0x59,0x23,0x49,0x2F,0xAF,0xFF,0x7D,0xC5,0x59,0x64,0x51,0x03,0x0B,0x2B,0xB5, + 0x05,0x62,0x84,0x51,0x3A,0xBB,0xAD,0xF5,0x47,0x72,0xC5,0x61,0x02,0x8A,0xEB,0xBD, + 0x47,0x72,0xE5,0x61,0xFE,0xFE,0x2E,0x2B,0xC9,0x82,0x26,0x6A,0x25,0xB5,0xF5,0xFF, + 0x2A,0x8B,0x88,0x7A,0xAA,0x0B,0xA9,0xBB,0x29,0x93,0x87,0x7A,0xD7,0x7E,0xEA,0xA0, + 0x0A,0x8B,0x88,0x7A,0x2B,0xB5,0xFF,0xB6,0x52,0xD5,0x4A,0x93,0x09,0x2D,0x2D,0x2D, + 0x72,0xD5,0xF0,0xC4,0x7C,0x78,0xF8,0xE0,0x51,0xCD,0x4E,0xAC,0x5E,0x7A,0xA8,0x00, + 0x72,0xCD,0x4E,0xAC,0x55,0xD5,0xFF,0x02,0xD3,0xDD,0x6E,0xB4,0x55,0x55,0x7F,0xA8, + 0xF0,0xC4,0x4D,0xAC,0x96,0xD7,0x97,0x00,0x92,0xD5,0xD0,0xBC,0xBD,0xAD,0x2D,0x0B, + 0xB3,0xD5,0x51,0xCD,0x5D,0xFF,0x0B,0x0A,0xD4,0xDD,0x72,0xCD,0x5D,0xEA,0x60,0x6A, + 0x93,0xCD,0x52,0xCD,0x57,0xDC,0x37,0x87,0xD4,0xD5,0x72,0xCD,0x8D,0xF9,0xFE,0xDE, + 0xB4,0xD5,0x73,0xCD,0x70,0x5A,0xF7,0xD7,0x72,0xCD,0x11,0xBD,0x7E,0xE8,0xF8,0xBC, + 0x32,0xC5,0x11,0xBD,0xBF,0xFE,0x90,0x60,0x52,0xC5,0xF1,0xBC,0x80,0xAE,0xAF,0xF7, + 0x93,0xCD,0x32,0xC5,0x03,0xAB,0xBF,0xFD,0xB4,0xCD,0x52,0xC5,0x5A,0x0B,0xAF,0xBD, + 0x93,0xCD,0xF1,0xBC,0x57,0xE0,0xA0,0xE0,0x12,0xBD,0xED,0x9B,0xE0,0xE0,0x68,0x78, + 0x6E,0xA4,0xCC,0x93,0x57,0xD5,0x95,0x35,0xD0,0xB4,0x4E,0xA4,0x29,0x39,0xAB,0x02, + 0xD0,0xB4,0x8F,0xB4,0xB0,0x78,0xF8,0xEA,0xD1,0xB4,0x6F,0xAC,0xEA,0xA2,0xDE,0xEF, + 0xD1,0xB4,0x6F,0xAC,0x3F,0xAF,0xB7,0xAE,0xF1,0xB4,0x90,0xAC,0x4F,0xBE,0xA9,0xEB, + 0x63,0x59,0x23,0x51,0x7E,0x59,0xE6,0xAE,0x43,0x51,0x02,0x49,0x20,0xAA,0xFB,0x6A, + 0x43,0x51,0x23,0x51,0x02,0x02,0x29,0x99,0x64,0x59,0x23,0x51,0x28,0xAE,0xDB,0x4F, + 0x64,0x59,0x23,0x51,0xA2,0xE8,0xA8,0xB7,0x84,0x59,0x43,0x59,0x82,0x6B,0x5F,0x5F, + 0x84,0x61,0x23,0x51,0xFD,0xBB,0xEA,0xC2,0x84,0x61,0x23,0x51,0xF6,0xFF,0xEF,0x8B, + 0x84,0x61,0x43,0x59,0x0A,0x03,0x27,0xAA,0xA4,0x61,0x43,0x59,0xFA,0x6A,0xE0,0xF2, + 0x64,0x59,0x23,0x59,0xFE,0xFB,0xBA,0xE8,0x64,0x59,0x23,0x51,0xC8,0x8A,0xEF,0x6B, + 0x64,0x59,0x23,0x51,0xBA,0xBF,0x1F,0xEF,0x64,0x59,0x23,0x59,0xA8,0xA8,0x02,0xA9, + 0x85,0x61,0x24,0x51,0xFE,0xFA,0x63,0xFF,0x64,0x59,0x23,0x51,0xAE,0xDD,0x7D,0x6F, + 0x44,0x59,0x03,0x51,0x5F,0xBC,0xBD,0x6F,0x23,0x51,0xE2,0x48,0xB8,0xF0,0x28,0xB3, + 0x43,0x51,0x03,0x49,0xFB,0xFA,0xEA,0xDB,0x23,0x51,0xE2,0x48,0x72,0xC8,0x82,0xA2, + 0x23,0x51,0x03,0x49,0xC1,0xB5,0xCF,0x0A,0x64,0x59,0x03,0x51,0xBF,0xBF,0x37,0x37, + 0x4A,0x93,0x64,0x59,0x2D,0x2D,0x0B,0x0B,0xCC,0xA3,0x4A,0x9B,0xAD,0x8B,0x2A,0xEE, + 0xEC,0xAB,0x8B,0x9B,0x5E,0xAF,0xAD,0x8F,0xCC,0xAB,0x4A,0x93,0x77,0x5A,0xE8,0xA0, + 0xAB,0xA3,0x4A,0x93,0x77,0xDD,0xEE,0xA8,0x6A,0x9B,0x29,0x93,0xFE,0xE6,0xF7,0x5E, + 0x6A,0x9B,0x09,0x8B,0x5E,0xFE,0xA3,0xAB,0x4A,0x93,0x09,0x93,0xAF,0xED,0xEF,0x30, + 0x4A,0x93,0x08,0x93,0x20,0xAA,0xA1,0xE8,0x6A,0x93,0x09,0x93,0x3B,0xAD,0xAF,0xEF, + 0x6A,0x9B,0xC8,0x82,0x72,0x62,0xFA,0x7A,0xA7,0x7A,0x67,0x72,0xA2,0xB8,0x68,0xAA, + 0xA8,0x7A,0x47,0x72,0xE2,0xE2,0x7F,0xF7,0x67,0x7A,0x26,0x72,0x80,0xE0,0x52,0x50, + 0x88,0x7A,0x47,0x72,0x7B,0x7D,0x77,0x49,0x46,0x72,0x06,0x6A,0x5F,0x7A,0x7A,0xFA, + 0x26,0x6A,0x64,0x51,0x7A,0xE8,0xEA,0x08,0xE5,0x61,0x23,0x49,0x55,0x5F,0x5E,0x68, + 0x43,0x49,0xE3,0x40,0xAA,0xFB,0x5F,0x54,0x43,0x49,0xE3,0x40,0xE8,0xEB,0xEF,0xF5, + 0xE3,0x40,0xC2,0x30,0xBE,0xEE,0xEA,0x60,0xE2,0x38,0xA1,0x30,0x0C,0xA8,0xFA,0xFB, + 0x03,0x41,0xC2,0x38,0x0B,0x0D,0x7D,0xF5,0xA5,0x51,0xE3,0x38,0x0F,0x2F,0xAD,0xFD, + 0x85,0x51,0x23,0x41,0xC0,0xCA,0xEA,0x7A,0x23,0x41,0xE3,0x38,0xBA,0xDC,0xDF,0x5F, + 0x24,0x41,0xC2,0x38,0xDA,0x2A,0x02,0x00,0x03,0x41,0xE3,0x38,0x7F,0xEC,0xBA,0x38, + 0x03,0x41,0xE3,0x38,0x36,0xD5,0xD7,0x5E,0x23,0x41,0xE4,0x38,0xEA,0xBF,0x0B,0x0A, + 0x44,0x49,0xE3,0x38,0x2B,0xB7,0xAE,0xE8,0x65,0x51,0x23,0x49,0xDC,0xF0,0x70,0xF2, + 0x85,0x59,0x03,0x41,0x0B,0x2B,0xBF,0x77,0xC6,0x59,0x44,0x51,0x8B,0x3A,0xAA,0xFD, + 0xA5,0x59,0x65,0x51,0xBC,0xBC,0xFE,0xFE,0xC6,0x59,0x64,0x51,0x5A,0x7A,0x4B,0x4F, + 0x85,0x51,0xC2,0x30,0xE8,0x6A,0x7E,0x5E,0xE3,0x38,0x82,0x30,0xA0,0xEA,0xDE,0xBF, + 0xC3,0x30,0xA2,0x30,0xE2,0xFF,0x5F,0x94,0xE3,0x30,0x82,0x28,0xAB,0xFD,0xBA,0xA8, + 0xE3,0x38,0xA2,0x30,0x21,0x7D,0x5F,0x5E,0x03,0x41,0xA3,0x30,0x2B,0xFB,0xBF,0xBD, + 0x64,0x51,0x03,0x41,0x2D,0x25,0x15,0xD5,0xE6,0x61,0x85,0x51,0x09,0xAB,0xFD,0x55, + 0xE6,0x61,0x64,0x51,0x00,0x82,0x8B,0xBF,0xC6,0x61,0x64,0x51,0x6A,0xF8,0xF0,0x80, + 0x64,0x51,0x03,0x41,0xA8,0xE0,0x60,0xF0,0x24,0x49,0x03,0x41,0x56,0xFE,0x2F,0xAC, + 0x24,0x41,0xE3,0x38,0xAB,0xA6,0x7E,0x78,0x04,0x41,0xC3,0x38,0x5E,0x72,0xAA,0x22, + 0x03,0x39,0xA3,0x38,0x0B,0xAA,0x88,0x28,0x03,0x39,0xC2,0x38,0x2A,0x2F,0xBD,0xBF, + 0x85,0x49,0x03,0x39,0x2B,0x2F,0xAD,0x8D,0x85,0x49,0x24,0x41,0xFF,0xD8,0xE0,0xFC, + 0x85,0x49,0xE2,0x38,0x8A,0x8A,0xFE,0x5D,0x44,0x41,0x03,0x39,0xA8,0xAE,0xFF,0x2D, + 0x23,0x41,0xE3,0x38,0x00,0xA0,0xF8,0xE0,0x23,0x41,0xC2,0x30,0xFE,0x66,0xFB,0xA8, + 0x03,0x39,0xC2,0x30,0x2F,0x2F,0x1F,0xF8,0x24,0x41,0xE2,0x30,0xAD,0x2F,0xAF,0xB5, + 0x23,0x39,0xE3,0x38,0xAA,0x88,0xA8,0x0F,0x24,0x41,0x03,0x39,0x1E,0xB9,0xAD,0xE2, + 0x23,0x39,0xE2,0x38,0xE8,0x78,0xB2,0xA0,0x23,0x39,0xE2,0x30,0xFF,0x55,0x5F,0xF0, + 0x23,0x41,0x03,0x39,0x75,0x25,0xA5,0x55,0x23,0x41,0xC2,0x30,0x27,0xAA,0xAF,0x0A, + 0x23,0x41,0xE2,0x38,0x17,0x0E,0x82,0x02,0x64,0x49,0x23,0x41,0x0B,0x0B,0x7F,0xFF, + 0x64,0x49,0x23,0x41,0x37,0xDF,0xBA,0xE7,0x84,0x51,0x44,0x49,0x5E,0x2F,0x65,0x7D, + 0x85,0x51,0x23,0x41,0xFD,0xD7,0xFB,0xC2,0x65,0x49,0x23,0x49,0xF7,0xB5,0x36,0xF7, + 0x85,0x51,0x23,0x49,0xFF,0xBF,0x35,0x8F,0xC5,0x61,0x22,0x49,0xDF,0xFE,0xA8,0x2B, + 0xA4,0x59,0x64,0x51,0x9B,0x7D,0xD8,0xA8,0x06,0x62,0x64,0x51,0x2F,0xAD,0x75,0xFF, + 0x26,0x6A,0x84,0x59,0x00,0xAE,0xF7,0xDD,0x67,0x7A,0xA5,0x61,0x2A,0x2B,0xAD,0xF5, + 0x0A,0x8B,0x26,0x72,0x0A,0x2B,0xAB,0xFD,0x2A,0x8B,0xC9,0x82,0xC0,0xA2,0x29,0xF9, + 0x09,0x8B,0xA8,0x7A,0xFA,0xF0,0xA0,0x28,0x52,0xD5,0x09,0x8B,0x2D,0x2D,0xB5,0xB5, + 0x35,0xE6,0x52,0xD5,0x5F,0xEB,0x0B,0x09,0x55,0xEE,0x72,0xD5,0x55,0xBF,0xAA,0x00, + 0x35,0xEE,0x72,0xD5,0xAD,0x8A,0x00,0x00,0x55,0xEE,0xF4,0xDD,0x5F,0xFF,0xEF,0xF2, + 0x35,0xE6,0xD3,0xDD,0x7D,0xAB,0x8A,0x80,0x14,0xE6,0x92,0xD5,0xF7,0xAA,0x00,0x08, + 0x34,0xE6,0x92,0xD5,0x7F,0xFE,0x8A,0x20,0x14,0xDE,0x52,0xC5,0x57,0x5F,0x5A,0x58, + 0xB3,0xD5,0x52,0xC5,0xA5,0x3D,0xAF,0xAD,0xB3,0xD5,0x73,0xCD,0xFE,0xEA,0xAA,0x3B, + 0x93,0xCD,0x52,0xC5,0xEE,0xAE,0xFE,0xF8,0x72,0xCD,0x32,0xC5,0xF4,0xF8,0x78,0xE0, + 0x52,0xC5,0x12,0xBD,0x6E,0xF8,0x7A,0xAA,0x32,0xC5,0xF1,0xBC,0x5F,0x76,0x7A,0xD8, + 0x52,0xC5,0xF1,0xBC,0x2B,0xE5,0x5D,0x5D,0x73,0xCD,0xF1,0xBC,0x22,0x0B,0xAF,0xF7, + 0x73,0xCD,0xD0,0xB4,0xE0,0xF8,0x7E,0x7F,0xD1,0xB4,0xCD,0x9B,0x78,0xF8,0x7E,0x7E, + 0xB0,0xB4,0xCC,0x93,0x25,0x2F,0x0B,0x0B,0xD1,0xB4,0x8F,0xAC,0xA2,0xE2,0x40,0xA2, + 0xD0,0xB4,0x8F,0xAC,0xEA,0xDB,0x7A,0xCC,0xB0,0xB4,0x70,0xAC,0xDA,0x90,0x3C,0x2E, + 0xB0,0xB4,0x70,0xAC,0xA8,0xEA,0xFE,0x18,0xD1,0xB4,0x90,0xAC,0xEB,0xE9,0xD5,0xBD, + 0x63,0x59,0x23,0x51,0xAE,0xFA,0xF1,0xA3,0x84,0x59,0x43,0x51,0x75,0xDF,0xEB,0xFE, + 0x84,0x59,0x23,0x51,0x57,0xFA,0xFA,0xDC,0x83,0x59,0x23,0x51,0x7D,0xF5,0xFD,0xEF, + 0x63,0x59,0x23,0x51,0xDF,0xB2,0x83,0xCB,0x63,0x59,0x23,0x51,0xF1,0xAA,0xAF,0xAA, + 0x84,0x61,0x43,0x59,0xDB,0xED,0x0F,0x39,0xA4,0x61,0x44,0x59,0xEB,0x2D,0xE8,0xAA, + 0xA4,0x61,0x64,0x59,0xFF,0xBD,0xA9,0xFF,0x84,0x59,0x43,0x59,0xF8,0x6C,0xEF,0xBF, + 0x64,0x59,0x23,0x51,0xAA,0x21,0x2A,0xEE,0x63,0x59,0x23,0x51,0xDA,0x7A,0x6F,0xEE, + 0x64,0x59,0x23,0x51,0xEA,0x8A,0xE9,0xFF,0x44,0x59,0x23,0x51,0xAB,0x5E,0x77,0xDA, + 0x44,0x59,0x23,0x51,0x92,0x73,0xB6,0xA7,0x44,0x59,0xE2,0x48,0xA0,0xE8,0x78,0xF8, + 0x23,0x51,0x03,0x49,0x6B,0xDF,0x69,0x6D,0x23,0x51,0xC2,0x40,0xAA,0x98,0xAA,0xAA, + 0x23,0x51,0xE2,0x48,0xBA,0x6A,0xDA,0xB2,0x23,0x51,0xE2,0x48,0x92,0x23,0x02,0xAA, + 0x43,0x51,0x03,0x49,0xCA,0xAF,0x5F,0xF7,0xE9,0x8A,0x23,0x51,0xD5,0x95,0xB5,0x25, + 0xAB,0xA3,0x88,0x82,0x8D,0x2B,0x8B,0x88,0xAB,0xA3,0x6B,0x9B,0xFE,0x2E,0xA6,0x2F, + 0xEC,0xAB,0xAB,0xA3,0x85,0xAD,0x21,0x2D,0x0D,0xAC,0xCC,0xA3,0x7F,0x7D,0x7F,0x7A, + 0xCB,0xA3,0x8B,0x9B,0xFE,0x5C,0x56,0x5E,0x8A,0x9B,0x29,0x93,0x6E,0xF8,0x78,0xD8, + 0x6A,0x9B,0x29,0x93,0xED,0xA7,0xCA,0x7B,0x6A,0x9B,0x09,0x8B,0x3F,0xDF,0xFE,0xFE, + 0x6A,0x9B,0x2A,0x93,0x7E,0xF9,0xAF,0xAB,0x6A,0x9B,0x08,0x93,0xAD,0x8B,0x82,0x02, + 0x4A,0x93,0xC8,0x82,0x7A,0x68,0x60,0x70,0xA8,0x7A,0x46,0x72,0xA8,0x5A,0x78,0xFE, + 0x88,0x7A,0x46,0x72,0xBA,0x69,0xE9,0xEF,0x67,0x7A,0x06,0x6A,0x90,0xFE,0xEE,0xAA, + 0x67,0x7A,0x06,0x6A,0x60,0x7E,0xFF,0xDF,0x47,0x72,0x06,0x6A,0x7B,0x8D,0x7F,0xE6, + 0x26,0x6A,0xE6,0x69,0x80,0xE0,0xA8,0xC0,0x06,0x6A,0x64,0x51,0x78,0xEA,0xC0,0x00, + 0xE5,0x61,0xC2,0x38,0x7F,0x7E,0x7A,0xF8,0x23,0x49,0xC2,0x38,0xBD,0xAD,0x2B,0x80, + 0x23,0x41,0xE2,0x38,0x5F,0x57,0x5E,0x58,0xE2,0x38,0x81,0x30,0xA2,0x00,0xAC,0xBE, + 0x03,0x39,0xC2,0x38,0xAB,0xBB,0xFE,0xE7,0x23,0x41,0xE3,0x38,0x2D,0xFB,0xAD,0xAD, + 0x44,0x49,0xE3,0x38,0xE2,0xEA,0xFE,0x7B,0x03,0x41,0xE3,0x38,0xAA,0x76,0x4A,0xEB, + 0x23,0x41,0xE3,0x38,0x0A,0xED,0xF5,0x5F,0x24,0x41,0xE2,0x38,0xE0,0xF2,0xFA,0xE3, + 0x24,0x41,0xC2,0x38,0xEA,0xBD,0xEA,0xAE,0x24,0x41,0xE2,0x38,0xAC,0x77,0xDE,0x8A, + 0x44,0x49,0xE2,0x38,0xCA,0xFB,0x57,0xF5,0x44,0x49,0x03,0x41,0x2A,0x5B,0xFD,0x9D, + 0x44,0x49,0x03,0x41,0xF8,0x7F,0x5E,0xFE,0x85,0x51,0x24,0x49,0xA3,0xBD,0xBF,0x27, + 0xA5,0x59,0x65,0x51,0xFE,0x8B,0x2F,0x8F,0x85,0x51,0x44,0x49,0xC3,0x6E,0x7C,0x5C, + 0x44,0x49,0xC3,0x30,0x58,0xF0,0xE0,0xF8,0x04,0x39,0xA2,0x30,0xD5,0x7F,0x7A,0xF8, + 0xE3,0x30,0xA2,0x30,0x9C,0x9F,0x95,0x95,0x24,0x39,0xC3,0x30,0xFD,0xFF,0xEB,0x82, + 0x03,0x39,0xA2,0x30,0x7F,0xBF,0xEA,0xEC,0x04,0x39,0xC3,0x38,0x55,0xF5,0xAF,0xBD, + 0x23,0x41,0xE3,0x38,0x3D,0xFD,0xD5,0xBD,0x85,0x59,0x03,0x41,0x0B,0x0F,0xAD,0xBF, + 0xA5,0x59,0x65,0x51,0x0F,0x8A,0xDB,0xFF,0x26,0x6A,0x85,0x51,0xEB,0x8B,0xAF,0xF5, + 0xC6,0x59,0x44,0x49,0x7E,0x5E,0xEC,0xBC,0x44,0x49,0x04,0x41,0x7F,0x28,0xBA,0xF8, + 0x24,0x41,0xE3,0x38,0xFC,0xEE,0xFE,0xBC,0x04,0x41,0xC3,0x38,0xA2,0xE8,0xB0,0xF8, + 0xE3,0x38,0xC3,0x38,0x00,0x23,0x00,0x08,0x03,0x39,0xC3,0x30,0xAF,0xBF,0x0F,0x28, + 0x64,0x49,0x03,0x39,0x2B,0x2F,0xBF,0xB5,0x64,0x41,0x03,0x41,0x68,0x7E,0xFE,0xFB, + 0x44,0x41,0x03,0x41,0x57,0xD5,0xFF,0xF3,0x85,0x49,0x03,0x41,0xBD,0xAF,0xBD,0xFF, + 0x85,0x49,0x23,0x41,0x5E,0xFE,0x68,0xDA,0x44,0x41,0xE2,0x38,0xAA,0xA2,0xAB,0x7F, + 0x03,0x39,0xC2,0x30,0x78,0xA8,0x2A,0x00,0x03,0x39,0xC2,0x30,0x2F,0xCB,0xE8,0x23, + 0x44,0x39,0xE3,0x38,0xBD,0xFD,0xDD,0x55,0x24,0x39,0x03,0x39,0xD0,0x5C,0x5E,0x5D, + 0x23,0x39,0xC2,0x30,0xA2,0xA8,0xFE,0x77,0x03,0x39,0xE2,0x30,0xE0,0xDE,0xBB,0xAD, + 0x23,0x41,0xC2,0x30,0xAF,0x2B,0x0F,0x2F,0x43,0x41,0xE2,0x38,0x6B,0xFE,0x2A,0xAA, + 0x85,0x49,0x23,0x41,0xF5,0x7D,0x97,0x3D,0xA5,0x51,0x23,0x41,0x7D,0xEF,0x6A,0x80, + 0x85,0x51,0x23,0x41,0xF7,0xFF,0xEB,0x20,0x84,0x51,0x44,0x49,0x5B,0x6A,0xBA,0xC8, + 0xA6,0x51,0x44,0x49,0xF5,0xFF,0xFF,0xF8,0xA5,0x59,0x23,0x41,0xD7,0xFF,0xA2,0x02, + 0xA5,0x59,0x64,0x51,0x75,0xA5,0xE5,0x88,0xC5,0x59,0x84,0x51,0x8D,0x2B,0xAB,0xFB, + 0xE6,0x61,0x84,0x59,0x6A,0xC7,0x27,0x3F,0xC5,0x61,0x84,0x59,0xE3,0x00,0x8E,0x9C, + 0x06,0x6A,0x64,0x59,0xFD,0xFB,0xAA,0x03,0x06,0x6A,0x84,0x59,0xB5,0xB7,0x37,0x3E, + 0x88,0x7A,0x06,0x6A,0x2F,0xAF,0xED,0xAF,0x09,0x8B,0x46,0x72,0x2A,0x8F,0xBD,0xB5, + 0x09,0x8B,0xA8,0x82,0x2F,0xA7,0xA9,0x2F,0x2E,0xAC,0xE9,0x82,0x2D,0x35,0x3D,0xB5, + 0x35,0xEE,0xB0,0xBC,0x0B,0x0B,0x0B,0x09,0x76,0xEE,0x35,0xEE,0xFE,0xEA,0x2A,0x28, + 0x76,0xEE,0x35,0xE6,0xFF,0xFA,0xAA,0xAA,0x76,0xEE,0x35,0xE6,0x7E,0xEA,0xE8,0x6A, + 0x55,0xEE,0x35,0xE6,0x7F,0xA8,0xE8,0x7A,0x14,0xEE,0x35,0xE6,0xFE,0x75,0xD5,0xF5, + 0x35,0xE6,0xF4,0xDD,0x88,0x88,0xA8,0x78,0xF4,0xDD,0x11,0xC5,0xF0,0x78,0x7C,0x5A, + 0xB3,0xCD,0x31,0xC5,0xAF,0x8F,0x2D,0x89,0xB3,0xD5,0x52,0xC5,0x2A,0xAA,0xBA,0xF6, + 0xD3,0xCD,0x73,0xCD,0x5F,0xDF,0x6F,0x7D,0x93,0xCD,0x52,0xC5,0x7F,0x6A,0xBB,0xBE, + 0x73,0xCD,0x12,0xBD,0xFF,0x7A,0x7A,0x68,0x32,0xC5,0x11,0xBD,0x60,0xEA,0x09,0x0A, + 0x32,0xC5,0xD0,0xB4,0xFF,0x6A,0xEA,0xA8,0x11,0xBD,0xB0,0xB4,0x0A,0x8B,0xE8,0x6A, + 0xF1,0xB4,0x89,0x72,0x80,0xA8,0xFE,0x5E,0x90,0xAC,0xAD,0x93,0xFE,0xBF,0xAD,0x2D, + 0xB0,0xB4,0x4F,0xA4,0x05,0x0B,0x2A,0x0B,0xD0,0xB4,0x90,0xAC,0x8B,0xDE,0x7E,0xFB, + 0xD1,0xB4,0x6F,0xAC,0x0A,0x1D,0xAB,0x8A,0xD1,0xB4,0x8F,0xAC,0x9F,0x3E,0xFC,0x08, + 0xD1,0xB4,0x90,0xAC,0xFA,0xBC,0xFA,0x2A,0xD1,0xB4,0x8F,0xAC,0x88,0xF8,0x7B,0x5F, + 0x84,0x59,0x43,0x51,0x3F,0x2E,0x6A,0x2B,0x84,0x59,0x22,0x51,0xA8,0xA2,0xE9,0xBF, + 0x84,0x59,0x23,0x51,0xFF,0xFA,0xFB,0xE2,0x64,0x51,0x23,0x51,0xAF,0xF6,0xAB,0xA9, + 0x63,0x59,0x22,0x51,0x8A,0x82,0x8D,0x02,0x84,0x59,0x43,0x59,0xEB,0xFF,0xBD,0xB5, + 0xA4,0x61,0x64,0x59,0xDF,0xFE,0x3B,0x1A,0x84,0x61,0x43,0x59,0xEA,0xFF,0x4E,0x7E, + 0xA4,0x61,0x23,0x51,0xE8,0xFA,0x7F,0xF5,0x63,0x61,0x43,0x51,0xA9,0xCF,0xED,0xAB, + 0x63,0x59,0x23,0x51,0xFF,0xAA,0xA3,0xEA,0x64,0x59,0x43,0x59,0xF5,0xE2,0x4B,0x65, + 0x44,0x59,0x23,0x51,0x2E,0x2C,0x0E,0x4D,0x43,0x59,0x23,0x51,0xD8,0x9E,0x7C,0xB8, + 0x43,0x59,0x03,0x51,0xFF,0x56,0xFC,0xBE,0x43,0x51,0x03,0x49,0x78,0x69,0xAA,0xB0, + 0x23,0x51,0x03,0x49,0x77,0x75,0x62,0x5C,0x03,0x49,0xE2,0x48,0xB2,0xDD,0x57,0x0C, + 0x23,0x51,0xE2,0x48,0xA2,0x22,0xE8,0x6A,0x24,0x51,0xE2,0x48,0xB6,0xEE,0xF5,0xAD, + 0x63,0x59,0xE2,0x40,0xFF,0xBF,0xAD,0x2D,0x4A,0x93,0x83,0x59,0x25,0x2D,0x29,0x0B, + 0xAB,0xA3,0x4A,0x9B,0xCF,0xFF,0x2A,0x02,0xEC,0xAB,0x6B,0x9B,0xA5,0x8F,0x2A,0x0B, + 0xEC,0xAB,0xAB,0xA3,0x3D,0xE6,0x6C,0xF8,0xEC,0xAB,0x8A,0x9B,0x08,0xC8,0xFB,0x57, + 0xCB,0xA3,0x8A,0x9B,0xFB,0xCE,0xEB,0x55,0xAB,0xA3,0x6A,0x9B,0x57,0xE8,0xEE,0xA9, + 0x8B,0x9B,0x29,0x93,0x7B,0xFE,0xBA,0xA8,0x8B,0x9B,0x49,0x93,0x55,0xD5,0xEE,0x02, + 0x8A,0x9B,0x4A,0x93,0x7D,0xDF,0x6B,0xF2,0x6A,0x9B,0x2A,0x93,0xAE,0xAC,0xBF,0xFE, + 0x6A,0x9B,0x87,0x82,0x68,0x62,0xEA,0xFA,0xA8,0x7A,0x46,0x72,0xFC,0xDE,0x7F,0x7E, + 0x67,0x72,0x06,0x72,0x8A,0x22,0xEA,0x8A,0x67,0x72,0x26,0x72,0xEA,0xE8,0xFE,0xF9, + 0x47,0x72,0x05,0x6A,0xBB,0xEE,0x7A,0x20,0x47,0x72,0x06,0x6A,0xCA,0xA2,0x7A,0x78, + 0x47,0x72,0x06,0x6A,0x69,0xFA,0x7F,0x57,0x26,0x6A,0x06,0x6A,0x6F,0xD7,0x37,0x25, + 0x06,0x62,0x43,0x51,0x78,0xE0,0x80,0x80,0xA5,0x59,0x03,0x41,0x5F,0x7F,0xFA,0xE8, + 0x23,0x41,0xE2,0x38,0x70,0x62,0xB8,0xEC,0x03,0x41,0xA1,0x30,0xFF,0x7E,0xFA,0xC8, + 0x03,0x41,0xC2,0x38,0xAD,0x83,0xA1,0x3F,0x44,0x49,0xE2,0x38,0xAD,0xAD,0x8B,0xAB, + 0x44,0x49,0xE2,0x38,0x5E,0x7A,0xE8,0xA8,0xE3,0x40,0x03,0x39,0x7E,0xD7,0xFD,0x3F, + 0x03,0x41,0xC2,0x38,0xA8,0xF8,0xFA,0xFA,0x03,0x41,0xC2,0x38,0x82,0xAE,0xF7,0xF7, + 0x24,0x41,0xE3,0x38,0xBF,0x3D,0xBD,0xBD,0x44,0x41,0x03,0x41,0xF7,0xFF,0xAF,0xAA, + 0x44,0x49,0x03,0x41,0xE5,0xBB,0xEA,0x82,0x24,0x49,0x03,0x41,0xBF,0x7A,0x23,0x0B, + 0x44,0x49,0x03,0x41,0xBB,0xCF,0xBB,0xBF,0xC6,0x61,0x44,0x49,0xFD,0xA5,0x2D,0xAD, + 0xC6,0x61,0x65,0x51,0xFD,0xFF,0xFA,0xCA,0x86,0x51,0x04,0x41,0xEE,0x7C,0xFE,0xEA, + 0x24,0x41,0xC3,0x38,0xE0,0xCA,0xEA,0xE6,0x03,0x39,0xC3,0x38,0x5D,0xFB,0x72,0xFE, + 0xE3,0x38,0xA2,0x30,0x5D,0x5E,0xDE,0x5E,0x45,0x41,0xC3,0x30,0x81,0xFB,0xFD,0xF5, + 0x03,0x39,0xC3,0x30,0xFE,0xEF,0xFE,0xE0,0x24,0x41,0xC3,0x30,0xBF,0xAB,0xF9,0xCD, + 0x44,0x41,0xE3,0x40,0xFF,0xAA,0x89,0xBF,0x65,0x49,0x03,0x41,0x3D,0xBF,0x3E,0xAB, + 0x85,0x51,0x44,0x49,0xAA,0x5A,0xFB,0xEF,0x85,0x51,0x24,0x49,0x2B,0xAB,0xFE,0x7A, + 0x85,0x59,0x04,0x49,0x88,0xFA,0xFA,0x7D,0x44,0x49,0xE3,0x38,0xC0,0xF8,0xEF,0xFE, + 0x04,0x41,0xC3,0x38,0xA2,0x0B,0x2F,0x3F,0x04,0x41,0xC3,0x38,0x68,0xEA,0x70,0xB0, + 0x24,0x41,0xC3,0x38,0xD7,0xFD,0xAB,0x29,0x04,0x41,0xC3,0x38,0xA8,0xEF,0xAF,0xEF, + 0x44,0x41,0xC2,0x30,0x2F,0x8B,0x2F,0xB7,0x65,0x49,0x04,0x41,0xEB,0xFB,0xEE,0xFE, + 0x44,0x41,0x23,0x41,0x55,0xD5,0x9D,0x57,0x64,0x49,0xE3,0x38,0xAA,0x2B,0xFA,0xD7, + 0x44,0x41,0x03,0x39,0xEA,0x7E,0xFA,0xE8,0x23,0x41,0xC2,0x30,0xA8,0xFE,0xFA,0x5A, + 0x03,0x39,0xC2,0x30,0x80,0xA0,0xAB,0x8D,0xC2,0x38,0xE2,0x30,0x77,0xF7,0xF5,0xDD, + 0xE3,0x38,0xC2,0x30,0xA2,0xA3,0x3E,0x2A,0x03,0x39,0xC2,0x30,0xE2,0xE8,0x8A,0xAF, + 0x03,0x39,0xC2,0x30,0xFF,0xFB,0xAA,0xA8,0x24,0x39,0xC3,0x30,0xFD,0xFB,0xBF,0xAB, + 0x03,0x39,0xC2,0x30,0x2F,0x8A,0x00,0x80,0x23,0x41,0xE3,0x38,0x0A,0x3B,0x3B,0xAD, + 0x85,0x51,0x23,0x41,0xBD,0xAB,0x37,0xBD,0xC5,0x51,0x64,0x49,0x0B,0xAF,0xFA,0xFB, + 0xC6,0x59,0x85,0x51,0x7A,0x6E,0xFA,0x55,0x84,0x51,0x64,0x51,0xDF,0xF2,0xEB,0x79, + 0x85,0x51,0x23,0x49,0x00,0x02,0xBE,0x7E,0xE6,0x61,0x43,0x49,0xAB,0x0A,0x0B,0xAD, + 0x06,0x62,0xC6,0x61,0x75,0x5A,0xF2,0xA1,0x06,0x6A,0xA5,0x59,0x7D,0xFB,0xBE,0x3F, + 0x27,0x6A,0xA4,0x59,0xD5,0xDF,0x78,0xF2,0x06,0x6A,0xC5,0x61,0x5A,0x6E,0x21,0x9F, + 0x47,0x72,0x84,0x59,0x0F,0x27,0xB7,0xBF,0xA8,0x82,0x06,0x6A,0x5D,0xFF,0xA9,0x81, + 0x67,0x7A,0x06,0x6A,0x0D,0xF5,0xDF,0x7E,0xC9,0x82,0x46,0x72,0x0F,0x2B,0x29,0xA5, + 0x09,0x8B,0xC8,0x82,0xF5,0xD5,0xBA,0xA9,0x6B,0x93,0xE9,0x82,0x35,0x3D,0x27,0x2D, + 0x15,0xE6,0xED,0xA3,0x09,0x0D,0x2D,0x2D,0x75,0xEE,0x35,0xEE,0x8A,0x8B,0xED,0xF5, + 0x75,0xEE,0x35,0xE6,0x8A,0xA8,0xEE,0xFD,0x55,0xEE,0x15,0xE6,0x88,0x88,0xA8,0x42, + 0x55,0xEE,0x14,0xE6,0x8A,0xEE,0xFF,0x55,0x35,0xE6,0xF4,0xDD,0xA0,0xE8,0xFA,0x7B, + 0x14,0xDE,0xB4,0xD5,0xC0,0x80,0x68,0x7E,0x93,0xD5,0xF1,0xBC,0xDC,0xA8,0xAC,0xAE, + 0xB4,0xD5,0x52,0xC5,0xA9,0x8B,0xAA,0xA0,0x93,0xCD,0x32,0xC5,0xBA,0xE8,0x68,0xEA, + 0x72,0xCD,0x32,0xC5,0x00,0x83,0x2D,0xEF,0x73,0xCD,0x93,0xC5,0x82,0xAA,0x7C,0xAA, + 0x73,0xC5,0x32,0xC5,0xF8,0xEA,0xEA,0xAA,0x52,0xC5,0x11,0xBD,0xBA,0xFE,0xF7,0x67, + 0x32,0xC5,0xF1,0xBC,0xAC,0xAB,0x7F,0x5E,0x32,0xC5,0xED,0x9B,0xE8,0xE8,0x6A,0x7A, + 0xEE,0x9B,0x89,0x72,0x54,0x9E,0xBE,0x2A,0x4F,0xA4,0x6C,0x8B,0x2D,0x2B,0x0B,0x02, + 0xD1,0xB4,0x6F,0xAC,0x25,0xFD,0xB5,0xF5,0xD0,0xB4,0x90,0xAC,0xF6,0x3B,0xB5,0xB5, + 0xD1,0xB4,0x8F,0xAC,0xAA,0xEF,0x2B,0xB0,0xD0,0xB4,0x6F,0xAC,0xA0,0xFE,0x7E,0x57, + 0xB0,0xB4,0x4F,0xA4,0x00,0xAA,0xA6,0xB7,0xB0,0xB4,0x4F,0xA4,0xB0,0xBB,0xAF,0xB5, + 0x63,0x59,0x22,0x49,0x83,0xFA,0x7A,0x5B,0x84,0x59,0x22,0x51,0xBB,0xED,0x3B,0x3F, + 0x63,0x59,0x23,0x51,0x00,0x83,0x3C,0x2F,0x84,0x59,0x22,0x49,0xF6,0xA2,0xAC,0xBA, + 0x84,0x61,0x63,0x59,0x55,0x79,0x4B,0x45,0x84,0x61,0x43,0x59,0x2D,0x2B,0x2B,0x0E, + 0x84,0x61,0x63,0x59,0x15,0xB6,0xFE,0x7A,0x84,0x59,0x43,0x59,0xEE,0xBE,0xFE,0xFE, + 0x84,0x61,0x23,0x51,0xFF,0xAA,0xBA,0x68,0x63,0x59,0x02,0x51,0xA2,0x0A,0xB8,0x7F, + 0x63,0x59,0x23,0x51,0x2A,0x02,0x2B,0x7F,0x84,0x61,0x23,0x51,0xFA,0xE8,0xDB,0xF7, + 0x64,0x59,0x23,0x51,0xFA,0xFE,0x62,0x6F,0x44,0x51,0x03,0x51,0x8A,0x02,0x0B,0x6B, + 0x44,0x51,0x03,0x49,0x7E,0x6A,0x73,0x68,0x43,0x51,0xE1,0x48,0xA0,0xEA,0xFB,0xEA, + 0x23,0x51,0xE2,0x48,0xAA,0xA5,0xD5,0xFB,0x23,0x51,0xE3,0x48,0xEF,0xE8,0xAA,0xAA, + 0x23,0x51,0xC2,0x48,0xA2,0xAA,0xBA,0x78,0x23,0x51,0xC2,0x48,0xAA,0xEF,0xB7,0x25, + 0xE6,0x69,0x03,0x51,0xF5,0x35,0x3D,0x2F,0x6A,0x9B,0x25,0x72,0x29,0x01,0x03,0x02, + 0xCC,0xA3,0x8B,0x9B,0xEF,0xEF,0xED,0x8B,0xAC,0xA3,0x8B,0x9B,0x0A,0xF9,0x79,0x62, + 0xAB,0xA3,0x29,0x93,0x80,0x7A,0xFE,0xFE,0x69,0x9B,0x28,0x93,0x8A,0xAD,0xAA,0x80, + 0x8A,0x9B,0x49,0x93,0x8B,0xAB,0x2F,0xBF,0x8A,0x9B,0x49,0x93,0x00,0x82,0xFC,0x7A, + 0x8B,0x9B,0x29,0x93,0x80,0x32,0xEB,0x7F,0x8B,0x9B,0x09,0x8B,0x88,0x28,0xFB,0x55, + 0x8B,0xA3,0x09,0x93,0xA2,0xE0,0xEF,0xED,0x4A,0x93,0xE9,0x8A,0x80,0xA8,0xF8,0xFF, + 0x09,0x8B,0x67,0x7A,0xE0,0xF8,0xE8,0x78,0x87,0x7A,0x26,0x72,0xDC,0xFA,0xFE,0xDE, + 0x67,0x7A,0x26,0x6A,0x6F,0x5B,0x8A,0xFF,0x46,0x72,0x05,0x6A,0xBB,0xDE,0x80,0x02, + 0x46,0x72,0x06,0x6A,0x3A,0xFA,0x8B,0xEB,0x47,0x72,0x06,0x6A,0x5C,0xDE,0x7B,0xB5, + 0x26,0x6A,0xE5,0x69,0xAD,0x36,0xBA,0xA8,0x47,0x72,0x06,0x6A,0xC1,0xAB,0x29,0x0F, + 0x68,0x72,0x06,0x6A,0x7A,0x7A,0xB0,0x22,0x67,0x72,0x43,0x49,0x7E,0xFA,0xF8,0xE0, + 0x64,0x49,0xE3,0x40,0x77,0x5E,0xFE,0xF8,0x03,0x41,0xC2,0x38,0xA8,0x0A,0x80,0x78, + 0x03,0x41,0xC2,0x38,0x02,0xA2,0xEB,0xF9,0x24,0x41,0xC2,0x38,0x0A,0x2E,0xBB,0xA9, + 0x44,0x49,0x03,0x39,0x02,0xC0,0xEF,0xA5,0x23,0x41,0xE2,0x38,0x5F,0xDA,0xDE,0xC2, + 0x03,0x41,0xC2,0x38,0xF2,0xCA,0xE8,0xFA,0x03,0x39,0xC2,0x38,0xB7,0xEF,0x3F,0xDF, + 0x24,0x41,0xC2,0x38,0xAF,0x2F,0x2F,0x9F,0x64,0x49,0x03,0x41,0xBD,0xAF,0x2D,0x0D, + 0x64,0x49,0x03,0x41,0xFA,0xF8,0xE8,0x58,0x24,0x49,0x03,0x41,0x8A,0x22,0x0A,0x2F, + 0x44,0x49,0x24,0x49,0x37,0x1A,0xDC,0x94,0xA6,0x59,0x44,0x49,0x2F,0x0F,0x3F,0xBD, + 0xC6,0x59,0x65,0x51,0xC2,0xE2,0x60,0xFB,0x85,0x51,0x23,0x41,0x6B,0x6A,0xEE,0xE0, + 0x24,0x41,0xC2,0x38,0xFF,0xD7,0x76,0x78,0x24,0x41,0xC3,0x38,0x7F,0xFF,0x73,0xF3, + 0xE3,0x30,0xA2,0x30,0x77,0xFD,0xBE,0x2E,0x03,0x39,0xC3,0x30,0xB5,0xD5,0xB7,0x2F, + 0x45,0x41,0x04,0x39,0x55,0x7A,0xE3,0x7B,0x03,0x39,0xE3,0x38,0xC9,0xBF,0xDF,0x1F, + 0x24,0x41,0xC2,0x38,0xBA,0x9F,0x2E,0x22,0x44,0x49,0x04,0x41,0x0A,0x2B,0x29,0x0D, + 0x65,0x51,0x44,0x49,0xF5,0xFD,0xBB,0x75,0x44,0x49,0x03,0x41,0x88,0xEA,0xE8,0xE0, + 0x24,0x41,0xE3,0x40,0x0A,0x0F,0x27,0x8A,0x24,0x41,0xE3,0x38,0xE8,0x70,0x58,0x6A, + 0x03,0x41,0xE3,0x38,0xD7,0xD7,0x7F,0xFB,0x24,0x41,0xE3,0x38,0xBF,0xBF,0x57,0x5B, + 0x24,0x41,0x03,0x39,0x27,0x1E,0xF6,0x7F,0x24,0x41,0xE3,0x38,0x78,0x78,0x6B,0xAF, + 0x24,0x41,0xE3,0x38,0xBD,0xFD,0x3D,0x37,0x65,0x49,0x03,0x41,0xFA,0xEA,0x62,0xE9, + 0x44,0x49,0xE3,0x38,0xAF,0x6A,0x0B,0x0A,0x44,0x49,0xC2,0x30,0x7E,0xFA,0xE8,0xE0, + 0x23,0x41,0xC2,0x30,0x8A,0xDA,0x5E,0x52,0xE2,0x38,0xC2,0x30,0x7C,0xF6,0xC5,0x2B, + 0x03,0x39,0xC2,0x30,0x2D,0xED,0xAB,0x2A,0x23,0x39,0xC2,0x30,0xF7,0x97,0x8F,0xAE, + 0x24,0x39,0xC2,0x30,0xFD,0xBF,0xEB,0x2A,0x23,0x39,0xE3,0x30,0xFD,0xFE,0xD4,0x7E, + 0x24,0x39,0xC3,0x30,0xFE,0xFF,0xFE,0xA3,0x23,0x39,0xE3,0x38,0x2B,0x89,0xB7,0xF5, + 0x44,0x41,0xE3,0x30,0x7F,0xEF,0xBA,0x8B,0x23,0x41,0xE2,0x38,0xED,0x7D,0xFF,0x8B, + 0x44,0x41,0xE3,0x38,0x09,0xF5,0xDB,0xD5,0x85,0x51,0x03,0x41,0x82,0xE3,0xFF,0xFD, + 0x85,0x51,0x02,0x39,0x28,0x8A,0xB5,0x57,0x84,0x51,0x23,0x41,0x20,0xBA,0xEA,0x7F, + 0x84,0x51,0x03,0x41,0x68,0x6A,0xFE,0xAF,0xA5,0x59,0x03,0x41,0x29,0x2D,0xAF,0x2F, + 0x06,0x62,0xA5,0x59,0x8B,0xBF,0xAD,0x2B,0x26,0x6A,0xC5,0x61,0xDC,0xAB,0x8B,0xB7, + 0x27,0x6A,0xC6,0x61,0xEB,0xBF,0x37,0x56,0x67,0x7A,0xE5,0x69,0x5F,0xEA,0xC8,0x03, + 0x26,0x72,0xC6,0x61,0xB7,0xBF,0xFF,0xFC,0x88,0x7A,0x06,0x6A,0x0D,0xAD,0xF7,0xD5, + 0x68,0x7A,0x06,0x6A,0x78,0x7A,0x77,0x6B,0xA8,0x7A,0xC4,0x61,0x2B,0xAB,0xBF,0xF5, + 0x09,0x8B,0x67,0x72,0x0A,0x09,0xAD,0xBD,0x29,0x8B,0xE8,0x82,0x0D,0xFD,0xFF,0x5D, + 0xD4,0xDD,0x6A,0x93,0x2D,0x2D,0x35,0xB5,0x55,0xEE,0xD3,0xDD,0x0A,0x2B,0xA9,0x2D, + 0x55,0xEE,0x35,0xE6,0xBF,0x33,0xAF,0xFF,0x55,0xEE,0x15,0xE6,0xEA,0xBA,0xFE,0xFF, + 0x35,0xE6,0x14,0xE6,0xF7,0x7E,0xFA,0x56,0x14,0xE6,0xB3,0xD5,0xA8,0xE8,0xFE,0x5A, + 0xD4,0xDD,0x32,0xC5,0xA0,0xE8,0xFA,0x7A,0x93,0xCD,0x11,0xBD,0x2F,0x2E,0x09,0x2D, + 0xB4,0xD5,0x93,0xCD,0x6A,0x4B,0x7F,0x7B,0x93,0xCD,0x73,0xCD,0x72,0x6A,0xEE,0x68, + 0x52,0xC5,0x32,0xBD,0x38,0xBA,0x78,0x38,0x72,0xCD,0x32,0xC5,0x08,0x8A,0xEA,0xDA, + 0x73,0xCD,0x32,0xC5,0x8A,0xEF,0x5D,0x77,0x32,0xC5,0xF1,0xBC,0xFE,0xBC,0xEC,0x68, + 0x12,0xBD,0xB0,0xB4,0xE0,0xFC,0x5F,0x76,0xB0,0xB4,0x0E,0x9C,0x60,0xF8,0xE8,0x78, + 0x2E,0xA4,0xAC,0x93,0x17,0x3F,0x3E,0xFA,0x6F,0xAC,0x0F,0x9C,0xAD,0x2A,0x03,0xA9, + 0xB0,0xB4,0x6F,0xAC,0xD5,0x95,0xB9,0xBD,0xD1,0xB4,0x6F,0xAC,0x27,0x3B,0xEE,0xFE, + 0xB1,0xB4,0x4F,0xA4,0xF8,0xF8,0xFF,0x5F,0x6F,0xA4,0x2F,0xA4,0xB2,0x2A,0xEB,0xAB, + 0x8F,0xAC,0x4F,0xA4,0x2F,0xAF,0xEA,0xFB,0xB0,0xAC,0x4F,0xA4,0xF5,0xB7,0x09,0x0F, + 0x63,0x59,0x02,0x51,0x7E,0xEE,0x2D,0xAF,0x63,0x59,0x22,0x51,0x3D,0x2F,0x02,0xE0, + 0x84,0x59,0x23,0x51,0x87,0xCA,0xA8,0xE3,0x84,0x59,0x22,0x51,0x7E,0xA3,0x80,0x2B, + 0xA5,0x61,0x63,0x59,0x25,0xD5,0xF5,0xEB,0xC5,0x61,0x43,0x59,0xAF,0x2F,0xE7,0xFD, + 0x84,0x61,0x43,0x59,0xE0,0xF8,0xEE,0x7E,0x84,0x61,0x23,0x59,0xFC,0xDB,0xEB,0xDA, + 0x64,0x59,0x23,0x51,0xA2,0xFB,0x7B,0x5A,0x63,0x59,0x23,0x51,0xFF,0xD8,0xBD,0xA9, + 0x63,0x59,0x23,0x51,0x7F,0xAA,0x8A,0x6E,0x64,0x51,0x02,0x51,0xAE,0xB4,0xBA,0xAA, + 0x43,0x59,0x03,0x51,0xE8,0xA8,0xFF,0xFA,0x43,0x51,0x03,0x49,0xAF,0xBE,0xAF,0xBE, + 0x64,0x59,0x02,0x49,0xF8,0xD2,0x5B,0x7F,0x23,0x51,0x03,0x49,0x88,0x38,0x0B,0x03, + 0x23,0x51,0x03,0x49,0x7F,0xAC,0xEE,0x63,0x23,0x51,0xE2,0x40,0xAA,0xEA,0xB6,0x0A, + 0x23,0x51,0xC2,0x48,0x72,0xBA,0xEA,0x00,0x64,0x59,0x03,0x51,0xFD,0x8B,0xAA,0xAA, + 0xC9,0x8A,0x64,0x59,0x95,0xB5,0x35,0x35,0xAC,0xA3,0x09,0x8B,0x2D,0x2B,0x2B,0xAA, + 0xCC,0xA3,0x8B,0x9B,0xEB,0xEB,0xAA,0x0F,0xEC,0xAB,0xAB,0xA3,0x75,0x75,0xFB,0x07, + 0xEC,0xAB,0x4A,0x93,0x5F,0xFE,0xAC,0x88,0xAB,0xA3,0x49,0x93,0xFF,0xDF,0xAA,0xE0, + 0x6A,0x9B,0x49,0x93,0x8B,0x28,0x2A,0xCC,0x6A,0x9B,0x08,0x93,0xA0,0x72,0xF8,0xB2, + 0x49,0x93,0xE8,0x8A,0x7E,0x7F,0xD6,0x88,0x29,0x93,0xE8,0x8A,0xFA,0xDE,0xFE,0xEB, + 0xE9,0x92,0x09,0x8B,0x55,0xFF,0x5F,0x95,0x29,0x93,0xC8,0x82,0x68,0x7A,0x7A,0xFF, + 0xE9,0x8A,0x87,0x7A,0x7A,0xE8,0x82,0xA0,0xA8,0x82,0x46,0x72,0x77,0x7F,0x7A,0x7C, + 0x67,0x72,0x26,0x72,0x7D,0x6F,0x3B,0x2A,0x66,0x72,0x05,0x6A,0xEB,0x6A,0xE8,0xB8, + 0x67,0x72,0xE5,0x69,0x6E,0xEE,0xFE,0x2E,0x47,0x72,0xE5,0x69,0xAF,0x27,0x37,0x9E, + 0x47,0x72,0x06,0x6A,0x77,0x56,0xFC,0xAF,0x67,0x7A,0x06,0x6A,0xA5,0xBF,0x8E,0xAA, + 0x87,0x7A,0x47,0x72,0xF5,0xB7,0xFE,0x2F,0x87,0x7A,0xE6,0x61,0x70,0x82,0x00,0x00, + 0x26,0x6A,0x03,0x41,0x5E,0x7C,0x78,0xF8,0x03,0x41,0xA2,0x38,0x5C,0xE0,0x80,0xA0, + 0xE2,0x38,0xA2,0x30,0x82,0x2A,0x1E,0xAE,0x03,0x41,0xE3,0x38,0xE9,0xFD,0xC2,0xEB, + 0x24,0x41,0xE2,0x38,0xF5,0xFA,0xE2,0xAB,0x24,0x41,0xE3,0x38,0xEF,0x5F,0x7B,0x5D, + 0xE3,0x38,0xC2,0x38,0x80,0xA0,0xC8,0x03,0x23,0x41,0xC2,0x38,0x57,0xDF,0xFF,0xBF, + 0x03,0x41,0xE3,0x38,0x05,0x01,0x69,0x2B,0x44,0x49,0x03,0x39,0xAA,0x6A,0xAD,0xB5, + 0x64,0x49,0x03,0x41,0xF8,0x7E,0xDA,0x7A,0x24,0x49,0xE3,0x40,0xB6,0xAE,0xB6,0xFF, + 0x65,0x51,0x03,0x41,0x3D,0xB5,0xD5,0x55,0x85,0x51,0xC3,0x40,0x0A,0xAA,0xAA,0xFD, + 0xA6,0x59,0x24,0x49,0xA2,0x22,0xBB,0xFD,0x85,0x51,0x44,0x49,0x42,0xE8,0xFA,0x2F, + 0x65,0x49,0xC2,0x30,0x7E,0x7A,0x78,0xE0,0x03,0x41,0xC3,0x30,0xA1,0xE3,0xFA,0xFA, + 0xE3,0x38,0xC3,0x30,0xDC,0x5A,0xFC,0xFF,0x04,0x39,0xC3,0x30,0x8D,0xBD,0xD5,0x7D, + 0x24,0x39,0xA2,0x30,0x22,0x3E,0xFF,0xD5,0x03,0x39,0xC3,0x30,0x00,0x00,0x0A,0x3D, + 0x24,0x41,0x03,0x39,0x5B,0xBB,0x83,0xAD,0x44,0x49,0x03,0x41,0x0D,0x0B,0x3D,0x09, + 0x64,0x49,0x24,0x49,0xAE,0xAF,0xAF,0xBB,0x44,0x49,0x03,0x41,0x80,0xA0,0x72,0xFE, + 0x24,0x41,0xC2,0x38,0x00,0xAA,0xBA,0x78,0x03,0x41,0xC3,0x38,0x82,0x2A,0xA0,0x3F, + 0x03,0x41,0xE3,0x38,0xBA,0x9E,0x5A,0xF8,0x24,0x41,0x03,0x39,0x57,0x3A,0x0B,0xEF, + 0x65,0x41,0xE3,0x30,0xFF,0xDF,0x7C,0x7F,0x44,0x39,0xE3,0x38,0xBF,0xBF,0xF7,0x75, + 0x23,0x39,0xE3,0x38,0x38,0xFA,0xBD,0x2F,0x44,0x41,0x03,0x39,0x8B,0xA9,0xEA,0xE2, + 0x64,0x49,0x02,0x39,0xA0,0xEB,0xFF,0x57,0x44,0x41,0xC2,0x30,0xF8,0x6A,0xF2,0xFF, + 0x02,0x39,0xC2,0x30,0x57,0xDF,0xDE,0x78,0x03,0x39,0xC2,0x30,0xBF,0xA6,0x8B,0xE5, + 0x23,0x39,0xE2,0x38,0xFD,0xAF,0x0B,0xA9,0x23,0x39,0xE2,0x30,0xFF,0xFA,0xE2,0xE3, + 0x24,0x39,0x03,0x39,0x2F,0xE5,0x75,0xB5,0x24,0x39,0xE3,0x38,0x7C,0xFC,0xA8,0x08, + 0x03,0x39,0xC2,0x30,0xA2,0xE0,0xB8,0xB0,0x03,0x39,0xC2,0x30,0x2B,0xAF,0xDD,0x7A, + 0x23,0x41,0xC2,0x30,0x0B,0xBF,0xDD,0x5D,0x64,0x41,0xC2,0x38,0xEA,0xAA,0xAB,0xAD, + 0x23,0x41,0xE3,0x38,0xD7,0x5B,0xFC,0xA8,0x43,0x41,0xE3,0x38,0x8D,0xB5,0xF7,0xFF, + 0x44,0x41,0xE3,0x38,0xFE,0xBA,0x3B,0xB9,0x23,0x41,0xE2,0x38,0x00,0xC7,0xF6,0xBC, + 0x44,0x49,0xE2,0x38,0x02,0xFA,0x9E,0xEB,0xA5,0x51,0x23,0x49,0x27,0xBF,0xB7,0xBD, + 0x47,0x6A,0x84,0x51,0x27,0x3F,0xBD,0xFD,0x88,0x7A,0xE6,0x61,0xF5,0xFA,0xAA,0x0B, + 0x47,0x72,0xA5,0x61,0x55,0x57,0x5C,0xE2,0x47,0x72,0x85,0x59,0x0B,0x2D,0xB7,0xFE, + 0x47,0x72,0xE5,0x69,0x78,0x60,0xDB,0x79,0x05,0x6A,0xC5,0x61,0x83,0xBF,0x8E,0x0B, + 0x67,0x72,0xE5,0x61,0x8B,0x09,0x09,0xB5,0x47,0x72,0xE5,0x61,0xF6,0xBE,0xE0,0x00, + 0xA7,0x7A,0x26,0x72,0x09,0x2B,0x09,0x2B,0x09,0x83,0xA8,0x7A,0xEB,0xA5,0x35,0x7D, + 0x8F,0xB4,0xE8,0x82,0x2D,0x2D,0x2D,0x2D,0x35,0xE6,0x31,0xCD,0x0B,0x29,0xAD,0x2D, + 0x35,0xE6,0x14,0xE6,0xA8,0xBF,0xF7,0x55,0x35,0xE6,0xF4,0xDD,0xA8,0xA8,0xFA,0xDF, + 0x34,0xE6,0xF4,0xDD,0xEA,0x6A,0xFB,0x7B,0x14,0xDE,0x93,0xD5,0xF8,0xFE,0xFE,0x7A, + 0x93,0xD5,0xF1,0xBC,0x68,0x58,0x58,0x5E,0x93,0xCD,0x11,0xBD,0x2D,0x29,0x29,0x2F, + 0xB4,0xCD,0x73,0xCD,0xAA,0xEA,0xFE,0x7B,0x93,0xCD,0x32,0xC5,0x82,0xCA,0xFE,0x7F, + 0x92,0xC5,0x32,0xC5,0x9E,0xFF,0xF7,0xF7,0x52,0xC5,0x32,0xC5,0x80,0xA0,0xC6,0xC8, + 0x52,0xC5,0x11,0xBD,0xF0,0xEA,0xFA,0x72,0x12,0xC5,0xB0,0xAC,0xA0,0xFA,0xFE,0x60, + 0xF1,0xBC,0x90,0xAC,0xF8,0xF8,0xF6,0xDF,0xB0,0xAC,0xED,0x9B,0xF8,0x78,0x5E,0x57, + 0x2E,0xA4,0xCD,0x93,0x8E,0x3D,0xF7,0xF5,0x90,0xAC,0xEE,0x9B,0x2F,0x2F,0x2B,0x29, + 0xB0,0xB4,0x4F,0xAC,0xAE,0xEF,0xE2,0xFA,0x90,0xAC,0x4F,0xA4,0x88,0xA0,0xFE,0x57, + 0x6F,0xAC,0x0E,0x9C,0x72,0xE8,0xAA,0x02,0x90,0xAC,0x2E,0xA4,0x29,0x29,0x2F,0x0A, + 0x90,0xAC,0x6F,0xA4,0x6A,0x00,0x28,0x08,0xB0,0xAC,0x4E,0xA4,0x2A,0xB0,0xF8,0x58, + 0x84,0x59,0x22,0x51,0xFD,0x9F,0xF7,0xCA,0x84,0x59,0x43,0x51,0xFF,0x8E,0xF7,0x5A, + 0x83,0x59,0x22,0x51,0xCA,0xAA,0x6A,0xEB,0x84,0x61,0x22,0x51,0x2F,0xAF,0x0D,0xA9, + 0x84,0x61,0x43,0x51,0x4C,0xCB,0xAE,0xFE,0x63,0x59,0x23,0x51,0x00,0xD8,0x5E,0x69, + 0x64,0x59,0x22,0x51,0xEA,0x8A,0xFE,0xFF,0x84,0x59,0x22,0x51,0xDA,0x28,0xAA,0xAF, + 0x63,0x59,0x23,0x51,0xF8,0x68,0xF8,0x30,0x64,0x59,0x22,0x51,0x8B,0x09,0xD7,0x5E, + 0x64,0x59,0x02,0x49,0xFF,0xFA,0xFC,0xFF,0x43,0x51,0x02,0x49,0xAA,0xAB,0x6F,0xCB, + 0x43,0x51,0x03,0x49,0xFA,0xFA,0xAB,0x0F,0x64,0x59,0x03,0x49,0xBF,0xFB,0xA1,0xFB, + 0x44,0x51,0x02,0x49,0xAE,0xAA,0x6A,0x40,0x44,0x51,0xE3,0x48,0xEF,0xAB,0x8F,0xAD, + 0x23,0x51,0xE2,0x48,0xE2,0xE0,0xE0,0x68,0x24,0x59,0x02,0x49,0xA3,0x89,0x3B,0x39, + 0x43,0x59,0x03,0x51,0x29,0x03,0xA2,0x20,0x64,0x59,0x44,0x59,0xDB,0x21,0xA5,0x95, + 0x4A,0x93,0xA5,0x61,0xB5,0x25,0x25,0x2D,0xCB,0xA3,0x4B,0x9B,0x39,0xBD,0xBF,0xBF, + 0xCC,0xA3,0x8B,0x9B,0x0B,0xBC,0xBB,0xAF,0xEC,0xAB,0xCC,0xA3,0x0C,0x02,0xAE,0xCB, + 0xEC,0xAB,0xAB,0xA3,0xB8,0xAC,0xF8,0x7E,0xCC,0xA3,0x6A,0x9B,0xE8,0xAA,0x68,0xBA, + 0xAB,0xA3,0x49,0x93,0xFE,0xFB,0xAE,0xB2,0x8A,0x9B,0x29,0x93,0xAF,0x88,0xBA,0x5E, + 0x6A,0x9B,0x09,0x8B,0xC8,0x82,0xFC,0x74,0x49,0x93,0xE8,0x8A,0xAA,0xE8,0xEE,0xF7, + 0x29,0x93,0xC8,0x82,0xC2,0xE2,0x7A,0x5E,0x09,0x8B,0xC8,0x82,0x7F,0x70,0x7F,0x5D, + 0xE9,0x8A,0x87,0x7A,0xF0,0x78,0xF8,0xF2,0x87,0x7A,0x26,0x6A,0xDA,0xFA,0x78,0xB8, + 0x67,0x72,0x46,0x72,0x7E,0xB6,0xB5,0xAB,0x67,0x72,0x26,0x72,0xFC,0xBA,0x25,0xAD, + 0x46,0x72,0x05,0x6A,0x60,0xC2,0xE0,0x80,0x46,0x72,0xE5,0x69,0xDB,0x29,0x29,0x0A, + 0x46,0x72,0x05,0x6A,0xDA,0xCA,0xAE,0xAA,0x47,0x72,0x06,0x6A,0x00,0x89,0x00,0x08, + 0xA7,0x7A,0x46,0x72,0xED,0x25,0x2B,0x27,0xE8,0x82,0x87,0x7A,0x77,0xCF,0xFB,0xEB, + 0xA8,0x7A,0x64,0x51,0x5E,0x6A,0xE0,0xA0,0x84,0x51,0xE3,0x40,0x5F,0x7E,0x5C,0x58, + 0xE3,0x38,0xA2,0x38,0xC0,0xAA,0xE2,0xEA,0xE3,0x38,0xA1,0x30,0x0F,0x0F,0x2F,0x27, + 0x24,0x39,0xC2,0x38,0x2B,0xA7,0x9F,0xFE,0x03,0x41,0xA2,0x30,0xE0,0xE0,0x68,0x7B, + 0xE3,0x38,0xA2,0x30,0x25,0xAB,0xAB,0xB9,0x23,0x41,0xE3,0x38,0xBD,0xAF,0x0B,0xAB, + 0x23,0x41,0xC2,0x38,0xAE,0xFA,0xF2,0x6A,0x45,0x41,0xE3,0x38,0x3F,0xF5,0xFF,0x57, + 0x44,0x49,0xE3,0x38,0xE8,0xF8,0xEE,0xED,0x03,0x41,0xE3,0x38,0x88,0x7A,0x82,0xE0, + 0x03,0x41,0xE3,0x40,0x80,0x03,0xF2,0x61,0x03,0x41,0xC3,0x38,0x8A,0xAA,0x6B,0xDB, + 0x44,0x49,0xC3,0x38,0xAA,0xAB,0xAD,0xEF,0x86,0x51,0x03,0x41,0x2B,0xB9,0xB5,0xFD, + 0x65,0x49,0x03,0x41,0xA0,0xF8,0xEA,0x7A,0x24,0x41,0xC3,0x30,0xFE,0x58,0x7A,0xFA, + 0xE3,0x38,0x82,0x28,0x2E,0xBF,0xDA,0xE8,0xC2,0x30,0x81,0x28,0x80,0xEA,0xFE,0xFF, + 0xC3,0x30,0x81,0x28,0x2F,0x2F,0x2F,0x2B,0x03,0x39,0xC3,0x30,0x35,0xBB,0xBF,0x9F, + 0x24,0x41,0xE3,0x38,0x2F,0x27,0xAF,0xAB,0x65,0x49,0x03,0x41,0x2F,0xAF,0xAD,0x0F, + 0x65,0x49,0x23,0x41,0x6A,0x6A,0xF7,0xAB,0x44,0x49,0x03,0x41,0x2F,0xAF,0xFF,0xDC, + 0x45,0x49,0xE3,0x38,0x7E,0x6E,0xA0,0xAA,0x24,0x41,0xC3,0x38,0xBD,0xFF,0xFC,0xFC, + 0x03,0x39,0xE3,0x38,0xBC,0xFC,0xFA,0xBF,0x24,0x39,0xC3,0x30,0xA2,0xC2,0x8A,0xE6, + 0x03,0x39,0xC2,0x30,0xCA,0x4A,0x52,0x5A,0x03,0x39,0xA2,0x30,0xAA,0xA3,0x9F,0xFD, + 0x23,0x39,0xE3,0x38,0x02,0x2C,0xBD,0x7D,0x44,0x41,0xE3,0x38,0x80,0xFA,0x5E,0x55, + 0x24,0x41,0xC2,0x30,0x78,0xDA,0xFF,0xFF,0x03,0x39,0xC2,0x30,0x2B,0xAD,0xAB,0xFA, + 0x03,0x39,0xC2,0x30,0x80,0x20,0xEF,0xF7,0x03,0x39,0xC2,0x30,0xF6,0xA2,0xEE,0xE8, + 0x23,0x39,0xE3,0x30,0xAD,0xBD,0xF5,0xE9,0x23,0x39,0xE3,0x30,0x22,0xAA,0xBF,0x77, + 0x23,0x39,0xE2,0x30,0x8A,0x63,0xAB,0xBE,0x44,0x41,0xE3,0x38,0x3B,0xBD,0x79,0xDF, + 0x24,0x41,0xE3,0x38,0xDE,0xFA,0xFE,0x7C,0x24,0x39,0xE2,0x30,0x7B,0xFF,0xB0,0xAA, + 0x03,0x39,0xC2,0x30,0x5D,0xD7,0xF7,0xFC,0x44,0x41,0xE2,0x30,0x3D,0xF5,0xDF,0xB5, + 0x44,0x41,0x03,0x39,0xFA,0xBA,0xEB,0xFE,0x23,0x41,0xE3,0x38,0xFE,0xBE,0xAA,0xAE, + 0x03,0x41,0xE2,0x38,0xA0,0x50,0x5F,0x55,0x24,0x41,0xC2,0x38,0xAF,0x7E,0x63,0x8A, + 0x64,0x49,0x03,0x39,0xAD,0xAD,0xAB,0xAF,0x84,0x51,0x44,0x49,0x95,0x35,0x15,0xED, + 0xC5,0x59,0x64,0x51,0x3F,0xFE,0xFE,0x5F,0x67,0x72,0xA5,0x59,0x0B,0x25,0xD5,0x55, + 0x88,0x7A,0xE6,0x61,0xE8,0x08,0x03,0x25,0x87,0x7A,0xE5,0x61,0x57,0x5F,0xE0,0xC0, + 0x06,0x62,0xA5,0x59,0xAA,0x26,0x1C,0x78,0x67,0x72,0xA5,0x59,0xBF,0xAF,0x2A,0x2D, + 0x88,0x72,0xE5,0x61,0xDB,0xAA,0x2A,0x28,0xA8,0x7A,0x46,0x72,0xFD,0x75,0xAB,0x2B, + 0xA8,0x82,0x67,0x72,0xF9,0x4D,0xBF,0x1A,0xA8,0x7A,0x47,0x72,0x02,0x2B,0x2A,0xA6, + 0xB0,0xBC,0x88,0x7A,0x2D,0x3D,0x3D,0xBD,0xF4,0xDD,0xD1,0xC4,0x0B,0x0B,0x2B,0x2D, + 0x14,0xE6,0xD4,0xDD,0xA0,0x78,0xD7,0x55,0x14,0xE6,0xB3,0xD5,0x8A,0xAA,0xEF,0x5F, + 0x14,0xDE,0xB3,0xD5,0x82,0xEC,0x7E,0xDF,0xD4,0xD5,0x52,0xCD,0xE0,0xEA,0x6A,0x6A, + 0x73,0xC5,0xD1,0xBC,0xDE,0x9C,0xBE,0x3E,0xD3,0xCD,0x73,0xCD,0xF5,0xF5,0xFF,0xED, + 0x93,0xCD,0x52,0xC5,0x80,0xEA,0xE8,0x78,0x73,0xCD,0x11,0xBD,0xEA,0xE8,0x7E,0x7A, + 0x52,0xC5,0xF1,0xBC,0x2B,0x3F,0xD5,0xDF,0x73,0xCD,0x11,0xBD,0xA2,0x0A,0x22,0x2D, + 0x73,0xCD,0xD1,0xB4,0xE2,0xE2,0xE8,0x78,0x11,0xBD,0xB1,0xB4,0xE8,0xFA,0x7C,0xEB, + 0xD1,0xB4,0x4E,0xA4,0xAA,0x6A,0x78,0x58,0x2E,0xA4,0x4C,0x83,0xA8,0xF8,0xFC,0x5E, + 0xEE,0x9B,0x6C,0x8B,0x82,0x0A,0xA7,0x25,0x90,0xAC,0xEE,0x9B,0xAD,0x29,0x2F,0xAB, + 0x90,0xAC,0x2F,0xA4,0xC0,0xF8,0xDE,0x5F,0x4F,0xA4,0xEE,0x9B,0x80,0xAA,0xE6,0xBE, + 0x6F,0xAC,0x2E,0x9C,0x29,0x29,0x39,0x0E,0x90,0xAC,0x2E,0xA4,0x08,0x80,0x78,0xE8, + 0x90,0xAC,0x0E,0x9C,0x8A,0xE6,0xFD,0xF7,0x6F,0xAC,0x4E,0xA4,0x78,0x77,0xEA,0x35, + 0x63,0x59,0x02,0x49,0x00,0x28,0x0F,0x27,0x84,0x59,0x23,0x51,0xE8,0xFB,0x5A,0xFC, + 0x63,0x59,0x23,0x51,0xAB,0x0B,0x03,0x2F,0x84,0x61,0x23,0x51,0xAC,0xDA,0xBA,0xBC, + 0x63,0x59,0x01,0x51,0x2C,0xAE,0xAA,0xBF,0x43,0x59,0x23,0x51,0x8A,0x60,0x72,0xB8, + 0x84,0x59,0x22,0x51,0xFF,0x7F,0x7B,0x5F,0x63,0x59,0x23,0x51,0xCA,0xFF,0xDD,0xB7, + 0x63,0x59,0x02,0x49,0xA8,0x48,0xFA,0xFE,0x63,0x51,0x22,0x51,0x73,0x63,0xFB,0x5F, + 0x43,0x51,0x02,0x49,0xAB,0x43,0xE8,0xFE,0x44,0x51,0x02,0x49,0xE5,0x2D,0x2D,0x22, + 0x64,0x59,0x03,0x49,0x8A,0xEB,0x6F,0x7F,0x43,0x51,0xE2,0x48,0x8A,0xE8,0xEB,0xF7, + 0x44,0x51,0xE3,0x48,0x7A,0xFF,0xAA,0x8B,0x44,0x51,0xE2,0x48,0xED,0x3F,0xBB,0xFB, + 0x43,0x51,0x03,0x51,0xF7,0xDA,0xF2,0xB6,0xA5,0x61,0x23,0x51,0xF5,0x75,0xBD,0xDF, + 0x64,0x59,0x23,0x51,0xBA,0xDA,0xF8,0xF0,0x64,0x59,0x23,0x51,0xA6,0x35,0x1D,0xBD, + 0x2A,0x93,0x84,0x61,0x2D,0x09,0x0F,0x0B,0xAB,0xA3,0x4A,0x9B,0xAD,0x2D,0x2D,0x27, + 0xCC,0xA3,0x8B,0xA3,0x2F,0x3D,0xDE,0x08,0x0D,0xAC,0xAB,0xA3,0xAA,0xEE,0xF7,0x3F, + 0x2D,0xB4,0xCC,0xA3,0x55,0xBF,0xAD,0x0E,0x0D,0xAC,0xAB,0xA3,0x67,0xFA,0xE8,0xEE, + 0xEC,0xAB,0x8B,0x9B,0xFF,0xDE,0x5A,0xF8,0x8B,0x9B,0x28,0x93,0x7E,0xFE,0xF8,0x6C, + 0x29,0x93,0xE9,0x8A,0xF8,0xE0,0xEA,0xFA,0x09,0x8B,0xC8,0x8A,0x68,0xFB,0x7A,0x7A, + 0x09,0x8B,0xA7,0x82,0xDA,0x3E,0xAE,0x9A,0x08,0x8B,0xA8,0x82,0xBD,0xAA,0x2A,0x2A, + 0x09,0x8B,0x87,0x7A,0x62,0x70,0xF8,0xFA,0x87,0x7A,0x26,0x6A,0xBA,0xF6,0xF6,0xB8, + 0x67,0x72,0x05,0x72,0xC8,0xA2,0xA8,0xA8,0x67,0x72,0x26,0x72,0xA9,0xFE,0xFE,0xFB, + 0x46,0x72,0x26,0x6A,0x82,0xA8,0xFA,0x24,0x46,0x72,0x06,0x6A,0x0A,0x2A,0x1E,0xD8, + 0x46,0x72,0x05,0x6A,0x20,0xA6,0x8B,0x8B,0x87,0x82,0x26,0x72,0xD7,0xBF,0xFF,0x0B, + 0xA8,0x82,0x46,0x72,0x2D,0xA2,0x20,0x08,0xE8,0x82,0xA8,0x82,0x8D,0xF5,0xD5,0x57, + 0xC8,0x82,0x26,0x6A,0x6A,0xE8,0x8A,0x88,0x67,0x7A,0xE3,0x40,0x7E,0x7E,0xE8,0xE8, + 0x03,0x49,0xA2,0x30,0x7F,0xFF,0xEE,0xE0,0xE3,0x38,0xA2,0x30,0xBD,0xFF,0x6E,0x5A, + 0xE3,0x38,0x81,0x30,0x80,0x2A,0xAB,0xED,0xE3,0x38,0x81,0x28,0xE8,0xAA,0xB2,0xBF, + 0xE3,0x38,0xA2,0x30,0xAD,0x3E,0x3E,0xAF,0x24,0x41,0xC3,0x30,0x2B,0xBF,0xF6,0xFF, + 0x24,0x39,0xC2,0x30,0xF8,0xBA,0xEA,0xEF,0x04,0x39,0xC2,0x38,0x7A,0xBE,0xFF,0xFF, + 0x23,0x41,0xE3,0x38,0x2D,0x6D,0xD5,0x55,0x44,0x49,0xE3,0x38,0xB8,0xAB,0xEB,0xFD, + 0x24,0x41,0x03,0x41,0x5D,0xF0,0xCA,0x82,0x65,0x49,0xC2,0x38,0xDF,0xF3,0xAA,0x22, + 0x65,0x49,0xE3,0x40,0x77,0xFD,0x2A,0x8A,0x24,0x41,0xE3,0x38,0x2B,0x2B,0x2A,0x28, + 0x65,0x49,0x03,0x41,0x6F,0xCE,0xEA,0xEB,0x24,0x41,0xC3,0x30,0xAA,0xFC,0x78,0xFA, + 0x03,0x39,0xA2,0x30,0x7C,0xE0,0x82,0xAA,0xE3,0x30,0x82,0x28,0xDF,0x7F,0x9F,0x2E, + 0xE3,0x30,0xA2,0x28,0x95,0xB5,0xA7,0xAC,0x03,0x39,0xC3,0x30,0xDF,0xFA,0x8B,0xAB, + 0x23,0x41,0xE3,0x38,0x0F,0xBB,0xBD,0x0B,0xC6,0x51,0x23,0x41,0xB5,0xF5,0xBD,0x2B, + 0xA6,0x51,0x44,0x49,0x7E,0xDF,0xFC,0xE8,0x64,0x49,0x03,0x41,0xF8,0xD7,0xFE,0x80, + 0x44,0x49,0x03,0x41,0xEA,0xEB,0xEA,0xE6,0x03,0x41,0xC3,0x38,0xA8,0xBC,0x9E,0xFA, + 0xE3,0x38,0x03,0x31,0x22,0x83,0x82,0x00,0x03,0x39,0xC2,0x30,0x8A,0xFE,0x7F,0x55, + 0xE3,0x30,0xA2,0x30,0xB8,0xF6,0xFE,0x2A,0xE2,0x30,0xA1,0x30,0x8F,0x8A,0xA8,0x00, + 0x03,0x39,0xC2,0x30,0x62,0x7F,0xD7,0xFF,0xE2,0x30,0xC2,0x30,0xF6,0xFF,0xBE,0xFE, + 0x03,0x39,0xC2,0x30,0xFE,0xE2,0xE3,0xAD,0x03,0x39,0xC2,0x30,0xDF,0xFF,0xFA,0xA8, + 0x03,0x39,0xC2,0x30,0xBF,0x2E,0xAA,0xF2,0x03,0x39,0xC2,0x30,0xDE,0xFC,0xF6,0x3F, + 0x03,0x39,0xE3,0x30,0x2E,0x0F,0x6B,0xEA,0x24,0x39,0xC2,0x30,0xA2,0xBB,0x7F,0x5D, + 0x24,0x39,0xC2,0x30,0x23,0x0B,0x2D,0xB7,0x23,0x39,0xE3,0x38,0xDE,0x55,0xFF,0xF2, + 0x03,0x39,0xE3,0x30,0x60,0xC2,0xCA,0x7D,0x23,0x39,0xE3,0x38,0xBF,0xDD,0xDB,0x57, + 0x24,0x39,0xC2,0x30,0x7C,0xD8,0xFA,0xBF,0x44,0x49,0xC2,0x30,0xAD,0xAF,0xB5,0xBF, + 0x44,0x41,0x03,0x39,0x97,0xB5,0xD7,0xD5,0x44,0x41,0x03,0x39,0xD6,0xDF,0xB7,0x2D, + 0x44,0x41,0xC2,0x30,0xD7,0xBE,0xE8,0xA8,0x43,0x41,0xE3,0x38,0xFF,0xFF,0xCF,0x9B, + 0x65,0x49,0xE3,0x38,0x35,0xBF,0xF7,0xFF,0x85,0x51,0x03,0x39,0x8A,0x8B,0xBF,0xF5, + 0x84,0x51,0x44,0x49,0xAA,0xB2,0xDE,0xB7,0xA5,0x59,0x64,0x51,0x22,0x29,0x35,0x95, + 0x47,0x72,0xA5,0x59,0x09,0xAD,0xD5,0x55,0xA7,0x7A,0xA5,0x59,0x88,0x82,0xAB,0xA5, + 0x67,0x72,0x85,0x59,0x78,0x78,0xC8,0xA8,0x06,0x6A,0x64,0x51,0x27,0x35,0xFF,0xDE, + 0x67,0x72,0xA5,0x59,0x02,0x02,0x03,0x0D,0xA8,0x7A,0x46,0x6A,0x2F,0x2F,0xF7,0x5F, + 0xC9,0x82,0x67,0x7A,0xBA,0xE8,0xA2,0x01,0xC9,0x82,0x67,0x72,0xFF,0xDE,0xFA,0xB8, + 0x2E,0xAC,0xA8,0x7A,0x35,0x35,0xB5,0xBD,0xB4,0xDD,0x6F,0xB4,0x0B,0x2B,0xAD,0xAD, + 0xD3,0xDD,0x72,0xCD,0xA8,0x6F,0xF5,0xF5,0xB3,0xD5,0x72,0xCD,0x2A,0x0E,0xB7,0x57, + 0xD4,0xDD,0x93,0xD5,0xA3,0xEA,0xBD,0xF5,0xB3,0xD5,0x11,0xBD,0xE0,0xE0,0xF8,0x78, + 0x73,0xCD,0xF1,0xBC,0x27,0x05,0x35,0x3D,0xB3,0xD5,0x53,0xC5,0x8B,0x8A,0xFF,0x5F, + 0x93,0xCD,0x52,0xC5,0xE0,0xAA,0xEE,0xB5,0x73,0xCD,0xF1,0xB4,0xF2,0xEA,0xE8,0x88, + 0x52,0xC5,0xB0,0xB4,0xFF,0xD7,0xF6,0xB8,0x52,0xC5,0xF1,0xBC,0x2F,0xA9,0xFF,0x57, + 0x31,0xC5,0xB0,0xB4,0xE8,0xFC,0xD6,0x57,0xF1,0xBC,0x90,0xAC,0xC8,0xEF,0xFC,0xFB, + 0xD0,0xB4,0xAD,0x93,0xE0,0x62,0x7C,0x7A,0xAD,0x93,0xEA,0x7A,0xF8,0xFE,0xF7,0xD7, + 0x4F,0xA4,0x6C,0x8B,0xA5,0x2D,0x2F,0x0B,0x70,0xAC,0x2E,0xA4,0xAE,0x28,0x78,0x5B, + 0x4F,0xA4,0x0E,0x9C,0xC8,0x92,0xD3,0x5D,0xB0,0xAC,0x0E,0x9C,0xF5,0xFE,0xEF,0x2B, + 0x90,0xAC,0x2E,0xA4,0xAF,0x99,0xE2,0x20,0x6F,0xAC,0x2E,0x9C,0xC2,0xA2,0xDF,0x00, + 0x90,0xAC,0x0D,0x9C,0xD7,0xD7,0xBF,0x00,0xD0,0xB4,0x4E,0xA4,0xDD,0xBD,0x0B,0x8A, + 0x64,0x59,0x22,0x51,0xA5,0xEE,0xBA,0x2F,0x84,0x61,0x22,0x51,0xFF,0xE5,0xEB,0xA0, + 0x83,0x61,0x23,0x51,0xB7,0xAF,0x3F,0xBF,0x84,0x61,0x22,0x51,0xBE,0xFC,0x5A,0x5A, + 0x43,0x51,0x02,0x51,0xAA,0xE0,0xEA,0x21,0x63,0x51,0x22,0x51,0xF7,0x95,0xED,0xAF, + 0x43,0x59,0x22,0x49,0xDA,0xDE,0x0A,0x8A,0x63,0x51,0x23,0x51,0xAF,0xFE,0xEF,0xAF, + 0x43,0x51,0x02,0x49,0xF2,0xFE,0xE8,0xAE,0x22,0x51,0x02,0x49,0x2A,0x6E,0xDE,0xD7, + 0x43,0x51,0xE2,0x48,0x2E,0xA9,0xAE,0xAB,0x43,0x51,0x02,0x49,0x00,0xB8,0xBE,0x6E, + 0x43,0x51,0x03,0x49,0x78,0xEC,0x7E,0x97,0x64,0x59,0x03,0x49,0x55,0xD5,0x3F,0xFF, + 0x43,0x51,0x02,0x49,0xAB,0xFC,0xEB,0x5A,0x23,0x51,0xE2,0x48,0x6E,0x8B,0x3A,0x2A, + 0x44,0x59,0x03,0x51,0xB7,0x15,0xA7,0x2B,0x64,0x59,0x23,0x51,0xB3,0x8B,0xBB,0x2D, + 0x64,0x59,0x23,0x51,0xFA,0x7E,0xEA,0xEE,0xC5,0x69,0x23,0x51,0xF5,0xB5,0xF5,0x37, + 0x4A,0x9B,0x26,0x72,0x2D,0x0D,0x09,0x0B,0xAB,0xA3,0x6A,0x9B,0x0D,0xA9,0xEE,0xAB, + 0xEC,0xAB,0x8B,0xA3,0xAB,0x2B,0xA5,0xBD,0x0D,0xAC,0xCC,0xA3,0xBF,0xAF,0x2D,0x2D, + 0x2D,0xB4,0xEC,0xAB,0x89,0xA2,0x80,0x3F,0x2D,0xB4,0xCC,0xA3,0xFE,0xBA,0xAF,0xE2, + 0xED,0xAB,0x6B,0x9B,0x68,0xEC,0xF8,0xE8,0x8B,0x9B,0x29,0x93,0x7A,0xEB,0xFB,0x88, + 0x6B,0x9B,0x09,0x8B,0x5F,0x7F,0xFA,0xE0,0x29,0x93,0xC8,0x82,0x5E,0xDE,0x5E,0xB8, + 0xE8,0x8A,0xC8,0x82,0x30,0x0A,0x0B,0xFA,0x08,0x8B,0xC8,0x82,0x8A,0x28,0x77,0xF7, + 0xE8,0x82,0x87,0x7A,0x78,0x7A,0xFE,0x7C,0x87,0x7A,0x26,0x6A,0xBC,0xEC,0xD8,0x58, + 0x67,0x72,0x26,0x72,0x9A,0xFA,0x6F,0xAF,0x66,0x72,0x05,0x6A,0xD8,0xF6,0xFF,0xBE, + 0x46,0x72,0x26,0x6A,0x3E,0xA5,0xEE,0xA7,0x46,0x72,0x26,0x6A,0xFA,0xEB,0x8A,0x8A, + 0x67,0x7A,0x26,0x72,0xF5,0x0D,0x02,0x3B,0xA8,0x82,0x46,0x7A,0xAF,0x36,0xAE,0x02, + 0xC8,0x82,0x87,0x82,0x1F,0xAD,0xAB,0xAA,0xC8,0x82,0x68,0x7A,0xAA,0xBA,0xF6,0xB8, + 0xC9,0x82,0x67,0x72,0x6A,0xF2,0xF8,0xFA,0x88,0x7A,0xE5,0x61,0x58,0x72,0xE0,0xE0, + 0xC5,0x59,0xE2,0x38,0x5E,0x5A,0xFE,0xF8,0x03,0x41,0x81,0x30,0x7A,0xE8,0xA8,0xA0, + 0xC2,0x30,0x81,0x28,0xAF,0x5E,0x77,0xD4,0xC2,0x30,0x81,0x28,0x3F,0xAB,0x2B,0xAD, + 0xC2,0x30,0xA2,0x28,0x80,0xA0,0xF8,0xFF,0xE3,0x38,0xA2,0x30,0x08,0x0A,0xFB,0xFE, + 0x23,0x41,0xA1,0x30,0x83,0xAB,0xAF,0xFD,0xE3,0x38,0xA1,0x30,0xA0,0xE0,0xE8,0xFA, + 0xE3,0x38,0xC2,0x30,0xA8,0x2B,0x23,0x03,0x24,0x41,0xC2,0x38,0x2B,0xAF,0xFF,0x7F, + 0x24,0x41,0xC3,0x38,0x00,0x82,0xFD,0xFD,0x65,0x49,0x03,0x41,0x21,0x29,0xAB,0xA5, + 0x85,0x51,0x24,0x41,0xAA,0xE2,0xCF,0xB7,0x44,0x41,0x03,0x41,0xD6,0x6A,0x60,0xC2, + 0x44,0x49,0xE3,0x38,0xA2,0xEF,0x7F,0x7F,0x23,0x41,0xE3,0x38,0x70,0xBA,0xEE,0xB7, + 0xE3,0x30,0xA3,0x30,0x0A,0x00,0x80,0xF0,0xC2,0x30,0xA2,0x28,0x00,0xA0,0x90,0x97, + 0x04,0x39,0xC3,0x30,0x77,0xA5,0xB5,0xFD,0xC3,0x38,0xE3,0x30,0x7F,0xDF,0xDF,0xD5, + 0x44,0x49,0xC2,0x30,0xAB,0x2D,0xBD,0x3F,0x85,0x49,0x44,0x49,0x25,0x2D,0x2F,0xB5, + 0xA5,0x51,0x65,0x49,0x48,0x70,0x5A,0x5D,0x65,0x49,0x23,0x41,0xE0,0xE0,0xF8,0x78, + 0x44,0x41,0x03,0x41,0xBF,0xBF,0x7F,0x5F,0x03,0x41,0xE3,0x38,0x6A,0xEA,0x58,0xF0, + 0x03,0x39,0xC3,0x30,0xAF,0x3B,0xFB,0x7F,0xE3,0x38,0xC2,0x30,0x57,0x56,0xD7,0xDE, + 0xE3,0x38,0xC3,0x30,0xE1,0xB7,0x14,0x0D,0x03,0x39,0xC3,0x30,0xBF,0xBF,0xBE,0xAA, + 0x03,0x39,0xC2,0x30,0x9A,0xA8,0xBA,0xEE,0xE3,0x30,0xC2,0x30,0x7C,0x5C,0x5B,0x92, + 0x03,0x39,0xC2,0x30,0xE5,0x7B,0xBF,0xEB,0x03,0x39,0xC2,0x30,0xEB,0xB7,0x7C,0x7A, + 0x03,0x39,0xC2,0x30,0xE2,0xA3,0x5F,0x75,0xE3,0x38,0xC2,0x30,0x2A,0xFA,0xFA,0x03, + 0x03,0x39,0xC2,0x30,0xEA,0xBD,0xFB,0xF2,0xC4,0x38,0xE2,0x30,0xB7,0xF5,0x5F,0x7F, + 0x03,0x39,0xC2,0x30,0x3F,0xDF,0xFB,0xDA,0x24,0x39,0xC2,0x30,0x62,0xFE,0xFB,0xDD, + 0xE3,0x30,0xA2,0x30,0xCB,0xCA,0xF8,0xE8,0xE3,0x30,0xA1,0x30,0xA0,0xAB,0xAF,0xBF, + 0x03,0x39,0xC2,0x30,0x2F,0xBD,0xFD,0xDD,0x03,0x39,0xC2,0x38,0x0F,0xBB,0x9B,0x0D, + 0x23,0x41,0xE2,0x38,0x2A,0x2C,0x0F,0x0D,0x44,0x41,0x03,0x39,0x8F,0xBF,0xD7,0xFC, + 0x44,0x41,0x23,0x41,0x57,0x65,0xB7,0xF5,0x44,0x41,0xE3,0x38,0xBE,0xFA,0xF8,0x1A, + 0x44,0x41,0x03,0x39,0xEE,0xAF,0xFB,0x2F,0x23,0x41,0xC2,0x38,0xFA,0xDE,0xF8,0xF8, + 0x64,0x49,0x03,0x41,0x0D,0x0D,0xAD,0xFD,0x85,0x51,0x23,0x41,0x1F,0xBE,0xAE,0xED, + 0xA5,0x51,0x44,0x49,0xA2,0x23,0x25,0x3D,0xC5,0x61,0x43,0x49,0x2B,0xFF,0xDF,0xFF, + 0x26,0x6A,0x64,0x51,0x80,0xAB,0xAF,0xF5,0xE6,0x61,0x63,0x51,0x7E,0xEA,0xC2,0x8B, + 0x26,0x6A,0x84,0x59,0x2D,0x25,0x9F,0xBF,0xA8,0x7A,0x26,0x6A,0x3F,0xAF,0x2B,0x2D, + 0xC9,0x82,0x67,0x72,0x8A,0xEA,0xF6,0x7F,0xC9,0x82,0x88,0x7A,0x6B,0xA2,0xBE,0xF7, + 0xAB,0x93,0xA8,0x7A,0x35,0xB5,0xF5,0xF5,0x52,0xCD,0xEC,0xA3,0x0B,0x2B,0xAD,0xAD, + 0x93,0xD5,0x11,0xC5,0x0A,0x2B,0xAD,0xB5,0x93,0xD5,0x52,0xCD,0xF4,0x54,0x7B,0xFB, + 0x93,0xCD,0x31,0xC5,0x8A,0xAE,0xAF,0xFF,0x93,0xD5,0xF0,0xBC,0x78,0x58,0x5F,0x57, + 0x93,0xCD,0xF1,0xBC,0xAD,0x29,0x8F,0x2A,0x73,0xCD,0x11,0xBD,0xF8,0x78,0xE0,0x60, + 0x52,0xC5,0xF1,0xBC,0x0E,0xBF,0xF7,0x57,0x73,0xCD,0xD1,0xB4,0xA8,0x28,0xAF,0xFD, + 0x52,0xC5,0x11,0xBD,0x78,0xAA,0xCF,0x6F,0x11,0xBD,0x6F,0xAC,0xA8,0xF8,0x78,0x5E, + 0xB0,0xB4,0x4F,0xA4,0xA0,0x92,0xBE,0x17,0xB0,0xB4,0x90,0xAC,0x4A,0x32,0x52,0x76, + 0x4F,0xA4,0xC9,0x7A,0xE0,0xF8,0x58,0x58,0x2E,0x9C,0xEA,0x7A,0xB5,0xBD,0x25,0x0D, + 0xD0,0xB4,0xEE,0x9B,0xFD,0xED,0xAB,0x0A,0xF1,0xBC,0x4E,0xA4,0x55,0x55,0xBD,0x0A, + 0x32,0xBD,0x0E,0x9C,0xFD,0xAE,0xA2,0x80,0xD0,0xB4,0x6F,0xAC,0xBD,0xAA,0xA8,0x20, + 0xD0,0xB4,0x6F,0xAC,0xA2,0xAF,0xDF,0xFE,0xB0,0xAC,0x6F,0xAC,0x00,0xAE,0xDC,0xDE, + 0xB0,0xB4,0x4F,0xA4,0xA2,0xE2,0xFB,0xE2,0xB0,0xAC,0x6F,0xAC,0xCB,0xD5,0xD7,0xF7, + 0x84,0x59,0x43,0x51,0xBF,0xBA,0xE2,0xFE,0x84,0x59,0x43,0x59,0x0A,0x8B,0x0F,0xB7, + 0x63,0x59,0x23,0x51,0x0F,0x8A,0xEE,0xFC,0x63,0x59,0x02,0x51,0xFA,0xEA,0xEA,0xFB, + 0x43,0x51,0x02,0x49,0x00,0x7F,0x6F,0x7F,0x64,0x51,0xE2,0x48,0x0A,0xA5,0xBF,0xAE, + 0x63,0x51,0x22,0x51,0xBF,0xFD,0x7F,0x53,0x43,0x51,0x22,0x51,0xC8,0x70,0x70,0x7A, + 0x43,0x51,0x02,0x49,0x8E,0xE2,0x62,0xD8,0x43,0x51,0x02,0x49,0x97,0x8F,0xBF,0xEB, + 0x44,0x51,0x03,0x49,0xEB,0x2A,0x2E,0x01,0x43,0x51,0x02,0x49,0xAE,0x27,0xAD,0xAD, + 0x64,0x51,0x02,0x49,0xF5,0x37,0xD7,0x5D,0x43,0x51,0x03,0x51,0xEA,0xC2,0xC3,0xFB, + 0x43,0x51,0xE2,0x48,0x78,0xEB,0xBE,0xFA,0x64,0x59,0x03,0x51,0xF7,0xAF,0xAF,0x8B, + 0x64,0x59,0x23,0x51,0xAA,0x2A,0xEA,0xEA,0x64,0x59,0x23,0x51,0x2D,0xAE,0xDE,0xFD, + 0x44,0x59,0x23,0x59,0x08,0x20,0x00,0xC0,0xE5,0x69,0x03,0x51,0xBF,0xBF,0x3D,0x35, + 0x4A,0x9B,0x67,0x7A,0x09,0x09,0x0B,0x0B,0xAB,0xA3,0x6B,0x9B,0x23,0xAB,0xAF,0x2E, + 0xEC,0xAB,0x8B,0x9B,0xFF,0xFD,0x2F,0xBB,0xEC,0xAB,0xAC,0xA3,0x2F,0xBF,0xAF,0xAF, + 0x0D,0xAC,0xCC,0xA3,0x3A,0xAF,0xBB,0xBF,0x0D,0xAC,0xCC,0xAB,0x60,0x82,0xA2,0xEB, + 0x0D,0xAC,0xAB,0xA3,0x7F,0xAE,0xBF,0x8A,0xEC,0xAB,0x8B,0x9B,0x5F,0xF2,0xE2,0xA0, + 0xAB,0xA3,0x4A,0x93,0x75,0x7E,0xFE,0xA0,0x6A,0x9B,0xE9,0x8A,0xDE,0x6E,0xA8,0x88, + 0x29,0x93,0xC8,0x82,0x77,0xFE,0xAA,0xA0,0xE8,0x8A,0xC8,0x82,0xCB,0xBF,0xD4,0xF8, + 0xE9,0x82,0x67,0x72,0xF0,0x62,0x72,0x7C,0x67,0x72,0x26,0x72,0xD8,0xF8,0xFC,0x7F, + 0x46,0x72,0x06,0x6A,0x2A,0x0A,0x28,0x6A,0x46,0x72,0x26,0x6A,0xD8,0x28,0x88,0x2B, + 0x46,0x72,0x05,0x6A,0xAC,0x8A,0x88,0x60,0x66,0x72,0x05,0x6A,0xFB,0xBE,0xEF,0x81, + 0x87,0x7A,0x26,0x72,0x9B,0x3B,0x2B,0x02,0xE8,0x8A,0x88,0x7A,0x9F,0x95,0xBF,0xAB, + 0xC8,0x8A,0xA8,0x7A,0x9F,0xFE,0xFC,0x7B,0xE9,0x8A,0x88,0x7A,0xFA,0xA8,0xA2,0xEA, + 0xA8,0x82,0x68,0x7A,0x78,0xA0,0x80,0xE8,0x87,0x7A,0x26,0x6A,0x62,0x20,0xA0,0x62, + 0x46,0x6A,0x43,0x49,0x5E,0x58,0x68,0x78,0x23,0x49,0xA2,0x30,0xFA,0x7A,0xFC,0x78, + 0xA2,0x30,0x61,0x28,0xF0,0xFA,0xDE,0xD8,0xA2,0x28,0x61,0x28,0x2B,0x2F,0x2B,0xA2, + 0xC2,0x30,0xA2,0x28,0xD7,0xED,0xAF,0x6D,0xC2,0x30,0x82,0x28,0x08,0xAE,0xBB,0xDB, + 0xC2,0x30,0xA2,0x30,0x0F,0x2A,0x1F,0xD7,0xC2,0x30,0xA2,0x30,0xDC,0x54,0x5A,0xF2, + 0xE2,0x38,0xA2,0x30,0x0F,0xED,0xBD,0xF7,0xE3,0x38,0xC3,0x38,0xE0,0xE0,0xFF,0x3B, + 0x03,0x41,0xE3,0x38,0xBD,0xBD,0x05,0xA2,0x44,0x49,0xE3,0x38,0x2B,0x3F,0xDF,0x5F, + 0x44,0x49,0x03,0x41,0x82,0xEE,0xF5,0x75,0x44,0x49,0x03,0x39,0x2A,0xEB,0xAD,0x35, + 0x45,0x49,0xE3,0x38,0x5E,0xDF,0xFC,0x7C,0x03,0x39,0xA2,0x38,0x2A,0x28,0x28,0xAB, + 0x03,0x39,0xA2,0x30,0x7A,0x7C,0xE8,0xA0,0xC3,0x30,0x81,0x28,0x2B,0xA9,0x7F,0xD6, + 0xE3,0x30,0x82,0x28,0x3A,0x2B,0xAF,0xBD,0x04,0x39,0xC2,0x30,0xE3,0xA3,0x77,0x7F, + 0x44,0x49,0xC2,0x30,0x35,0xA7,0x35,0xB5,0x85,0x49,0x03,0x41,0x2B,0xAE,0xDF,0x55, + 0x64,0x49,0x03,0x41,0x88,0xFE,0xF5,0xD7,0x64,0x49,0xE3,0x38,0xE0,0xF0,0xAF,0xDF, + 0x24,0x41,0xE3,0x38,0xEB,0xEB,0x5E,0x57,0x03,0x39,0xA2,0x30,0xA2,0xF2,0xFA,0xDA, + 0xE3,0x38,0xA2,0x30,0xEA,0xBA,0x2A,0xB7,0x04,0x39,0xC3,0x30,0xB5,0xBF,0x3E,0x97, + 0x03,0x39,0xC3,0x30,0xFF,0x7E,0xEA,0xAB,0x03,0x39,0xC3,0x30,0xAB,0xFB,0xBF,0xBD, + 0x03,0x39,0xC3,0x30,0xA2,0xAA,0xB8,0xDA,0x03,0x39,0xC2,0x30,0x2A,0x0A,0xBA,0xFE, + 0xE3,0x38,0xC2,0x30,0x2F,0xD7,0x57,0x55,0xE3,0x30,0xA2,0x30,0xA8,0x3F,0x2F,0x2F, + 0x03,0x39,0xA2,0x28,0xFA,0xFA,0xF0,0x72,0xE3,0x38,0xC2,0x30,0x0D,0xAD,0x95,0x25, + 0x03,0x41,0xE3,0x30,0x53,0x5D,0xF5,0xF5,0x24,0x41,0xC3,0x30,0xF7,0xBF,0xBA,0xAE, + 0x03,0x39,0xC2,0x30,0x7E,0x7E,0xBC,0xB8,0x03,0x39,0xC2,0x30,0xBF,0xBB,0xA8,0xC0, + 0x03,0x39,0xC2,0x30,0x78,0xEA,0xE8,0x82,0x03,0x39,0xA1,0x30,0xF7,0xBB,0xAA,0xA0, + 0x03,0x39,0xC2,0x30,0xFD,0x5F,0xCB,0x8A,0x03,0x39,0xC2,0x38,0x0B,0x03,0x0B,0xAB, + 0x44,0x41,0xE3,0x38,0xAD,0x3F,0xAB,0xAB,0x64,0x49,0x23,0x41,0xB8,0xFE,0xBE,0x6F, + 0x64,0x49,0x23,0x41,0x56,0x78,0x5F,0x5F,0x23,0x41,0x03,0x39,0xFB,0xDF,0xDD,0x36, + 0x23,0x41,0x03,0x39,0xEE,0x7B,0xBF,0xAE,0x03,0x41,0xE3,0x30,0xA2,0x8A,0x00,0x28, + 0x24,0x41,0xE2,0x38,0x16,0xF7,0xBE,0xAF,0x44,0x49,0xE2,0x38,0x3E,0x37,0x37,0xFF, + 0xA5,0x51,0x23,0x49,0xBD,0xBB,0x2B,0x8F,0x84,0x51,0x44,0x49,0xEB,0xEE,0xF8,0xE8, + 0xA5,0x59,0x44,0x49,0x2F,0xB5,0x5F,0x5F,0xA4,0x59,0x64,0x51,0x2B,0xAE,0x29,0x0B, + 0x06,0x62,0xA4,0x59,0x2F,0xAD,0xBB,0xEB,0xC8,0x7A,0x06,0x62,0xAD,0x29,0x2D,0x25, + 0x09,0x83,0x67,0x72,0x7E,0x5A,0x6A,0xA2,0xC8,0x82,0x67,0x72,0xAE,0x8B,0xBD,0xD5, + 0x2A,0x83,0x87,0x7A,0x3D,0xFF,0xF5,0xF5,0xAF,0xBC,0x4A,0x93,0x0B,0x0B,0x29,0x0D, + 0x52,0xCD,0xAF,0xB4,0x0B,0x8E,0x2F,0xAD,0x72,0xCD,0x32,0xC5,0x82,0x2B,0x89,0xA5, + 0x93,0xCD,0x31,0xC5,0xF7,0xFF,0xE7,0x89,0x32,0xC5,0xF1,0xBC,0xF8,0x1F,0x3C,0xBC, + 0x94,0xCD,0x52,0xC5,0x89,0x2B,0x0B,0x23,0x94,0xCD,0x32,0xC5,0x78,0xE8,0xE0,0x58, + 0x32,0xC5,0xF1,0xBC,0x7B,0x50,0xFC,0x96,0x11,0xBD,0xD0,0xB4,0xEC,0xEA,0xD0,0xDB, + 0x32,0xC5,0x90,0xB4,0x22,0xAA,0xBB,0x77,0xF1,0xBC,0x4F,0xA4,0x7C,0x78,0x7A,0xFF, + 0x8F,0xAC,0x4F,0xA4,0xB7,0xBD,0x2A,0x0A,0xD0,0xB4,0x4F,0xA4,0x7E,0x7B,0x6B,0x8A, + 0xD0,0xB4,0xEA,0x7A,0x5E,0xFE,0xAA,0x00,0xF0,0xBC,0x8C,0x8B,0x25,0x2B,0x02,0x08, + 0x11,0xBD,0xB0,0xB4,0xB9,0x8E,0x80,0x7F,0x11,0xBD,0xD0,0xB4,0x22,0x0A,0xBA,0xB5, + 0x52,0xC5,0x11,0xBD,0x6D,0xBB,0x2D,0x3D,0x51,0xC5,0xD0,0xB4,0x5F,0x5A,0xFA,0xF8, + 0x11,0xBD,0x8F,0xAC,0x57,0x7E,0xFA,0xB0,0xF1,0xBC,0x8F,0xAC,0x7F,0x7F,0xEF,0xE2, + 0xB0,0xB4,0x6F,0xAC,0x5D,0x9F,0x23,0xC2,0x90,0xAC,0x6F,0xAC,0x55,0x2B,0x7A,0x7B, + 0x64,0x59,0x43,0x51,0x8E,0x98,0xF6,0x57,0x64,0x59,0x23,0x51,0xF0,0x7A,0x5F,0xDB, + 0x64,0x59,0x23,0x51,0xDB,0xE5,0xA3,0xCB,0x43,0x51,0x22,0x51,0xF5,0x74,0x74,0x08, + 0x43,0x51,0x02,0x49,0xAB,0xDA,0x38,0x2F,0x43,0x51,0x23,0x51,0x8E,0xAF,0x9C,0x58, + 0x63,0x51,0x02,0x49,0xEF,0x8F,0xAF,0xFE,0x43,0x51,0xE2,0x40,0xA8,0xC2,0xEA,0x7B, + 0x23,0x49,0xE2,0x48,0xD4,0xBA,0xA7,0x89,0x43,0x51,0x03,0x49,0x0B,0x8F,0x85,0xD5, + 0x44,0x51,0x03,0x49,0xEA,0xEA,0x5F,0x57,0x23,0x51,0x03,0x49,0x0D,0x8F,0xDC,0x2E, + 0x43,0x59,0x03,0x51,0xDD,0x3B,0x68,0xFA,0x23,0x51,0xE3,0x48,0x82,0xB2,0xF8,0xFB, + 0x44,0x59,0x03,0x51,0x55,0x35,0xA9,0x3F,0x64,0x59,0x23,0x59,0xAB,0xE0,0x68,0xCA, + 0x64,0x59,0x23,0x51,0x78,0xE2,0xFA,0x5E,0x44,0x59,0x23,0x51,0xFD,0xDD,0x74,0x05, + 0x44,0x59,0x03,0x51,0xEB,0xAF,0x83,0x80,0x87,0x82,0x23,0x51,0xB5,0xB5,0xB5,0x2D, + 0x8B,0xA3,0xC8,0x8A,0x29,0x09,0x09,0x0B,0xCC,0xAB,0x6A,0x9B,0xBF,0xA7,0xAD,0xAA, + 0xCC,0xA3,0xAB,0xA3,0x0B,0xB9,0x7B,0xEB,0xEC,0xAB,0x8B,0x9B,0x2A,0x8A,0xAD,0xEE, + 0x0D,0xAC,0xAB,0xA3,0x28,0x0E,0x37,0xD7,0x2D,0xB4,0xCC,0xA3,0xA8,0xA2,0xCB,0xED, + 0x0D,0xAC,0xCC,0xAB,0xAA,0xF0,0xE2,0x6D,0x0D,0xAC,0xCC,0xAB,0xE2,0xFB,0xE8,0xDA, + 0xEC,0xAB,0xAB,0xA3,0x56,0x68,0x00,0x6E,0xCC,0xAB,0x6A,0x9B,0x5F,0xAA,0x80,0xFE, + 0xAB,0xA3,0x09,0x8B,0x5A,0x7A,0xF0,0x78,0x09,0x93,0x87,0x7A,0xAA,0xF8,0x7C,0x7E, + 0xA8,0x82,0x46,0x72,0xF0,0xE8,0xFF,0x57,0x67,0x7A,0x26,0x72,0x76,0x87,0x37,0xF7, + 0x46,0x72,0x26,0x6A,0xA8,0xC0,0x80,0x20,0x46,0x72,0x26,0x6A,0xAD,0x9F,0xBA,0xA3, + 0x46,0x72,0x05,0x6A,0x32,0x2B,0x0A,0x2F,0x87,0x7A,0x46,0x72,0x79,0xDD,0xFD,0x8B, + 0xC8,0x82,0x67,0x72,0x3D,0x0F,0x09,0x02,0xC8,0x82,0x87,0x7A,0xA8,0xB0,0xFA,0xF2, + 0xC8,0x82,0x67,0x7A,0xA8,0xAA,0xAA,0x5A,0xC9,0x82,0x25,0x6A,0x80,0xAB,0xFE,0x56, + 0x88,0x7A,0x26,0x6A,0x80,0xFA,0x5F,0x5D,0x67,0x7A,0x05,0x6A,0x80,0xFA,0x5B,0xD7, + 0x26,0x6A,0xA4,0x59,0x70,0x60,0xE0,0xAA,0xA4,0x59,0xC2,0x38,0x5F,0x7E,0xDE,0x78, + 0xC2,0x38,0x82,0x30,0x56,0x5E,0x7C,0x5C,0xA2,0x30,0x81,0x28,0xAA,0xAF,0x22,0x29, + 0xC2,0x30,0xA2,0x28,0x6D,0xE8,0xC0,0xE0,0xC2,0x30,0x81,0x28,0x7B,0xEA,0xA2,0xAA, + 0xC3,0x30,0x81,0x28,0xFA,0xFB,0xBC,0x2A,0xC2,0x30,0xA2,0x30,0xEF,0xAF,0x0B,0x0B, + 0xE3,0x38,0xA2,0x30,0xF5,0xAF,0x2B,0x02,0x03,0x39,0xC2,0x30,0x3D,0xAF,0xAB,0x0E, + 0x03,0x39,0xC2,0x38,0x9C,0x5C,0x7E,0x7E,0x03,0x41,0xC3,0x38,0x8A,0xC9,0xED,0xAD, + 0x44,0x49,0xE3,0x38,0xAD,0xAD,0x0D,0x2B,0x65,0x49,0x03,0x41,0xF5,0xAE,0xAA,0xCA, + 0x24,0x41,0xE3,0x38,0x54,0x5C,0x8C,0x80,0x24,0x41,0xE3,0x38,0x55,0x7D,0x6A,0x80, + 0x03,0x39,0xC2,0x30,0xAB,0x9D,0x97,0xBA,0xE3,0x38,0x82,0x28,0x7C,0xF0,0xF8,0xA0, + 0xC2,0x30,0x82,0x28,0x9F,0xDF,0xD7,0xB6,0xC2,0x30,0xA2,0x28,0x00,0xB3,0x7F,0xD6, + 0xE3,0x38,0x82,0x28,0x2A,0xAA,0xAD,0xBF,0x23,0x41,0xC3,0x38,0xAF,0x3D,0x9D,0xBD, + 0x44,0x49,0xE3,0x38,0xDF,0xFF,0xC0,0x8A,0x24,0x41,0xC2,0x38,0xEE,0xF2,0xFA,0xF8, + 0xE3,0x38,0x82,0x30,0x30,0xFE,0xF6,0xFF,0xC3,0x30,0x82,0x28,0x20,0xAB,0xA7,0xDF, + 0xC2,0x30,0xA2,0x28,0x0E,0x2E,0x0A,0x83,0xE3,0x30,0xA2,0x28,0x2F,0xB7,0x7F,0xFF, + 0xE3,0x30,0xA2,0x28,0x0B,0x0A,0x2F,0xA3,0x03,0x31,0xA2,0x28,0x8A,0xAA,0xBE,0xDD, + 0xE3,0x30,0xA2,0x30,0x20,0x22,0xB6,0xBF,0x03,0x39,0xC2,0x30,0xFF,0x9B,0xFA,0xE8, + 0x03,0x31,0xA2,0x30,0xDF,0xFC,0xEB,0xEB,0xE3,0x38,0xC2,0x30,0xA5,0xA5,0x2A,0x08, + 0x03,0x39,0xC2,0x30,0x53,0xEB,0xBF,0xFC,0x03,0x39,0xC2,0x30,0xA5,0x95,0x97,0x55, + 0x03,0x39,0xA2,0x30,0x2A,0x9A,0x2A,0xA2,0x03,0x39,0xE3,0x38,0xBC,0xD7,0x57,0xDE, + 0x24,0x41,0xE3,0x38,0xDA,0x7D,0xF2,0x4A,0x03,0x41,0xE2,0x38,0x79,0xAB,0x3A,0xA2, + 0x24,0x41,0xE2,0x38,0xFF,0x6B,0xE8,0x0F,0x03,0x41,0xE3,0x38,0xBD,0xA7,0xFD,0x7B, + 0x23,0x41,0xC2,0x30,0xB7,0xBE,0x2A,0xAA,0x24,0x41,0xE2,0x38,0x97,0xF7,0xB9,0x8B, + 0x64,0x49,0x03,0x41,0xEF,0xB7,0x25,0x0D,0x64,0x49,0x03,0x39,0xEE,0x5A,0xFA,0xF2, + 0x03,0x41,0x44,0x39,0xAA,0xFA,0x2B,0xFF,0x24,0x41,0xE2,0x38,0x2A,0x8E,0xFB,0xDE, + 0x23,0x41,0x03,0x39,0x03,0x3F,0x6F,0xD7,0x23,0x41,0xE3,0x38,0x2E,0x08,0xAF,0xBF, + 0x24,0x41,0xE2,0x38,0x2E,0x2A,0x2F,0xB7,0x44,0x49,0xE2,0x38,0xAA,0x0A,0xF2,0x7E, + 0x85,0x51,0x03,0x41,0x2B,0x0F,0x3D,0xBD,0xA5,0x51,0x44,0x49,0x7E,0xAE,0x8B,0xAD, + 0xE6,0x59,0x64,0x51,0x5D,0xF9,0xAA,0x2C,0xC5,0x59,0x64,0x51,0x8D,0xBD,0x9F,0x3F, + 0x26,0x6A,0xE5,0x61,0x75,0x35,0x9F,0xA2,0xA8,0x72,0x06,0x6A,0x2D,0xBF,0xEF,0xBF, + 0xE9,0x82,0x87,0x72,0xEB,0xFB,0x3D,0xED,0xC8,0x82,0x67,0x72,0xD6,0x5A,0xF8,0x60, + 0xA8,0x7A,0x46,0x72,0x0A,0x2D,0x37,0x9E,0x6E,0xAC,0xA8,0x7A,0x0F,0x2B,0x2D,0x2D, + 0x11,0xC5,0x8E,0xB4,0x29,0xAF,0x2D,0x29,0xB3,0xD5,0x11,0xBD,0xFD,0xB5,0xAF,0x0B, + 0xB3,0xD5,0x32,0xC5,0xAB,0xEB,0xFA,0x78,0x32,0xC5,0xAF,0xAC,0xA8,0xAA,0xAF,0xB5, + 0xB4,0xD5,0x32,0xC5,0xA9,0xA9,0xA9,0x8F,0x73,0xCD,0x33,0xC5,0x70,0xE8,0xA8,0xE8, + 0x53,0xC5,0x11,0xBD,0xF7,0x5A,0x58,0x78,0x11,0xBD,0xB0,0xB4,0x7F,0x7E,0x7E,0x5C, + 0xB0,0xB4,0x0E,0xA4,0xE0,0xFA,0xFC,0xBE,0xB0,0xB4,0x2E,0xA4,0xAF,0xAD,0xAB,0x8A, + 0x11,0xBD,0x6F,0xAC,0x9D,0x2F,0x0B,0xAA,0xF1,0xBC,0x6F,0xAC,0xA2,0x88,0x68,0x5E, + 0xD1,0xB4,0x4E,0xA4,0x80,0xFE,0x55,0x55,0xB0,0xB4,0x2E,0xA4,0x80,0xAF,0xBF,0x55, + 0xB0,0xB4,0x0E,0x9C,0xA0,0xAA,0x7E,0x57,0xF1,0xB4,0xCD,0x9B,0x2A,0xBA,0xFF,0xD5, + 0xF1,0xBC,0x4E,0xA4,0x00,0xAB,0xF5,0x55,0x11,0xBD,0x6F,0xAC,0x00,0x8B,0xBF,0xF5, + 0x32,0xC5,0x8F,0xAC,0xAA,0x02,0xBA,0xDD,0x32,0xC5,0xD0,0xB4,0x7A,0xBC,0xF6,0x9B, + 0x11,0xBD,0xB0,0xB4,0x5F,0x08,0x20,0x00,0x32,0xC5,0x8F,0xAC,0x55,0xEC,0x88,0x0A, + 0x64,0x59,0x23,0x51,0xFE,0xDC,0x55,0xD5,0x43,0x51,0x23,0x51,0xCB,0x62,0xBC,0x75, + 0x63,0x51,0x03,0x49,0x8D,0xFE,0x5A,0xF7,0x43,0x51,0x02,0x49,0x0C,0xBA,0xFE,0x8A, + 0x43,0x51,0x03,0x51,0x2A,0x8A,0x4A,0xC8,0x64,0x59,0x03,0x49,0xEB,0xB2,0xFB,0x6B, + 0x43,0x51,0xE2,0x48,0xE2,0x82,0xF8,0x6E,0x43,0x51,0xE2,0x40,0xDB,0xEE,0xFB,0xA3, + 0x43,0x51,0x03,0x49,0x7F,0x7F,0xFB,0x8B,0x44,0x51,0x02,0x49,0xFD,0xAB,0x8A,0xB8, + 0x23,0x51,0x02,0x49,0x5E,0x7F,0xA2,0x02,0x43,0x51,0xE3,0x48,0x8A,0xE2,0xA0,0xA8, + 0x44,0x59,0xE2,0x50,0xEA,0x62,0xFA,0xEA,0x44,0x59,0xE2,0x48,0xBD,0x2D,0xAA,0x02, + 0x85,0x61,0x23,0x51,0xFD,0x7F,0x5E,0x78,0x64,0x59,0x23,0x51,0xB9,0xB1,0x22,0x83, + 0x64,0x59,0x23,0x51,0xF4,0xFE,0xFF,0xAD,0x64,0x61,0x23,0x51,0xBD,0xA9,0xCB,0xFB, + 0x64,0x59,0x23,0x51,0xAC,0xBF,0xF5,0x2F,0xA8,0x82,0x44,0x59,0x3D,0x3D,0x2D,0x2D, + 0xAB,0xA3,0x09,0x93,0xAF,0xAD,0x0D,0x2B,0xCB,0xA3,0x8B,0x9B,0x1F,0xAD,0xAB,0xAA, + 0xCC,0xA3,0x8B,0xA3,0x83,0xA2,0xD2,0xEA,0xCB,0xA3,0x6A,0x9B,0xA2,0xAA,0xEB,0x7F, + 0xAB,0xA3,0x4B,0x9B,0x00,0xE0,0xEB,0x5F,0xAC,0xA3,0x4B,0x9B,0x82,0xAB,0xEB,0xFD, + 0xCC,0xAB,0x2A,0x93,0x02,0xAA,0xBB,0x5F,0xCC,0xA3,0x29,0x93,0x00,0xAA,0xDF,0x55, + 0xAB,0xA3,0x09,0x8B,0x80,0xEA,0xFE,0xD5,0x6A,0x9B,0xC8,0x82,0x00,0xEA,0xFE,0x5F, + 0x29,0x93,0x67,0x7A,0xA0,0xF8,0xFA,0x5F,0xC8,0x82,0x67,0x72,0xDE,0x5F,0xFF,0xFF, + 0x67,0x7A,0x46,0x72,0x53,0xCC,0x7A,0x74,0x67,0x72,0x26,0x72,0xCE,0x4A,0x6A,0x7F, + 0x46,0x72,0x25,0x6A,0xA8,0x90,0x7B,0x57,0x46,0x72,0x05,0x6A,0xAE,0xA2,0xAF,0x3F, + 0x67,0x72,0x06,0x6A,0xBF,0xA6,0xAF,0xAA,0xE9,0x82,0x46,0x72,0x97,0xBD,0xAE,0x23, + 0xE8,0x82,0x87,0x7A,0xAF,0xFA,0xDA,0x74,0xC8,0x82,0x46,0x72,0x88,0xA8,0xAA,0x7A, + 0xA8,0x82,0x05,0x6A,0xE8,0xF8,0x7E,0x5F,0x67,0x72,0xC5,0x61,0xE8,0x6A,0x7F,0x5F, + 0x05,0x6A,0xA4,0x59,0xE0,0x6D,0xFE,0x5F,0x05,0x6A,0x84,0x59,0x02,0xAB,0x9E,0xFF, + 0x25,0x62,0xC5,0x61,0x6F,0xDF,0xFD,0xED,0xC5,0x61,0xE3,0x40,0x78,0x78,0xE8,0x80, + 0x04,0x41,0x61,0x28,0x5E,0x5E,0x78,0x78,0xC2,0x30,0x61,0x28,0x3F,0x2D,0x2F,0xAD, + 0xE3,0x38,0xA2,0x30,0x7F,0xF2,0xAE,0x3F,0xE3,0x38,0xA2,0x30,0x7F,0xFB,0x8A,0xA0, + 0x04,0x39,0xC3,0x30,0xD5,0xDD,0xF5,0x0A,0xE3,0x38,0xA2,0x30,0xAF,0xAE,0x5E,0xF8, + 0x03,0x39,0xC2,0x38,0xA9,0x2D,0x09,0x2B,0xE2,0x40,0x23,0x39,0xFC,0xFE,0xFF,0xAF, + 0x03,0x41,0xA2,0x38,0xE8,0xA8,0x2C,0x2E,0x24,0x41,0xC3,0x38,0xA5,0x2F,0x8A,0xA0, + 0x65,0x49,0x03,0x41,0xAD,0xB5,0x0D,0xEB,0x65,0x49,0x24,0x41,0xAB,0x9F,0xDE,0x9B, + 0x44,0x49,0x23,0x41,0x54,0x77,0x5F,0x55,0x44,0x41,0x03,0x41,0xE2,0xF2,0xFF,0xB7, + 0x44,0x41,0xE3,0x38,0xFB,0xDA,0xE2,0xFA,0x03,0x39,0xC2,0x30,0x7E,0xFA,0xC2,0xE2, + 0xE3,0x30,0x81,0x28,0xDF,0x5F,0xFC,0xF8,0xE3,0x30,0xA2,0x30,0x5F,0x89,0x29,0xBD, + 0x03,0x39,0xA2,0x30,0x1D,0xFB,0xEE,0xAE,0x24,0x41,0xC3,0x30,0x2F,0x25,0x2F,0x0B, + 0x64,0x49,0x04,0x41,0xEF,0xFF,0xEF,0xEF,0x24,0x41,0xA2,0x30,0xE0,0xB0,0xFA,0x5E, + 0xE3,0x38,0xA2,0x30,0x7F,0x7B,0xEB,0x8B,0xE2,0x30,0x81,0x28,0xFF,0x7B,0xAA,0xA0, + 0x03,0x39,0x82,0x28,0xEB,0x7B,0xFB,0x0B,0xE3,0x30,0xA2,0x28,0xEF,0xBB,0x8B,0x28, + 0xE3,0x30,0xA2,0x30,0xE3,0xFB,0xFF,0xD6,0xE3,0x30,0xA2,0x30,0x97,0x1F,0xAB,0x2E, + 0x03,0x39,0xC2,0x30,0x57,0x7B,0xEB,0xAA,0x44,0x41,0xE3,0x38,0x55,0xDD,0xBD,0x8F, + 0x03,0x39,0xC2,0x30,0xFE,0xBC,0xA8,0x2A,0x03,0x39,0xC2,0x30,0xAF,0xAF,0xB6,0xFA, + 0xE2,0x38,0xC2,0x30,0xA2,0x2A,0xBF,0xD5,0xE2,0x38,0xA2,0x30,0xFE,0x2C,0x2E,0xAA, + 0x04,0x41,0xE3,0x30,0xF9,0x8D,0xAF,0xA9,0x23,0x41,0xE3,0x38,0x1D,0xAF,0xBA,0xA3, + 0x44,0x41,0x03,0x39,0x7D,0x5D,0x8B,0x2A,0x03,0x41,0xE3,0x38,0xE7,0xBE,0xA4,0x24, + 0x44,0x49,0x03,0x39,0xBD,0xBB,0x7B,0x02,0x44,0x49,0x03,0x39,0xF7,0xFF,0xFF,0x0F, + 0x43,0x41,0xE3,0x38,0xF7,0xEF,0xFE,0xA8,0x23,0x41,0x03,0x39,0x9D,0x1B,0x03,0x02, + 0x85,0x51,0x03,0x39,0x2B,0x2F,0xFD,0xF7,0x85,0x49,0x03,0x41,0xDC,0xFA,0xFB,0xFF, + 0x44,0x41,0xE2,0x38,0xE2,0xEA,0x7A,0xFA,0x23,0x41,0xE3,0x38,0x56,0x9F,0x3D,0xAE, + 0x64,0x49,0x03,0x39,0xFD,0xFF,0xBA,0x8A,0x44,0x41,0x03,0x39,0xFE,0xAA,0x9E,0x2A, + 0x44,0x41,0xE2,0x38,0xFF,0xD7,0xFE,0xEC,0x23,0x41,0x03,0x39,0x77,0x2B,0x01,0xAD, + 0x44,0x49,0x03,0x41,0xAB,0xAA,0xFE,0xE8,0x85,0x51,0x44,0x49,0x2B,0xBD,0x65,0xD5, + 0xA5,0x51,0x64,0x51,0xF8,0xFE,0xBD,0x35,0xC6,0x59,0x84,0x51,0xB5,0x1D,0x1A,0x2B, + 0x67,0x72,0xA5,0x59,0xAB,0x2B,0x2B,0xAD,0x67,0x72,0x06,0x62,0x0A,0x22,0xA8,0xDE, + 0xA8,0x7A,0x06,0x6A,0x02,0x0A,0xAF,0x75,0xA8,0x7A,0x26,0x6A,0x00,0x02,0xAB,0xB5, + 0x88,0x7A,0x47,0x72,0x5E,0x5B,0xB0,0xAE,0x4D,0xAC,0xA8,0x7A,0x2D,0x2D,0x25,0x25, + 0x72,0xCD,0xCF,0xBC,0xA5,0x2D,0x29,0x09,0xB3,0xD5,0x72,0xCD,0xAD,0x8B,0xCB,0x75, + 0x73,0xCD,0x8F,0xAC,0xE0,0x70,0x78,0x7C,0x73,0xCD,0x4F,0xAC,0xBD,0xBD,0x2D,0x2B, + 0x94,0xCD,0x53,0xC5,0x09,0x7D,0x7A,0xFB,0x73,0xC5,0xF1,0xBC,0xE0,0xFE,0xDF,0x5F, + 0x53,0xC5,0xD1,0xB4,0x8A,0x0F,0xA7,0xFF,0x32,0xC5,0x90,0xAC,0xF8,0xEA,0xF8,0x7E, + 0x90,0xAC,0xEE,0x9B,0x00,0x00,0xA0,0x7A,0x90,0xAC,0xCD,0x93,0x08,0xA8,0xFF,0x75, + 0xB0,0xAC,0xCD,0x93,0xA0,0xEE,0xF5,0x55,0x6F,0xAC,0xEE,0x9B,0xA0,0xFB,0xBF,0x77, + 0x0E,0xA4,0x2E,0x9C,0xB5,0xFE,0xBF,0x8A,0x2E,0xA4,0xCC,0x93,0x00,0xEA,0xFA,0x62, + 0x2F,0xA4,0xCD,0x93,0xA0,0x77,0x7F,0xB7,0x0E,0x9C,0x8C,0x8B,0xBE,0xFF,0xDF,0x20, + 0x6F,0xAC,0xAD,0x93,0x2F,0xB7,0xF5,0x55,0x6F,0xAC,0xED,0x9B,0x2A,0x0B,0x2B,0x95, + 0xB0,0xB4,0x2E,0xA4,0x22,0xA2,0xFF,0x77,0x11,0xBD,0x4F,0xA4,0x0A,0x2F,0x9F,0xD5, + 0x32,0xC5,0xB0,0xAC,0x80,0x02,0x2B,0xB5,0x32,0xC5,0x11,0xBD,0x77,0x2A,0x80,0x23, + 0x43,0x51,0x23,0x51,0xFD,0xD8,0x00,0xE0,0x43,0x51,0x23,0x51,0x4A,0xC2,0x8D,0x13, + 0x43,0x51,0xE2,0x48,0xAA,0xFA,0xF8,0xBC,0x63,0x59,0x03,0x49,0xAF,0x29,0x35,0xBF, + 0x64,0x59,0x23,0x51,0x7E,0x07,0xE5,0x6D,0x43,0x51,0x02,0x49,0x83,0x08,0x02,0x5A, + 0x23,0x51,0xE2,0x40,0x7C,0xEE,0x6E,0xAF,0x23,0x49,0xE2,0x48,0xAB,0x3F,0xAE,0x00, + 0x44,0x51,0x02,0x49,0xBE,0x9D,0xA3,0xA2,0x43,0x51,0x03,0x49,0xF2,0xE8,0xBE,0x2F, + 0x44,0x51,0x02,0x49,0x99,0xFC,0xA2,0x28,0x43,0x51,0x02,0x51,0xAA,0x0A,0xC8,0xEE, + 0x63,0x51,0x03,0x51,0x6F,0xBE,0xAE,0x2A,0x85,0x61,0x23,0x51,0xE7,0xCE,0xF7,0x57, + 0x64,0x59,0x23,0x51,0x70,0x58,0xDF,0xDD,0x64,0x59,0x23,0x51,0x8D,0xB7,0xDA,0x7A, + 0x64,0x59,0x03,0x51,0x2E,0xBB,0xFD,0xAF,0x43,0x59,0x03,0x51,0x32,0xBA,0x28,0x1A, + 0x64,0x59,0x03,0x51,0x2F,0xA7,0xAF,0xAA,0x4A,0x93,0x64,0x59,0x3D,0x2D,0x2D,0x2F, + 0xAB,0xA3,0x49,0x9B,0xB5,0xA5,0xFB,0x0F,0xAB,0xA3,0x6A,0x9B,0x02,0x02,0x2B,0xDA, + 0xCC,0xAB,0x6B,0x9B,0xE2,0xA2,0xEA,0xEA,0x8B,0x9B,0x2A,0x93,0xA2,0xEC,0xFA,0x7E, + 0x4B,0x9B,0x09,0x93,0x20,0xC0,0xFE,0x7F,0x6B,0x9B,0xE9,0x8A,0x8A,0xEE,0x7F,0x77, + 0x2A,0x93,0x87,0x7A,0x20,0xBA,0xFE,0x57,0x09,0x8B,0x87,0x7A,0x00,0x80,0xEA,0x5D, + 0x2A,0x93,0x87,0x7A,0x8A,0xFA,0x7F,0x55,0xA8,0x82,0x66,0x72,0x00,0xBF,0x7E,0x7D, + 0xA7,0x7A,0x46,0x72,0xF0,0xFA,0xF7,0xFF,0x87,0x7A,0x46,0x72,0xE0,0x7B,0x56,0xD7, + 0x66,0x72,0x26,0x6A,0xE6,0xAD,0xC8,0x3A,0x87,0x7A,0x26,0x6A,0x57,0xF5,0xF5,0xDA, + 0x66,0x72,0x25,0x6A,0x7F,0xDA,0xAF,0xBA,0x66,0x72,0x26,0x72,0xBB,0xFB,0xAA,0x0E, + 0xC8,0x82,0x46,0x72,0xB5,0xFF,0x2D,0x2A,0xE9,0x82,0x88,0x7A,0xEA,0xFB,0x72,0xEA, + 0xA7,0x7A,0x46,0x72,0xA8,0x8C,0xE8,0x7E,0x87,0x7A,0xE5,0x69,0xA0,0xEA,0x72,0x7E, + 0x26,0x6A,0xC4,0x61,0x20,0xE0,0x5E,0x7B,0x05,0x6A,0xA4,0x61,0x7C,0xE7,0xEE,0x2B, + 0x05,0x6A,0xA4,0x61,0x7F,0xF5,0xFE,0xA2,0x06,0x6A,0xA4,0x61,0xDF,0xFB,0xA3,0xAA, + 0xE5,0x69,0xA4,0x59,0x2B,0xAE,0xAD,0x82,0x06,0x6A,0xA5,0x59,0x5A,0x7B,0x7A,0xE2, + 0xA5,0x59,0x81,0x30,0x7E,0xFA,0xFA,0xE8,0xE3,0x38,0x81,0x28,0xF5,0xDA,0x7C,0xF0, + 0xE3,0x38,0x61,0x28,0x2B,0x2B,0xFF,0x5F,0x04,0x39,0xA2,0x30,0x00,0x82,0xBD,0xF5, + 0x24,0x41,0xA2,0x30,0x8A,0x0E,0xBF,0x27,0x24,0x41,0xC2,0x30,0x7E,0x7A,0xA0,0x80, + 0xE3,0x38,0xA2,0x30,0x02,0xA8,0xFC,0x58,0xE2,0x38,0xA2,0x30,0xA0,0x3B,0xBF,0x9F, + 0x24,0x41,0xE2,0x38,0x25,0xFB,0x2B,0xBF,0x64,0x49,0x03,0x41,0xF7,0xBF,0xBF,0xAD, + 0x64,0x49,0x24,0x41,0xFB,0xE2,0x88,0x00,0x65,0x49,0x24,0x41,0xDB,0x7F,0x77,0x7F, + 0x44,0x41,0xE2,0x38,0x8F,0xF7,0xFA,0xA0,0x44,0x49,0x03,0x39,0xB7,0xFF,0xAA,0xEA, + 0x23,0x41,0xE3,0x38,0x70,0xF8,0xDA,0xB8,0x24,0x41,0xE3,0x38,0x69,0x5F,0xBE,0x0A, + 0x24,0x39,0xA2,0x30,0x7B,0xFE,0xEA,0xF0,0xC3,0x30,0xA2,0x28,0x25,0x3F,0x2C,0x08, + 0x04,0x39,0xA2,0x30,0xBF,0x3F,0x3E,0xB7,0x44,0x41,0x04,0x39,0xAD,0xEF,0xE1,0x55, + 0x24,0x41,0xC3,0x30,0x80,0xA8,0xE8,0xDE,0xE3,0x38,0xC3,0x30,0xDC,0xC8,0xEA,0x17, + 0xC3,0x38,0xE3,0x30,0xBF,0xDF,0x7F,0x55,0x03,0x39,0xC3,0x30,0x77,0x8A,0xE2,0xD6, + 0x03,0x39,0xC3,0x30,0xAD,0xAF,0x3D,0x7B,0xE3,0x30,0xC2,0x28,0xAC,0x6C,0xFE,0x5C, + 0xE2,0x30,0xA2,0x28,0x9D,0xF5,0xDF,0x73,0x03,0x39,0xA2,0x28,0xBF,0xBD,0xAF,0x29, + 0x44,0x41,0xE3,0x38,0xFF,0xAB,0x0D,0x8F,0x44,0x41,0x03,0x39,0xAD,0xEB,0xFB,0x7A, + 0x24,0x39,0xE3,0x38,0xEF,0x8B,0xFA,0xFF,0xE2,0x30,0xC2,0x30,0x6E,0x57,0x57,0x57, + 0xE3,0x38,0xC2,0x30,0x55,0x5D,0xA2,0xA2,0x03,0x39,0xC3,0x30,0xFF,0x2F,0x0F,0x8F, + 0x45,0x41,0xE3,0x38,0xA5,0x2B,0x2E,0xAB,0x65,0x49,0x24,0x41,0x5D,0x55,0xAE,0xEB, + 0x64,0x49,0x03,0x39,0xFB,0x7E,0x9F,0xA2,0x44,0x49,0xE3,0x38,0xF5,0xF6,0xB8,0xA2, + 0x64,0x49,0x24,0x41,0xAF,0xBF,0xFC,0xAA,0x65,0x49,0x23,0x41,0xAF,0xFD,0x9F,0x82, + 0x64,0x49,0x03,0x39,0xF8,0x78,0xFA,0xAA,0x44,0x41,0x03,0x41,0xFA,0xA2,0x98,0xFE, + 0x44,0x41,0xC2,0x38,0x2A,0x22,0xE8,0x5E,0x44,0x49,0xE3,0x38,0xA8,0xA8,0xEF,0xDD, + 0x23,0x41,0x03,0x39,0xA2,0x60,0x2A,0x0B,0x23,0x41,0xE2,0x38,0x2E,0x2E,0x28,0xDC, + 0x64,0x49,0x03,0x39,0x8B,0xBF,0xF7,0xD5,0x44,0x41,0xE2,0x38,0x88,0xBA,0xEF,0x75, + 0x23,0x41,0xE3,0x30,0x08,0x88,0x83,0x01,0x43,0x41,0x03,0x39,0xB5,0x35,0xBD,0xD5, + 0x64,0x49,0x24,0x41,0x82,0x82,0x9B,0xFD,0x64,0x49,0x23,0x41,0xB2,0xA2,0xB8,0xDD, + 0x85,0x51,0x23,0x41,0x27,0xBA,0xFE,0xEE,0xC6,0x59,0x64,0x51,0x82,0xAE,0xFD,0xFD, + 0x06,0x62,0x84,0x51,0x2D,0xB7,0xF7,0xFF,0x47,0x6A,0xC5,0x61,0xAB,0x0B,0xA9,0xAB, + 0x47,0x72,0xC5,0x59,0xBE,0x5A,0x58,0xE8,0x47,0x72,0xC4,0x59,0x0A,0x3D,0x2F,0xAF, + 0x88,0x72,0x26,0x6A,0xE8,0xF5,0xBD,0xB5,0x0D,0xA4,0x87,0x72,0x35,0x25,0x35,0xB5, + 0x92,0xD5,0x8F,0xB4,0x8B,0x0B,0x29,0x29,0x93,0xD5,0x31,0xC5,0xAA,0xA0,0xEA,0x68, + 0x52,0xCD,0xB0,0xB4,0x5C,0x58,0x5E,0x57,0x73,0xCD,0xAF,0xB4,0xAD,0x0B,0x2B,0x0B, + 0x94,0xCD,0x73,0xC5,0x47,0x88,0xFA,0x5E,0x32,0xC5,0x90,0xAC,0xE8,0xE0,0xE0,0x78, + 0xD1,0xB4,0x2E,0xA4,0x00,0x88,0xFA,0xF7,0xB0,0xB4,0x0E,0x9C,0xC8,0xEA,0x7E,0x5F, + 0x4F,0xA4,0xAD,0x93,0xE8,0xFE,0xDF,0x77,0xCE,0x9B,0x6C,0x8B,0x08,0xFA,0x7E,0xFB, + 0xCD,0x93,0x6C,0x8B,0x08,0x2B,0xB7,0xA7,0x0E,0x9C,0xAD,0x93,0xA2,0xEA,0xFF,0xFD, + 0x0E,0x9C,0x8D,0x93,0x20,0xAA,0xFF,0x7F,0x0E,0xA4,0xAD,0x93,0x8A,0x8B,0xAD,0xF9, + 0x2E,0xA4,0xCD,0x93,0xFD,0xBF,0x0F,0xE9,0x2E,0x9C,0xEE,0x9B,0x8B,0x68,0x58,0x5E, + 0xCD,0x93,0x6C,0x8B,0xBC,0xB4,0x5E,0x5E,0x4F,0xA4,0xAC,0x93,0xAF,0x2B,0x2D,0xAD, + 0x6F,0xAC,0x0E,0xA4,0x3A,0xA2,0x0B,0xAB,0xAF,0xAC,0x4F,0xA4,0xD7,0xDD,0xBF,0xAD, + 0xF1,0xBC,0x4F,0xA4,0xB7,0xAB,0x02,0x02,0x11,0xBD,0x6F,0xAC,0x2B,0xD6,0xE8,0x00, + 0x64,0x59,0x02,0x49,0xF2,0xBE,0x78,0xEB,0x64,0x59,0x03,0x49,0xAE,0x3F,0xB9,0xBD, + 0x65,0x59,0x03,0x49,0xF4,0x7B,0xEF,0xFF,0x44,0x51,0xE3,0x48,0xAF,0x8B,0xEF,0xDB, + 0x43,0x51,0xE1,0x48,0x02,0x8A,0xAA,0x7E,0x23,0x49,0xE2,0x40,0xEC,0x5E,0xBF,0xFF, + 0x43,0x51,0xE2,0x40,0xFB,0xB9,0xF7,0x2F,0x43,0x51,0x02,0x49,0xFB,0x8B,0x0F,0xBE, + 0x43,0x51,0x23,0x49,0xC0,0x44,0xC6,0xE0,0x64,0x51,0x23,0x51,0xAD,0x5D,0xDF,0x57, + 0x43,0x51,0x03,0x51,0x2E,0xA8,0x8A,0xEB,0x44,0x59,0x22,0x49,0xB7,0xA7,0xA7,0xCF, + 0x64,0x59,0x23,0x51,0xBA,0xAB,0x8B,0xF9,0x64,0x59,0x03,0x51,0x7E,0xAA,0xA0,0xAE, + 0x43,0x59,0x23,0x51,0x3B,0xFB,0x75,0xAE,0x64,0x59,0x23,0x51,0xF2,0x5F,0xFF,0xFA, + 0x43,0x59,0x23,0x51,0x2B,0x1B,0x1E,0x8B,0x44,0x59,0x03,0x51,0xEA,0xF0,0x5A,0x5B, + 0x84,0x61,0x02,0x51,0xFF,0xBD,0x2F,0xAD,0x4A,0x9B,0xC5,0x61,0x2D,0x0D,0x29,0x09, + 0xAB,0xA3,0x6A,0x9B,0x0D,0x2D,0x2D,0xA5,0xAB,0xA3,0x6A,0x9B,0xB0,0xFC,0xFC,0x77, + 0x8B,0x9B,0x09,0x8B,0xA0,0x60,0x7E,0x5F,0x4A,0x9B,0x87,0x82,0xA0,0xAA,0x7B,0x7F, + 0x29,0x93,0x87,0x7A,0xA0,0x7B,0xDD,0x55,0xE9,0x8A,0x46,0x72,0xE8,0xFA,0xEF,0xFF, + 0xA8,0x82,0x46,0x72,0xB0,0xAA,0xFF,0xF7,0xA8,0x7A,0x46,0x72,0xE2,0xCA,0xFA,0x7D, + 0x87,0x7A,0x46,0x72,0xCA,0xEA,0xB8,0x97,0x87,0x7A,0x46,0x72,0xA3,0x88,0xE2,0x7B, + 0x87,0x7A,0x25,0x72,0xC0,0xEA,0xEA,0x89,0x66,0x72,0x27,0x72,0xAA,0xBE,0xBB,0xEE, + 0x66,0x72,0x05,0x6A,0xBC,0xFA,0xFE,0xAA,0x66,0x72,0x05,0x72,0xA0,0xE6,0x2F,0xAE, + 0x66,0x72,0x26,0x72,0x8F,0x22,0x00,0x28,0xA8,0x7A,0x46,0x72,0xD5,0xD5,0x35,0x2E, + 0xC8,0x82,0x87,0x7A,0x35,0xA7,0xEA,0xA8,0xC8,0x82,0x26,0x72,0xA0,0xAA,0xFA,0x7F, + 0x87,0x7A,0x05,0x6A,0xAC,0xFF,0x7F,0x75,0x26,0x72,0xE5,0x61,0x78,0xA8,0xF2,0xFA, + 0x25,0x6A,0xE5,0x69,0xDF,0x3F,0xBD,0x62,0x05,0x6A,0xE5,0x61,0x8E,0x88,0x90,0xB0, + 0x26,0x6A,0xE5,0x69,0xDD,0xF7,0xF3,0xAE,0x27,0x72,0xC4,0x61,0xF7,0xFF,0xBF,0x2E, + 0x26,0x72,0xC5,0x61,0x9A,0xDE,0xAA,0x02,0x26,0x72,0xC5,0x59,0x7E,0x7A,0xFE,0xEA, + 0xC5,0x61,0x24,0x49,0x7C,0x7A,0xF8,0xE8,0x45,0x49,0xA2,0x30,0x5E,0x5E,0xF8,0xF8, + 0xC3,0x30,0x61,0x28,0xDF,0x9F,0xBC,0x20,0xA2,0x30,0x82,0x28,0x02,0xFE,0x88,0x88, + 0xE3,0x38,0x81,0x28,0x2B,0x2F,0xBD,0xB9,0x24,0x41,0xC2,0x30,0xE2,0xAF,0x29,0xBD, + 0x03,0x39,0xC2,0x30,0xF8,0x78,0x7C,0x7A,0xC2,0x30,0x82,0x30,0xBC,0x2E,0x3E,0xFC, + 0x23,0x41,0xA2,0x30,0x2B,0x2D,0x8D,0x3F,0x44,0x41,0x03,0x41,0x3F,0xB2,0xA2,0x80, + 0x65,0x49,0x24,0x41,0xC2,0x8A,0xCB,0x5D,0x64,0x49,0x24,0x41,0x5F,0x7B,0xEF,0x8D, + 0x64,0x49,0x24,0x41,0xDA,0x56,0x5E,0x7E,0x24,0x41,0x03,0x41,0x50,0x7A,0x78,0x0A, + 0x24,0x41,0xE3,0x38,0xAE,0xAF,0xBE,0xFC,0x65,0x49,0x03,0x39,0xFF,0xFF,0xCF,0xA9, + 0x24,0x41,0xA2,0x28,0xF8,0xEA,0xF8,0x7A,0xC2,0x30,0x82,0x28,0xA2,0x8A,0xAF,0xED, + 0xC2,0x30,0x82,0x28,0x3A,0x5E,0x55,0x5F,0x04,0x39,0x82,0x28,0x82,0xFA,0xFD,0x75, + 0xC3,0x30,0xA2,0x30,0x00,0x02,0xE3,0x85,0x03,0x39,0xC3,0x30,0x15,0xFD,0xBD,0x1D, + 0x04,0x39,0xC3,0x30,0x20,0xA2,0x7E,0x57,0xE3,0x38,0xA2,0x28,0xE8,0xFE,0xFF,0xF7, + 0xC2,0x30,0xA2,0x28,0xA0,0x1E,0x36,0xBA,0xE3,0x30,0xA2,0x28,0xEC,0xFF,0xBB,0xBA, + 0x03,0x39,0xA2,0x28,0xDF,0xF7,0xF5,0x3B,0x03,0x39,0xC3,0x30,0x25,0x25,0xAF,0xBF, + 0x23,0x39,0xC2,0x30,0x2B,0xAA,0xEA,0x7F,0x24,0x39,0xC2,0x30,0x88,0xE2,0xFF,0x75, + 0x03,0x39,0xA2,0x30,0xA2,0xEA,0xEA,0xF7,0xE3,0x38,0xC2,0x30,0xF8,0xF0,0x2A,0x07, + 0x04,0x39,0xC3,0x30,0xDA,0xFE,0xF7,0x5F,0x03,0x39,0xC3,0x38,0xBF,0xFF,0x3F,0x35, + 0x64,0x49,0xE3,0x38,0xBF,0xF5,0xBD,0x3F,0x85,0x51,0x24,0x41,0xFF,0xB5,0x2F,0x2A, + 0x85,0x49,0x23,0x41,0xFE,0xF8,0xEC,0x60,0x44,0x49,0x03,0x41,0xAA,0xEE,0x76,0x7B, + 0x65,0x49,0x03,0x39,0x0A,0x2B,0x2B,0xB5,0x85,0x51,0x23,0x41,0xE8,0x5F,0xDE,0x7F, + 0x44,0x49,0x03,0x39,0xAA,0x70,0xF8,0xFF,0x23,0x41,0xE3,0x38,0xA0,0xB8,0xF6,0x5F, + 0x23,0x41,0xC2,0x30,0x78,0xFA,0x7B,0xFB,0x03,0x39,0xC2,0x30,0x2B,0xA5,0xFD,0x5F, + 0x23,0x41,0xC2,0x30,0x8A,0xAB,0x9F,0xF5,0x02,0x39,0xC2,0x30,0x5C,0xDF,0xFE,0x7E, + 0x03,0x31,0xA1,0x30,0x22,0xBF,0xBF,0xF9,0x23,0x39,0xC2,0x30,0xA7,0x3E,0x02,0x8F, + 0x44,0x41,0x03,0x39,0xB7,0x37,0x35,0x9D,0x44,0x41,0x03,0x39,0x5E,0x5C,0x58,0xFE, + 0x64,0x49,0x03,0x39,0xAD,0x2D,0xAD,0xFD,0x43,0x49,0x23,0x41,0xA5,0xA6,0xE8,0x7D, + 0x85,0x51,0xE2,0x38,0x2A,0x3F,0xB7,0x95,0xC6,0x51,0x64,0x51,0xFD,0xB2,0xBB,0xB9, + 0x06,0x62,0xA5,0x51,0xBD,0xAD,0x2F,0x2F,0x47,0x6A,0xC5,0x61,0xBF,0xA7,0x27,0x8F, + 0xA8,0x7A,0x06,0x6A,0x5E,0x7E,0xEB,0x83,0x47,0x6A,0xE5,0x61,0x3B,0x76,0xD7,0xF8, + 0x67,0x72,0x26,0x6A,0xFD,0xF5,0x1F,0xF7,0xCC,0x9B,0x47,0x72,0x2D,0x35,0x35,0xB5, + 0x72,0xCD,0x2E,0xAC,0x0B,0x0B,0x0B,0x29,0x93,0xD5,0xF1,0xBC,0xC0,0xE0,0x60,0x70, + 0xF1,0xBC,0x4F,0xAC,0xDC,0xBE,0xBF,0xF7,0x53,0xC5,0x90,0xAC,0x0B,0xAB,0xFF,0x5D, + 0x52,0xC5,0xED,0x9B,0x20,0xB2,0xFE,0x7F,0xD0,0xB4,0x0E,0x9C,0xE8,0xFA,0x7F,0x5D, + 0x4F,0xA4,0xCD,0x9B,0x88,0xE8,0x7F,0x5F,0x0E,0xA4,0x8D,0x93,0xE8,0xFA,0xD7,0xDF, + 0xAD,0x93,0x8C,0x8B,0x00,0x82,0xA2,0xD6,0xCD,0x93,0x8C,0x8B,0xFF,0x5F,0x7E,0x78, + 0xAD,0x93,0x6C,0x8B,0x36,0xAE,0xAE,0xAE,0xEE,0x9B,0x6C,0x8B,0x82,0x8A,0xAF,0xA7, + 0xEE,0x9B,0x8C,0x8B,0xEF,0xB9,0xAB,0xE0,0x2F,0xA4,0x8C,0x8B,0xAB,0x0A,0xBB,0xDF, + 0x0E,0x9C,0xCD,0x93,0x72,0x68,0x8A,0x6B,0xED,0x9B,0x6C,0x83,0x82,0xA8,0xFA,0x5E, + 0xCD,0x93,0x4B,0x83,0xE8,0xEA,0x7B,0x5F,0x4F,0xA4,0x4B,0x83,0x2F,0x2D,0x2D,0xB5, + 0x90,0xAC,0x2E,0xA4,0x55,0xFA,0xEB,0x8F,0xAF,0xB4,0x4F,0xA4,0xA7,0x3F,0xBF,0xBE, + 0x32,0xBD,0xB0,0xAC,0xEF,0xFF,0x29,0xA5,0x53,0xC5,0x11,0xBD,0xF5,0x95,0xF5,0x2D, + 0x43,0x51,0x23,0x51,0x58,0x7F,0x3F,0xD5,0x64,0x59,0x03,0x51,0xAE,0x7F,0xEF,0x83, + 0x44,0x51,0x02,0x49,0xFC,0xBF,0xFF,0xDA,0x23,0x51,0x03,0x49,0xBA,0x50,0x58,0x73, + 0x02,0x49,0xC2,0x40,0xA8,0xA4,0x3A,0x02,0x43,0x51,0xE2,0x40,0xDF,0x7B,0xFA,0xCF, + 0x44,0x51,0x03,0x49,0xB5,0x25,0x35,0xFF,0x44,0x51,0x23,0x49,0xBB,0xFA,0x62,0x77, + 0x64,0x51,0x23,0x51,0xDA,0xEA,0xE2,0x59,0x44,0x51,0x02,0x51,0xEA,0x80,0x8A,0xFB, + 0x43,0x51,0x03,0x49,0xFB,0xAE,0x8F,0x06,0x64,0x59,0x23,0x51,0xED,0x85,0xBD,0x3A, + 0x64,0x59,0x23,0x51,0xEF,0xA8,0x92,0xA6,0x84,0x61,0x23,0x51,0xFF,0xF3,0x6F,0x65, + 0x84,0x59,0x23,0x51,0xFF,0xEE,0xCB,0xA9,0x64,0x59,0x23,0x51,0xFE,0xAB,0xC5,0xD5, + 0x44,0x59,0x03,0x51,0xEA,0x62,0x6A,0x94,0x23,0x59,0x02,0x49,0xFF,0xED,0xAA,0xAA, + 0xA4,0x61,0x02,0x51,0xBD,0x35,0x27,0x3D,0x8B,0x9B,0x26,0x72,0x29,0x09,0x0B,0x2B, + 0x8A,0x9B,0x4A,0x93,0xC0,0x82,0xA0,0x92,0x6A,0x9B,0x09,0x8B,0x00,0x82,0xE2,0x6A, + 0x2A,0x93,0x87,0x7A,0x80,0xE8,0x7A,0x76,0x09,0x8B,0x67,0x72,0xF8,0xFF,0x77,0x7D, + 0xA8,0x7A,0x46,0x72,0xFC,0xD8,0xEA,0xBF,0x87,0x7A,0x26,0x72,0xAE,0xEB,0xDE,0xE4, + 0x45,0x82,0x67,0x72,0x5F,0xDD,0xD7,0x75,0x87,0x7A,0x46,0x72,0xA6,0x82,0xF8,0x8D, + 0x87,0x7A,0x46,0x72,0xBC,0x8A,0xB0,0x1A,0x87,0x7A,0x46,0x72,0x6F,0x8F,0xBE,0xFF, + 0x87,0x7A,0x67,0x72,0x75,0xB7,0x6E,0xF2,0x66,0x72,0x25,0x72,0xA8,0x10,0xAC,0x0F, + 0x67,0x7A,0x46,0x72,0x65,0x7F,0xA3,0xBA,0x66,0x72,0x26,0x6A,0xDF,0xBA,0x68,0x6A, + 0x66,0x72,0x25,0x72,0xAE,0x3E,0x32,0x2A,0xC8,0x82,0x67,0x7A,0xA5,0xA7,0x2F,0x6B, + 0xA8,0x82,0x25,0x6A,0x80,0xA8,0xFE,0x55,0x67,0x7A,0xC4,0x69,0xE0,0xE0,0xFB,0xFF, + 0x25,0x6A,0xE5,0x69,0xEE,0x62,0x7A,0x5E,0x05,0x6A,0xC5,0x61,0x30,0xBA,0xBF,0xFD, + 0x26,0x6A,0xC4,0x61,0x2A,0xFF,0xFF,0x7E,0x06,0x6A,0xC5,0x61,0xBE,0xEB,0xAE,0x9F, + 0x26,0x6A,0xE5,0x69,0xFF,0xBB,0x8B,0xAF,0x46,0x72,0x06,0x6A,0xD5,0xFF,0xEA,0xFD, + 0x47,0x72,0x06,0x6A,0xF9,0xA9,0xAD,0xAF,0x47,0x72,0xE6,0x69,0x6E,0x7A,0xA8,0x22, + 0x26,0x6A,0x64,0x51,0x7E,0x7A,0x78,0x68,0x44,0x49,0xC3,0x38,0xD8,0x7B,0x7A,0x78, + 0xE3,0x38,0x82,0x30,0xC2,0xCA,0x7A,0x7E,0xA2,0x30,0x81,0x28,0xC2,0x63,0xFA,0xAB, + 0xC1,0x30,0x82,0x28,0xAD,0xBD,0xF7,0xFF,0x03,0x41,0xA2,0x30,0xAB,0x2A,0x0F,0x39, + 0x03,0x39,0xE3,0x38,0x5F,0x96,0xD4,0x7E,0xE2,0x38,0xA2,0x30,0x56,0x74,0xAA,0xE2, + 0x64,0x49,0xA2,0x30,0xB5,0x29,0x2B,0x2B,0x44,0x49,0xE3,0x38,0xEA,0xE0,0xE0,0x60, + 0x03,0x41,0xE3,0x38,0x20,0x96,0x3E,0x76,0x65,0x49,0xE3,0x38,0x2A,0xFE,0xEF,0xF5, + 0x64,0x49,0xE3,0x38,0xEC,0xFB,0xFF,0xD7,0x24,0x41,0xC2,0x30,0x08,0x80,0xBC,0x57, + 0x23,0x41,0xC3,0x30,0xBE,0xF6,0xAF,0x2B,0x44,0x41,0xC3,0x30,0x2A,0xAB,0x8E,0x5E, + 0x04,0x39,0xA2,0x28,0x78,0x5C,0x7E,0x5F,0xE3,0x28,0x82,0x28,0xF5,0xBF,0xFF,0xD7, + 0xA2,0x28,0x61,0x20,0xE0,0xE0,0xF0,0xE6,0xA2,0x28,0x61,0x20,0x0F,0xBD,0xBD,0x0B, + 0xE3,0x30,0xA2,0x28,0xD5,0xBD,0xBD,0x8A,0xE3,0x30,0xA2,0x28,0x82,0xEA,0x7A,0x68, + 0x81,0x30,0xC2,0x28,0xFF,0xFA,0xEB,0x7A,0xC2,0x30,0xA2,0x28,0xBF,0xB5,0x25,0x05, + 0xE3,0x30,0xA2,0x28,0xA3,0xFB,0xAF,0x27,0xC2,0x30,0xA2,0x28,0xAE,0xCF,0x88,0x08, + 0xE3,0x30,0xC3,0x30,0x02,0xA9,0x75,0x2D,0x04,0x39,0xC2,0x30,0xDF,0x8B,0xEB,0xDF, + 0xC3,0x38,0xE3,0x30,0xFD,0xF5,0xFF,0xAD,0x04,0x39,0xC2,0x30,0x5F,0x7D,0xAD,0x2B, + 0xE3,0x38,0xC2,0x30,0x55,0x61,0x5B,0xF8,0xE3,0x38,0xC2,0x30,0x29,0x81,0xD7,0xF2, + 0xE3,0x38,0xC2,0x30,0xD6,0x7F,0x89,0x2B,0x03,0x39,0xC3,0x30,0x15,0x15,0xDA,0xF2, + 0x85,0x51,0xE3,0x38,0xAD,0x2F,0x2D,0xBD,0x85,0x51,0x65,0x49,0x55,0x7F,0xF2,0x7B, + 0x85,0x51,0x23,0x41,0xE2,0xE2,0xEA,0x62,0x44,0x49,0x03,0x39,0xF2,0x48,0x4A,0x7B, + 0x23,0x41,0xE2,0x38,0x2F,0x2F,0xE7,0xF7,0x44,0x49,0x24,0x41,0x72,0x6A,0x53,0x95, + 0x23,0x41,0xC2,0x38,0xFA,0xDF,0xEE,0xBA,0x03,0x41,0xC2,0x30,0x7E,0xEA,0xAA,0xA8, + 0x03,0x39,0xC2,0x30,0x0F,0xB5,0xD5,0xBB,0x03,0x39,0xC2,0x30,0x7E,0xD7,0xF6,0xCA, + 0x03,0x39,0xC2,0x30,0x3F,0x3E,0x27,0x2E,0x23,0x39,0xE2,0x30,0x77,0xFF,0xAB,0xBC, + 0x23,0x39,0xC2,0x30,0xFD,0x7E,0x78,0xF8,0x23,0x39,0xC2,0x30,0x8B,0x0F,0x2D,0x2B, + 0x23,0x39,0x03,0x39,0xD3,0x2F,0xFD,0x9B,0x23,0x39,0xE2,0x38,0xF8,0xF0,0xE8,0x6A, + 0x23,0x41,0xC2,0x30,0x02,0x8A,0x0B,0x89,0x43,0x41,0x03,0x39,0x9F,0xB5,0xA5,0x2B, + 0x44,0x49,0x03,0x39,0x35,0xBB,0xAA,0xA3,0xA5,0x59,0x44,0x49,0x3F,0x3D,0xDD,0x37, + 0x26,0x62,0x85,0x51,0xB7,0xBF,0x97,0x37,0x67,0x72,0x06,0x62,0xCD,0xED,0xA5,0xBE, + 0x88,0x72,0x46,0x6A,0xA9,0x29,0xED,0xF5,0x87,0x72,0xE5,0x61,0xFA,0xE8,0xE8,0x5A, + 0x47,0x6A,0xC5,0x59,0xA0,0xEE,0x7E,0x5E,0x6B,0x93,0xE5,0x61,0x3F,0x3D,0xBD,0xB5, + 0x73,0xCD,0xED,0xA3,0x2B,0x09,0x29,0x09,0x93,0xD5,0x6F,0xAC,0xE0,0x70,0x78,0x78, + 0xB0,0xB4,0x4F,0xAC,0xAF,0x37,0x7F,0x7D,0x90,0xAC,0xED,0x9B,0xA0,0xA8,0xFA,0xD7, + 0x4F,0xA4,0xEE,0x9B,0xC2,0x7F,0x57,0x77,0x0E,0x9C,0xAD,0x93,0xA2,0xEA,0xF2,0x5E, + 0xEE,0x9B,0xAD,0x93,0x7E,0x6A,0x7A,0x54,0xAD,0x93,0x6D,0x8B,0xB0,0xE8,0xA2,0xA0, + 0xAD,0x93,0x6C,0x8B,0xEA,0xEA,0x8B,0x0F,0xCD,0x93,0x8C,0x8B,0x7D,0xA9,0x7D,0x5E, + 0xAD,0x93,0x6C,0x8B,0xB6,0xEF,0xAA,0x22,0xCD,0x93,0x8C,0x8B,0x05,0x0D,0xFF,0xFF, + 0x0E,0x9C,0x8C,0x8B,0x82,0xBA,0x5B,0x7F,0xAD,0x93,0x0A,0x7B,0x20,0x88,0xA8,0x5E, + 0xCD,0x93,0x2B,0x7B,0x00,0xAA,0x6F,0x75,0x8C,0x83,0x0A,0x7B,0xBC,0xFE,0x7F,0xD7, + 0x6C,0x83,0x0B,0x7B,0xBC,0xB7,0xFD,0xB5,0xAD,0x93,0x0B,0x7B,0x2F,0xBF,0xBF,0x55, + 0x4F,0xAC,0x6C,0x8B,0x0A,0x2F,0xFF,0x55,0x6F,0xAC,0xAD,0x8B,0x20,0x8A,0xAF,0xBD, + 0x11,0xBD,0x0E,0x9C,0x2B,0x2B,0xBF,0xB5,0x32,0xC5,0x90,0xAC,0x02,0x00,0x0E,0xA5, + 0x43,0x51,0x02,0x49,0x98,0xE0,0xEC,0xBF,0x64,0x51,0x02,0x49,0x8B,0xF9,0xFF,0xBF, + 0x43,0x51,0x02,0x49,0x6B,0xF2,0x5A,0x5B,0x23,0x49,0xE1,0x40,0xF8,0xBA,0xAD,0x82, + 0x23,0x49,0xE2,0x48,0xA3,0x00,0xA2,0x9E,0x44,0x51,0x03,0x49,0x6F,0xD6,0xA7,0x25, + 0x43,0x51,0x02,0x49,0xF5,0x09,0x36,0xAA,0x64,0x51,0x23,0x49,0xEF,0xBE,0x7A,0x78, + 0x44,0x51,0x03,0x49,0xBB,0x7E,0x56,0xDA,0x43,0x51,0x03,0x49,0xFF,0xFF,0xBE,0xB7, + 0x64,0x59,0x02,0x49,0x2F,0x27,0xA3,0xAA,0x64,0x59,0x23,0x51,0xA0,0xF7,0xE5,0x77, + 0x64,0x59,0x03,0x49,0xBE,0xAF,0xAF,0x8F,0x44,0x59,0x03,0x51,0xAE,0xEE,0xF4,0xAC, + 0x44,0x59,0x23,0x51,0x01,0xEA,0x0B,0x09,0x44,0x59,0xE2,0x48,0x6E,0xE8,0xE8,0xE8, + 0x43,0x59,0xE2,0x48,0xEE,0xE2,0xFB,0xDF,0x23,0x51,0x03,0x51,0x21,0xDB,0xFA,0xFD, + 0x26,0x72,0x23,0x51,0x95,0xB5,0x35,0x35,0x4A,0x9B,0x87,0x82,0x01,0x0B,0x09,0x03, + 0x6A,0x9B,0x09,0x93,0x2A,0xFA,0xFA,0x7E,0x6A,0x9B,0x87,0x7A,0xA8,0xEE,0x7E,0x7E, + 0xC8,0x7A,0x67,0x7A,0xF8,0xFE,0xEC,0xD6,0x87,0x7A,0x46,0x72,0xBE,0xBC,0x7E,0x62, + 0x87,0x7A,0x47,0x72,0xBF,0xB2,0xFA,0xFF,0x87,0x7A,0x26,0x72,0x28,0xEA,0x35,0x0B, + 0x87,0x7A,0x46,0x72,0x48,0x2A,0xFA,0xFA,0x87,0x7A,0x26,0x72,0x0B,0x8A,0x8A,0xA7, + 0x87,0x7A,0x25,0x72,0xB8,0xB6,0xB6,0xEA,0x87,0x7A,0x46,0x72,0xFC,0xFF,0xFF,0x1E, + 0x87,0x7A,0x46,0x72,0xC9,0x63,0x78,0x6B,0x87,0x72,0x25,0x72,0x2F,0xEF,0xFE,0x7F, + 0x66,0x7A,0x26,0x6A,0xB3,0xEF,0xCB,0x8B,0x67,0x7A,0x46,0x72,0xB7,0xCF,0xAF,0x22, + 0x87,0x7A,0x46,0x72,0x89,0xAA,0x23,0xAD,0xA7,0x7A,0x46,0x72,0xA3,0xEA,0xFB,0xFD, + 0x67,0x72,0x05,0x6A,0x5E,0x58,0xFE,0x7A,0x26,0x72,0xE5,0x69,0x77,0x56,0x55,0x89, + 0x06,0x6A,0xC5,0x61,0xFE,0x8E,0xFB,0x7E,0x05,0x6A,0xC5,0x61,0xEA,0x5C,0x55,0x55, + 0x05,0x6A,0xC5,0x61,0xE2,0xA2,0xF9,0xFF,0x05,0x6A,0xC4,0x61,0xB7,0xBF,0xBF,0xBF, + 0x05,0x6A,0xE5,0x61,0x27,0x18,0x08,0x0F,0x66,0x72,0x06,0x6A,0x5F,0xF3,0xFD,0xFD, + 0x47,0x72,0x06,0x6A,0xBF,0xFE,0x6B,0x2A,0x47,0x72,0x26,0x6A,0xEB,0xAA,0x2E,0xAA, + 0x26,0x6A,0xA4,0x59,0x70,0xE0,0x00,0x00,0xE5,0x61,0xE2,0x38,0x5F,0x7A,0x78,0xF0, + 0xE2,0x38,0x82,0x28,0xFA,0xFC,0xFA,0x78,0xA2,0x30,0x81,0x28,0xC3,0x8A,0x0F,0x3F, + 0xE2,0x30,0x81,0x28,0xBD,0x2D,0x0B,0x2A,0x02,0x39,0xA1,0x30,0x3A,0x3E,0xFA,0xDA, + 0x03,0x39,0xC2,0x38,0xFA,0xFE,0xBF,0xA1,0x03,0x39,0xC2,0x38,0x5F,0xD4,0xD6,0xFB, + 0x64,0x49,0xC2,0x38,0xA9,0x2D,0x2D,0x89,0x65,0x49,0xE2,0x38,0x70,0x6A,0xF0,0x7E, + 0x03,0x39,0xC2,0x30,0x5E,0xEA,0xFA,0x7A,0x03,0x39,0xC2,0x30,0x29,0xEE,0xBB,0xA5, + 0x24,0x41,0xC2,0x30,0xAE,0xCB,0x57,0x55,0xE3,0x38,0xA2,0x28,0xAA,0xBA,0xFA,0xFF, + 0x24,0x41,0xC2,0x30,0x2B,0x2D,0xAB,0xAD,0x24,0x39,0xA2,0x28,0x78,0xF8,0xFE,0xFE, + 0xE3,0x30,0x82,0x28,0xF2,0xF8,0xFC,0x7F,0xA2,0x28,0x62,0x20,0xEC,0xF6,0xFF,0xF7, + 0x63,0x28,0xA2,0x20,0xBE,0xFA,0xEB,0x6E,0xE3,0x30,0x82,0x28,0xB5,0x2D,0x2F,0x3F, + 0x04,0x39,0xA2,0x28,0xAA,0xA0,0x72,0x6A,0xC3,0x28,0x82,0x28,0x80,0xAA,0xFB,0xF7, + 0xA2,0x28,0x82,0x20,0x2B,0x2F,0xBA,0x2C,0xC2,0x28,0xA2,0x28,0xE5,0xD5,0xAD,0xF9, + 0xE3,0x30,0xA2,0x28,0xFF,0xFB,0x3E,0x29,0xE3,0x30,0xA2,0x28,0x0E,0x2F,0x2C,0xAA, + 0xE3,0x30,0xC2,0x30,0xBF,0x0B,0xEA,0x6A,0xE3,0x38,0xA2,0x28,0x2E,0xAF,0xFF,0xFF, + 0xE3,0x30,0xA2,0x30,0x08,0x8A,0xAB,0x2F,0x03,0x39,0xE3,0x30,0xAF,0xFB,0xF7,0xFE, + 0xE3,0x38,0xC3,0x30,0xF8,0xEC,0xCA,0x70,0x24,0x39,0xC2,0x30,0xFB,0xCB,0x79,0x75, + 0xE3,0x38,0xC3,0x30,0x37,0xB5,0xD5,0x35,0x03,0x39,0xC3,0x30,0xA2,0xBF,0xBF,0xF7, + 0x44,0x41,0xE3,0x38,0x0D,0x3D,0x9F,0xDF,0x44,0x49,0xE3,0x38,0x02,0xA3,0xBF,0x7D, + 0x64,0x49,0x03,0x39,0xE2,0xFF,0xD7,0xDD,0x24,0x41,0xE3,0x38,0xAE,0xFE,0xBA,0xF9, + 0x03,0x39,0xA2,0x38,0xB8,0xA8,0xA8,0x88,0x23,0x41,0xE3,0x38,0x2A,0xAF,0xAB,0xAB, + 0x03,0x41,0xE3,0x38,0xA5,0xAA,0xEB,0x62,0x44,0x41,0xE2,0x38,0x77,0xAF,0x0F,0xEE, + 0x03,0x39,0xA2,0x30,0x9A,0x98,0xA0,0xE2,0x03,0x39,0xC2,0x30,0xE8,0xFA,0xA7,0xD5, + 0x03,0x39,0xC2,0x30,0xAC,0x7E,0x17,0x95,0x03,0x39,0xE2,0x30,0xE0,0xAD,0x2D,0x2E, + 0x23,0x39,0xC2,0x30,0xDB,0x7F,0xFE,0xE8,0x23,0x39,0xC2,0x30,0x2F,0x0D,0xBF,0xEF, + 0x64,0x41,0x03,0x39,0x66,0xEA,0xA3,0x8D,0x43,0x41,0xE2,0x30,0x7F,0xEA,0xAA,0xF8, + 0x43,0x41,0xE2,0x30,0x2D,0x35,0xFB,0xFF,0x64,0x49,0x02,0x39,0xAE,0x2B,0x01,0x2B, + 0x84,0x51,0x23,0x41,0xAD,0xBE,0x2E,0x08,0xA5,0x51,0x64,0x49,0x96,0xF2,0xE0,0x82, + 0x26,0x62,0x84,0x51,0x37,0xED,0xF5,0x57,0x26,0x6A,0x84,0x51,0x80,0xE2,0xFB,0x7E, + 0x47,0x6A,0x84,0x51,0x82,0xAB,0xF7,0xD5,0x26,0x6A,0xC5,0x59,0xF8,0xFE,0x7F,0xAD, + 0x06,0x62,0xA4,0x59,0xA8,0xFF,0x9D,0xAD,0xC9,0x7A,0xE6,0x61,0x15,0x35,0x9D,0xF5, + 0x52,0xCD,0xEA,0x7A,0x0B,0x0B,0x09,0x2D,0x52,0xCD,0x8F,0xAC,0x78,0x78,0x78,0x58, + 0xB0,0xB4,0x4E,0xA4,0x6B,0x70,0xC2,0xA8,0x4F,0xAC,0xAD,0x8B,0xFE,0xFE,0x5E,0x7C, + 0xEE,0x9B,0x8C,0x8B,0x0A,0xA7,0xD5,0x57,0xCD,0x93,0x6C,0x8B,0xA8,0xEB,0xED,0xFF, + 0xCD,0x93,0x6C,0x8B,0xBC,0xBC,0xAE,0xA9,0xCD,0x93,0x8D,0x8B,0xFB,0x7E,0xAB,0x2A, + 0xCE,0x93,0x8C,0x8B,0xE5,0xFD,0xBF,0x3F,0xEE,0x9B,0x8C,0x8B,0xDF,0x75,0xB5,0xAE, + 0xCD,0x93,0x8C,0x8B,0xED,0x8B,0x00,0xA0,0xAC,0x8B,0x4C,0x83,0xA2,0x68,0xAA,0x7B, + 0xAC,0x8B,0x2B,0x7B,0x8A,0x6A,0xEA,0x7F,0x4B,0x83,0xEA,0x72,0xB0,0xD0,0xF8,0xEE, + 0x2B,0x7B,0xEA,0x72,0x8A,0xF6,0xA6,0x15,0x2B,0x7B,0xEA,0x72,0x28,0xB0,0x92,0xB5, + 0x4C,0x83,0xEA,0x72,0x2E,0xA9,0x5F,0x5F,0x4B,0x83,0xC9,0x72,0xE8,0xFA,0xFE,0xFB, + 0x8C,0x8B,0xEA,0x7A,0x2F,0x2D,0x2B,0x2F,0xCD,0x93,0x6C,0x8B,0x3F,0x95,0x77,0xFF, + 0x2E,0xA4,0x8D,0x8B,0x0A,0x2F,0x35,0xAD,0xD1,0xB4,0x0E,0x9C,0x0B,0xBD,0xFF,0x75, + 0x43,0x51,0xE3,0x48,0x8E,0xA9,0xAA,0xBA,0x43,0x51,0x23,0x49,0xE5,0x5F,0x5F,0x7E, + 0x23,0x49,0xE2,0x40,0xAB,0xAA,0x9A,0x8E,0x44,0x51,0xE1,0x40,0x8F,0xEB,0x7F,0xFF, + 0x43,0x51,0xE1,0x40,0x2F,0x0B,0x2F,0xBD,0x43,0x51,0x02,0x49,0x2E,0xAC,0xAE,0xE6, + 0x43,0x51,0x02,0x49,0x08,0xAE,0xD6,0x7D,0x43,0x51,0xE2,0x40,0xE0,0x9A,0xFB,0xFB, + 0x43,0x51,0x02,0x49,0xEA,0xBB,0x7D,0x2D,0x64,0x59,0x02,0x49,0x3B,0xB9,0x89,0xA2, + 0x64,0x59,0x23,0x51,0xAB,0xEE,0xF7,0x76,0x43,0x51,0x23,0x51,0xD4,0xDB,0xC2,0x03, + 0x44,0x59,0x23,0x51,0xAD,0xAD,0x31,0x3F,0x44,0x51,0x03,0x51,0xB8,0x9C,0xDA,0xE8, + 0x43,0x51,0x03,0x51,0xDA,0xD3,0x7A,0xFA,0x44,0x59,0x03,0x51,0xB8,0xEA,0x7B,0xDF, + 0xE3,0x50,0x02,0x49,0xF7,0xFC,0x57,0x77,0x23,0x51,0xE3,0x48,0x8F,0xFA,0xEE,0xF2, + 0x67,0x7A,0x03,0x51,0x35,0x3D,0x35,0x35,0x6B,0x9B,0xC9,0x8A,0x29,0x09,0x2B,0xAB, + 0x4A,0x93,0xC8,0x8A,0x62,0xFA,0xE8,0x6F,0xC8,0x82,0x88,0x7A,0xE0,0xE8,0xFA,0xAC, + 0xA8,0x7A,0x67,0x7A,0xD8,0xF2,0xEA,0xBA,0xA7,0x7A,0x67,0x7A,0x5F,0xFE,0x68,0xEC, + 0x87,0x7A,0x46,0x72,0x6A,0x62,0xCA,0xA2,0x87,0x7A,0x47,0x72,0xE9,0xBE,0x3B,0xF9, + 0x87,0x7A,0x46,0x72,0xEB,0x70,0xE0,0xE8,0x87,0x7A,0x46,0x72,0x3A,0xC0,0xFA,0x3F, + 0x87,0x7A,0x46,0x72,0xEC,0xEE,0xA6,0xFF,0x87,0x7A,0x46,0x72,0xAE,0xEB,0xAD,0xBF, + 0x87,0x72,0x25,0x6A,0xF2,0x6E,0xFA,0xFA,0x87,0x72,0x25,0x72,0xFF,0xFC,0xEE,0xFD, + 0x66,0x72,0x25,0x6A,0xDF,0xAA,0xAA,0xE8,0x86,0x7A,0x25,0x72,0xE6,0xEB,0xAB,0x3F, + 0xA7,0x7A,0x26,0x6A,0xE9,0xAF,0xAA,0x2A,0x87,0x7A,0x26,0x72,0xA2,0xE8,0x78,0xD2, + 0x46,0x72,0xE5,0x61,0xE8,0xE8,0xE8,0x7A,0x06,0x6A,0xC5,0x61,0x00,0xFE,0xD7,0x72, + 0xE5,0x69,0x84,0x61,0xEC,0xFE,0x7E,0xFB,0xE5,0x61,0x84,0x59,0xAB,0xA7,0x2D,0x2E, + 0x05,0x6A,0xC5,0x61,0xF6,0xE5,0xEF,0x5A,0xE5,0x69,0xC5,0x61,0x96,0x2F,0xAE,0x57, + 0x26,0x6A,0xC4,0x61,0xAF,0x0F,0x8F,0xB9,0x46,0x72,0x05,0x6A,0xED,0xF5,0x7D,0xC5, + 0x46,0x72,0x05,0x6A,0xAA,0x82,0x03,0xA3,0x46,0x72,0x26,0x6A,0x0C,0x80,0xFB,0x1F, + 0x66,0x72,0xE4,0x61,0xBA,0x72,0xFC,0x5E,0x06,0x62,0x03,0x41,0xF8,0x78,0xE8,0x7C, + 0x03,0x41,0x81,0x28,0x5C,0x5A,0x5C,0x56,0xA2,0x30,0x81,0x28,0x17,0xB7,0xB7,0x1F, + 0xC2,0x30,0xA2,0x28,0x0B,0x06,0x0A,0x83,0x02,0x39,0xC2,0x30,0x55,0xD5,0xFD,0x2F, + 0x23,0x41,0xE2,0x38,0xE5,0xBD,0x09,0x0B,0x44,0x41,0xE2,0x38,0x55,0xF5,0xBF,0x02, + 0x44,0x49,0xE2,0x38,0x29,0xEB,0xAA,0x08,0x23,0x41,0xC2,0x30,0xC0,0xF2,0x78,0x7C, + 0x03,0x39,0xA2,0x30,0x72,0x7E,0x5F,0x77,0xE3,0x38,0xA2,0x30,0x8B,0xFB,0x55,0x55, + 0xC2,0x30,0xA2,0x28,0x0A,0x02,0xEF,0x55,0xE3,0x30,0xA2,0x28,0x3F,0xAD,0xBB,0xBD, + 0x23,0x39,0xC3,0x28,0xEF,0xFF,0xD5,0xD5,0xE3,0x30,0x82,0x28,0xA8,0xE8,0xFE,0xDC, + 0xC2,0x28,0x62,0x20,0xEA,0xFC,0x77,0xD6,0x82,0x20,0x61,0x20,0x3F,0x2A,0x0A,0xBA, + 0x61,0x30,0x82,0x20,0x5F,0x55,0x7D,0x55,0xE3,0x30,0x82,0x20,0xAF,0xEF,0xA9,0xAF, + 0xE3,0x30,0x82,0x28,0xEA,0x62,0xFA,0xFB,0xA2,0x28,0x82,0x20,0xE7,0x55,0xF7,0x08, + 0xE3,0x30,0x82,0x20,0xFD,0xED,0xBB,0x2B,0xE3,0x30,0x81,0x20,0xDF,0xFF,0xBE,0xA0, + 0xE3,0x30,0xA2,0x28,0xB5,0xBF,0xAA,0xAA,0xE3,0x30,0xA2,0x28,0xAA,0x7A,0x6E,0xEA, + 0xE3,0x30,0xA2,0x28,0xE2,0xEF,0x75,0x57,0xC2,0x30,0xA2,0x28,0xF5,0xF9,0x01,0x29, + 0xE3,0x30,0xA2,0x30,0x0F,0x01,0x0B,0x0F,0x03,0x39,0xC3,0x30,0xBA,0xB3,0xFF,0xFF, + 0xE3,0x30,0xA2,0x30,0xF0,0xFA,0xFA,0xF6,0xE3,0x38,0xA2,0x30,0x0D,0xBB,0xE2,0xF0, + 0xE3,0x38,0xA2,0x28,0x0B,0x2E,0xA7,0xB5,0x03,0x39,0xA2,0x30,0xFF,0xF7,0xAE,0x88, + 0x03,0x39,0xE3,0x38,0x73,0x7B,0xDF,0x98,0x24,0x39,0xE3,0x38,0xA5,0xB5,0xEF,0x7B, + 0x23,0x41,0xC2,0x30,0xCE,0xFE,0xFF,0x7B,0x03,0x39,0xC2,0x30,0xA3,0xAA,0xEB,0xBF, + 0xE3,0x48,0x03,0x39,0x5D,0x77,0xF7,0x55,0x23,0x41,0xE3,0x38,0xAA,0x2E,0xA5,0xF5, + 0x23,0x41,0xC2,0x30,0xA2,0xAA,0xF7,0xFF,0x24,0x41,0xE2,0x38,0xFA,0x3A,0x7B,0x7F, + 0x44,0x41,0xC2,0x30,0xE2,0xA0,0x7F,0x5F,0x03,0x39,0xC2,0x30,0xBF,0xB6,0xAF,0x2F, + 0x23,0x41,0xC2,0x30,0xB7,0xAE,0x3B,0x3E,0x44,0x41,0xE2,0x38,0xFF,0x09,0xE5,0xF7, + 0x43,0x41,0x03,0x39,0x5B,0xFD,0xB5,0xF7,0x23,0x39,0xE2,0x30,0x5F,0xFA,0xFA,0xEB, + 0x44,0x41,0xE2,0x30,0x29,0xFD,0xFF,0x55,0x44,0x41,0x03,0x39,0x7C,0xBF,0xAF,0xE5, + 0x23,0x39,0xC2,0x30,0xAA,0xE8,0x7A,0x5C,0x64,0x49,0xC2,0x30,0x0B,0xFF,0xDF,0x7D, + 0x85,0x51,0xE2,0x38,0x20,0xA3,0xAB,0xF5,0xC5,0x51,0x23,0x41,0xA2,0xE2,0xFF,0x9D, + 0x84,0x51,0x23,0x41,0x2C,0x3D,0x3D,0x2C,0xC5,0x59,0x64,0x51,0x8A,0x2B,0x9A,0xB5, + 0xE5,0x59,0x84,0x51,0xB5,0x3D,0x2E,0x2D,0x26,0x62,0xE5,0x59,0xE9,0xB5,0x2B,0x0B, + 0x46,0x6A,0xC5,0x59,0xF7,0xBE,0xAA,0x2A,0x48,0x6A,0xE5,0x61,0x25,0x2F,0xBA,0xFA, + 0x90,0xB4,0x89,0x72,0x0D,0x2D,0xB5,0xB5,0xF1,0xBC,0x0E,0xA4,0xE8,0xFE,0xED,0x95, + 0xB0,0xB4,0x6F,0xAC,0xAA,0xCB,0xFB,0x4A,0x6F,0xAC,0xAC,0x8B,0x58,0x70,0x68,0x68, + 0x8C,0x8B,0x2B,0x83,0x82,0xEE,0xFE,0x5C,0xAD,0x93,0x4B,0x83,0xCA,0xAB,0xF5,0x2D, + 0xCD,0x93,0x4B,0x83,0xAD,0xAD,0xAB,0x2A,0xCD,0x93,0x8C,0x8B,0x0B,0x2B,0x2D,0x36, + 0xEE,0x93,0xAD,0x93,0xF6,0x8A,0xC2,0xFE,0xED,0x93,0x0B,0x7B,0xA8,0xA8,0xEA,0x6A, + 0xAD,0x8B,0xCA,0x72,0x80,0x8A,0xFB,0x55,0x6C,0x83,0x0A,0x73,0x7A,0xF0,0xFB,0xDD, + 0x4B,0x83,0xCA,0x6A,0xA2,0x22,0xAE,0xB6,0x4C,0x83,0xCA,0x6A,0xE0,0xAE,0xF0,0x7A, + 0x0B,0x7B,0xCA,0x72,0xF6,0xDC,0x58,0x7A,0x2A,0x7B,0xCA,0x72,0xF9,0xF7,0x55,0x77, + 0x4B,0x83,0xEA,0x72,0xDD,0x57,0xBF,0x3B,0x4C,0x83,0xEA,0x72,0xAD,0xAB,0x2A,0xC8, + 0x6B,0x83,0x0B,0x7B,0x2F,0x97,0xF7,0xBF,0xAD,0x93,0x6C,0x8B,0xFF,0xAB,0x6D,0xF5, + 0xCE,0x93,0x6C,0x8B,0x0D,0x2F,0xF9,0x7E,0x4F,0xA4,0x6C,0x8B,0x0A,0xAB,0xAF,0xAD, + 0x43,0x51,0xE1,0x40,0x2A,0xE0,0x4A,0x7A,0x43,0x51,0xE2,0x40,0x8E,0x2B,0xAF,0xE9, + 0x64,0x51,0x02,0x49,0xFD,0x73,0x5A,0x75,0x23,0x49,0xE1,0x40,0xB2,0x9E,0x6B,0xAB, + 0x43,0x51,0xE2,0x48,0xE6,0xE7,0xAD,0x3E,0x23,0x49,0x02,0x49,0x80,0x7F,0xA4,0x94, + 0x43,0x51,0x02,0x49,0xDD,0x9F,0x52,0xE2,0x43,0x51,0xE2,0x40,0x7A,0xF8,0xDA,0xDB, + 0x64,0x59,0x02,0x49,0xB5,0x2D,0xA9,0xEA,0x64,0x59,0x23,0x51,0xAB,0xA8,0xEB,0xEF, + 0x64,0x59,0x23,0x51,0xFF,0x7C,0x7D,0x6D,0x43,0x51,0x02,0x49,0x8A,0xF8,0xFF,0x87, + 0x64,0x51,0x23,0x51,0x7A,0xBF,0xA7,0x7B,0x64,0x59,0x03,0x49,0x2E,0xA8,0xEA,0xDF, + 0x44,0x51,0x03,0x49,0xB8,0x68,0xEA,0xEA,0x23,0x51,0xE2,0x48,0xAA,0xFF,0xEF,0x0A, + 0x44,0x51,0x03,0x49,0x7F,0x5E,0x35,0xBF,0x23,0x51,0xE2,0x48,0xFB,0xBF,0x8E,0x8E, + 0x88,0x7A,0x23,0x51,0x25,0x25,0x3D,0x2D,0x2A,0x93,0xE9,0x8A,0xAB,0xFD,0xA9,0x6B, + 0x09,0x8B,0xA8,0x82,0xF8,0xF2,0x78,0x5A,0xC8,0x82,0x87,0x7A,0xF2,0xF0,0xDE,0x57, + 0xA8,0x7A,0x67,0x7A,0xFE,0x5F,0x7C,0xFF,0x87,0x7A,0x46,0x72,0x00,0x0F,0x2E,0xBB, + 0xA8,0x7A,0x67,0x7A,0xF7,0xEF,0xBF,0xAD,0x87,0x7A,0x67,0x72,0xB7,0x8A,0xC0,0xA0, + 0x87,0x7A,0x66,0x72,0x7E,0x0A,0x3E,0x12,0xA7,0x7A,0x67,0x72,0x75,0xE5,0xDF,0x37, + 0x87,0x7A,0x46,0x72,0xF5,0x0F,0x2A,0x08,0x87,0x7A,0x46,0x72,0x5D,0x5F,0x3A,0xFA, + 0x86,0x72,0x25,0x6A,0xE0,0x9E,0xFE,0xFF,0x67,0x7A,0x26,0x6A,0xBF,0xB6,0xBC,0x8A, + 0x86,0x7A,0x46,0x72,0x75,0x75,0xFD,0xED,0x87,0x7A,0x46,0x72,0xA5,0x03,0x2A,0xAF, + 0xA8,0x7A,0x46,0x72,0xEB,0x0E,0xAC,0xED,0x87,0x7A,0x25,0x6A,0x7E,0xEC,0xAE,0x6E, + 0x26,0x72,0xC5,0x61,0x62,0xBA,0xB8,0xEA,0x06,0x6A,0xA4,0x61,0xE0,0xF2,0xFE,0x77, + 0xC5,0x61,0x63,0x59,0xA2,0x27,0xAC,0x8A,0x05,0x6A,0xA4,0x61,0xAD,0x29,0xAB,0x5E, + 0x05,0x6A,0xA4,0x61,0xFA,0xA8,0xFA,0x7A,0x06,0x6A,0xA4,0x59,0xDF,0x7B,0xFF,0x2B, + 0x05,0x6A,0xA4,0x61,0xBF,0x7F,0xFF,0x80,0x46,0x72,0xC4,0x61,0x8B,0x2D,0xBE,0x2E, + 0x46,0x72,0x26,0x6A,0x2F,0x2E,0xD0,0xFA,0x87,0x7A,0x26,0x6A,0xFD,0x57,0x6B,0xA2, + 0x66,0x72,0xE5,0x61,0x7E,0x7B,0xEA,0xE0,0xA4,0x59,0xA2,0x38,0x7C,0x78,0x78,0xF8, + 0xA1,0x30,0x61,0x28,0x78,0x5F,0x5E,0x5E,0xC2,0x30,0x61,0x28,0xBF,0x3D,0xAD,0xBD, + 0x23,0x41,0xA1,0x28,0xFD,0xFB,0x2B,0x0B,0x23,0x41,0xE2,0x38,0x8D,0xF7,0xAF,0xAC, + 0x23,0x41,0xE2,0x38,0x0F,0x2F,0xF7,0xDF,0x64,0x49,0x03,0x41,0x2B,0x89,0x85,0x25, + 0x64,0x49,0x23,0x41,0xE6,0xFA,0x70,0xE0,0x43,0x41,0xA2,0x30,0xFC,0x5E,0x7A,0xFE, + 0xC2,0x30,0x81,0x28,0xFC,0xFA,0xE8,0xA8,0xA2,0x28,0x81,0x28,0xBE,0x7E,0xFC,0x68, + 0xA2,0x28,0x82,0x20,0x80,0xFA,0x5E,0x5D,0xC2,0x28,0x82,0x20,0xAF,0xBD,0x1F,0x7F, + 0xE3,0x30,0xA2,0x28,0x03,0xFF,0xFF,0x5F,0xC3,0x28,0x61,0x20,0xF8,0xF8,0x7E,0x56, + 0x83,0x20,0x61,0x20,0xDC,0x96,0xDF,0xD2,0x82,0x20,0x61,0x20,0xF8,0xBE,0xEB,0xFB, + 0xA2,0x28,0x41,0x18,0xA2,0xA8,0xBE,0xDF,0xC3,0x28,0x61,0x20,0x0B,0xEF,0xBF,0xF5, + 0xA2,0x28,0x82,0x20,0xBA,0xFE,0x0F,0x2F,0xC3,0x28,0x82,0x20,0x2E,0x89,0x3B,0xAB, + 0xE3,0x30,0xA2,0x28,0x3F,0xBF,0xFD,0xBD,0x03,0x31,0xA2,0x28,0xDA,0xFA,0xE3,0xFF, + 0xE3,0x30,0xC2,0x28,0xF2,0x78,0xDE,0x5D,0xE3,0x30,0xA2,0x28,0x2A,0xBF,0xBB,0xF7, + 0xE3,0x30,0xA2,0x28,0x7F,0xEE,0xAB,0x8A,0xE3,0x38,0xA2,0x28,0xFD,0xF5,0xFE,0x2B, + 0xE3,0x30,0xA2,0x30,0x8F,0x2B,0x88,0xEA,0xE3,0x30,0xA2,0x30,0xB8,0xF6,0xF7,0x7D, + 0xC2,0x30,0xA2,0x30,0x0E,0x0B,0x03,0x2A,0xE3,0x38,0xA2,0x28,0xF8,0xFB,0xBF,0xAA, + 0x03,0x39,0xA2,0x30,0xB5,0xFD,0xBB,0x2A,0x24,0x39,0xE3,0x30,0xB2,0xBB,0x57,0x57, + 0x03,0x39,0xC2,0x30,0x80,0xA0,0xFA,0xFE,0x03,0x39,0xC2,0x30,0xA2,0xAB,0xBF,0x3F, + 0x23,0x39,0xE2,0x30,0xEF,0xFE,0xE9,0xE2,0x03,0x39,0xC2,0x30,0xFF,0xAF,0xAB,0x00, + 0x03,0x39,0xE2,0x38,0x03,0x57,0x27,0x05,0x24,0x39,0xE2,0x38,0x95,0xF5,0x9E,0x5A, + 0x23,0x41,0xE2,0x38,0x7E,0x6E,0xA0,0x8A,0x03,0x39,0xC2,0x30,0x63,0x62,0x70,0xE8, + 0x03,0x39,0xA2,0x30,0x7B,0x3F,0x2F,0x2E,0x44,0x41,0xE2,0x30,0xB5,0xFD,0xEE,0x3A, + 0x44,0x49,0x03,0x39,0x57,0x77,0xFF,0xB0,0x44,0x49,0x03,0x39,0xD5,0x55,0x7D,0xF2, + 0x24,0x39,0xE3,0x38,0xEA,0xF2,0xB9,0xFF,0x03,0x39,0xC2,0x38,0x02,0x00,0xC0,0xC2, + 0x03,0x39,0xC2,0x30,0x77,0xAF,0xBB,0x8A,0x23,0x39,0xC2,0x30,0x8B,0xA6,0x3F,0xAB, + 0x23,0x39,0xE2,0x30,0x56,0xFF,0x6A,0xE8,0x02,0x39,0xC1,0x30,0xEA,0x63,0xA2,0x82, + 0x03,0x41,0xC2,0x30,0x2F,0xA9,0x2B,0x3F,0xA4,0x51,0x23,0x41,0xAD,0x37,0x29,0x2D, + 0xC5,0x51,0x64,0x49,0xDF,0x59,0x8A,0x22,0xC5,0x59,0x64,0x49,0xFD,0x95,0xFA,0xF8, + 0x05,0x62,0x63,0x49,0xAF,0x2F,0xAF,0xF7,0x67,0x6A,0xC5,0x59,0x8A,0xAA,0xBF,0x75, + 0x06,0x62,0x84,0x51,0x08,0xB8,0xFE,0xDF,0x47,0x6A,0xA4,0x51,0x0A,0x2A,0xBD,0x2D, + 0x8C,0x93,0x27,0x62,0x2F,0x2D,0x2D,0x2D,0xB0,0xB4,0xED,0x9B,0x3D,0xAD,0x29,0x29, + 0xD0,0xB4,0x6F,0xAC,0xEE,0x7F,0xE2,0xFA,0x6F,0xAC,0xAD,0x93,0x68,0xE0,0xE8,0xE0, + 0xAD,0x93,0x0A,0x7B,0xFE,0xAC,0xF8,0x58,0xAC,0x8B,0x2B,0x83,0x2B,0x2B,0x2F,0xBD, + 0xCD,0x8B,0x8C,0x8B,0xBC,0x68,0x82,0xC9,0xCD,0x93,0x6C,0x7B,0xA8,0xAA,0x2A,0xFF, + 0xCD,0x93,0x0A,0x73,0xA0,0xA2,0xFA,0x7E,0x8C,0x8B,0xAA,0x6A,0xA0,0xFA,0x7E,0xDF, + 0x0B,0x73,0xA9,0x6A,0x7B,0xF2,0xFE,0x5E,0x0A,0x73,0x89,0x62,0x02,0x2B,0xF9,0xDD, + 0x2B,0x73,0xEA,0x72,0xAD,0x7D,0xD5,0x5D,0x2B,0x7B,0xA9,0x6A,0xB8,0xBF,0xF7,0xB7, + 0x0A,0x73,0xC9,0x72,0x96,0xFB,0x42,0xE0,0x0A,0x7B,0xCA,0x72,0x9E,0x39,0x25,0xD5, + 0x4C,0x7B,0x0B,0x7B,0xDD,0xDD,0x89,0xB7,0x6C,0x83,0x0B,0x7B,0xDE,0xBF,0x1F,0xEF, + 0x6C,0x83,0x2B,0x83,0xFF,0xFA,0xEA,0xA8,0xEE,0x9B,0x4B,0x83,0xBD,0x0F,0x29,0x2D, + 0xEE,0x9B,0x4B,0x83,0x7E,0x7A,0x58,0xF0,0xEE,0x9B,0x4C,0x83,0x2D,0x2D,0xFD,0xF5, + 0x43,0x51,0xE1,0x48,0xDE,0xEB,0x8A,0x0B,0x22,0x49,0xE2,0x40,0xE0,0xFA,0xFF,0xEF, + 0x44,0x51,0xC2,0x40,0xFF,0x7F,0xBF,0x2B,0x43,0x51,0xE2,0x40,0xFD,0xEB,0x2F,0x08, + 0x63,0x51,0x02,0x49,0xF7,0x55,0x6D,0xFE,0x43,0x51,0x02,0x49,0xF7,0xA5,0xB5,0xBF, + 0x43,0x51,0xE2,0x40,0xE0,0x7A,0x7C,0xFA,0x43,0x51,0xE2,0x40,0xBF,0xAF,0xB9,0xE9, + 0x43,0x51,0x02,0x49,0x80,0xA8,0xAF,0x4B,0x43,0x51,0x03,0x49,0xA0,0xA3,0xBB,0x0F, + 0x65,0x59,0x23,0x51,0xED,0xBA,0x5A,0x5F,0x64,0x59,0x02,0x49,0xBB,0x8F,0xCD,0xEA, + 0x44,0x51,0x23,0x51,0x5C,0xDB,0x8D,0xED,0x43,0x51,0x03,0x49,0xF7,0xFB,0xCB,0xE2, + 0x23,0x51,0x03,0x49,0xE0,0xFC,0x5A,0x72,0x23,0x51,0xE2,0x48,0xCA,0xFA,0xAA,0xAB, + 0x23,0x51,0xE2,0x48,0xE2,0xBB,0xFF,0x75,0x23,0x51,0xE2,0x48,0xCF,0xCB,0x2B,0xED, + 0xE8,0x8A,0x23,0x51,0x2D,0x25,0x29,0x2D,0x29,0x93,0xE8,0x8A,0x72,0xF2,0x62,0x5F, + 0xC9,0x8A,0xA7,0x7A,0xE8,0xF8,0xBE,0x72,0xA8,0x7A,0x87,0x7A,0x58,0x5C,0xE0,0xFF, + 0xA7,0x7A,0x67,0x72,0xDB,0x2B,0xBF,0x77,0x87,0x7A,0x46,0x72,0x79,0xCA,0x2A,0x00, + 0xA7,0x7A,0x67,0x72,0xA9,0xB7,0xE4,0x7C,0xA8,0x82,0x26,0x72,0xA8,0xAF,0x0A,0x22, + 0xA7,0x7A,0x66,0x72,0xBB,0xDC,0xE0,0x82,0x87,0x7A,0x67,0x72,0x18,0x0C,0x2B,0x0E, + 0xA7,0x7A,0x67,0x7A,0xFF,0x5F,0xEF,0x1F,0x87,0x7A,0x46,0x72,0x2A,0x2F,0xBA,0x90, + 0x66,0x72,0x26,0x72,0xEC,0x4C,0xD0,0xC2,0x67,0x7A,0x25,0x6A,0x9A,0xC2,0xCB,0x6F, + 0x87,0x7A,0x46,0x72,0xFA,0x5E,0x7E,0x7D,0x87,0x7A,0x46,0x72,0xEF,0x8F,0xAD,0x0F, + 0x87,0x7A,0x67,0x72,0xA3,0x93,0xBD,0x6F,0x67,0x72,0x05,0x6A,0xE8,0xEC,0xFE,0xDF, + 0x26,0x72,0xC5,0x61,0xF8,0xEF,0x79,0xBE,0xC5,0x61,0x83,0x59,0xEC,0x02,0x20,0xE8, + 0x05,0x6A,0xA4,0x61,0xF5,0xE5,0x2D,0x0D,0x46,0x72,0xA4,0x61,0xD7,0xBD,0x0A,0xAA, + 0x46,0x72,0xC5,0x61,0xA5,0x8B,0x80,0x08,0x87,0x7A,0x06,0x6A,0xFD,0x2D,0x8A,0xAA, + 0xA7,0x7A,0x46,0x72,0x5F,0x2B,0x22,0xAB,0xA8,0x82,0x05,0x6A,0xFD,0xEB,0x88,0x22, + 0xA8,0x7A,0x26,0x72,0x77,0xAF,0x8A,0xAA,0xA8,0x7A,0x67,0x72,0x7F,0xCB,0x6A,0xDD, + 0x87,0x72,0x26,0x6A,0x60,0x80,0xE8,0x7F,0x06,0x62,0xE2,0x38,0x5A,0x78,0x78,0x78, + 0xC2,0x38,0x61,0x28,0x5E,0xBE,0xFA,0xB8,0xE2,0x38,0x81,0x30,0xBD,0x3D,0x2F,0x2D, + 0x64,0x49,0x03,0x39,0xA9,0x8F,0xA9,0xFD,0x64,0x49,0x03,0x39,0x7A,0x7A,0x7E,0xAF, + 0x23,0x41,0xE2,0x38,0x45,0xF7,0x7A,0xEA,0x65,0x49,0xE3,0x38,0x2D,0xAD,0xFD,0xDD, + 0x64,0x49,0x03,0x39,0xA2,0xA2,0xAB,0x87,0x23,0x39,0xA2,0x28,0x68,0x6A,0xF0,0x68, + 0xC2,0x30,0x82,0x28,0x2F,0xAE,0x20,0x22,0xC2,0x28,0xA2,0x28,0x77,0x5F,0x7F,0xEF, + 0xA2,0x28,0x82,0x20,0x72,0x62,0xAB,0xEC,0xC3,0x28,0x61,0x20,0xFE,0xFA,0xB8,0x7E, + 0xC3,0x28,0x61,0x20,0xE3,0xEF,0x7F,0x57,0x82,0x20,0x61,0x20,0x58,0xDF,0xFF,0xBF, + 0x82,0x20,0x61,0x20,0x60,0x0B,0x3F,0x3B,0xA2,0x28,0x61,0x20,0xFF,0xFA,0x8B,0x02, + 0xA2,0x20,0x61,0x20,0x57,0x9F,0xFA,0xF8,0xA2,0x28,0x41,0x18,0xBD,0xEA,0xAA,0x2A, + 0xA2,0x28,0x61,0x20,0x2B,0xAF,0x3B,0x08,0xC2,0x28,0x82,0x20,0xFF,0xFF,0x3F,0xB7, + 0xC2,0x28,0x81,0x28,0x0B,0x22,0xE8,0xA8,0xC2,0x28,0xA2,0x28,0x78,0x5A,0x5D,0xDB, + 0xC2,0x30,0xA2,0x28,0x73,0xF5,0x35,0x2B,0xC2,0x30,0xA2,0x28,0x55,0xFA,0xA0,0x80, + 0x03,0x39,0xA2,0x28,0xAB,0x8B,0xA7,0xFF,0x03,0x39,0xC2,0x30,0xAF,0xF6,0x57,0x57, + 0xE3,0x38,0xC3,0x30,0x78,0xED,0x3B,0x39,0xE3,0x30,0xA2,0x30,0xFF,0xEE,0xAA,0xAB, + 0xC2,0x30,0xA3,0x28,0x0A,0xAA,0x80,0x20,0x03,0x31,0xA2,0x30,0xFE,0x5F,0xF5,0x77, + 0x03,0x39,0xC2,0x30,0x2B,0x2F,0xA5,0x75,0x03,0x39,0xA2,0x30,0xA0,0xA8,0xFE,0xFA, + 0x03,0x39,0xC3,0x30,0xAA,0x02,0xA7,0xD7,0x23,0x39,0xE3,0x38,0x97,0xBB,0x77,0xD5, + 0x23,0x39,0xE3,0x38,0xE6,0xAA,0x13,0x3B,0x23,0x39,0xC2,0x30,0x88,0x8A,0xBA,0x9A, + 0x03,0x39,0xC2,0x30,0x03,0xBE,0x3C,0xBA,0x03,0x39,0xC2,0x30,0x00,0x2A,0xAA,0xFE, + 0x23,0x39,0xE2,0x30,0x28,0x3B,0xF5,0x57,0x23,0x41,0xE2,0x38,0xFC,0x58,0x50,0x53, + 0xE2,0x38,0xC2,0x30,0x28,0x0E,0x0E,0x2E,0x44,0x41,0xE3,0x38,0x23,0xAD,0x37,0x1F, + 0x85,0x49,0x23,0x41,0xFF,0xFB,0x9F,0x1F,0x64,0x49,0x24,0x41,0x52,0x5A,0x78,0x2A, + 0x44,0x41,0xE2,0x38,0x7F,0xDE,0xFE,0xEC,0x44,0x41,0xE3,0x38,0xED,0xAF,0xEF,0xCA, + 0x02,0x39,0xC2,0x30,0xF0,0x5A,0xC2,0xAE,0x02,0x39,0xC1,0x30,0x2A,0x25,0xB5,0xEF, + 0x23,0x39,0xE2,0x38,0xE2,0xAC,0xB7,0xBD,0x43,0x41,0xE2,0x38,0xDF,0xEB,0xA0,0xBC, + 0x23,0x41,0xE2,0x38,0x55,0xDF,0x14,0xBF,0xA4,0x51,0x02,0x39,0x29,0xAF,0xA5,0xD7, + 0xA4,0x51,0x02,0x41,0x00,0x82,0xA8,0x6E,0xA4,0x51,0x23,0x41,0xA0,0xFE,0xFF,0xFD, + 0xA4,0x59,0x22,0x41,0xAF,0xB7,0x2D,0x2F,0xC5,0x59,0x84,0x51,0x83,0xA9,0xFB,0xB3, + 0xE6,0x59,0x84,0x51,0x57,0x5F,0x7A,0xE2,0x26,0x62,0x84,0x51,0x2F,0xB5,0xAD,0xAF, + 0x8C,0x93,0x26,0x62,0x2D,0x2D,0x25,0x25,0xB0,0xB4,0x2E,0xA4,0x0D,0x09,0x29,0xAD, + 0xB0,0xB4,0x6F,0xAC,0x78,0xF8,0x7B,0xE7,0x6F,0xAC,0xCD,0x93,0x68,0x68,0xF8,0x58, + 0xAD,0x93,0xA9,0x72,0x78,0x78,0x78,0x70,0x2C,0x83,0x48,0x62,0x02,0x8A,0xAF,0xD5, + 0x8C,0x8B,0x89,0x6A,0x0A,0xFF,0xFF,0x7F,0x8C,0x83,0x69,0x62,0x20,0xAB,0xFF,0x57, + 0x2B,0x73,0x68,0x62,0xA0,0xE8,0x7F,0x55,0xCA,0x6A,0x68,0x62,0x22,0xED,0xFA,0xF7, + 0xCA,0x6A,0x68,0x62,0xF8,0x5F,0x75,0x7D,0xCA,0x6A,0x68,0x62,0x3B,0xB3,0x9D,0xE9, + 0xEA,0x72,0x89,0x62,0x82,0xAA,0x2B,0xAD,0xEA,0x72,0x89,0x62,0x2B,0x2D,0xBE,0xBE, + 0x0A,0x73,0xC9,0x6A,0xA0,0xFF,0xB5,0x15,0x4B,0x7B,0xCA,0x72,0x57,0xFD,0xAB,0x2D, + 0xAD,0x8B,0x0B,0x7B,0xF5,0xFD,0x8F,0x0A,0x0E,0x9C,0x2B,0x7B,0xF5,0xFF,0xAB,0x2A, + 0xED,0x93,0x4B,0x83,0x57,0x77,0xFE,0xFC,0xED,0x93,0x4B,0x83,0x3F,0x27,0x3D,0xBF, + 0x2E,0xA4,0x8C,0x8B,0x60,0xA2,0x02,0x03,0x0E,0x9C,0x4B,0x83,0xDD,0x5F,0x7E,0x58, + 0x43,0x51,0x03,0x49,0x8B,0xCE,0x9E,0x96,0x23,0x49,0xE2,0x48,0xFC,0x9E,0x3E,0x0A, + 0x23,0x49,0x02,0x49,0x5A,0xF8,0x88,0xA8,0x44,0x51,0x02,0x49,0xBF,0xFF,0x6A,0x52, + 0x44,0x51,0x03,0x49,0xB6,0xBA,0xF5,0xF5,0x22,0x49,0xE2,0x40,0x20,0xA8,0xAD,0xDC, + 0x43,0x51,0xE2,0x40,0xFA,0xAD,0x2B,0x8A,0x43,0x51,0x02,0x49,0xFB,0xDA,0xA8,0xFA, + 0x64,0x51,0x03,0x49,0xFE,0xFE,0xEE,0x35,0x44,0x51,0x02,0x49,0xCB,0xEF,0xF9,0xF9, + 0x64,0x51,0x23,0x51,0xFD,0xD5,0x35,0xA5,0x44,0x59,0x23,0x49,0xEA,0xE3,0x7A,0x7A, + 0x43,0x51,0x03,0x49,0xAF,0xA3,0x0F,0x6F,0x43,0x51,0x03,0x49,0x83,0x9C,0x5E,0xFD, + 0x23,0x51,0xE2,0x48,0xE8,0x68,0xFC,0x96,0x23,0x51,0xE2,0x48,0x35,0xA5,0xA9,0xCE, + 0x02,0x49,0xE2,0x48,0x70,0x02,0xB8,0xF0,0x43,0x51,0xE2,0x48,0xFF,0xF7,0x2F,0xAD, + 0xE8,0x82,0x83,0x59,0x25,0x0D,0x0D,0x0D,0x29,0x8B,0xC8,0x82,0xEA,0x7A,0xE2,0xFA, + 0xE9,0x8A,0x87,0x7A,0x62,0xEB,0xFB,0x56,0xA8,0x7A,0x67,0x72,0xE2,0x2E,0xBA,0x7F, + 0xA7,0x82,0x67,0x72,0xFF,0xEE,0xEB,0xF1,0xA8,0x7A,0x67,0x7A,0xFE,0xDA,0xDA,0xAA, + 0xC8,0x82,0x67,0x72,0x7F,0x5E,0x58,0xEB,0xA8,0x7A,0x67,0x72,0xBE,0xAB,0x2D,0xBF, + 0x46,0x82,0xA8,0x7A,0xF6,0xF7,0xFD,0xFF,0xA8,0x7A,0x46,0x72,0x8A,0xAE,0xFF,0xAB, + 0xA7,0x7A,0x67,0x72,0xFF,0x6B,0x4B,0xFF,0x87,0x7A,0x46,0x72,0xAB,0xFA,0xFA,0x7A, + 0x66,0x72,0x26,0x72,0x2F,0xAA,0x6B,0xFF,0x66,0x72,0x05,0x72,0xA8,0x8A,0x8B,0x82, + 0x67,0x7A,0x46,0x72,0xCD,0x37,0xD5,0x17,0x87,0x7A,0x46,0x72,0xB2,0xAF,0xAF,0xEF, + 0x87,0x7A,0x26,0x72,0xC2,0xDF,0x6F,0xFB,0x46,0x72,0xE5,0x61,0xB8,0xFE,0xDE,0x7C, + 0x06,0x6A,0xA4,0x61,0xDC,0x5A,0x5A,0x6A,0x25,0x6A,0x83,0x59,0x7F,0xFF,0xDD,0x3B, + 0x46,0x72,0xA4,0x59,0xFD,0x75,0x3B,0x00,0xA8,0x7A,0x05,0x6A,0xD5,0xB5,0x0F,0xEE, + 0x87,0x7A,0x05,0x6A,0x2B,0x2A,0xE8,0x56,0x88,0x7A,0x05,0x6A,0xA2,0x2C,0xAF,0xF5, + 0x87,0x7A,0x05,0x6A,0x22,0x88,0x8B,0xFD,0x87,0x7A,0x26,0x6A,0x8A,0xAA,0xBB,0xFD, + 0x67,0x72,0x26,0x6A,0xA7,0xB8,0x5A,0x78,0x87,0x7A,0xE6,0x69,0xAB,0xFE,0xBD,0x2E, + 0x67,0x72,0x06,0x6A,0x6A,0xBE,0xE0,0x80,0xE6,0x61,0x03,0x41,0x78,0x58,0x78,0x78, + 0xE2,0x38,0x81,0x30,0xD8,0x88,0xA2,0xA8,0x03,0x41,0x81,0x30,0xAD,0xAF,0xAA,0x88, + 0x23,0x41,0xE3,0x38,0x09,0x09,0xF7,0xF5,0x64,0x49,0xE2,0x38,0x8B,0x2E,0x2D,0xB5, + 0x44,0x49,0xC2,0x38,0xFE,0xF8,0x58,0xF0,0xE2,0x38,0xC2,0x30,0x00,0xEE,0xEE,0xBF, + 0x24,0x41,0xC2,0x30,0x0A,0xAB,0xAF,0x7D,0x23,0x39,0xC2,0x28,0x78,0xEA,0x7E,0x7F, + 0xC2,0x28,0x62,0x20,0xA2,0xAA,0xAA,0xEA,0xC2,0x28,0x82,0x20,0xEA,0x5B,0x5F,0x55, + 0xA2,0x20,0x61,0x18,0x2C,0xBA,0xBA,0xFF,0xA2,0x20,0x61,0x20,0x7A,0x7A,0x78,0x7F, + 0x82,0x20,0x61,0x20,0x55,0xD5,0x37,0x0B,0xA1,0x20,0x62,0x20,0xF7,0xF7,0xFE,0xEA, + 0xA2,0x28,0x61,0x20,0x5F,0xFF,0x8B,0x02,0xC2,0x28,0x82,0x20,0xBD,0x5D,0xBF,0x7E, + 0xC3,0x28,0x61,0x20,0x7A,0xEA,0xAA,0x8A,0xA2,0x28,0x81,0x20,0x07,0x7C,0x5E,0x7A, + 0xC2,0x28,0x81,0x20,0xAF,0xAF,0xB5,0xB5,0xC2,0x28,0x61,0x20,0x2A,0x20,0xA8,0xEA, + 0xE3,0x30,0xA2,0x28,0xBF,0xBB,0xBF,0xD5,0xC2,0x28,0xA2,0x28,0x7A,0xEE,0xD4,0x67, + 0xC2,0x30,0xA2,0x28,0x7E,0x5F,0x7D,0xA9,0xE3,0x30,0xA2,0x28,0xFB,0x0B,0x03,0x20, + 0xE3,0x30,0xC2,0x28,0xAB,0x8B,0xAB,0xF6,0xE3,0x30,0x82,0x28,0xEA,0xFA,0xFA,0xDE, + 0xC2,0x30,0x81,0x28,0xA0,0xB8,0x6F,0xBD,0xE3,0x30,0xA2,0x28,0xA9,0xEB,0xED,0x69, + 0xE3,0x30,0xA2,0x28,0xE3,0xA3,0xFD,0x7D,0xC2,0x30,0xA2,0x28,0x38,0x30,0x3F,0x0A, + 0xE3,0x30,0xA2,0x30,0xBE,0xB6,0xAE,0x0A,0xE3,0x38,0xC2,0x30,0xF0,0xE2,0xEA,0xD0, + 0xC2,0x38,0xE3,0x30,0xFF,0xDF,0xFE,0x2F,0xE3,0x38,0xA2,0x28,0x22,0xE0,0xDA,0xFE, + 0x03,0x39,0xC2,0x30,0x3E,0x9F,0xFF,0xB7,0x23,0x39,0xE2,0x30,0x5F,0x57,0xB5,0xB5, + 0x03,0x39,0xC2,0x30,0xDA,0xAA,0x2A,0x08,0x03,0x39,0xC2,0x30,0xFF,0xBE,0xA4,0x00, + 0x24,0x39,0xE2,0x38,0x77,0xF7,0xBF,0xF8,0x23,0x41,0xE3,0x38,0xFD,0xA9,0xAA,0x4B, + 0x23,0x41,0xC2,0x30,0xFF,0xDA,0xC2,0xA2,0x44,0x41,0x03,0x41,0xA5,0xA5,0x8D,0xFF, + 0x85,0x49,0x23,0x41,0xED,0x3D,0x9F,0xBA,0x85,0x51,0x44,0x41,0xAD,0x0D,0xBB,0xBA, + 0x64,0x49,0x03,0x39,0x76,0xCE,0xC0,0x88,0x84,0x49,0x23,0x41,0xF5,0x5F,0x5B,0x63, + 0x44,0x49,0xE2,0x38,0x7E,0xAB,0x8A,0x82,0x43,0x49,0xC1,0x38,0x7D,0xFE,0xFA,0xA0, + 0x23,0x41,0xE2,0x38,0x2F,0x29,0xAF,0xEF,0x23,0x41,0x03,0x39,0x24,0x0A,0x8F,0x2B, + 0x23,0x41,0xE2,0x38,0xBF,0x38,0x00,0xB0,0x43,0x49,0xE2,0x38,0x2C,0xEA,0xB7,0x2D, + 0x64,0x49,0x02,0x41,0x2A,0x2D,0xAF,0x0A,0xA5,0x51,0x43,0x41,0xDF,0xE7,0x8A,0x02, + 0xE5,0x59,0x22,0x41,0xA7,0x2F,0x0B,0x2A,0x27,0x62,0x84,0x51,0x7F,0xEF,0x3A,0x2F, + 0x27,0x62,0xC5,0x59,0xFD,0xEF,0xA8,0x00,0x27,0x62,0xC5,0x59,0xF7,0x79,0xBE,0xA8, + 0x2A,0x83,0xE6,0x59,0x2D,0x3D,0x35,0x35,0x32,0xC5,0xED,0x9B,0xBD,0x2D,0x29,0x2D, + 0x73,0xCD,0xD1,0xB4,0x55,0xFF,0xA2,0x00,0x52,0xC5,0x4F,0xA4,0x5F,0xEA,0xA0,0x80, + 0xB0,0xB4,0xEA,0x7A,0x7E,0xF8,0xA0,0x20,0x2F,0x9C,0x07,0x5A,0x55,0x57,0xFA,0xA0, + 0xCA,0x72,0x07,0x5A,0xA0,0xA8,0x6A,0x70,0x49,0x62,0xA6,0x51,0x80,0xAC,0xBE,0xD7, + 0x48,0x62,0xA6,0x51,0x0A,0xAB,0x7F,0x77,0x68,0x62,0xE6,0x51,0x80,0xEE,0xFF,0xDF, + 0x68,0x62,0x07,0x52,0x02,0x02,0xFB,0x77,0x89,0x62,0x27,0x5A,0x08,0x2A,0xE8,0xDF, + 0xA9,0x6A,0x68,0x62,0x2B,0xAA,0xAD,0x25,0xCA,0x6A,0x68,0x62,0x20,0x0B,0x0D,0x0B, + 0x0A,0x7B,0xA9,0x6A,0xAF,0xE7,0xB3,0x0A,0xAD,0x8B,0x0A,0x73,0x95,0x35,0x2D,0x0B, + 0x4F,0xA4,0xAD,0x8B,0xF5,0xB5,0x3A,0xAB,0x4E,0xA4,0xCC,0x93,0xD7,0xFA,0xAA,0x02, + 0x4F,0xA4,0xAC,0x8B,0x7E,0xEA,0xAA,0x82,0xCD,0x93,0x6B,0x8B,0xAA,0xB0,0x98,0x88, + 0x4E,0xA4,0xCD,0x93,0x0D,0x2F,0xAF,0x3D,0x6F,0xAC,0x8C,0x8B,0x5E,0x78,0x78,0xE8, + 0x44,0x49,0x02,0x49,0x78,0x55,0xD5,0xF5,0x23,0x49,0x03,0x49,0xEB,0xDA,0xF7,0xC8, + 0x23,0x49,0xE2,0x40,0x28,0xB7,0xD6,0xAE,0x43,0x51,0x03,0x49,0xFF,0x0B,0xBF,0xF9, + 0x43,0x51,0xE2,0x40,0xE2,0xA8,0x7A,0x9A,0x43,0x51,0xE2,0x40,0x97,0xA7,0x2F,0x0A, + 0x64,0x51,0x02,0x49,0xFB,0xFA,0xF6,0xE8,0x43,0x51,0x03,0x49,0x77,0x0A,0x20,0x5B, + 0x64,0x59,0x02,0x49,0x9F,0xBE,0xB8,0xEF,0x43,0x51,0x03,0x51,0x20,0x00,0x2C,0xEB, + 0x43,0x51,0x23,0x51,0x26,0xFE,0x56,0xF1,0x43,0x51,0x02,0x49,0x6A,0xEA,0xFA,0x52, + 0x23,0x51,0x03,0x49,0x0A,0xC7,0x2F,0x09,0xE2,0x50,0x23,0x49,0xFE,0xBB,0xAD,0xED, + 0x44,0x51,0xE2,0x48,0xFF,0xFD,0xAA,0xA8,0x23,0x51,0xC1,0x40,0x6E,0x7A,0xEA,0xE8, + 0x02,0x49,0xE2,0x48,0x39,0x0B,0x8B,0xCD,0xE6,0x69,0x02,0x49,0xD5,0xD5,0xB5,0x25, + 0x49,0x93,0xE5,0x61,0xAD,0x2D,0xAB,0x2A,0x08,0x8B,0xA7,0x7A,0xF0,0xFC,0x78,0x7A, + 0xC8,0x82,0x66,0x72,0xA8,0xE0,0x6A,0x7A,0xA7,0x7A,0x67,0x7A,0xAE,0xA2,0xFA,0x1F, + 0xA7,0x7A,0x66,0x72,0xEE,0xA8,0x66,0xAA,0xA7,0x82,0x66,0x72,0xC3,0x71,0x7D,0x75, + 0x87,0x7A,0x67,0x72,0x02,0xA3,0x21,0x23,0xA7,0x7A,0x66,0x72,0xBA,0xAB,0x29,0xDF, + 0xA7,0x7A,0x66,0x72,0xBA,0xAA,0xB6,0x77,0xA8,0x7A,0x66,0x7A,0x2F,0xBF,0xEE,0x2D, + 0xA8,0x82,0x46,0x72,0xBA,0xF2,0x78,0x78,0x67,0x7A,0x46,0x72,0xF2,0xEB,0x7D,0x69, + 0x66,0x72,0x26,0x6A,0xF7,0xFF,0xF8,0xEB,0x66,0x7A,0x26,0x6A,0x2A,0x89,0x0B,0xBA, + 0xA7,0x7A,0x26,0x72,0xBF,0xFF,0x7F,0x0A,0x09,0x8B,0x26,0x72,0xF5,0xBD,0xAD,0x2A, + 0x4A,0x93,0x46,0x72,0x55,0xFF,0xAA,0x2A,0x29,0x8B,0x46,0x72,0x55,0xEE,0xAA,0xA0, + 0xA8,0x7A,0xE5,0x61,0xDF,0xEA,0xA0,0xB8,0x67,0x7A,0xE5,0x69,0x2B,0x82,0xF0,0x56, + 0x67,0x72,0xE5,0x69,0xAC,0xFF,0xFF,0xF5,0x25,0x72,0xC5,0x61,0xE8,0xEA,0xAA,0xAA, + 0x46,0x72,0xC4,0x61,0x7F,0x7F,0xBA,0x8A,0x46,0x72,0xE5,0x61,0xD7,0xDF,0xFB,0x28, + 0x67,0x72,0x05,0x6A,0xDD,0xFD,0xF9,0x83,0x67,0x7A,0x26,0x6A,0x29,0xF5,0x5D,0xFF, + 0x87,0x7A,0x26,0x6A,0xBF,0xB5,0xAF,0x0B,0x87,0x72,0x26,0x6A,0xAE,0xFE,0xDF,0x7A, + 0x87,0x72,0x26,0x6A,0x7E,0x7C,0x57,0x57,0xE5,0x59,0x23,0x41,0x78,0x78,0x78,0x78, + 0x23,0x41,0xA1,0x30,0xDE,0xFE,0xDE,0xFC,0x04,0x39,0xC2,0x38,0xFB,0xF7,0x6B,0xE9, + 0x03,0x39,0xC2,0x38,0xAB,0xFF,0xFD,0x77,0x23,0x41,0xC2,0x30,0x3F,0xB7,0xB7,0xFF, + 0x44,0x41,0x03,0x39,0x6A,0x7A,0x7F,0x55,0x03,0x39,0xE2,0x30,0xBF,0x20,0xF8,0x34, + 0x03,0x39,0xA2,0x28,0xFA,0xFC,0x78,0x78,0xC2,0x28,0x81,0x20,0xC0,0xE8,0xF7,0x55, + 0xA2,0x28,0x61,0x20,0xEA,0xE8,0xF8,0xFA,0x82,0x20,0x61,0x18,0xDB,0x5A,0x72,0xC0, + 0x82,0x20,0x61,0x18,0xD5,0xF5,0xEF,0x8F,0xA2,0x20,0x61,0x18,0xF5,0xE9,0xAB,0xAB, + 0xA2,0x28,0x61,0x20,0xAB,0xEF,0x27,0xAE,0xC2,0x28,0x81,0x20,0xFB,0x8F,0xAD,0xAF, + 0x03,0x31,0xA2,0x28,0xF7,0xE7,0x7D,0xFF,0xE3,0x30,0x81,0x20,0x7E,0xFE,0xF2,0xAA, + 0xC2,0x28,0x82,0x28,0xFD,0x5F,0x5E,0xB6,0xA2,0x28,0x81,0x20,0xFE,0x40,0x78,0x5A, + 0xA2,0x28,0x61,0x20,0xAA,0xAC,0x7A,0xAE,0xA2,0x28,0x61,0x20,0x28,0xA8,0xFA,0xFA, + 0xA2,0x28,0x61,0x20,0x00,0x02,0x2F,0xAF,0xC2,0x28,0x81,0x28,0xAB,0x8F,0x2F,0xFF, + 0xC2,0x28,0x81,0x28,0x02,0xA8,0x7B,0x55,0xE2,0x30,0x81,0x28,0x8A,0xBE,0xE9,0xBF, + 0xE3,0x30,0xA2,0x28,0x9B,0x3B,0x3E,0xFF,0xC2,0x30,0xA2,0x28,0x5E,0xDC,0x7C,0x5F, + 0x61,0x30,0xC2,0x28,0xFB,0x77,0xFF,0x5D,0x03,0x31,0xC2,0x28,0x7D,0xF5,0x6D,0x43, + 0xE3,0x30,0xA2,0x28,0xFD,0x8E,0xA2,0x82,0x04,0x39,0xC3,0x30,0xF5,0xFF,0xDF,0xAF, + 0x24,0x39,0xE3,0x38,0xF5,0x8D,0x25,0xFF,0x24,0x39,0xC2,0x30,0x5E,0x7E,0x60,0xE8, + 0xE3,0x30,0xC2,0x30,0x72,0xDD,0xF7,0xB6,0xC3,0x38,0xE3,0x30,0xF6,0xD7,0xFD,0xFF, + 0x03,0x39,0xC2,0x30,0x2F,0x0B,0xAA,0xA3,0x23,0x39,0xE3,0x38,0xAD,0x82,0xA1,0x2F, + 0x23,0x39,0xE2,0x30,0xB8,0xEB,0xEC,0xF8,0x23,0x39,0xE2,0x30,0x2A,0x02,0xA3,0xDD, + 0x44,0x41,0xC2,0x30,0xF8,0xFE,0x7F,0x7F,0x03,0x39,0xE2,0x30,0xAA,0x1F,0x3F,0x7F, + 0x44,0x41,0xE2,0x38,0x8F,0xAF,0xBF,0xD5,0x44,0x41,0xE2,0x38,0xFE,0x7A,0xF8,0xED, + 0x44,0x49,0x03,0x39,0x23,0x83,0xA1,0xE9,0x85,0x49,0x03,0x41,0xAB,0x2D,0xBF,0x5D, + 0x85,0x51,0x44,0x49,0xFA,0xE9,0xAF,0x0A,0x85,0x51,0x23,0x41,0x02,0x2A,0xEA,0xD8, + 0x44,0x49,0x03,0x41,0x08,0x00,0x80,0xF2,0x64,0x49,0x02,0x39,0xF8,0x52,0xDE,0x9F, + 0x23,0x41,0xE2,0x38,0xFA,0x7E,0xF8,0xEC,0x23,0x41,0xE2,0x38,0xA2,0xC9,0xF9,0x6B, + 0x43,0x41,0xE2,0x38,0xDE,0xBF,0xFF,0xA3,0x43,0x41,0x03,0x41,0x0D,0xAA,0x8A,0xBF, + 0x85,0x51,0x03,0x41,0x23,0x22,0xBA,0xFD,0xA5,0x51,0x22,0x41,0x0A,0xEA,0x77,0x55, + 0xC5,0x59,0x22,0x41,0x0A,0xAA,0xAD,0xFD,0xE6,0x61,0x63,0x49,0x02,0x0F,0xF5,0xD5, + 0x27,0x62,0x84,0x51,0x2A,0xBE,0xDF,0x75,0x27,0x62,0x84,0x51,0x00,0x88,0xFB,0x95, + 0xE9,0x7A,0xE5,0x59,0x35,0x25,0x35,0xBD,0x12,0xC5,0x8C,0x93,0x29,0x29,0x29,0x2D, + 0x73,0xCD,0x32,0xC5,0x00,0xAE,0xAF,0xBD,0x73,0xCD,0x12,0xBD,0x6C,0xF8,0xFA,0xCA, + 0x52,0xC5,0x90,0xAC,0x5E,0x5E,0x78,0x7A,0xB0,0xB4,0x0E,0x9C,0x5E,0xBA,0xE8,0xAF, + 0x6F,0xA4,0x4C,0x83,0x5E,0xEA,0xA8,0xA2,0x0E,0x9C,0x68,0x62,0x57,0xA8,0x00,0x00, + 0x0E,0x9C,0xE7,0x59,0x55,0x7F,0xE8,0x00,0xCD,0x93,0xC6,0x51,0x55,0x55,0xFF,0xA8, + 0x4C,0x83,0xE6,0x51,0x55,0x55,0xFF,0x00,0x2B,0x7B,0x07,0x5A,0x75,0xDD,0xFF,0x00, + 0x6C,0x83,0x06,0x52,0xFD,0xFF,0xBF,0x00,0xAD,0x8B,0x68,0x62,0xF5,0xDF,0xEF,0x00, + 0x0D,0x94,0xEA,0x72,0x75,0xF5,0xAD,0x2E,0xED,0x93,0x6B,0x83,0x3D,0xAF,0xB7,0x20, + 0x4E,0xA4,0xCC,0x93,0xBF,0x2F,0x2D,0xAF,0x6F,0xAC,0x0E,0x9C,0x2E,0x8B,0x9A,0xA2, + 0x6F,0xA4,0x0E,0xA4,0x6A,0xA8,0xFA,0xFE,0x2E,0x9C,0x8B,0x8B,0xFE,0x5C,0xFE,0xF8, + 0x2E,0xA4,0x8C,0x8B,0x2D,0x29,0xAF,0x2F,0x6F,0xA4,0x2E,0xA4,0x67,0x7B,0xEA,0xAB, + 0x23,0x49,0xE2,0x40,0x2E,0xAF,0x3E,0x2A,0x03,0x51,0x43,0x49,0xFA,0xBF,0xFF,0xFB, + 0x43,0x51,0x03,0x49,0xE7,0x7D,0xFF,0xEB,0x43,0x49,0x03,0x49,0x2E,0xF7,0x7D,0xFB, + 0x43,0x51,0x02,0x49,0xF6,0xBC,0xBF,0xBF,0x43,0x51,0x02,0x49,0xAA,0xEA,0xEB,0xEF, + 0x63,0x59,0x02,0x49,0xEA,0xAE,0x27,0xBF,0x63,0x59,0x02,0x49,0xFF,0xEB,0xAC,0xAB, + 0x43,0x51,0x02,0x49,0xFE,0x7C,0xC2,0x08,0x43,0x51,0xE2,0x48,0xBB,0xCD,0xAB,0xAB, + 0x64,0x59,0xE2,0x48,0xAA,0xAB,0xF9,0x77,0x23,0x51,0x02,0x49,0x52,0xD4,0xD7,0x95, + 0x43,0x51,0x03,0x49,0xFD,0x3F,0xFF,0x5F,0x43,0x51,0x03,0x49,0xB8,0xE7,0xB7,0x55, + 0x23,0x49,0xE2,0x40,0xA2,0xBF,0xF3,0xDA,0x23,0x51,0xE2,0x48,0xFC,0x56,0x7F,0xAF, + 0x43,0x51,0xE2,0x48,0xD5,0xD5,0xB5,0x2F,0x09,0x8B,0x23,0x51,0xB5,0x2D,0x0F,0x03, + 0x29,0x8B,0xC8,0x82,0xBD,0xE6,0x5C,0x7C,0xE8,0x82,0x87,0x7A,0xF8,0xC8,0x68,0xEA, + 0xC7,0x82,0x87,0x7A,0x7D,0xFD,0xAD,0xBD,0xA7,0x7A,0x66,0x72,0xB6,0x72,0x80,0xC0, + 0xA7,0x7A,0x66,0x72,0xEA,0x7B,0xAE,0xEE,0xA7,0x7A,0x46,0x7A,0xAA,0x8A,0xE8,0x20, + 0xA7,0x82,0x46,0x72,0xAA,0xAE,0x0A,0x0E,0xA7,0x7A,0x66,0x72,0xFB,0xBF,0xAA,0x0A, + 0xA7,0x7A,0x66,0x72,0xFF,0xAF,0xEA,0xA8,0x87,0x7A,0x67,0x72,0x80,0xC0,0x8A,0xAF, + 0x87,0x7A,0x46,0x72,0x68,0xE6,0x76,0xAF,0x67,0x7A,0x05,0x6A,0xAA,0x68,0xA8,0x22, + 0x09,0x8B,0x05,0x6A,0xFD,0xFF,0xFD,0x0F,0x89,0x9B,0x46,0x72,0xDD,0xAD,0x2B,0x02, + 0x8A,0x9B,0xC8,0x82,0xD5,0x2B,0x80,0x02,0x8A,0x9B,0x08,0x8B,0xF5,0xAE,0x8E,0x78, + 0x29,0x8B,0x05,0x6A,0x80,0x20,0xE8,0x7E,0xC8,0x82,0xE5,0x69,0xA0,0xEA,0xDF,0x55, + 0x46,0x6A,0xE6,0x69,0xFC,0xFF,0xDD,0xFF,0x26,0x6A,0xE5,0x61,0xFE,0xDA,0xAA,0x8A, + 0x26,0x6A,0xC5,0x59,0x0A,0xAA,0xAB,0xDA,0x46,0x6A,0x84,0x51,0x2A,0x20,0xA8,0x5F, + 0x67,0x72,0xA5,0x59,0x28,0xA8,0xEE,0x55,0x67,0x72,0xA5,0x59,0x20,0x0A,0xFB,0x55, + 0x67,0x72,0x84,0x51,0x00,0x00,0xBA,0x5D,0x87,0x72,0x84,0x51,0x00,0x00,0xBA,0x55, + 0xA8,0x7A,0x64,0x51,0x02,0xA8,0xFE,0x55,0x67,0x72,0x43,0x49,0xA0,0xA8,0xFF,0x55, + 0x06,0x62,0x44,0x49,0x00,0x00,0x2E,0xE5,0xC5,0x59,0x23,0x49,0xF8,0x78,0x78,0x78, + 0x65,0x49,0xE3,0x38,0x5F,0x7F,0xAA,0xAA,0x43,0x41,0xE3,0x38,0xFD,0xEF,0xFF,0xF8, + 0x24,0x41,0xC2,0x30,0xF7,0xE7,0xAC,0xAA,0x03,0x39,0xA2,0x30,0xAA,0xA8,0xE8,0xFA, + 0xE3,0x38,0xA2,0x28,0xA8,0xFC,0x7E,0x5F,0x03,0x39,0x81,0x20,0xA8,0xAE,0xD7,0x7D, + 0x03,0x31,0x81,0x20,0xFC,0xFE,0xFF,0x55,0xC2,0x28,0x61,0x20,0xFF,0xEA,0x78,0x5E, + 0x81,0x20,0x61,0x18,0xA8,0x28,0x80,0x76,0xA2,0x20,0x61,0x18,0xEA,0x7A,0x7F,0xFD, + 0x82,0x20,0x61,0x18,0xCD,0x0B,0x3B,0xBA,0xC2,0x28,0x82,0x20,0xFD,0xFD,0xBB,0x2B, + 0xE3,0x30,0x81,0x20,0xDD,0xF7,0xAB,0x0A,0xC2,0x28,0xA2,0x28,0xA7,0x35,0x95,0xAC, + 0xE3,0x30,0xA2,0x28,0xAA,0xAB,0xF9,0x80,0x03,0x31,0xC2,0x28,0x7D,0xEF,0xAE,0x2F, + 0xE2,0x30,0xA2,0x28,0x57,0x70,0xEC,0xE8,0xE3,0x28,0x82,0x28,0x5F,0xBF,0xBB,0xE2, + 0xC2,0x28,0x81,0x28,0xF5,0xD6,0xEA,0xA8,0xA2,0x28,0x81,0x20,0xFA,0xAA,0x0A,0x0C, + 0xC2,0x30,0x61,0x20,0xE9,0x8B,0x02,0x02,0xE3,0x30,0x81,0x28,0x7D,0x7B,0xE8,0xE0, + 0xC2,0x28,0x61,0x20,0xF7,0xBF,0xAA,0x8A,0xC2,0x30,0xA2,0x28,0xD5,0x75,0x8D,0xC3, + 0xC2,0x30,0xA2,0x28,0xBB,0x1F,0xDD,0x7F,0xC2,0x30,0xA2,0x28,0xF5,0xE2,0xF7,0xE5, + 0xE3,0x30,0xA2,0x28,0x2F,0x0F,0xBD,0x85,0x03,0x31,0xC2,0x30,0xAA,0x0A,0x0B,0x3D, + 0x03,0x31,0xC3,0x30,0xAA,0x08,0x2A,0xB7,0x24,0x39,0xE3,0x30,0x6B,0xFB,0xFF,0xED, + 0x24,0x39,0xE3,0x38,0xBD,0xBB,0x97,0x55,0x44,0x41,0xE3,0x38,0xF3,0xAA,0xEE,0xFD, + 0x03,0x39,0xE3,0x30,0xB5,0x0A,0x88,0x8C,0x24,0x41,0xC3,0x30,0xEF,0x2E,0x2F,0xB7, + 0x24,0x39,0xC2,0x30,0xC9,0xAE,0xB6,0xEA,0x03,0x39,0xC2,0x30,0x1B,0xF2,0x20,0x00, + 0x23,0x39,0xE2,0x30,0x76,0xBF,0x3F,0xF8,0xE2,0x30,0xC3,0x30,0x20,0x2D,0xB6,0xA8, + 0x03,0x39,0xC2,0x30,0x7A,0xAB,0xAF,0x6B,0x02,0x39,0xC2,0x30,0xAF,0x2E,0xB7,0xFF, + 0x03,0x39,0xC2,0x30,0x0F,0xAA,0xAF,0x73,0x24,0x41,0xC2,0x30,0xAA,0x0F,0x0A,0xA7, + 0x43,0x41,0xE3,0x38,0xFF,0xEF,0xF6,0xF8,0x43,0x41,0x03,0x41,0xFF,0x3D,0x26,0xA7, + 0x85,0x51,0x44,0x49,0x2F,0x8B,0x1F,0xDF,0x84,0x51,0x23,0x41,0x5C,0xE8,0xE3,0xA2, + 0x44,0x49,0x03,0x41,0xE2,0xA2,0x2C,0xB4,0x64,0x49,0x23,0x41,0xDD,0xEB,0xAB,0xAB, + 0x44,0x49,0x02,0x39,0xFE,0xD7,0xFA,0xFC,0x44,0x41,0x02,0x41,0x7F,0xEF,0xAB,0x8B, + 0x43,0x41,0xE3,0x38,0xB2,0xAA,0x82,0x0A,0x44,0x41,0xE2,0x38,0xDB,0xFE,0xAA,0xE0, + 0x64,0x49,0x03,0x39,0xD5,0xF5,0xBF,0x2D,0x64,0x49,0x23,0x41,0xF7,0x57,0xFA,0xF0, + 0x84,0x49,0x22,0x41,0x8D,0xA7,0x29,0xAB,0x64,0x51,0x43,0x41,0x3E,0xDE,0x6F,0x2F, + 0xA5,0x51,0x44,0x49,0xBB,0xF9,0xAB,0x8A,0xC5,0x59,0x84,0x51,0x2D,0xF5,0x0B,0x0B, + 0x68,0x72,0xA4,0x51,0x2B,0x2D,0xAD,0x3F,0xD1,0xBC,0x0A,0x83,0x2F,0x2D,0xAD,0xAD, + 0x73,0xCD,0x90,0xB4,0x2A,0x2B,0xED,0xFD,0x73,0xCD,0x11,0xBD,0xE2,0x8B,0x2B,0xA5, + 0x73,0xCD,0xB0,0xAC,0x7A,0xB8,0xA0,0x80,0x12,0xBD,0x6F,0xAC,0x77,0x5F,0xDA,0x80, + 0xF1,0xBC,0x4F,0xA4,0x5D,0xBF,0xAA,0x0A,0xD0,0xB4,0x2E,0xA4,0x9D,0xBF,0xBA,0x80, + 0xD0,0xB4,0x2E,0x9C,0x7F,0xAA,0xA2,0x08,0xD0,0xB4,0x2E,0x9C,0xD5,0xAA,0x88,0x08, + 0xD0,0xB4,0x2E,0x9C,0x77,0xFA,0xA8,0x80,0xB0,0xAC,0x0E,0x9C,0x55,0xEA,0xA8,0x0A, + 0x8F,0xAC,0x0D,0x94,0xD7,0xFA,0xA8,0xAA,0x6F,0xA4,0x2E,0x9C,0xF6,0xAA,0xC0,0xBA, + 0x6F,0xA4,0x0E,0x9C,0xF5,0xE2,0xEA,0xFA,0x4F,0xA4,0xED,0x93,0x7E,0xFC,0xAE,0xA2, + 0x6F,0xA4,0x0E,0x9C,0xBD,0xAD,0x8D,0xAF,0x6F,0xA4,0x2E,0xA4,0x68,0x93,0x8E,0x77, + 0x6F,0xA4,0x0E,0x9C,0xBA,0xFF,0x8F,0x3D,0x2E,0xA4,0xCC,0x93,0x5C,0x6A,0xEA,0x80, + 0x2E,0xA4,0xCC,0x93,0x25,0x3D,0x95,0x17,0x90,0xAC,0x2E,0xA4,0xEA,0x2A,0x29,0xAB, + 0x44,0x51,0x02,0x49,0xBC,0xAC,0xE6,0xB5,0x23,0x49,0xE2,0x48,0x28,0x00,0xF0,0xF0, + 0x43,0x51,0x02,0x49,0x2F,0xB6,0x77,0x75,0x23,0x51,0xE2,0x40,0xA8,0xAF,0x2D,0x2D, + 0x23,0x51,0x43,0x49,0xA0,0x2A,0x0B,0x78,0x84,0x59,0x23,0x51,0xD5,0x55,0xD5,0xDC, + 0x63,0x59,0x02,0x49,0xAE,0xE8,0xFA,0xDA,0x43,0x51,0x02,0x49,0x3E,0xB6,0x5A,0xE3, + 0x64,0x59,0x02,0x49,0x25,0xFB,0xBF,0xEF,0x23,0x51,0x02,0x49,0xA2,0xC2,0xA8,0x2A, + 0x23,0x51,0x02,0x41,0xF2,0x72,0xFF,0xDF,0x23,0x49,0x03,0x49,0x55,0x16,0x38,0x17, + 0x23,0x49,0x02,0x49,0x5A,0xF0,0x28,0xA0,0x43,0x49,0x03,0x49,0x55,0x55,0x15,0xFB, + 0x23,0x49,0xE2,0x48,0xE2,0xA2,0xA8,0xF1,0x23,0x49,0xE2,0x48,0xB9,0xB3,0xBA,0x2A, + 0xC8,0x82,0x02,0x49,0xF5,0xB5,0x2D,0x2F,0x4A,0x93,0xA7,0x7A,0xA9,0x8B,0xA2,0x8A, + 0x29,0x8B,0xC7,0x82,0x78,0xD8,0x78,0x5E,0xE8,0x82,0xA7,0x7A,0xFA,0x58,0x6A,0xAA, + 0xA7,0x7A,0x66,0x72,0x3C,0xE2,0x22,0x00,0xC7,0x82,0x66,0x72,0x7B,0x6F,0xAB,0xAF, + 0xC7,0x82,0x66,0x7A,0xFB,0xE9,0xEA,0xFE,0xA7,0x82,0x66,0x72,0x3E,0x36,0xDF,0xB6, + 0xA7,0x7A,0x87,0x7A,0xBD,0x35,0xFF,0xDC,0x87,0x7A,0x66,0x72,0x08,0x28,0x80,0x00, + 0xA8,0x7A,0x46,0x72,0xEA,0xB2,0xFE,0xD7,0x86,0x7A,0x25,0x6A,0x83,0xFA,0xFA,0x3E, + 0xE8,0x8A,0x46,0x72,0xDD,0xED,0xAF,0x2A,0x4A,0x93,0x47,0x72,0xD5,0xB7,0x2E,0x02, + 0xAB,0xA3,0xA8,0x82,0x3D,0xAB,0x8A,0x00,0xAA,0xA3,0x49,0x93,0xAF,0x8A,0xA2,0x72, + 0x8A,0x9B,0x27,0x72,0x00,0x80,0xE8,0x7E,0x49,0x93,0xC5,0x61,0xA8,0xFA,0x5F,0x55, + 0x66,0x72,0xC4,0x61,0xF8,0x7F,0xF7,0xDD,0x06,0x6A,0xC5,0x61,0xCE,0xAD,0xB5,0xDF, + 0x26,0x6A,0xC6,0x61,0xAA,0xA3,0xEA,0xDE,0x26,0x6A,0x23,0x49,0x00,0xA0,0x7A,0x5F, + 0xE5,0x61,0x23,0x49,0xE8,0x5F,0x55,0x55,0x64,0x51,0x23,0x49,0x7A,0x5A,0x55,0x55, + 0x64,0x49,0x03,0x41,0xA9,0xBE,0xA8,0xAF,0x43,0x49,0x23,0x41,0x00,0x8E,0xC9,0xCA, + 0x64,0x49,0x23,0x49,0xF5,0xED,0x5D,0xF3,0x43,0x49,0x03,0x41,0xCA,0x6B,0xEE,0xA2, + 0x43,0x49,0xE2,0x40,0x7A,0xBB,0xFA,0xE8,0x43,0x49,0xE2,0x40,0x72,0xFA,0x8F,0x2F, + 0x85,0x51,0x03,0x41,0xAD,0x07,0xAF,0xAA,0x85,0x51,0x23,0x41,0x70,0x6C,0xFB,0xEA, + 0x65,0x49,0xE3,0x38,0x0B,0xEA,0xBA,0x5E,0x44,0x41,0xE3,0x38,0xD8,0xAE,0xA7,0xDF, + 0x24,0x41,0xC2,0x30,0x28,0xEA,0x8A,0x5E,0xE3,0x30,0x81,0x20,0xA8,0x48,0x7A,0xDF, + 0xA2,0x28,0x81,0x20,0x82,0x0B,0x8B,0xC2,0xA2,0x28,0x81,0x20,0x50,0x56,0x76,0xA3, + 0xA2,0x20,0x81,0x20,0xE5,0xEF,0xBB,0xF0,0xA1,0x20,0x61,0x18,0xDA,0x5A,0x5A,0x7A, + 0x41,0x20,0x61,0x18,0xFD,0xDD,0x7F,0x77,0x81,0x20,0x41,0x18,0xAB,0x3B,0x2F,0x2B, + 0xA2,0x28,0x61,0x18,0xBF,0x3F,0xAF,0xAB,0xE3,0x28,0x82,0x20,0xA3,0xAB,0xFF,0xE7, + 0x03,0x31,0xA2,0x28,0x8F,0xEF,0xD5,0x5F,0x24,0x39,0xC2,0x28,0xBF,0xBF,0x09,0x89, + 0x03,0x31,0xC2,0x30,0xF8,0x98,0x5A,0x5C,0x03,0x39,0xC2,0x30,0xAF,0xF7,0xEE,0x83, + 0xE2,0x30,0xA2,0x28,0xFA,0x5A,0x6E,0xE0,0xC2,0x28,0x81,0x28,0x22,0xAA,0x9F,0xDE, + 0x03,0x31,0xC2,0x28,0x55,0x95,0x9D,0xB5,0x03,0x31,0xC2,0x28,0x55,0xF5,0xB6,0xAC, + 0x03,0x31,0xC2,0x28,0xFD,0xFA,0xFA,0xBE,0xE3,0x30,0xA2,0x28,0x7A,0x7C,0xEE,0xB6, + 0xC2,0x30,0x81,0x28,0x0B,0xAA,0xFA,0xF8,0xE3,0x28,0x81,0x28,0xFB,0xFF,0xFD,0x75, + 0xA2,0x28,0x81,0x28,0x20,0x20,0x2A,0x0B,0xA2,0x28,0x81,0x20,0x00,0xA0,0xA0,0xC2, + 0xC2,0x28,0x81,0x28,0x0B,0xAB,0xBF,0xAF,0x03,0x31,0xA2,0x28,0x3F,0xFF,0xFF,0x7D, + 0xE3,0x30,0xA2,0x28,0x34,0xAE,0xEB,0xDF,0x03,0x39,0xA2,0x28,0xAA,0xBF,0xFF,0xDD, + 0xE3,0x30,0xA2,0x28,0x02,0xA7,0xAD,0xB6,0x24,0x39,0xC2,0x30,0xAF,0x8D,0x8F,0xE5, + 0x24,0x39,0xE3,0x38,0xEF,0xEB,0xEB,0x7F,0x03,0x39,0xC2,0x30,0xFF,0xDA,0xFA,0xFF, + 0x24,0x39,0xC2,0x30,0xAB,0x2F,0xBF,0xBF,0x23,0x39,0xE3,0x38,0x2B,0x3A,0x3E,0xFE, + 0x23,0x39,0xE2,0x30,0xB0,0xA0,0xEA,0xFA,0x23,0x39,0xC2,0x30,0xFE,0xF8,0xFE,0xFB, + 0x03,0x39,0xC1,0x30,0xB7,0x2B,0xB3,0xAA,0x23,0x41,0xC2,0x30,0xAF,0xAE,0x29,0x8B, + 0x23,0x41,0xC2,0x30,0x52,0x78,0xAC,0xA8,0x03,0x39,0xA2,0x30,0x2B,0x8F,0xFA,0xF2, + 0x24,0x41,0xE3,0x38,0xFA,0x7A,0x7F,0xF7,0x64,0x49,0x03,0x41,0xB5,0x25,0x35,0x05, + 0x85,0x51,0x23,0x41,0xEF,0xFE,0x5C,0x5F,0x84,0x51,0x23,0x41,0xA2,0x2B,0xFF,0x75, + 0x44,0x49,0x03,0x41,0x2C,0xB4,0xB4,0xF6,0x44,0x41,0x03,0x41,0x20,0x00,0x28,0x2F, + 0x43,0x41,0xE3,0x38,0xA2,0xAA,0x86,0xFE,0x44,0x41,0x03,0x41,0x8A,0xEF,0x3F,0xD7, + 0x44,0x41,0x03,0x39,0x2E,0xBE,0xF4,0xF6,0x64,0x49,0x03,0x41,0x42,0x82,0x03,0xED, + 0xA5,0x51,0x03,0x41,0x2D,0xAF,0xEF,0xF5,0x85,0x51,0x23,0x41,0xAA,0x88,0xE2,0xF9, + 0xA5,0x51,0x43,0x41,0xBF,0x2E,0x2F,0xA5,0xC5,0x51,0x64,0x49,0xD5,0xEA,0x0A,0x8A, + 0xE5,0x59,0x84,0x51,0xED,0x3D,0x8B,0x0A,0x26,0x62,0xC5,0x59,0xDD,0xBE,0xFB,0x35, + 0x47,0x6A,0xC5,0x59,0x3F,0xAF,0xB6,0xB7,0x0E,0xA4,0x67,0x6A,0x0F,0x0F,0x29,0x0D, + 0xD1,0xBC,0x4F,0xAC,0x0B,0x2D,0xAD,0xFD,0x32,0xBD,0xB0,0xB4,0x2F,0x3F,0xF5,0xD5, + 0x73,0xC5,0xF1,0xBC,0x8A,0xBA,0xD7,0xD5,0x53,0xC5,0x11,0xBD,0xFE,0x2A,0x2F,0x37, + 0x73,0xCD,0x11,0xBD,0x75,0xAF,0xAA,0x80,0x73,0xC5,0xF0,0xB4,0x57,0x7E,0xAA,0x22, + 0x52,0xC5,0xAF,0xAC,0x5D,0x5E,0x5E,0x7C,0xD0,0xB4,0x8F,0xAC,0x2B,0x8B,0x3F,0x15, + 0xD0,0xB4,0x6F,0xAC,0xB2,0xBA,0xF8,0x7A,0xB0,0xAC,0x4E,0xA4,0xE8,0xE0,0xFA,0x56, + 0x8F,0xAC,0x2E,0xA4,0xBA,0xAB,0xEA,0x7D,0x6F,0xA4,0x2E,0xA4,0x3F,0xEA,0xA9,0x29, + 0x90,0xAC,0x2E,0x9C,0x7B,0x7E,0xAA,0x28,0x6F,0xAC,0xED,0x9B,0xFF,0x5F,0xEE,0xB0, + 0x4F,0xA4,0x0E,0x9C,0x3B,0xEA,0xDE,0x56,0x4F,0xA4,0x0D,0x9C,0x38,0x3C,0x23,0xFB, + 0x4E,0xA4,0x0E,0x9C,0x0A,0x0A,0xEB,0x7F,0x6F,0xAC,0x0D,0x9C,0x68,0xEA,0xBF,0xFF, + 0x2E,0xA4,0xCD,0x93,0x36,0xB8,0xAC,0xE0,0x8F,0xAC,0x2E,0x9C,0xAB,0x0D,0x39,0x25, + 0x23,0x49,0xE2,0x48,0x9C,0xC3,0x6B,0x2F,0x23,0x49,0xE2,0x40,0xB8,0x23,0xFE,0xEA, + 0x23,0x51,0xE2,0x40,0xFE,0xFF,0x9D,0x3D,0x43,0x51,0xE2,0x48,0xAD,0x2B,0xAB,0x88, + 0x63,0x51,0x23,0x51,0xFA,0x16,0x4F,0x6D,0x64,0x59,0x23,0x51,0xFE,0x67,0xEF,0xEE, + 0x63,0x59,0x03,0x49,0xF7,0xFF,0x7A,0xE8,0x43,0x51,0x02,0x49,0xB0,0xE0,0xBA,0xA9, + 0x43,0x51,0xE1,0x40,0xE2,0xEA,0xA2,0xF8,0x23,0x51,0x02,0x49,0x69,0x0A,0x2D,0x5D, + 0x43,0x51,0xE2,0x40,0xDE,0xFF,0x2E,0xBE,0x02,0x49,0xE2,0x40,0xBC,0x28,0x38,0xB0, + 0x23,0x49,0xE2,0x40,0xB0,0x0A,0x0A,0xBE,0x03,0x49,0x22,0x41,0x0A,0x08,0x8A,0xA0, + 0x23,0x49,0xC2,0x40,0xBE,0xAF,0x3F,0x97,0x47,0x72,0x02,0x49,0xD5,0xF5,0xB5,0x2D, + 0x29,0x8B,0xA4,0x61,0x2D,0x0B,0x02,0x00,0x4A,0x93,0xC8,0x82,0xAA,0xEA,0x7E,0xDC, + 0x09,0x8B,0xC8,0x82,0x78,0xAF,0xEF,0x77,0xE8,0x82,0xA7,0x82,0xAA,0x58,0x5B,0xFB, + 0xE8,0x82,0x87,0x7A,0x7E,0xFB,0xF2,0x80,0xC8,0x82,0x87,0x7A,0xFE,0x6A,0x42,0xAB, + 0xC8,0x82,0x87,0x7A,0xDF,0x7F,0x5B,0xF8,0xC8,0x82,0x87,0x7A,0x55,0xD5,0xAF,0xBB, + 0xC7,0x7A,0x66,0x7A,0xBA,0xA2,0x6A,0x7A,0xA7,0x7A,0x46,0x72,0xE2,0xFA,0xFB,0x7A, + 0x66,0x7A,0x46,0x72,0x75,0x56,0xD8,0x1E,0x6B,0x9B,0x45,0x72,0xD5,0xF5,0xBD,0x2B, + 0xAB,0xA3,0xC7,0x82,0xB5,0xAF,0x2A,0x00,0xCB,0xA3,0x6A,0x9B,0xA9,0x8B,0x28,0xA8, + 0xAB,0xA3,0x09,0x8B,0x88,0xA0,0xE8,0x58,0x6A,0x9B,0xE5,0x69,0x80,0xE0,0x78,0x5F, + 0x87,0x7A,0xA5,0x61,0xF8,0x5E,0xD5,0x57,0xE6,0x69,0xA5,0x61,0x72,0x7E,0xFA,0xEF, + 0xE6,0x61,0xA4,0x61,0x5E,0x9F,0xA9,0x2A,0x26,0x6A,0x83,0x59,0xF7,0xBF,0xAA,0xCA, + 0xE5,0x61,0x43,0x51,0xE8,0xF8,0x7A,0xFB,0x64,0x51,0x03,0x41,0xFC,0xF6,0xFA,0x8A, + 0x64,0x49,0x03,0x41,0x5D,0x57,0xBF,0x2F,0x64,0x49,0x03,0x41,0xED,0x82,0x20,0xB0, + 0x64,0x49,0x23,0x41,0xEF,0xEB,0x7C,0xFE,0x43,0x49,0x03,0x41,0x8C,0xEA,0xBA,0xC6, + 0x44,0x49,0x03,0x41,0xAA,0xCA,0x7B,0x5D,0x43,0x41,0x03,0x41,0xFA,0xFA,0x79,0x7F, + 0x43,0x49,0x03,0x41,0x7A,0xFE,0x5F,0xDD,0x44,0x49,0xE3,0x38,0x27,0xAB,0xEF,0xBE, + 0x64,0x49,0x03,0x41,0x0A,0xAA,0xA9,0x8B,0x85,0x51,0x23,0x41,0xF0,0xFF,0xF7,0x55, + 0x23,0x41,0xC3,0x30,0xF8,0xAA,0xA8,0x7C,0x03,0x39,0xA2,0x30,0x2A,0xA8,0xBE,0xD7, + 0xE3,0x30,0xA2,0x28,0xEC,0xFE,0x7A,0xC0,0xA2,0x28,0x61,0x20,0xA8,0xFA,0xF8,0xFA, + 0xA1,0x20,0x60,0x20,0x82,0x02,0x29,0xAB,0xC2,0x28,0x81,0x20,0xE2,0x75,0xF7,0x55, + 0xA2,0x20,0x81,0x20,0xF0,0x7B,0x58,0x57,0x81,0x20,0x61,0x18,0xE8,0xAC,0xAA,0xCF, + 0xA2,0x20,0x41,0x18,0xFE,0xBE,0xA7,0x2F,0xA2,0x20,0x61,0x20,0xAF,0xBA,0xA0,0x00, + 0xA2,0x28,0x81,0x20,0x35,0xED,0xCA,0x08,0xE3,0x30,0xA2,0x28,0xF5,0xE5,0x3D,0x2A, + 0x03,0x31,0xA2,0x28,0x7F,0x7F,0x78,0xE0,0x24,0x39,0xA2,0x28,0x0F,0x09,0x09,0x2F, + 0x44,0x41,0xC2,0x30,0x5C,0x58,0xFC,0x5C,0x03,0x39,0xC2,0x30,0x81,0x80,0x8A,0xFA, + 0x03,0x39,0xA2,0x28,0x5A,0xFA,0xFA,0xFE,0xC2,0x30,0x81,0x28,0x5B,0x7E,0xBF,0xAA, + 0xE2,0x30,0x81,0x20,0x25,0x8B,0xBF,0xFF,0x03,0x31,0xA1,0x28,0xAE,0x2E,0x9D,0xD5, + 0xE2,0x30,0xA2,0x28,0x22,0xA0,0xFA,0x7E,0xC2,0x30,0xA2,0x28,0x2A,0x2A,0xEE,0xBE, + 0xE3,0x30,0xA2,0x28,0x5F,0x5F,0x7A,0x5A,0xA2,0x28,0x82,0x20,0xF2,0x60,0xC0,0x00, + 0xA2,0x28,0x81,0x20,0x2E,0x9E,0x7F,0xCB,0xC2,0x28,0x81,0x20,0xEB,0x8F,0x89,0xA3, + 0xC2,0x28,0xA2,0x28,0xF7,0x6D,0xC9,0xE9,0xC1,0x28,0x82,0x28,0xAA,0xDA,0xFE,0xFE, + 0xE3,0x30,0xA2,0x28,0x57,0x7F,0x6B,0x59,0xC2,0x30,0xA2,0x28,0xAB,0xAF,0xC9,0x88, + 0xC2,0x30,0xA2,0x28,0xAC,0xAC,0xAB,0x8B,0xE2,0x38,0xA2,0x28,0xAB,0x3F,0xBF,0xBF, + 0x03,0x39,0xC2,0x30,0xAA,0x5F,0x7F,0x55,0xE3,0x38,0xA2,0x30,0x88,0xEA,0xDA,0xFF, + 0xE3,0x38,0xC2,0x30,0x3E,0x59,0xFF,0x6D,0x03,0x39,0xC2,0x30,0xF2,0xB2,0xB5,0x0D, + 0x23,0x39,0xE3,0x38,0x8F,0xB7,0xFE,0x8F,0x23,0x39,0xC3,0x30,0xF8,0xAA,0xBE,0xEB, + 0x02,0x41,0xE3,0x30,0x55,0x7F,0xDF,0xFD,0x23,0x41,0xE2,0x30,0x09,0x2F,0x3F,0xAF, + 0x24,0x41,0xE2,0x38,0xE8,0xEC,0x77,0x4D,0x03,0x39,0xC2,0x30,0xAC,0xE7,0x6B,0x7F, + 0x23,0x41,0xC2,0x30,0xAA,0x2F,0x3D,0xD5,0x64,0x49,0xE3,0x38,0x2F,0xAA,0x03,0x0F, + 0xA5,0x51,0x43,0x41,0x5B,0x60,0xFE,0xAA,0x64,0x49,0x03,0x41,0xFB,0xDA,0xA8,0xBC, + 0x44,0x49,0xC2,0x38,0xAF,0xFE,0xD4,0xFA,0x44,0x41,0xE2,0x38,0x2B,0x2F,0xEF,0x7F, + 0x44,0x41,0xC2,0x38,0xFC,0x5E,0xF7,0xEF,0x03,0x39,0xC2,0x38,0xBA,0xFF,0x7A,0xE2, + 0x24,0x41,0xE3,0x38,0xEA,0x7F,0xDD,0xFF,0x23,0x41,0xE3,0x38,0x89,0x5D,0x5F,0xCD, + 0x03,0x39,0xC2,0x30,0x8A,0xFF,0xFF,0xAA,0x43,0x41,0xE2,0x38,0x37,0x27,0xED,0xAD, + 0x64,0x49,0x02,0x41,0xA8,0xEB,0xEF,0xF5,0xA4,0x51,0x23,0x41,0x8B,0x2E,0x7B,0xDF, + 0xC5,0x51,0x43,0x41,0x2A,0xAF,0xEB,0x5D,0xE6,0x61,0x63,0x49,0x0A,0xAA,0xFF,0xD5, + 0xE6,0x61,0x43,0x49,0x20,0xBB,0xDF,0xDF,0xED,0x9B,0x06,0x62,0x2F,0x29,0x2D,0x2D, + 0x8F,0xAC,0xED,0x9B,0x0B,0xAA,0xA9,0xAB,0xD0,0xB4,0x4E,0xAC,0x2E,0xAF,0x37,0xDD, + 0xF1,0xBC,0x90,0xAC,0x00,0x00,0xAB,0xBD,0x52,0xC5,0xB0,0xB4,0x2E,0x9F,0x57,0xFB, + 0x73,0xCD,0xF1,0xB4,0x82,0x02,0xAD,0xB5,0x73,0xC5,0x32,0xC5,0xFD,0xD6,0x7E,0xA9, + 0x52,0xC5,0xB0,0xB4,0x5A,0x7A,0xE8,0xA8,0xF1,0xBC,0x6F,0xAC,0xF7,0xD7,0xFE,0x58, + 0x90,0xAC,0x4F,0xA4,0x0F,0xFA,0x6A,0xF8,0x8F,0xAC,0x2E,0xA4,0xEA,0x6F,0x6A,0x3A, + 0x6F,0xAC,0x0E,0x9C,0xFF,0xFD,0xAE,0xA8,0x4E,0xA4,0x0D,0x9C,0x2A,0x72,0xFA,0xA0, + 0x90,0xAC,0x2E,0xA4,0x2E,0xA3,0xA5,0xBF,0x90,0xAC,0x0D,0x9C,0x9A,0x82,0x0A,0x0A, + 0x90,0xAC,0x2E,0x9C,0x5F,0xFB,0xA2,0xA8,0x6F,0xAC,0x0D,0x9C,0xEF,0xDE,0xDE,0xBC, + 0x4E,0xA4,0x0E,0x9C,0xFF,0xEE,0xA8,0x00,0x4F,0xA4,0xED,0x9B,0x2A,0x8A,0xCE,0x60, + 0x4E,0xA4,0x0E,0x9C,0x7F,0x5F,0xB8,0x3F,0x6F,0xAC,0x0E,0x9C,0x09,0x29,0xA9,0xAD, + 0x23,0x49,0xE2,0x40,0xA3,0x35,0xFE,0xF6,0x43,0x51,0xC2,0x40,0xFA,0xDE,0xAD,0x2B, + 0x43,0x51,0xE2,0x40,0xAD,0x3F,0x0B,0x02,0x64,0x59,0x23,0x51,0xBD,0x8A,0x2A,0xAB, + 0x84,0x59,0x02,0x49,0xFE,0xF6,0xFC,0xEA,0x64,0x51,0x22,0x51,0xBF,0xB7,0x15,0xF7, + 0x63,0x59,0x23,0x51,0xD0,0xB8,0xDA,0xFF,0x43,0x51,0x23,0x49,0x53,0x63,0x68,0x7E, + 0x23,0x49,0x03,0x49,0xB8,0xAF,0x31,0xAF,0x23,0x49,0x02,0x49,0xD7,0x97,0x24,0x8C, + 0x23,0x49,0xE2,0x48,0x90,0xA2,0xA8,0xAA,0x23,0x49,0xE2,0x40,0x76,0xBA,0xA2,0x0A, + 0x23,0x49,0xE2,0x40,0xF3,0xF2,0xF0,0xB8,0x44,0x51,0xE2,0x40,0xD7,0xFF,0xCF,0xE8, + 0xA4,0x59,0x03,0x49,0x55,0x55,0xD5,0x15,0xAC,0xA3,0x43,0x51,0xA5,0x2F,0x83,0x0A, + 0x49,0x93,0x08,0x8B,0x5B,0x5E,0x5E,0x56,0x08,0x8B,0xC8,0x82,0xD8,0xDA,0x02,0x03, + 0xE8,0x8A,0xC8,0x82,0xFE,0xFE,0x40,0x6B,0xC7,0x82,0xA7,0x82,0xC0,0x88,0xC9,0xEE, + 0xC7,0x82,0xA7,0x7A,0x00,0xEC,0xF9,0x1A,0xC7,0x82,0x87,0x7A,0x1B,0x88,0xA0,0x00, + 0xC7,0x82,0x86,0x7A,0xEF,0x9E,0xDA,0xDC,0xE7,0x82,0x86,0x7A,0xF7,0x77,0x54,0x5F, + 0xA7,0x82,0x45,0x7A,0xE8,0xFB,0x7F,0xFE,0xE8,0x8A,0x45,0x72,0x55,0xF5,0xBF,0x2F, + 0xAB,0xA3,0x66,0x7A,0xD5,0xB5,0x2B,0x02,0xCB,0xA3,0x29,0x93,0xA5,0xA3,0x00,0x00, + 0xCB,0xA3,0x6A,0x9B,0x2B,0x0A,0x02,0x78,0xCB,0xA3,0xA7,0x7A,0x80,0xA0,0xE8,0x5E, + 0x49,0x93,0x06,0x6A,0xE0,0x7E,0x5F,0x57,0x27,0x72,0x84,0x59,0xA8,0xEE,0xFE,0x5E, + 0xC5,0x61,0x64,0x59,0x28,0xE8,0xAB,0xA7,0x06,0x6A,0xA4,0x59,0xEF,0xBD,0x9D,0x35, + 0x06,0x6A,0xC5,0x61,0x0B,0x6A,0x7B,0x58,0x06,0x6A,0xA5,0x59,0xC8,0xEA,0x6A,0x5C, + 0xA5,0x59,0x44,0x49,0x48,0xFC,0xEC,0x7C,0x64,0x51,0x44,0x49,0xAD,0xF2,0xD0,0xF5, + 0x64,0x49,0x23,0x49,0xFA,0x5C,0xF7,0xAE,0x64,0x49,0xE2,0x40,0xAA,0xAB,0xAE,0xFC, + 0x43,0x49,0x03,0x41,0xAA,0xAA,0xEA,0x7A,0x43,0x49,0x02,0x41,0x0A,0xCB,0xEB,0xFA, + 0x43,0x49,0x03,0x41,0x5A,0xEF,0xFF,0x7F,0x24,0x49,0xE3,0x40,0x8E,0xEF,0xAF,0xAF, + 0x23,0x49,0xE2,0x40,0x9F,0xAE,0x3A,0xFE,0x43,0x41,0xE3,0x40,0x1F,0xB7,0xBF,0xEF, + 0x64,0x49,0x03,0x41,0xC2,0xE2,0xFB,0xFA,0x44,0x49,0xE2,0x38,0xF8,0xFC,0x5E,0x75, + 0x03,0x39,0xA2,0x30,0xF8,0xB8,0xDB,0xFD,0xC2,0x30,0xA2,0x30,0x3E,0x3E,0x2C,0x8A, + 0xE3,0x30,0xC2,0x30,0xEB,0xDF,0x89,0x83,0xC2,0x28,0x61,0x20,0xFE,0xD8,0xD8,0xF8, + 0x81,0x20,0x61,0x18,0x00,0x28,0x28,0xA0,0x81,0x20,0x61,0x18,0x28,0xA8,0xAA,0xCB, + 0x81,0x20,0x61,0x18,0x80,0xE8,0xFF,0x55,0x82,0x20,0x61,0x18,0xEB,0x2B,0x89,0x35, + 0x82,0x20,0x61,0x18,0x0A,0x0F,0x28,0x08,0xA2,0x28,0x82,0x18,0x22,0x01,0x02,0x82, + 0xA2,0x28,0x82,0x20,0x0A,0x8B,0xAF,0xFA,0xE3,0x30,0x81,0x28,0x28,0xA2,0xFF,0x97, + 0x03,0x31,0xA2,0x28,0x80,0x8F,0x8D,0xAF,0x24,0x39,0xC2,0x30,0x35,0xB7,0xB5,0x55, + 0x03,0x39,0xA2,0x28,0xF0,0xF0,0x7E,0xDA,0xE2,0x38,0xA2,0x30,0xF2,0xE2,0xEB,0x60, + 0x04,0x39,0xA2,0x28,0xFE,0xEA,0x8F,0xB5,0x03,0x39,0xA2,0x28,0xFF,0xEF,0xA2,0xA2, + 0x02,0x31,0x80,0x28,0x7F,0x7E,0xB8,0xA8,0xC2,0x30,0xA1,0x28,0x9D,0xD5,0x7F,0xE8, + 0xC2,0x28,0x81,0x20,0xF8,0xEE,0x7A,0xE0,0xE3,0x28,0x81,0x28,0xFF,0xFF,0xB5,0xF5, + 0xC2,0x28,0x82,0x20,0xE0,0x68,0x6A,0xAE,0xC2,0x30,0xA2,0x28,0xD5,0xB5,0xE5,0xA9, + 0xC2,0x30,0xA2,0x28,0x75,0x55,0xBD,0xFE,0xE3,0x30,0x81,0x28,0xFF,0xF7,0xBF,0x8B, + 0xC2,0x30,0xA2,0x28,0x75,0xF4,0xE0,0x5F,0xC2,0x28,0x81,0x20,0xF6,0x8F,0x82,0xEA, + 0xC2,0x30,0xA2,0x28,0x2B,0xAA,0x81,0xDB,0xE3,0x30,0xA2,0x28,0xFB,0x2F,0x3A,0x56, + 0xE2,0x30,0xA2,0x28,0xEF,0xF5,0x37,0xAF,0x03,0x39,0xC2,0x30,0x55,0x65,0xCB,0xAF, + 0xE2,0x30,0xA2,0x28,0xBB,0xF5,0xEF,0xF8,0xE2,0x30,0xA2,0x30,0xFF,0xAA,0xA3,0xA8, + 0x03,0x39,0xC2,0x30,0xE9,0xF9,0x7F,0xDD,0x44,0x41,0xC2,0x30,0xB5,0x3D,0x2F,0xBF, + 0x44,0x41,0x03,0x39,0x6F,0xAA,0x8E,0x09,0x44,0x41,0xE3,0x38,0xFB,0x6B,0xEA,0xE2, + 0x03,0x39,0xC2,0x30,0xAB,0x87,0x3F,0xBB,0x23,0x39,0x02,0x39,0xE9,0x69,0x59,0x42, + 0x03,0x39,0xC2,0x30,0x68,0xB8,0x0E,0xAC,0x03,0x39,0xC2,0x30,0xDF,0xBE,0x9C,0xCC, + 0x03,0x39,0xA2,0x30,0x7D,0xF7,0xEB,0xF3,0x64,0x49,0xC2,0x30,0x0D,0x3D,0x2D,0x2F, + 0xC5,0x59,0x64,0x49,0x73,0xE8,0xEB,0x8E,0x85,0x51,0x03,0x41,0xDA,0x7A,0xD0,0xA8, + 0x24,0x41,0xC2,0x38,0xA0,0x82,0x60,0xEA,0x03,0x39,0xC2,0x30,0xE0,0xE2,0xA9,0x25, + 0x03,0x41,0xE2,0x30,0x37,0x8F,0xF9,0xF5,0x44,0x41,0xE3,0x38,0xE5,0xA9,0x29,0x0B, + 0x23,0x39,0xE2,0x38,0xAA,0xEA,0x78,0xE8,0x23,0x39,0xE2,0x38,0x95,0x97,0xBF,0xFB, + 0x24,0x41,0xC2,0x30,0xB7,0xBE,0xFF,0x2B,0x64,0x49,0xE3,0x38,0xE5,0xEF,0xAB,0x2A, + 0x85,0x49,0x23,0x41,0xFF,0xF5,0x2B,0x0A,0x84,0x49,0x44,0x49,0x5F,0x8B,0x01,0x8A, + 0x64,0x49,0x23,0x41,0xE2,0x68,0xE2,0x08,0xE6,0x59,0x44,0x49,0xFD,0x7F,0xEF,0x0B, + 0xC5,0x59,0x64,0x49,0x96,0xF5,0xA2,0x0C,0xAC,0x93,0xA4,0x51,0x2D,0x3D,0xAD,0xAD, + 0x6F,0xAC,0xCD,0x93,0x8A,0x89,0xA9,0x8D,0x6F,0xAC,0x2E,0xA4,0x8A,0x3A,0x27,0xA5, + 0xB0,0xB4,0x2E,0xA4,0x0A,0xAA,0xBF,0x5F,0x31,0xBD,0x4F,0xA4,0x22,0x2A,0xAD,0xF5, + 0x52,0xC5,0xD0,0xB4,0xAF,0xAA,0xA2,0x89,0x32,0xC5,0xD0,0xB4,0x0A,0x00,0x6E,0xF8, + 0x52,0xC5,0xD0,0xB4,0xE8,0xAA,0xFF,0x7F,0xD0,0xB4,0x6F,0xAC,0x78,0xF8,0xE8,0xAE, + 0xB0,0xAC,0x6F,0xAC,0x7F,0xEB,0xBE,0xAA,0xB0,0xB4,0x4E,0xA4,0xF5,0xFE,0xB2,0xE0, + 0x8F,0xAC,0x4F,0xA4,0x7A,0x7A,0xBD,0xDD,0x6F,0xAC,0x2E,0xA4,0x9E,0x2E,0x28,0x2A, + 0x90,0xAC,0x4F,0xA4,0x55,0x0A,0x0E,0xAC,0x8F,0xAC,0x4F,0xA4,0xBF,0xFE,0xE9,0xAF, + 0x8F,0xAC,0x4F,0xA4,0xDB,0xEE,0xFE,0xAA,0x8F,0xAC,0x2E,0xA4,0xDA,0xF2,0x2A,0xCB, + 0x90,0xAC,0x4E,0xA4,0xFF,0x5A,0xD2,0xB7,0x6F,0xAC,0x2E,0xA4,0x5C,0xEE,0xC2,0xA3, + 0x8F,0xB4,0x0E,0xA4,0xF5,0x6B,0xEB,0x8A,0x6F,0xAC,0x2E,0xA4,0xAD,0xF9,0x9A,0x80, + 0x02,0x49,0xE2,0x40,0xF6,0xDC,0xF5,0x35,0x84,0x59,0x03,0x49,0xAD,0x35,0xB5,0xAD, + 0x63,0x59,0x43,0x51,0x6F,0xC2,0xE9,0x77,0x64,0x59,0x23,0x51,0xF2,0xE3,0xFF,0xFE, + 0x84,0x59,0x22,0x51,0x56,0xD7,0xF7,0xF7,0x63,0x59,0x02,0x49,0x7A,0x3E,0xFA,0xF8, + 0x43,0x51,0x02,0x49,0x8A,0xA8,0x3A,0x7E,0x43,0x49,0x02,0x49,0x7B,0xF8,0xD8,0x95, + 0x23,0x49,0x02,0x49,0x36,0x0F,0x07,0x1F,0x43,0x51,0x03,0x49,0x6F,0x6A,0x5E,0x55, + 0x23,0x49,0xE2,0x40,0xFE,0xAB,0x0A,0x2E,0x23,0x49,0xC1,0x40,0x8E,0xB6,0x8E,0xA8, + 0x43,0x49,0xE2,0x40,0x3E,0xDF,0xDF,0xFF,0x23,0x49,0xE2,0x40,0xE0,0xE0,0xE2,0xF2, + 0xA7,0x7A,0x02,0x41,0x95,0xB5,0x25,0x25,0x0C,0xAC,0x2A,0x8B,0x89,0x83,0x02,0x02, + 0xAB,0xA3,0x08,0x8B,0x5F,0xE8,0xF8,0xBA,0x69,0x93,0xE7,0x8A,0x5F,0xFE,0x68,0xA2, + 0x08,0x8B,0xC8,0x8A,0xEF,0xF8,0xE0,0xB0,0xE8,0x8A,0xA7,0x82,0xBF,0xAE,0xFC,0xDA, + 0xE7,0x82,0x86,0x7A,0x6B,0xEA,0x2A,0xAF,0xE8,0x82,0xA7,0x7A,0x77,0x57,0xF8,0x6E, + 0xC7,0x82,0x86,0x7A,0x6E,0x7A,0xF8,0x58,0xA6,0x82,0x66,0x7A,0x92,0xDA,0xE5,0xEB, + 0x29,0x93,0x86,0x7A,0x55,0x55,0xF5,0x0F,0xAB,0xA3,0x87,0x82,0xA5,0x2F,0x0A,0x02, + 0xCB,0xA3,0x8A,0x9B,0xA9,0x0F,0x28,0x00,0xEC,0xAB,0x8A,0x9B,0xE8,0xB8,0xFE,0x5E, + 0x8B,0x9B,0x26,0x72,0x80,0xE0,0x78,0x56,0xC8,0x82,0x26,0x6A,0x78,0x56,0x55,0x55, + 0x47,0x72,0x05,0x6A,0x7E,0xB7,0x75,0x57,0xE5,0x69,0x84,0x59,0x7A,0x78,0x7C,0xD6, + 0xC5,0x61,0x84,0x59,0x2F,0x2D,0x2A,0xAF,0x05,0x6A,0xA4,0x59,0x2B,0xAF,0x2F,0x2D, + 0x26,0x6A,0xC5,0x61,0x5E,0xDC,0x7E,0x5E,0x06,0x6A,0x64,0x51,0x78,0x7B,0x5F,0x5F, + 0x85,0x59,0x23,0x41,0xF0,0xFA,0x7E,0x5F,0x64,0x49,0x23,0x49,0xA9,0x15,0xB5,0x2E, + 0x64,0x49,0x23,0x41,0xB7,0xB6,0x3A,0x82,0x64,0x49,0x03,0x41,0xFC,0x60,0xAB,0xAA, + 0x43,0x49,0x03,0x41,0x5B,0x7D,0x72,0xAA,0xA5,0x51,0x02,0x41,0x7F,0x7F,0xBF,0x0B, + 0xC5,0x61,0xC2,0x38,0xFF,0xFF,0x8A,0x00,0xE6,0x61,0xE2,0x40,0xD5,0xFF,0xAB,0x00, + 0xE5,0x59,0x23,0x41,0x55,0xDF,0xAA,0x00,0xC6,0x59,0x03,0x41,0x55,0xFF,0xA0,0x80, + 0x64,0x49,0x03,0x41,0x7A,0xFE,0xBC,0xFE,0x23,0x41,0xC2,0x38,0xFB,0x9A,0xFE,0xF0, + 0x03,0x39,0xA2,0x28,0xFF,0x7C,0x74,0x56,0xE3,0x30,0xA2,0x28,0xB9,0x2B,0xB9,0xFD, + 0xE3,0x30,0xA2,0x28,0xA8,0xFA,0xF0,0x79,0xC2,0x28,0x81,0x20,0x5A,0x7E,0x7A,0x5F, + 0xA2,0x20,0x61,0x20,0xFF,0xFA,0xEA,0x83,0xA2,0x20,0x61,0x18,0xCB,0xEA,0x7F,0xEE, + 0x61,0x18,0x41,0x18,0xAB,0x2F,0x0F,0x08,0xA2,0x20,0x41,0x18,0xFF,0xDF,0xFF,0x2E, + 0xC2,0x28,0x82,0x20,0xF9,0xA9,0xAB,0x8A,0xC2,0x28,0x81,0x20,0xEB,0xBA,0xE8,0xEE, + 0xA2,0x28,0x82,0x20,0xBC,0x94,0x3D,0x3F,0xA2,0x28,0x81,0x28,0x0E,0x88,0xB8,0x80, + 0xE3,0x30,0x81,0x28,0x8B,0xAB,0x7F,0xFF,0xC2,0x30,0x82,0x28,0x3A,0xAF,0x8F,0x0F, + 0xE2,0x30,0xA2,0x28,0xDE,0x9D,0x2D,0x8B,0xE3,0x30,0xA2,0x30,0xF0,0xFA,0xFE,0xDF, + 0xE3,0x30,0xA2,0x30,0xAD,0xAA,0xBA,0xFE,0x03,0x39,0xC2,0x30,0xAA,0x83,0x03,0xA1, + 0xE2,0x30,0xC2,0x30,0xF8,0xE0,0x00,0x00,0x03,0x39,0xA1,0x28,0xFF,0xDF,0xD7,0x72, + 0x03,0x39,0xA2,0x28,0x7B,0xFF,0xAB,0x2B,0x04,0x39,0xA2,0x28,0x55,0x57,0x7E,0xF8, + 0xC2,0x30,0xA2,0x28,0xFD,0x3D,0x9A,0x9A,0xE3,0x30,0xA2,0x28,0xE9,0x7F,0xFA,0x68, + 0xC2,0x30,0xA2,0x28,0xAA,0xAF,0x2D,0xAE,0xE2,0x30,0xA2,0x28,0x8B,0xEF,0xEE,0xFF, + 0xC2,0x30,0xA2,0x28,0xD7,0xA5,0xA6,0xF7,0xE3,0x30,0x81,0x28,0x2B,0x7A,0x7F,0xFF, + 0xC2,0x28,0x81,0x28,0x3B,0xA9,0xFD,0xAD,0xC3,0x30,0x82,0x28,0xB8,0xAE,0xFA,0xFE, + 0xC2,0x28,0x81,0x28,0x00,0x22,0xAF,0x0F,0xE2,0x30,0xC2,0x28,0xAF,0x9F,0x27,0x25, + 0xE2,0x30,0xC2,0x30,0xD4,0xF0,0xA2,0xFD,0xE2,0x30,0xA2,0x30,0xC8,0x80,0x80,0xA2, + 0x03,0x39,0xA2,0x30,0xEF,0xFD,0xAA,0xE8,0x03,0x39,0xC2,0x30,0xA7,0xD7,0xEF,0xEF, + 0x24,0x39,0xC3,0x30,0xAB,0x2F,0x3B,0xFF,0x44,0x41,0x03,0x39,0xEA,0xEA,0xEB,0x7D, + 0x03,0x39,0xC2,0x30,0xBA,0x3E,0xE6,0x54,0x23,0x39,0xE2,0x30,0xA0,0xEA,0xB5,0xF7, + 0x02,0x39,0xC2,0x30,0xBE,0x9E,0xBB,0xFA,0x03,0x39,0xC2,0x30,0x08,0xA2,0xD8,0xDA, + 0xE2,0x38,0x03,0x31,0x08,0x80,0x80,0x6A,0x85,0x51,0x03,0x39,0x25,0x25,0xBD,0xBD, + 0xA5,0x51,0x44,0x41,0x02,0xCA,0x7B,0x5F,0x85,0x49,0x24,0x41,0xE8,0xE2,0xEA,0xDF, + 0x44,0x49,0xC3,0x38,0xEE,0x7A,0x7A,0xEC,0x03,0x39,0xC2,0x30,0x24,0x0F,0x2F,0xA9, + 0x03,0x39,0xC2,0x30,0x3C,0xE8,0xEF,0xAF,0x23,0x39,0xE3,0x38,0x02,0x3D,0xFB,0xE6, + 0x24,0x41,0xE3,0x38,0xC8,0xFA,0xF7,0xF5,0x03,0x39,0xC2,0x30,0xA2,0x2C,0xF7,0xFF, + 0x24,0x41,0x03,0x39,0xB7,0xA3,0x0B,0xA5,0x64,0x49,0x24,0x41,0xBD,0xF5,0xAD,0x29, + 0xA5,0x51,0x23,0x41,0xA9,0x0B,0x03,0x00,0xE6,0x59,0x85,0x51,0x55,0xFD,0xAD,0x3F, + 0xE6,0x59,0x43,0x49,0xD7,0xBA,0xB8,0xA0,0xE6,0x59,0xA5,0x51,0x89,0x0A,0x82,0xAB, + 0x06,0x62,0xA5,0x49,0xBF,0xB2,0xAF,0xFE,0x4B,0x83,0xE5,0x59,0x2D,0x2D,0x2D,0x2D, + 0x2E,0xA4,0x8C,0x8B,0x2B,0xAD,0xAF,0xAD,0x4F,0xA4,0xED,0x9B,0x0E,0xA7,0xBD,0xF5, + 0x6F,0xAC,0x0E,0xA4,0x0B,0xAF,0x7F,0xDF,0x8F,0xAC,0x2E,0xA4,0x27,0xAA,0xAB,0xFD, + 0xF1,0xBC,0x0E,0xA4,0x0A,0xAF,0xBF,0xD7,0xF1,0xBC,0xB0,0xB4,0xA8,0xBB,0xBB,0x95, + 0x11,0xBD,0xB0,0xB4,0x02,0x0A,0x2A,0xBD,0x31,0xBD,0xB0,0xB4,0x57,0x7C,0xFA,0xAA, + 0xF0,0xBC,0x8F,0xAC,0xDF,0xDE,0xBE,0xFA,0xB0,0xB4,0x6F,0xAC,0x7B,0xAA,0xEF,0xBC, + 0x90,0xAC,0x4F,0xA4,0xD7,0xFA,0x90,0xB8,0x8F,0xAC,0x2E,0xA4,0x8F,0x9A,0x82,0xA2, + 0xAF,0xB4,0x4F,0xA4,0xBD,0xFF,0xFF,0x73,0x8F,0xAC,0x4F,0xA4,0xAB,0xBF,0xF7,0x75, + 0x8F,0xAC,0x2E,0xA4,0x0A,0x2A,0x2B,0xE9,0x90,0xAC,0x4E,0xA4,0xE7,0xEE,0xE2,0xAB, + 0x8F,0xAC,0x4E,0xA4,0xE2,0xAA,0xAB,0xF7,0x6F,0xAC,0x2E,0xA4,0xBB,0x0C,0xA0,0xBA, + 0x8F,0xAC,0x2E,0xA4,0x2C,0xFF,0x6F,0xFB,0x6F,0xAC,0x0D,0x9C,0x28,0xBB,0x9F,0xFF, + 0x64,0x59,0xE2,0x40,0xF5,0xAB,0x2A,0xAA,0x64,0x51,0x23,0x51,0xBD,0xB9,0x2F,0xE3, + 0x84,0x59,0x43,0x51,0x7F,0xDC,0xEE,0xBF,0x84,0x59,0x43,0x51,0x7D,0x79,0xAB,0xEE, + 0x64,0x59,0x22,0x51,0xF5,0x56,0xBC,0xE8,0x43,0x51,0x02,0x49,0xB8,0xDA,0xE8,0xFA, + 0x64,0x51,0x02,0x49,0xFF,0xBF,0x7F,0xF2,0x23,0x49,0xE2,0x40,0x29,0x3E,0xDA,0x02, + 0x43,0x51,0x03,0x49,0xF6,0xFF,0xBA,0xAF,0x23,0x49,0x02,0x41,0x80,0x42,0xA0,0x7A, + 0x23,0x49,0xE2,0x40,0x3B,0x23,0xAF,0x9F,0x23,0x49,0xE2,0x40,0xA0,0x3E,0xBE,0x2E, + 0x23,0x49,0x02,0x41,0x1B,0xF6,0xD6,0xFC,0x44,0x49,0x02,0x49,0x5F,0x57,0x95,0x95, + 0x8A,0x9B,0x43,0x51,0xB5,0x2D,0x2D,0x2D,0x0C,0xAC,0x8A,0x93,0x82,0xAA,0x62,0xE2, + 0xAB,0x9B,0x49,0x93,0xFC,0xF8,0xFA,0xDD,0x69,0x9B,0x08,0x8B,0xE0,0x78,0xFC,0x78, + 0x08,0x8B,0xE8,0x8A,0x80,0x77,0xFE,0x9C,0x08,0x8B,0xA7,0x82,0xBF,0x6F,0xEF,0xB2, + 0xE8,0x82,0xA7,0x82,0xBE,0x7B,0xAE,0xAB,0xC7,0x82,0x86,0x7A,0xEE,0xEA,0x83,0xCA, + 0xC7,0x82,0x87,0x7A,0xBA,0xEF,0xBF,0xAA,0x8A,0x9B,0x87,0x7A,0x5D,0xB7,0x2F,0x0B, + 0xCB,0xA3,0x08,0x8B,0x25,0x09,0x02,0x00,0xEA,0xAB,0xAB,0xA3,0x65,0xEF,0xFB,0xFA, + 0xEC,0xAB,0xC8,0x82,0x20,0xA8,0xF0,0x7E,0x8A,0x9B,0x46,0x72,0xE0,0x78,0x5E,0x55, + 0x67,0x7A,0x05,0x6A,0xDC,0xFF,0x7F,0x77,0x67,0x72,0x06,0x6A,0xFD,0xAD,0xAD,0x8B, + 0x26,0x6A,0x84,0x51,0x80,0xE8,0x40,0x60,0xC5,0x59,0x43,0x51,0xDC,0xFF,0xBF,0x2F, + 0xE5,0x61,0x84,0x51,0xED,0xAB,0xAA,0xAA,0x06,0x62,0xC5,0x59,0xA7,0xFB,0x72,0x7B, + 0xE5,0x61,0x44,0x51,0xA8,0x68,0x78,0x77,0xA5,0x59,0x23,0x49,0xCA,0xEA,0xED,0xFE, + 0x64,0x49,0x24,0x49,0xD6,0xD6,0xD2,0xF5,0x84,0x51,0x44,0x49,0x99,0xB5,0xF5,0xB5, + 0x85,0x51,0x23,0x41,0xFC,0xFF,0xFE,0xFA,0x64,0x51,0x23,0x41,0xFE,0xF6,0xFE,0x33, + 0x26,0x6A,0x43,0x49,0xD5,0xBD,0x2B,0x0A,0x26,0x6A,0xA5,0x51,0xB5,0xEE,0xE0,0xA0, + 0xE6,0x61,0x43,0x51,0x00,0x82,0xE0,0xFA,0x06,0x62,0x43,0x49,0x8A,0x2A,0xBF,0x55, + 0xC5,0x59,0x63,0x49,0x00,0xA8,0xEA,0x5D,0xC5,0x59,0x22,0x41,0xE0,0xFA,0xFE,0x7F, + 0x23,0x41,0xE2,0x38,0x00,0xAC,0x5E,0x5E,0x03,0x39,0xC2,0x38,0xC0,0xAA,0xFC,0xBC, + 0xE2,0x30,0x81,0x28,0xFE,0x78,0xFA,0xEA,0xC2,0x30,0x61,0x20,0xAA,0xEA,0xFA,0x7A, + 0xC2,0x28,0x81,0x20,0xE3,0x8D,0x7D,0x7D,0xA2,0x28,0x61,0x20,0xBA,0x7E,0x56,0x5F, + 0xA2,0x20,0x61,0x18,0xEA,0xDB,0xD7,0x57,0x81,0x20,0x41,0x18,0x02,0xE0,0xFE,0xE2, + 0x81,0x20,0x41,0x18,0xFF,0x5F,0xBF,0x2E,0xC2,0x28,0x61,0x18,0xBD,0x3D,0x2F,0x2E, + 0xC3,0x28,0xA2,0x28,0xCB,0xFE,0xE0,0x80,0xC2,0x28,0x81,0x20,0xFA,0xFA,0xDE,0xA2, + 0xA2,0x28,0x82,0x20,0x2F,0xAB,0xE3,0x2E,0xC2,0x28,0x81,0x28,0xFB,0xEF,0xAB,0xAA, + 0xC2,0x28,0x61,0x28,0x2B,0xAA,0x8A,0x02,0x03,0x31,0xA2,0x28,0xF5,0xB5,0x39,0x3A, + 0x03,0x31,0xC2,0x30,0x57,0x7E,0xBC,0x82,0x03,0x31,0xC2,0x30,0xD7,0x65,0xAF,0xEB, + 0xC2,0x30,0x82,0x28,0xA8,0xFC,0xF0,0x78,0xE2,0x30,0x81,0x28,0x02,0xAE,0xEB,0xBF, + 0xE2,0x30,0xA1,0x28,0x88,0xB8,0xBF,0x55,0x03,0x39,0xC2,0x30,0xE2,0xBA,0xBF,0xFD, + 0x03,0x39,0xC2,0x30,0xEF,0xF8,0xFA,0xA2,0x03,0x39,0xC3,0x30,0x7A,0xFF,0x7F,0xDF, + 0xE2,0x30,0xA2,0x28,0xDF,0xDF,0xDE,0xF8,0xE3,0x30,0xA2,0x28,0xE3,0xAF,0xA6,0xE5, + 0x82,0x30,0xC2,0x28,0xBD,0xD5,0x77,0xDD,0xA2,0x28,0x81,0x20,0x62,0xFE,0x0A,0x00, + 0xC2,0x28,0x81,0x28,0x8F,0xEF,0xEF,0xAE,0xC2,0x28,0x82,0x28,0x20,0x02,0x09,0x02, + 0xE3,0x30,0xA2,0x28,0xFD,0xAE,0xAE,0xBE,0xC2,0x30,0xA2,0x28,0x58,0x50,0xEA,0xAF, + 0xC2,0x30,0xA2,0x28,0xD5,0xC3,0xF5,0xF5,0xC2,0x30,0xA2,0x28,0x02,0xBA,0x9B,0xAB, + 0xE3,0x30,0xC2,0x28,0xEF,0x4D,0x4D,0x3D,0xE2,0x30,0xA1,0x28,0xFA,0xCB,0xA3,0x0A, + 0x03,0x39,0xC2,0x30,0xF7,0xFF,0x81,0x03,0x03,0x39,0xC2,0x30,0xAB,0xAF,0xBF,0xF6, + 0xE2,0x30,0xA1,0x30,0x20,0xA0,0xAF,0x2B,0x23,0x39,0xE3,0x38,0xBD,0xDF,0xEF,0xED, + 0x03,0x39,0xC2,0x30,0xEE,0xAB,0x06,0xB7,0x03,0x39,0xC2,0x30,0x8F,0x88,0xC0,0xD2, + 0x03,0x39,0xE2,0x30,0xFF,0xE7,0xE3,0xE8,0x03,0x41,0xE2,0x30,0x55,0x7F,0xD7,0xD7, + 0x43,0x41,0x03,0x39,0x95,0x7D,0xFD,0xED,0x44,0x41,0xE2,0x30,0xA3,0xA9,0xEA,0xEA, + 0x64,0x49,0xE3,0x38,0xA0,0xBA,0xFE,0xDD,0x44,0x41,0xE3,0x38,0x28,0xFE,0x57,0x55, + 0x24,0x41,0xC2,0x30,0xE8,0xDE,0xDB,0xDB,0xE3,0x38,0xC2,0x30,0xAE,0x9E,0xB8,0x80, + 0x03,0x39,0xC2,0x30,0x2F,0x2E,0xAD,0x3F,0x03,0x39,0xE3,0x30,0xAA,0x0A,0x2F,0xE7, + 0x24,0x39,0xC2,0x30,0xAA,0x3A,0xDE,0xFB,0xE3,0x38,0xC2,0x30,0xFE,0x54,0x76,0x8E, + 0x03,0x39,0xC2,0x30,0x03,0xA9,0xDD,0x8A,0x23,0x41,0xE3,0x30,0x0F,0x35,0xA3,0x89, + 0xA5,0x51,0x03,0x39,0x02,0x0A,0xE9,0xBD,0xC5,0x51,0x44,0x49,0x2A,0x8F,0xA5,0xB5, + 0x06,0x5A,0x64,0x49,0x8E,0xFA,0xFF,0x75,0xA5,0x51,0x64,0x49,0x20,0xB8,0x3B,0x2B, + 0xE6,0x59,0x85,0x51,0x2B,0x2B,0x3D,0x97,0x4B,0x83,0x06,0x5A,0x35,0xA5,0x35,0x2D, + 0xED,0x9B,0x8C,0x8B,0x2D,0xBD,0xB5,0x6F,0xED,0x9B,0xAC,0x93,0x22,0x88,0x2A,0xD5, + 0x0E,0xA4,0xAC,0x93,0x0A,0x2E,0xAE,0xDD,0x2E,0xA4,0xCD,0x93,0x00,0xCE,0xAF,0x7D, + 0x4E,0xA4,0xED,0x9B,0x08,0x2B,0xB5,0xB5,0xB0,0xAC,0x0D,0x9C,0x0B,0xBB,0xD7,0x57, + 0xD0,0xB4,0x4E,0xA4,0x0A,0xAB,0x09,0xAD,0x11,0xBD,0xB0,0xB4,0x8B,0x8A,0xFB,0x55, + 0x11,0xBD,0xB0,0xAC,0x7A,0x7E,0x83,0x8B,0xF1,0xBC,0x8F,0xAC,0xD7,0x9E,0x7F,0xEC, + 0xB0,0xB4,0x6F,0xAC,0xFE,0xA8,0xAB,0xAA,0xB0,0xB4,0x6F,0xAC,0x7F,0x7E,0xE0,0xAA, + 0xAF,0xB4,0x4F,0xA4,0x6F,0xFD,0x6E,0xA8,0x8F,0xAC,0x4F,0xA4,0xF7,0xDF,0xFD,0xB0, + 0x90,0xAC,0x2E,0xA4,0x7B,0x5A,0xFE,0xDC,0x6F,0xA4,0x2E,0xA4,0x33,0xE9,0x6A,0x9E, + 0x6E,0xAC,0x2E,0xA4,0x2E,0xCB,0xED,0xF9,0x6F,0xAC,0x2E,0xA4,0xA2,0xBB,0xDA,0x42, + 0x4F,0xA4,0x0E,0x9C,0xF8,0xF8,0x50,0xAF,0x2E,0xA4,0x0E,0x9C,0x7B,0xDD,0xCB,0x82, + 0x64,0x51,0x23,0x51,0xEB,0xA2,0xBA,0xBF,0x64,0x59,0x43,0x51,0xFD,0xAD,0x50,0xF8, + 0x64,0x59,0x43,0x51,0xA2,0x88,0x6B,0xFD,0x84,0x59,0x23,0x51,0xEA,0xEA,0xEA,0x4A, + 0x63,0x51,0x22,0x51,0xFF,0xBF,0x6F,0xA0,0x43,0x51,0x02,0x49,0xE8,0xBA,0xF6,0x7A, + 0x43,0x51,0x02,0x49,0xBA,0x68,0xF9,0xDD,0x43,0x49,0x02,0x49,0xAA,0xAB,0xED,0xE5, + 0x43,0x49,0xE2,0x40,0x8A,0xB8,0xFF,0xDF,0x43,0x51,0xE2,0x40,0x3B,0xBE,0xFB,0xF9, + 0x23,0x49,0xE2,0x40,0xBF,0xBE,0xFE,0xF8,0x23,0x49,0xE2,0x40,0x3A,0xFA,0xF8,0xFA, + 0x43,0x49,0x02,0x49,0x5E,0x55,0x55,0xD5,0x63,0x59,0xE2,0x40,0xDD,0x3F,0xAF,0x2F, + 0xCB,0xA3,0xC5,0x61,0x2D,0x2D,0x0D,0xA9,0xEB,0xA3,0x49,0x93,0xE2,0x8A,0xEE,0x7E, + 0x8A,0x9B,0x49,0x93,0xA2,0xE2,0xFD,0xED,0x69,0x9B,0x08,0x8B,0x48,0xF2,0x7A,0x5E, + 0x28,0x93,0xC7,0x82,0xBA,0x6E,0x78,0xFA,0xC8,0x8A,0x07,0x83,0xAF,0xEE,0xAE,0xBF, + 0xE8,0x8A,0xC7,0x82,0xD6,0x96,0x8A,0x1A,0x29,0x93,0xA7,0x82,0x57,0x57,0xBF,0x2B, + 0xAB,0xA3,0xE8,0x8A,0x55,0x55,0xAD,0x02,0xEB,0xAB,0x4A,0x93,0xAD,0xAB,0xAB,0x88, + 0x0B,0xAC,0xAB,0xA3,0xFE,0xF3,0x6B,0x5A,0xCB,0xA3,0x66,0x72,0x00,0xA0,0xE8,0x7E, + 0x4A,0x93,0x26,0x72,0x78,0x7E,0x57,0x55,0x46,0x72,0x05,0x6A,0xEF,0xEB,0x8D,0xAB, + 0x67,0x72,0x26,0x72,0x5E,0x65,0x7D,0x07,0x67,0x72,0x06,0x62,0x03,0x2A,0xBB,0x7E, + 0x26,0x6A,0x84,0x51,0x50,0x5E,0xDC,0x7F,0x06,0x62,0x84,0x51,0xB5,0x37,0xAA,0xAB, + 0xE5,0x61,0xC5,0x59,0xB2,0xD4,0x57,0xFA,0xE6,0x61,0x43,0x49,0xA0,0xF8,0x7F,0x57, + 0x84,0x59,0x44,0x49,0x7C,0xD7,0x5F,0x7F,0x64,0x51,0x03,0x41,0xEC,0xDA,0xBA,0xA0, + 0x64,0x49,0x03,0x41,0xBD,0x87,0x8B,0x2A,0x84,0x49,0x44,0x49,0xBD,0xDD,0x56,0x55, + 0x85,0x51,0x03,0x41,0xEC,0xB8,0xFE,0x7F,0xC5,0x61,0x23,0x41,0xBD,0xB7,0x3D,0x3D, + 0x27,0x6A,0xE6,0x61,0xE9,0xAB,0xD5,0x57,0x26,0x6A,0x84,0x51,0xAA,0x6F,0x7C,0x7A, + 0xA4,0x59,0x02,0x41,0xF8,0x7F,0x5E,0x7E,0x63,0x49,0xE2,0x40,0x2B,0xBD,0xF5,0xF5, + 0x63,0x49,0xE2,0x40,0x22,0xEE,0xFF,0x77,0x63,0x49,0x03,0x41,0xCC,0x6A,0x7D,0x5D, + 0x03,0x41,0xC2,0x30,0xB8,0x6C,0xF8,0xF8,0xE2,0x38,0xA2,0x30,0xAA,0xE2,0xFB,0x8A, + 0xE2,0x30,0xA2,0x28,0xFA,0x5E,0x7A,0x7A,0xC2,0x28,0x61,0x20,0xFC,0x7A,0xFF,0xAE, + 0xC2,0x28,0x61,0x20,0xFB,0xE9,0xBA,0xA8,0xA2,0x28,0x61,0x20,0x57,0xFE,0x6C,0xFA, + 0x81,0x20,0x41,0x18,0xFB,0xFE,0xFE,0xF8,0x81,0x20,0x41,0x18,0xFB,0x7E,0x7F,0x3F, + 0xC3,0x28,0x61,0x18,0xB5,0xAD,0xA9,0x0A,0xE3,0x30,0xA2,0x28,0xE5,0xE9,0xAB,0xFB, + 0xC2,0x28,0xA2,0x28,0x83,0x88,0x08,0xEA,0xC2,0x28,0x81,0x28,0xE8,0xA0,0x00,0x00, + 0xC2,0x28,0x82,0x28,0xEF,0x2E,0x28,0x02,0xC2,0x30,0x81,0x28,0xEF,0xDE,0xE6,0x2B, + 0x03,0x39,0xA2,0x28,0xFD,0xBD,0xAF,0x8B,0x03,0x39,0xC2,0x30,0x3F,0xAB,0x68,0x6A, + 0x23,0x39,0xC2,0x28,0xA2,0x2A,0xFD,0xD5,0xE3,0x30,0xC2,0x28,0x80,0x5C,0x56,0xFE, + 0xC2,0x30,0x82,0x28,0x70,0xF8,0xA2,0xA2,0xE3,0x30,0x81,0x28,0xF5,0xFF,0xFA,0xA2, + 0xC2,0x30,0xA2,0x30,0xDB,0xDF,0x29,0x02,0xE3,0x38,0xC2,0x30,0xA2,0xAA,0xA7,0x2D, + 0x03,0x39,0xC2,0x30,0xEB,0xBD,0xBB,0xAE,0xE3,0x30,0xC2,0x30,0xFC,0xFA,0xFF,0x16, + 0xE3,0x30,0x82,0x20,0xBA,0xDE,0xFA,0xA0,0xE3,0x30,0xA2,0x28,0x3D,0xAB,0x2B,0x3F, + 0x03,0x31,0xA2,0x28,0xFB,0xF8,0x77,0x7E,0xC2,0x30,0xA2,0x28,0xF9,0xE5,0x45,0x75, + 0xA2,0x30,0xC2,0x28,0xFA,0xFF,0xDF,0xFF,0xC2,0x28,0xA2,0x28,0xEF,0xEB,0xA3,0x80, + 0xE3,0x30,0xA2,0x28,0xF7,0x7D,0xFF,0x3F,0xE3,0x30,0xA2,0x28,0xD5,0xEB,0x72,0x5A, + 0xC2,0x30,0xA2,0x28,0xBE,0xAE,0x8D,0xEF,0xC2,0x30,0xA2,0x28,0x88,0xB8,0xD8,0x9F, + 0xE3,0x30,0xA1,0x28,0x2F,0x8B,0xEB,0xA7,0xE3,0x30,0xA2,0x28,0x20,0xBE,0x77,0x55, + 0x03,0x39,0xA2,0x28,0x0A,0x0F,0x2F,0xAF,0x03,0x39,0xC2,0x30,0xA2,0xDA,0x60,0xCE, + 0xE3,0x30,0xC2,0x30,0xB7,0xD5,0xD5,0x57,0x02,0x39,0xC3,0x30,0xFE,0xFA,0x3B,0xAF, + 0xE2,0x30,0xA2,0x30,0xFE,0xDF,0xEC,0xB2,0x03,0x39,0xC2,0x30,0xEB,0x9D,0xAB,0x57, + 0x03,0x39,0xC2,0x30,0xCA,0x8A,0xAF,0x95,0x23,0x39,0xC2,0x30,0xFF,0xF7,0x3F,0xEF, + 0x23,0x39,0xE3,0x30,0x23,0x3F,0xBD,0xFD,0x24,0x39,0xE3,0x30,0x7E,0x72,0xC8,0x6B, + 0x24,0x39,0xC2,0x30,0xF7,0xBD,0xFF,0xAF,0x03,0x39,0xC3,0x30,0xEE,0xF2,0xC0,0xC2, + 0x03,0x39,0xC3,0x30,0xBD,0x3F,0xED,0xAB,0x03,0x31,0xC3,0x30,0xEA,0x80,0x08,0x68, + 0x03,0x39,0xE3,0x30,0x3F,0x3D,0x67,0xB5,0x23,0x39,0xE3,0x30,0xDF,0xFD,0xDD,0xC5, + 0x03,0x39,0xE3,0x30,0x71,0xFD,0xF5,0x59,0x44,0x41,0xE3,0x30,0x7D,0x6F,0xEB,0xA9, + 0x23,0x39,0xE3,0x30,0xEF,0xFD,0x29,0x8B,0x64,0x41,0xE3,0x38,0xED,0xEF,0x8A,0xAA, + 0x64,0x49,0x03,0x39,0xAD,0xA9,0x3D,0x1E,0x84,0x49,0x23,0x41,0xBF,0x77,0xB6,0xBE, + 0x84,0x51,0x44,0x49,0xFE,0xB5,0xBD,0x27,0xE5,0x59,0x85,0x51,0x7D,0xF5,0xB5,0x0E, + 0xE6,0x59,0xA5,0x51,0x15,0xA5,0x0F,0x20,0x6C,0x8B,0xE5,0x59,0x2D,0x2D,0x2D,0x2F, + 0xEE,0x9B,0xAC,0x93,0x7D,0xEB,0x23,0x23,0xED,0x9B,0x8C,0x8B,0xFF,0xDF,0x7A,0x5C, + 0xCD,0x93,0x6B,0x8B,0xA0,0xB8,0xFB,0xFD,0xED,0x9B,0x8C,0x8B,0x8E,0x39,0xB9,0xF7, + 0x0E,0xA4,0xAC,0x93,0x2A,0x3D,0xAF,0xBF,0x2D,0xA4,0xCC,0x93,0xB8,0x2E,0xAB,0xF7, + 0x6F,0xAC,0xED,0x9B,0x0B,0xAD,0xFF,0x75,0xAF,0xAC,0x0D,0x9C,0x28,0xAF,0xBD,0xD5, + 0xF1,0xBC,0x4E,0xA4,0x02,0x2A,0xBD,0x9D,0xF0,0xBC,0x8F,0xAC,0x70,0xEA,0xAE,0xFB, + 0xD1,0xB4,0x8F,0xAC,0x5F,0x5F,0xA0,0xAC,0xB0,0xB4,0x90,0xAC,0x2E,0x8B,0x04,0x36, + 0xD0,0xB4,0x6F,0xAC,0xA7,0xBF,0xB7,0xF4,0xB0,0xB4,0x6F,0xAC,0xF8,0xE2,0xA8,0xE8, + 0xB0,0xB4,0x4F,0xA4,0x5A,0xB8,0xBA,0xEE,0x8F,0xAC,0x4E,0xA4,0x57,0x4F,0xC3,0xCE, + 0x6F,0xAC,0x0E,0xA4,0x28,0x88,0x88,0x7A,0x6F,0xAC,0x2E,0xA4,0xEA,0x72,0xFE,0x7D, + 0x4E,0xA4,0x0D,0x9C,0xEF,0xBF,0xBE,0x4B,0x2E,0xA4,0xED,0x9B,0x80,0xCB,0x7F,0x7E, + 0x64,0x59,0x02,0x49,0xEF,0xEA,0x3C,0x7F,0x84,0x59,0x23,0x51,0xAF,0x3B,0xBE,0xFD, + 0x84,0x59,0x43,0x51,0x77,0x56,0xF4,0x2F,0x84,0x59,0x43,0x51,0xEB,0xED,0xF8,0x7E, + 0x84,0x59,0x22,0x49,0x7E,0x5E,0xEE,0x73,0x43,0x51,0x02,0x49,0x5E,0xCE,0x7E,0x5E, + 0x23,0x49,0x02,0x41,0xFB,0x20,0x02,0x00,0x22,0x49,0x02,0x41,0xCB,0x56,0x8B,0xF6, + 0x23,0x49,0xE2,0x40,0xAB,0xEB,0xFA,0xA8,0x23,0x49,0xE2,0x40,0xAB,0xBB,0xDE,0x7E, + 0x23,0x49,0xE2,0x40,0xC8,0x78,0xEF,0x8D,0x02,0x49,0xE2,0x40,0xA0,0xB9,0x25,0x87, + 0x23,0x49,0xE1,0x40,0xBF,0xA5,0x0A,0x2B,0x05,0x6A,0x43,0x49,0xD5,0xD5,0x15,0x35, + 0xAB,0x9B,0x66,0x7A,0x29,0x89,0x2F,0x23,0xAB,0xA3,0x49,0x93,0x7B,0xF8,0x6E,0x7A, + 0x69,0x9B,0x29,0x93,0xA6,0xBE,0x6B,0xFA,0x69,0x9B,0x08,0x8B,0xDA,0xE8,0xE3,0x7E, + 0x28,0x93,0xC7,0x82,0xEA,0xA8,0x88,0x28,0x28,0x8B,0xE8,0x8A,0x50,0x52,0x7D,0xFB, + 0x8A,0x9B,0xE8,0x82,0x55,0xBD,0xAD,0x2B,0x0C,0xAC,0xE8,0x8A,0xBD,0xAB,0x2A,0x0A, + 0x0C,0xAC,0xAA,0xA3,0xDD,0x3E,0xBA,0x28,0x0C,0xAC,0x69,0x9B,0xA2,0xEA,0xA8,0x7A, + 0xCB,0xA3,0x66,0x72,0xA0,0xE0,0x7A,0x5E,0xC8,0x82,0x25,0x6A,0xF0,0xDE,0x77,0x5E, + 0x46,0x72,0x05,0x6A,0x2C,0xAF,0x0B,0x02,0x67,0x7A,0x26,0x6A,0xFA,0xAF,0xA7,0x0A, + 0x67,0x72,0x26,0x72,0x9E,0xDE,0xFC,0x88,0x47,0x72,0xA5,0x59,0xE8,0xF8,0x62,0x7A, + 0xC5,0x59,0x84,0x59,0x2C,0x2F,0xAE,0x8E,0xC5,0x61,0x43,0x51,0x20,0xA0,0xA8,0xDE, + 0xC5,0x59,0x23,0x49,0x80,0xFA,0x5E,0x5D,0xA5,0x51,0x02,0x41,0x9F,0x2F,0x2F,0x82, + 0x84,0x51,0x43,0x49,0x78,0x78,0x7C,0x5A,0x84,0x51,0x44,0x49,0x6F,0xFF,0xBF,0xAD, + 0x64,0x49,0x23,0x41,0x32,0x2A,0x9E,0x5C,0x64,0x49,0x23,0x41,0xE3,0x8B,0xAF,0xBF, + 0x64,0x49,0x03,0x41,0x7F,0x7E,0xDC,0x78,0xA5,0x59,0x03,0x41,0x3D,0x2D,0x29,0x2F, + 0x05,0x62,0xC5,0x61,0x5E,0xD7,0xCA,0xA2,0x06,0x6A,0xA4,0x59,0x5A,0x7C,0xC8,0xAB, + 0xA4,0x59,0x23,0x49,0x7E,0x7C,0x78,0x5E,0x23,0x49,0xC1,0x38,0x88,0xBB,0xFE,0x6C, + 0x23,0x41,0xE2,0x40,0xDF,0xBA,0x0B,0x43,0x23,0x41,0xE2,0x38,0x5A,0xDA,0x5F,0x55, + 0x23,0x41,0xC2,0x30,0xFB,0xA3,0xFF,0x7D,0x03,0x39,0xC2,0x30,0xFA,0xFA,0xFF,0xFD, + 0xE3,0x30,0xA2,0x28,0x5E,0xFA,0xAE,0xF8,0xA2,0x28,0x81,0x28,0x0E,0x0E,0x08,0x00, + 0xC2,0x28,0x81,0x20,0xEA,0x82,0xE2,0x5E,0xA2,0x20,0x40,0x18,0xA8,0xAA,0xF8,0x7E, + 0x82,0x20,0x61,0x18,0x5B,0x5D,0xF9,0x3D,0xC2,0x28,0x61,0x18,0xD5,0xD5,0x9D,0x0F, + 0xE3,0x30,0xA2,0x20,0xFF,0xEF,0xEB,0xA2,0xE3,0x30,0xC2,0x28,0x57,0x52,0x2B,0xF7, + 0xA2,0x30,0xC2,0x28,0xDF,0xFD,0x6D,0xF5,0x03,0x31,0xA2,0x28,0xFF,0xDF,0xBE,0x3B, + 0x23,0x39,0xC2,0x28,0x55,0x7F,0xEF,0x8A,0x03,0x31,0xC2,0x30,0x55,0x7A,0xF8,0xFA, + 0xE3,0x30,0xA2,0x30,0x0A,0x2A,0xEA,0x7A,0xE3,0x38,0x81,0x28,0xE8,0xEE,0x5B,0x5F, + 0xC2,0x30,0x81,0x28,0x02,0x8B,0xAF,0xAD,0xA2,0x30,0xE2,0x28,0xBF,0xBE,0xEA,0xEA, + 0x03,0x31,0xC2,0x30,0x95,0x9D,0xD7,0xB5,0x03,0x39,0xC2,0x30,0xFA,0xEA,0xEF,0xEB, + 0xE3,0x38,0xC2,0x30,0xF7,0xDF,0x2F,0x0E,0x03,0x39,0xC2,0x30,0x37,0xBB,0x6A,0xAA, + 0x03,0x39,0xC2,0x30,0xA2,0xEB,0xEB,0x00,0x03,0x39,0xC3,0x30,0x9A,0xBB,0xB3,0xF8, + 0x24,0x39,0xE3,0x30,0x57,0xE3,0xEA,0xAB,0x03,0x31,0xC3,0x30,0x5E,0xDE,0xBE,0xDE, + 0xE3,0x30,0xA2,0x28,0x7A,0xB8,0xF8,0xF0,0xC2,0x28,0xA2,0x28,0x75,0x66,0xF7,0x1F, + 0xE2,0x30,0x81,0x28,0xFF,0x5D,0x75,0xFE,0xE3,0x30,0x81,0x20,0x2B,0xAB,0xFF,0xFD, + 0xE3,0x30,0xA2,0x28,0xB7,0xEA,0xB3,0xB9,0xE3,0x30,0xA2,0x28,0xFA,0xFA,0x74,0xDF, + 0xA2,0x28,0x81,0x20,0x28,0xB0,0xA8,0x80,0xE2,0x28,0x82,0x28,0xBF,0xFF,0x75,0xFF, + 0xC2,0x28,0xA2,0x28,0xEA,0x7A,0x55,0x9D,0xE3,0x30,0x81,0x28,0xFF,0x7F,0xA2,0xA2, + 0xE3,0x30,0xA2,0x28,0x0B,0x89,0x09,0xBD,0xE3,0x30,0xA2,0x30,0x80,0xAA,0xFF,0xFE, + 0xE2,0x30,0xA2,0x28,0xFA,0xFA,0xF7,0x56,0xE2,0x30,0xC2,0x30,0x3B,0x9F,0x5F,0xDE, + 0x03,0x39,0xC2,0x30,0xFA,0x82,0x7A,0x55,0xE3,0x30,0xC2,0x30,0xFF,0xB9,0x4B,0x77, + 0xE3,0x30,0xA1,0x28,0xB8,0xBC,0xAE,0xB7,0x23,0x39,0xC2,0x28,0xAF,0xBF,0xBF,0xD7, + 0x03,0x31,0xC2,0x28,0x7A,0x50,0x9C,0xBC,0x03,0x31,0xE3,0x30,0xE9,0xDD,0x56,0x5E, + 0x24,0x31,0xC2,0x30,0xFF,0xF5,0x6F,0xDF,0x24,0x31,0xC2,0x30,0xFB,0xDF,0xFD,0xE3, + 0x03,0x31,0xC3,0x30,0xF2,0xFF,0xFA,0x7F,0xE3,0x30,0xC2,0x28,0xC0,0x60,0x60,0x43, + 0x03,0x31,0xA2,0x28,0xAA,0x2A,0xEB,0xF9,0x03,0x39,0xA2,0x28,0x2E,0xAE,0xF7,0xF7, + 0xE3,0x30,0xC2,0x28,0x18,0xAA,0x72,0xFB,0x45,0x39,0xE3,0x30,0xCB,0xFD,0xD5,0xD5, + 0x03,0x31,0xC2,0x30,0xE2,0x9E,0xBC,0xB8,0x23,0x41,0xE2,0x30,0x20,0x3E,0xBF,0x36, + 0x65,0x41,0x23,0x41,0x9F,0xBF,0xDE,0x9F,0xA5,0x51,0x43,0x41,0x57,0xDD,0xBD,0xFF, + 0xC5,0x59,0x44,0x49,0xBB,0x39,0xBF,0xFD,0x06,0x62,0xC5,0x51,0xAB,0x8A,0xCD,0xE5, + 0x26,0x62,0xC5,0x59,0xDE,0xBB,0x2F,0x8F,0x4B,0x83,0x26,0x62,0x2D,0x2D,0x29,0x2F, + 0xED,0x9B,0x8C,0x8B,0x03,0x81,0x8B,0xAB,0xED,0x9B,0x8C,0x8B,0x7C,0xEF,0xBA,0xAE, + 0xAC,0x93,0x6B,0x8B,0xAF,0xC4,0x48,0x80,0xCD,0x9B,0x4B,0x8B,0x2A,0x3B,0x9D,0xD7, + 0xED,0x9B,0x8C,0x8B,0x83,0xAA,0xAF,0xF5,0xED,0x9B,0xAC,0x93,0xAB,0xF3,0x92,0xEA, + 0x0D,0x9C,0x8C,0x93,0x80,0x0A,0xA9,0x9D,0x2E,0xA4,0xCD,0x93,0xEA,0x2E,0xAD,0xEA, + 0x6E,0xA4,0xED,0x9B,0x23,0xEF,0xEF,0xDD,0xB0,0xB4,0x0D,0x9C,0x8A,0xAB,0xF5,0xFD, + 0xB0,0xB4,0x0E,0x9C,0xA0,0xAE,0xBE,0xF7,0x8F,0xAC,0x2E,0xA4,0x0A,0x0E,0xAF,0x7D, + 0xB0,0xB4,0x0E,0x9C,0x88,0xEA,0xAF,0x7F,0x8F,0xAC,0x2E,0xA4,0x80,0xEF,0xBF,0x55, + 0x8F,0xAC,0x0D,0x9C,0x88,0xAA,0xEB,0x55,0x8F,0xAC,0xCC,0x93,0x8A,0xEA,0x77,0x7F, + 0x4E,0xA4,0xCD,0x93,0xA8,0xBB,0xFF,0xFD,0x2E,0xA4,0xED,0x9B,0x23,0xE0,0x59,0x55, + 0x4E,0xA4,0xED,0x9B,0xFE,0x73,0xDD,0xD5,0x4F,0xA4,0xED,0x9B,0x5E,0xFE,0xEF,0x82, + 0x64,0x51,0x02,0x51,0x9E,0xEA,0xAA,0xBC,0x63,0x51,0x22,0x51,0xBF,0xBA,0xA2,0xA8, + 0x84,0x59,0x43,0x51,0xAE,0xCE,0xE9,0xEF,0x64,0x51,0x23,0x51,0xFA,0xC8,0xA2,0xAA, + 0x64,0x51,0x23,0x49,0xCA,0x55,0x57,0x7F,0x43,0x49,0x02,0x49,0x6A,0x7E,0x55,0x7D, + 0x23,0x49,0xE1,0x40,0x82,0x2D,0xA9,0xBB,0x23,0x49,0xE2,0x40,0xAA,0xE0,0x78,0xF7, + 0x23,0x49,0x02,0x41,0xB2,0xFD,0x5D,0x5D,0x23,0x49,0xC2,0x40,0xFA,0xDA,0xBA,0x8A, + 0x23,0x49,0xC2,0x40,0x0D,0x2F,0xEA,0xBA,0x44,0x49,0xE2,0x40,0x8E,0x9B,0xAF,0xBB, + 0x23,0x49,0xE3,0x40,0xEF,0xE3,0xEE,0x6A,0x08,0x8B,0x03,0x49,0xB5,0xB5,0xAD,0x2D, + 0xAB,0x9B,0x08,0x8B,0xA9,0x0D,0x0B,0xAB,0xAB,0x9B,0x49,0x93,0xC8,0x62,0x58,0x7C, + 0x6A,0x9B,0x29,0x93,0xEB,0xEA,0xBE,0x7E,0x49,0x93,0xE8,0x8A,0x60,0xF0,0xEA,0x80, + 0x49,0x93,0xE7,0x8A,0xFE,0xDB,0xBF,0x00,0x6A,0x9B,0x08,0x8B,0xDD,0x95,0x9F,0x2E, + 0xCB,0xA3,0x69,0x93,0x25,0x2F,0xEF,0xB7,0x0C,0xAC,0xAA,0x9B,0xAB,0xF7,0x75,0xF5, + 0xEC,0xA3,0x49,0x8B,0x00,0x00,0x8A,0x7A,0xCB,0xA3,0x86,0x7A,0xE8,0x78,0x5E,0x57, + 0x86,0x7A,0x26,0x6A,0xF8,0xAA,0xDC,0xFF,0x66,0x72,0x25,0x6A,0xF0,0xFE,0x5A,0x82, + 0x66,0x72,0x25,0x72,0x21,0xEB,0xEF,0xCE,0x87,0x7A,0x46,0x72,0x71,0x7B,0xDD,0x72, + 0x67,0x72,0xC5,0x61,0xC2,0xA8,0xF8,0x72,0xE5,0x61,0x63,0x51,0xC0,0xF8,0xFE,0x5C, + 0xC4,0x59,0x22,0x41,0xA8,0xEA,0xFF,0x55,0x84,0x51,0x23,0x49,0xF8,0x6A,0x7E,0x55, + 0xA5,0x51,0x02,0x41,0xBD,0xBF,0x2B,0xAB,0xA5,0x59,0x43,0x49,0xAA,0xEA,0x68,0xEA, + 0x84,0x49,0x23,0x41,0xAC,0xFE,0xAB,0xAA,0xA5,0x51,0x44,0x49,0x8F,0xEB,0xFA,0x7F, + 0x64,0x49,0x23,0x41,0xFE,0xFA,0xFA,0x5F,0x64,0x49,0x23,0x41,0xAA,0xA0,0xB5,0xBB, + 0x44,0x49,0x03,0x39,0xA8,0xB2,0x7C,0x56,0x84,0x51,0xE2,0x38,0x2F,0xBF,0x9D,0x55, + 0xE5,0x61,0x23,0x49,0x00,0x02,0x03,0x29,0xE5,0x61,0xA4,0x59,0xFA,0x5A,0xBA,0x78, + 0xC5,0x61,0x23,0x49,0x78,0x7A,0xF0,0xF0,0x23,0x49,0xE2,0x40,0xEA,0x6C,0xA8,0x00, + 0x23,0x41,0xE2,0x38,0x63,0xE1,0x7E,0x6A,0x03,0x41,0xC2,0x38,0xFF,0x5B,0x7A,0xEE, + 0xE2,0x38,0xC2,0x30,0xF8,0xEF,0x67,0xDF,0xE3,0x30,0xC2,0x30,0xBF,0xBA,0x7E,0x5A, + 0x03,0x39,0xA2,0x28,0x6A,0x8A,0xAB,0x3A,0xE3,0x30,0x81,0x20,0xFF,0x7B,0xF8,0x68, + 0xA2,0x28,0x40,0x18,0x68,0xFA,0xEA,0xFE,0x82,0x18,0x41,0x18,0x7A,0xFF,0xAF,0xAF, + 0xA1,0x20,0x40,0x18,0xBD,0x2A,0x2B,0x2B,0xC2,0x28,0xA2,0x20,0x0B,0xE2,0x61,0xDB, + 0x03,0x31,0xA2,0x28,0xBF,0xAF,0xBD,0x2D,0x24,0x39,0xC2,0x28,0xD5,0xDD,0xB7,0x0A, + 0x65,0x41,0xC2,0x28,0x57,0xDF,0xEF,0x02,0x65,0x41,0xC1,0x28,0xF5,0xEF,0x82,0x80, + 0x44,0x41,0xE3,0x30,0xFB,0x7E,0xBC,0xBC,0x23,0x39,0xC2,0x30,0x55,0x76,0xFE,0xE8, + 0x03,0x39,0xA2,0x28,0x5F,0xDF,0xFB,0x60,0xC2,0x30,0x81,0x28,0xD0,0xE0,0xF0,0x0A, + 0x03,0x39,0xA2,0x30,0xD5,0xDD,0xBD,0x83,0xE3,0x38,0xA2,0x28,0xBE,0xFE,0xF8,0xE8, + 0x03,0x39,0xC2,0x30,0xA9,0xEB,0x77,0xB5,0x03,0x39,0xE2,0x30,0x7A,0x72,0x61,0x78, + 0x24,0x39,0xC2,0x30,0xEF,0xA3,0xBB,0xFD,0x23,0x39,0xE2,0x30,0x8F,0xFA,0xEF,0x75, + 0x23,0x39,0xE3,0x30,0xA2,0xBA,0xAB,0xF9,0x03,0x39,0xA2,0x28,0xE8,0xF8,0xF8,0xDC, + 0x03,0x39,0xA2,0x28,0x22,0xAF,0xFD,0xF7,0xE2,0x30,0xA3,0x28,0xFE,0xAA,0xEA,0x02, + 0xE3,0x30,0xA2,0x28,0xEA,0xA7,0xAF,0x2F,0xE3,0x30,0xA2,0x28,0xE7,0xFF,0xEF,0x2E, + 0xE2,0x30,0xA2,0x28,0xF7,0xDF,0xFF,0xF8,0xC2,0x28,0x61,0x20,0x7F,0xFA,0x08,0x00, + 0xC2,0x28,0x81,0x20,0xBD,0xFD,0xEB,0x8B,0xC2,0x30,0x81,0x20,0xAA,0xEB,0xFD,0x7A, + 0xA2,0x28,0x61,0x20,0xB0,0xEF,0xBE,0xFE,0xA2,0x28,0x81,0x20,0x0A,0x8D,0xED,0x7D, + 0xC2,0x28,0x61,0x20,0x0A,0x2A,0x01,0x0A,0xE2,0x30,0xA2,0x28,0x8E,0xB7,0xCB,0x88, + 0xE3,0x30,0xA2,0x28,0x6F,0xAC,0x2F,0x2F,0x04,0x31,0xC3,0x30,0x55,0xDA,0x5E,0xFF, + 0xE3,0x30,0xA2,0x28,0x5F,0x2C,0x9B,0xBB,0x03,0x39,0xC2,0x30,0x7F,0xDA,0xEA,0x6A, + 0xE2,0x30,0xA2,0x28,0xBA,0xAF,0xA5,0xD7,0xE2,0x30,0xA2,0x28,0xFA,0xFE,0xEE,0xBF, + 0xC2,0x28,0xA2,0x28,0xD7,0xBD,0xAE,0xA0,0x03,0x31,0xC2,0x28,0xF7,0xBF,0x2A,0xAB, + 0x03,0x31,0xE3,0x30,0xF5,0xE7,0xFF,0x7B,0x24,0x39,0xE3,0x30,0xEB,0xB2,0xAF,0x29, + 0x24,0x39,0xC2,0x28,0x7E,0xEA,0xE2,0xC3,0x24,0x39,0xC2,0x28,0xE3,0xAD,0x6B,0x5E, + 0xE3,0x30,0xC2,0x28,0xBA,0x3C,0x29,0x8D,0x03,0x31,0xC2,0x30,0x6B,0xFA,0xFE,0xFF, + 0x23,0x31,0xC2,0x30,0xFD,0xFB,0xFF,0x57,0xE3,0x30,0xC2,0x28,0xD7,0xF7,0xFA,0x02, + 0x03,0x31,0xA3,0x30,0xAB,0x0A,0xAA,0x08,0x03,0x31,0xC3,0x30,0x2C,0xBC,0xFE,0x82, + 0x03,0x31,0xE2,0x30,0xD8,0x55,0xAF,0xFB,0x44,0x41,0xE2,0x30,0x2F,0xA5,0xBD,0xF7, + 0x64,0x49,0x03,0x39,0xAA,0x02,0xAE,0xF7,0xA5,0x51,0x23,0x41,0x3E,0x2B,0xDF,0xFD, + 0xA5,0x51,0x44,0x49,0xFF,0xAA,0xAC,0xD6,0xC5,0x51,0x64,0x49,0xAA,0x3F,0xAD,0x29, + 0x48,0x6A,0xC5,0x51,0xFD,0xBF,0x3D,0x39,0xAC,0x93,0x88,0x72,0xAD,0x2D,0x29,0x2F, + 0x0E,0x9C,0xAD,0x93,0xDD,0x5F,0xAB,0xAB,0xED,0x9B,0x8C,0x8B,0x27,0xEF,0x7E,0xA8, + 0xCD,0x93,0x8C,0x8B,0xFA,0x7A,0x6A,0x76,0xAD,0x93,0x6B,0x8B,0xB6,0xDF,0xFB,0x5E, + 0x8C,0x93,0x4B,0x83,0xC0,0xBD,0xB7,0x6A,0xCD,0x93,0x4B,0x83,0x02,0x0A,0x3B,0x2D, + 0xCD,0x93,0xAC,0x93,0x9A,0x30,0x98,0x5C,0x2E,0xA4,0xCD,0x93,0xEB,0xFD,0xDF,0x35, + 0x2E,0xA4,0xCD,0x93,0xFF,0xFF,0x6F,0xCD,0x2E,0xA4,0xCD,0x93,0x8B,0xEF,0x9B,0xBF, + 0x2E,0xA4,0xEE,0x9B,0xFA,0x82,0xAE,0x6B,0x2E,0xA4,0xCD,0x93,0x02,0xAB,0x7A,0xF9, + 0x2E,0xA4,0xCD,0x93,0xA8,0xA8,0x2B,0xAD,0x0D,0x9C,0xCC,0x93,0x00,0x20,0xA8,0x5A, + 0x2D,0x9C,0xAC,0x93,0xE8,0xE8,0xFA,0x5F,0xCD,0x93,0xAC,0x93,0x83,0xEF,0xAC,0x39, + 0xED,0x9B,0xAC,0x93,0x3F,0xDF,0xEB,0x7A,0xED,0x9B,0xCC,0x93,0x00,0x2A,0xFF,0x95, + 0x0D,0x9C,0xCC,0x93,0x8A,0x28,0x2B,0x2B,0x4F,0xA4,0xED,0x9B,0x0F,0xAF,0xDF,0x6D, + 0x43,0x51,0x23,0x49,0x17,0x95,0xAA,0x39,0x63,0x51,0x23,0x49,0x6A,0xEA,0xEE,0x7D, + 0x64,0x51,0x23,0x49,0xCB,0x73,0xEE,0x69,0x64,0x51,0x23,0x49,0xAA,0x6A,0x7F,0xED, + 0x43,0x49,0x02,0x49,0x6C,0x5F,0x57,0x58,0x22,0x49,0xE1,0x40,0xEC,0xDE,0xEB,0xAE, + 0x02,0x49,0xE2,0x40,0xFE,0x8A,0xF2,0x8A,0x23,0x49,0xE2,0x40,0xE7,0xAF,0x99,0x55, + 0x23,0x49,0xC1,0x38,0x0A,0x82,0xAA,0xB7,0x22,0x49,0xE3,0x40,0xAA,0x2B,0xAB,0xFF, + 0x23,0x49,0xE2,0x40,0x77,0xB7,0x17,0xFB,0x23,0x49,0xE3,0x40,0xC3,0x8B,0x8E,0x2F, + 0x43,0x51,0x03,0x49,0xDD,0x43,0xED,0xBD,0x49,0x93,0x43,0x51,0x25,0x2D,0x2D,0x0D, + 0xAA,0x9B,0x69,0x93,0xF7,0xAE,0xE3,0x6B,0x8A,0x9B,0x49,0x93,0xBA,0xF8,0xFA,0xEF, + 0x69,0x9B,0x49,0x93,0xD6,0x55,0xE5,0x55,0x89,0x9B,0x28,0x93,0xD7,0x67,0x17,0x3D, + 0x8A,0x9B,0x29,0x93,0x7D,0x7F,0x7A,0xC0,0x6A,0x9B,0x29,0x93,0x6B,0x3E,0xBA,0xBE, + 0x8A,0x9B,0x49,0x93,0x27,0x0F,0xAA,0xBF,0xCB,0xA3,0x29,0x8B,0x8A,0xAA,0xEA,0xFF, + 0x8A,0x9B,0x66,0x7A,0xA0,0x78,0x7E,0x57,0xA7,0x7A,0x46,0x72,0xF8,0x7B,0xFE,0xFF, + 0x87,0x7A,0x25,0x6A,0xFF,0x6A,0xAB,0xAB,0x86,0x7A,0x45,0x6A,0xEB,0xAD,0xB6,0xE8, + 0x87,0x72,0x46,0x72,0xF7,0x87,0x08,0x6A,0x87,0x7A,0x06,0x62,0x82,0x80,0x82,0x72, + 0x46,0x6A,0x23,0x49,0xE0,0xFA,0x7A,0xD6,0x84,0x59,0x02,0x41,0xA8,0xBE,0x77,0x7F, + 0x43,0x49,0x23,0x41,0xDC,0xD7,0xA5,0x89,0x63,0x49,0x23,0x49,0x97,0x2F,0x2A,0x0A, + 0xA5,0x59,0x64,0x51,0xBD,0x2D,0x8F,0xBB,0x84,0x51,0x43,0x49,0xEE,0x68,0xFE,0xFC, + 0x64,0x49,0x43,0x49,0x1A,0x95,0x37,0x98,0x85,0x49,0x44,0x49,0xFF,0xAE,0xBA,0xEB, + 0x64,0x49,0x24,0x41,0x7F,0xEC,0x6E,0x7E,0x44,0x49,0x24,0x41,0x2A,0x6F,0xE5,0x2D, + 0x23,0x41,0x03,0x41,0xEC,0xFA,0x23,0xE0,0x23,0x41,0xC2,0x38,0x2E,0xAE,0xAA,0xF4, + 0xA5,0x59,0x03,0x41,0x09,0x05,0xF5,0x55,0xC5,0x59,0x23,0x49,0xA8,0xAA,0xAA,0xBD, + 0xA4,0x51,0x43,0x51,0xE8,0xFA,0xFE,0x7E,0x64,0x51,0x03,0x41,0xFF,0xEA,0xFA,0x6C, + 0x23,0x41,0xA1,0x30,0xE8,0xEA,0x7A,0x7E,0x03,0x39,0xA1,0x30,0xAB,0x8B,0xAD,0xBE, + 0xE2,0x38,0xA1,0x28,0x02,0x28,0xEE,0x78,0x03,0x39,0xC2,0x30,0x5E,0xAA,0x82,0x53, + 0xE3,0x30,0x81,0x28,0x82,0x8A,0xEF,0xDF,0xE3,0x30,0x81,0x20,0xFC,0xFE,0xF7,0x5D, + 0xA1,0x20,0x40,0x18,0xF8,0xF8,0xF8,0x7A,0x82,0x20,0x40,0x18,0xB9,0x2F,0xAB,0xAF, + 0xC2,0x28,0x61,0x18,0xB7,0x2F,0x2B,0x03,0x03,0x31,0xA2,0x28,0x9F,0x87,0x2B,0x2A, + 0x44,0x41,0xC3,0x30,0x2D,0xBB,0x8A,0xBA,0x44,0x41,0xC2,0x28,0x02,0x08,0xBE,0xDE, + 0x85,0x41,0xA2,0x28,0x0A,0xA8,0xFE,0xF7,0x44,0x41,0xC2,0x30,0x80,0xAA,0xEF,0x5D, + 0x24,0x39,0xE3,0x30,0x88,0xAB,0x3D,0xD5,0x23,0x41,0x03,0x39,0x5D,0x5F,0x7B,0x55, + 0x03,0x39,0xC2,0x30,0x72,0x98,0xAA,0xA0,0x03,0x39,0xA2,0x30,0xE5,0x2E,0x8A,0x8A, + 0x03,0x39,0xC3,0x30,0xE2,0xEA,0xFE,0xF5,0xC2,0x38,0xE3,0x30,0xF5,0xBF,0xFD,0xFF, + 0xE3,0x38,0xA1,0x28,0x03,0xAA,0xB6,0x9F,0x03,0x39,0xC2,0x30,0xEA,0xAA,0x22,0xF2, + 0x03,0x39,0xA2,0x30,0xAB,0xAB,0xEE,0x78,0xE2,0x30,0xC2,0x30,0xE1,0xA0,0x23,0xBB, + 0x03,0x31,0xC2,0x28,0xB9,0xB5,0xA7,0xD5,0xE3,0x30,0x81,0x28,0xB8,0xF8,0x7A,0x7F, + 0xC2,0x28,0x82,0x28,0x28,0x2F,0xAF,0xF5,0xE3,0x30,0xA2,0x28,0x0A,0xAF,0xBD,0xE9, + 0x04,0x31,0xC3,0x30,0xBF,0xED,0xFF,0xAD,0xE3,0x30,0xC2,0x28,0xCC,0x98,0xF0,0xC0, + 0x03,0x39,0xE3,0x30,0x57,0x7B,0xEB,0xA5,0xE3,0x30,0xA2,0x28,0x7F,0xFF,0x2E,0xE2, + 0xE3,0x30,0x81,0x28,0xAD,0xAB,0xAA,0xEA,0xC2,0x28,0x82,0x28,0x78,0xB0,0xC2,0x80, + 0xE3,0x30,0x81,0x20,0x55,0x7F,0xEA,0xA0,0xC2,0x28,0x61,0x20,0xFD,0xFB,0xAA,0x00, + 0xE2,0x30,0x81,0x20,0xAF,0xAD,0xBE,0x28,0x23,0x39,0xC2,0x28,0xFD,0xFF,0xEB,0x8F, + 0xE3,0x30,0xA2,0x28,0x2A,0xA0,0xA0,0xF8,0x03,0x31,0xC2,0x30,0x15,0xB5,0xA7,0xAF, + 0x03,0x31,0xA2,0x28,0x9C,0xFE,0xFF,0x56,0xE3,0x30,0xA2,0x28,0x02,0x02,0xEA,0xDF, + 0xC2,0x30,0xA2,0x28,0xAE,0x0E,0x2E,0xB7,0xE3,0x30,0xC2,0x28,0xDE,0x96,0x2F,0xFF, + 0x03,0x31,0xA2,0x28,0x6A,0xE2,0xA0,0xAB,0x03,0x31,0xA2,0x30,0xA9,0x22,0x82,0xA8, + 0x03,0x31,0xE3,0x30,0x22,0x6A,0xF1,0xB2,0x24,0x39,0xA1,0x28,0x0A,0xAA,0xDF,0x5F, + 0x24,0x39,0xC2,0x30,0xF8,0x7A,0x7F,0x5D,0xE3,0x30,0xA2,0x28,0xF0,0xF8,0xFA,0x7B, + 0xE3,0x30,0xA2,0x28,0x05,0xED,0x9F,0xAF,0xE3,0x30,0xC2,0x28,0x8E,0x2F,0x0D,0xA5, + 0xE3,0x30,0xC2,0x28,0x56,0x2A,0x39,0x2F,0xE3,0x30,0xA2,0x28,0x08,0xBE,0x3E,0x2A, + 0x23,0x31,0xE2,0x30,0x97,0xC7,0x95,0xF5,0x03,0x31,0xE2,0x30,0xE0,0x68,0x40,0xD7, + 0x03,0x31,0xA1,0x28,0x22,0x82,0xC2,0xFA,0x03,0x39,0xC1,0x28,0x82,0x03,0x09,0x05, + 0x44,0x41,0x03,0x39,0xFB,0x2B,0xAB,0xED,0x64,0x49,0x23,0x41,0x8F,0xAD,0x9D,0xF5, + 0x64,0x49,0x23,0x41,0x79,0xEE,0xE2,0xE0,0xE5,0x59,0x43,0x41,0x2F,0xAD,0xAB,0xAA, + 0xC8,0x7A,0xE4,0x51,0xB7,0xBD,0x2D,0x2F,0xCD,0x9B,0xC9,0x7A,0x2D,0x0D,0x29,0x0B, + 0x0F,0x9C,0xCD,0x93,0xAF,0xA9,0xC3,0x2F,0xED,0x9B,0xAD,0x93,0xC8,0xA2,0x6A,0x82, + 0xEE,0x9B,0x8C,0x8B,0x5E,0x5A,0xE8,0xAA,0xAC,0x93,0x4B,0x83,0xDA,0xFB,0xFF,0xF6, + 0x8B,0x8B,0x4B,0x83,0xBA,0x99,0x77,0xAF,0xAD,0x93,0x2A,0x83,0x37,0x97,0xD5,0xF5, + 0xCD,0x93,0x6C,0x8B,0x80,0xBA,0x2F,0x2D,0xED,0x9B,0xCD,0x93,0x26,0x2F,0x35,0xF5, + 0x0D,0x9C,0xAC,0x93,0x80,0x0A,0x39,0x2B,0x0E,0x9C,0xCD,0x9B,0xAA,0xB9,0xE0,0xE2, + 0xED,0x9B,0xCD,0x93,0x68,0x20,0x0A,0xE2,0x0E,0x9C,0xCD,0x93,0x62,0xDE,0xCB,0xCE, + 0xED,0x9B,0xCD,0x93,0xE3,0x68,0x57,0x97,0xED,0x9B,0xAD,0x93,0xF6,0xEE,0x3A,0xAC, + 0xED,0x93,0x8C,0x93,0xDA,0xAA,0x2A,0xA8,0x0D,0x9C,0xAC,0x93,0xFD,0x55,0xD4,0x5F, + 0xCD,0x93,0x6B,0x8B,0xE0,0x2A,0x22,0xA2,0xCD,0x93,0x8C,0x93,0x2A,0x02,0xAE,0x2D, + 0xED,0x9B,0x8C,0x8B,0x02,0x0A,0x2A,0xB6,0x2E,0xA4,0xCD,0x93,0x8E,0xFE,0xDF,0xFD, + 0x44,0x51,0x03,0x49,0xF2,0xE8,0xFB,0x97,0x43,0x51,0x03,0x49,0x3A,0xAB,0x2F,0xA6, + 0x63,0x51,0x03,0x49,0xEB,0xA0,0xFB,0xD7,0x44,0x51,0x23,0x49,0x6B,0xEF,0x52,0x55, + 0x22,0x49,0x02,0x41,0x80,0x0F,0xBA,0xB8,0x23,0x49,0x02,0x41,0xD6,0xDC,0x0C,0xBE, + 0x23,0x49,0xC1,0x38,0xA2,0xE6,0x62,0xAA,0x23,0x49,0xC1,0x38,0xFA,0x6F,0x2F,0x0A, + 0x23,0x41,0xC1,0x40,0xF6,0x88,0xEA,0xCE,0x02,0x41,0xC2,0x38,0x28,0xCD,0xAB,0x8B, + 0x23,0x41,0xE3,0x40,0xEE,0x0F,0x27,0x3E,0x23,0x49,0xE2,0x40,0xB2,0xD0,0xEA,0xFB, + 0x43,0x51,0xE2,0x40,0x2B,0x0F,0x3D,0xBF,0x69,0x93,0xC4,0x59,0x2D,0x09,0x29,0x0D, + 0xA9,0x9B,0x69,0x93,0x7F,0x53,0x7E,0x54,0x8A,0x9B,0x49,0x93,0xEF,0xEA,0xE8,0x6D, + 0x69,0x93,0x28,0x8B,0xFE,0xA9,0xFE,0x0E,0x8A,0x9B,0x49,0x93,0xA5,0x2D,0x0D,0xA0, + 0xAB,0x9B,0x49,0x93,0x42,0xBA,0xFA,0xD5,0x8A,0x9B,0x4A,0x93,0x9F,0xAB,0xFA,0xDF, + 0x8A,0x9B,0xE9,0x8A,0xBA,0xE8,0xF8,0xFA,0x2A,0x93,0x06,0x6A,0x80,0xE8,0xFA,0x7E, + 0x87,0x7A,0x25,0x6A,0xBC,0xF8,0xEE,0x7F,0x87,0x72,0x46,0x72,0xAD,0x83,0x8A,0x58, + 0x87,0x72,0x46,0x72,0xAA,0xBA,0xAB,0xDD,0xA7,0x7A,0x46,0x72,0x5F,0x9A,0xBF,0x0A, + 0xA7,0x7A,0x46,0x6A,0xEB,0xEE,0xC2,0x68,0x46,0x72,0x64,0x51,0xE0,0xE0,0x78,0x5E, + 0x84,0x59,0x02,0x41,0xFC,0x5E,0xFF,0xDC,0x43,0x49,0x02,0x41,0xC2,0xAA,0xAD,0xBF, + 0x64,0x51,0x02,0x41,0xA9,0x8F,0xAF,0x2A,0xA5,0x51,0x43,0x49,0xBF,0xA9,0xBB,0x82, + 0xA4,0x51,0x43,0x49,0xA8,0xC8,0x6A,0xFE,0xA4,0x51,0x43,0x49,0xDA,0x35,0x25,0xEF, + 0x84,0x49,0x44,0x49,0x7A,0x78,0xA0,0x80,0x85,0x49,0x44,0x49,0xEB,0x8B,0x37,0x17, + 0x84,0x49,0x44,0x49,0x77,0xFE,0xF6,0xDB,0x44,0x41,0x03,0x41,0xA8,0xAE,0xAE,0xEA, + 0x44,0x49,0x03,0x41,0xEE,0x2F,0xAD,0xBA,0x24,0x41,0xE3,0x38,0xD6,0xFB,0xFC,0xAA, + 0x03,0x41,0xC2,0x38,0xA8,0x5A,0x77,0x5E,0x64,0x51,0xA2,0x38,0x0B,0xAF,0xB5,0xF5, + 0x84,0x51,0x03,0x41,0xA0,0xA2,0x8A,0xA5,0x64,0x51,0x02,0x41,0xE8,0xEE,0x6A,0xEB, + 0x23,0x41,0xC2,0x30,0x5F,0x7B,0xEB,0xE8,0x03,0x39,0xC2,0x38,0xFF,0xFF,0xA7,0x8F, + 0x03,0x39,0xC2,0x30,0x57,0xDF,0xFE,0xFA,0xE3,0x30,0x81,0x28,0xA2,0xEA,0xEA,0x5A, + 0xA2,0x28,0x61,0x20,0xA0,0xA2,0x7A,0x7F,0x81,0x20,0x41,0x18,0x80,0xE8,0x7E,0x7F, + 0x61,0x20,0x41,0x18,0xE2,0xEF,0xFD,0x95,0xA2,0x28,0x41,0x18,0xBD,0xAF,0xAF,0x3F, + 0xE3,0x28,0x81,0x20,0x8B,0xAD,0xFF,0x57,0xE3,0x30,0x81,0x20,0x0A,0xAB,0xED,0xF9, + 0xE3,0x30,0x81,0x20,0x80,0xEF,0xFD,0x57,0xC2,0x28,0x81,0x20,0x20,0xF2,0xAF,0xAF, + 0xC3,0x30,0x82,0x20,0xA7,0x97,0xFF,0xBE,0xC3,0x28,0x82,0x28,0xEA,0xEB,0xFE,0x76, + 0x03,0x39,0x81,0x20,0xAB,0x2F,0xFD,0xF5,0x24,0x39,0xE2,0x30,0xBF,0xBE,0xAE,0xB5, + 0x24,0x39,0xE3,0x38,0x7A,0xF3,0xDD,0x77,0x03,0x39,0xC2,0x30,0xFF,0xFB,0xF8,0xEE, + 0xE3,0x30,0xA1,0x28,0x3E,0xF8,0x70,0xA2,0x03,0x39,0xA2,0x28,0x8F,0xEB,0xFB,0x7F, + 0xC2,0x30,0x81,0x28,0x28,0x28,0xA8,0xBD,0xE2,0x30,0xA2,0x30,0xEA,0xAA,0x8F,0x26, + 0xE3,0x30,0xA2,0x30,0x40,0x82,0x00,0x02,0xC2,0x30,0xE3,0x28,0xBA,0x2A,0x0E,0xBE, + 0xC2,0x30,0xA2,0x28,0x5A,0x5E,0xE8,0x58,0xA2,0x28,0x81,0x20,0x7B,0x6B,0x58,0x70, + 0xA2,0x28,0x61,0x20,0xDF,0xBF,0x1B,0x2B,0xC3,0x30,0xA2,0x28,0x2D,0xDF,0xCA,0x2B, + 0xE3,0x30,0xA2,0x28,0x2B,0xEA,0xAB,0x3F,0x03,0x31,0xC2,0x30,0xEA,0xFB,0xEA,0x09, + 0x03,0x31,0xC3,0x30,0x8F,0xBF,0xAF,0xAF,0xE3,0x30,0xA1,0x28,0xB2,0xBC,0xF0,0xFA, + 0xE3,0x30,0xA2,0x28,0xEB,0xAB,0xB9,0xBB,0xE3,0x30,0xA2,0x28,0xAF,0x26,0x2A,0xAA, + 0x03,0x39,0xE3,0x30,0x57,0x9F,0x39,0x43,0x24,0x39,0xC2,0x28,0x7E,0xEE,0xFE,0xDC, + 0x23,0x39,0xE3,0x30,0xC5,0xBD,0xEF,0xF5,0x03,0x39,0xC2,0x30,0xEE,0x7A,0xE8,0xE8, + 0xE3,0x30,0xC2,0x28,0x52,0x15,0xF7,0xFB,0x02,0x31,0xA2,0x28,0x3F,0xFF,0xBD,0xFF, + 0xE3,0x30,0xA2,0x28,0xFC,0xFC,0x5F,0x57,0xE3,0x30,0xA2,0x28,0xBD,0xE3,0x7B,0xEA, + 0xC2,0x28,0xA2,0x28,0xDF,0xD6,0xA5,0x8F,0xC2,0x30,0xA2,0x28,0xD6,0x95,0xA5,0xAD, + 0x03,0x31,0xC2,0x28,0x35,0xA5,0xAD,0x9D,0x03,0x31,0xC3,0x30,0x08,0x80,0xAA,0xDE, + 0x24,0x39,0xE3,0x30,0x7E,0xA7,0xED,0x6B,0x03,0x31,0xA2,0x28,0x7E,0xF8,0xFA,0xAA, + 0xE3,0x30,0xC2,0x28,0x79,0xFF,0x6B,0xC0,0x03,0x31,0xC2,0x28,0x55,0xDD,0xF3,0xB8, + 0xC2,0x30,0xE3,0x28,0xAE,0xA9,0xAF,0xB7,0xE3,0x30,0xA2,0x28,0xF9,0x3E,0xBA,0x3A, + 0x03,0x31,0xC2,0x30,0xB7,0x36,0xF8,0xB8,0x03,0x31,0xC2,0x30,0xA7,0xAA,0xBE,0xFE, + 0x03,0x31,0xC2,0x28,0x2B,0x8E,0x27,0x0F,0x43,0x39,0xE2,0x30,0x55,0x7F,0xEF,0xF2, + 0x02,0x31,0xC2,0x30,0x72,0x42,0x76,0x7E,0x03,0x39,0xA1,0x28,0x3D,0xAD,0x3D,0xA7, + 0x64,0x49,0x03,0x39,0xF9,0xBF,0x3D,0x2D,0xA5,0x51,0x43,0x41,0x55,0xD5,0x8B,0x83, + 0xA5,0x51,0x64,0x49,0x57,0x07,0x2D,0xAE,0x06,0x5A,0x84,0x49,0xB7,0xEF,0xAF,0x2D, + 0x0A,0x83,0xE5,0x59,0x2F,0xAD,0x29,0x2F,0xED,0x9B,0x4B,0x8B,0x2F,0x0F,0x3D,0x99, + 0x0E,0x9C,0x8C,0x93,0xAA,0x0A,0xEF,0x5F,0xED,0x9B,0x8C,0x93,0x20,0xAA,0xAA,0xEF, + 0xCD,0x93,0x8C,0x93,0xC0,0xC4,0x6B,0x5E,0x8C,0x8B,0x4B,0x83,0xE0,0xBE,0xE8,0xF6, + 0x8C,0x8B,0x4B,0x83,0xEF,0x7E,0xFF,0xD5,0x6B,0x8B,0x0A,0x7B,0xBE,0xD8,0xDE,0x7C, + 0xCC,0x93,0x29,0x7B,0x2F,0xAF,0xAD,0xFD,0xED,0x9B,0x8B,0x8B,0xAA,0xAA,0x3B,0x3D, + 0xED,0x9B,0xAC,0x93,0x22,0x38,0xAA,0xF5,0x0E,0x9C,0x8C,0x8B,0xA8,0x2A,0xAB,0x7F, + 0x2E,0xA4,0xAC,0x93,0xF8,0xBE,0xF7,0x75,0x0E,0x9C,0xAC,0x93,0x3A,0xBE,0xEB,0x9F, + 0xCD,0x93,0x8C,0x8B,0x00,0x02,0x0A,0x2C,0xCD,0x93,0x8C,0x8B,0x38,0xD0,0x6F,0xEE, + 0xCD,0x93,0x8C,0x8B,0xA0,0x30,0xFA,0xF7,0xCD,0x93,0x8C,0x8B,0x28,0x0C,0x08,0x88, + 0xCD,0x93,0x6C,0x8B,0xAA,0xFE,0xA6,0x22,0xCC,0x93,0x6B,0x8B,0x32,0xFA,0xE2,0xE8, + 0xED,0x9B,0x8C,0x8B,0xEF,0xEB,0xCF,0x5D,0x0E,0x9C,0xAC,0x93,0xBD,0xBC,0xFF,0xF5, + 0x43,0x51,0x03,0x49,0xEA,0xEA,0xFB,0x6A,0x43,0x51,0x03,0x41,0xEB,0xA2,0xD3,0xFF, + 0x23,0x49,0xE2,0x40,0x0B,0x0F,0xA2,0x88,0x43,0x49,0xE2,0x40,0xAC,0xFC,0x7F,0xEE, + 0x23,0x49,0xE2,0x40,0xAB,0x8F,0xBB,0x29,0x23,0x49,0xE2,0x40,0x62,0xDC,0x98,0xF8, + 0x03,0x49,0xE1,0x38,0xAA,0xF2,0xF2,0xD6,0x23,0x41,0xC1,0x38,0x82,0x8A,0xE3,0xFE, + 0x02,0x41,0xE2,0x38,0x89,0xE5,0xAF,0x25,0x23,0x49,0xE2,0x38,0xA5,0x8D,0xFF,0xFB, + 0x03,0x41,0xE2,0x38,0x08,0x02,0x28,0x07,0x23,0x49,0xE2,0x40,0xFB,0xFC,0xFE,0x7F, + 0x43,0x51,0xE2,0x40,0x3F,0xBF,0x2F,0x2D,0x6A,0x93,0xA5,0x59,0x0B,0x09,0x0B,0x0B, + 0x8A,0x9B,0x69,0x93,0x68,0xC0,0xA2,0x29,0x8A,0x9B,0x49,0x93,0x87,0x05,0x2A,0xB0, + 0x8A,0x9B,0x28,0x8B,0x29,0x0A,0xE8,0xFE,0x6A,0x9B,0xE8,0x82,0xC0,0x68,0x7E,0x57, + 0x29,0x8B,0xC8,0x82,0x0A,0x2F,0xAF,0xDD,0x6A,0x93,0x09,0x8B,0x20,0x03,0xAF,0xF5, + 0x4A,0x93,0x05,0x6A,0x80,0xA0,0xE0,0x78,0x67,0x7A,0xE5,0x61,0xE2,0xFE,0xDE,0xDF, + 0x66,0x72,0x05,0x6A,0x8B,0xEF,0xB5,0x7F,0x66,0x72,0xE4,0x61,0xA8,0x2B,0x2B,0xA9, + 0x87,0x72,0x26,0x72,0x9A,0xEA,0xE2,0xCA,0xC8,0x7A,0x46,0x6A,0x29,0xCF,0xFF,0xD7, + 0xA7,0x72,0x84,0x59,0xA0,0xEA,0x78,0x5E,0xE5,0x61,0x23,0x49,0xD8,0xDF,0x7F,0xFF, + 0x63,0x51,0x22,0x41,0x5C,0x76,0x6A,0xEE,0x43,0x49,0x02,0x41,0xFF,0x9F,0x9A,0x58, + 0x64,0x51,0xE2,0x38,0x0A,0x0B,0x2F,0xAD,0xA5,0x51,0x64,0x49,0xC0,0x8E,0x77,0x75, + 0x84,0x49,0x44,0x49,0xFA,0xD8,0x2A,0x2F,0xA5,0x51,0x43,0x49,0xA6,0xA8,0x88,0xAA, + 0x84,0x51,0x64,0x49,0xE2,0x42,0x7E,0x5E,0x85,0x51,0x23,0x41,0xBC,0xF7,0x56,0x77, + 0x64,0x49,0x23,0x41,0xA0,0x78,0xA3,0xA3,0x64,0x49,0x23,0x41,0x7F,0xCD,0xFF,0xDE, + 0x64,0x49,0x03,0x39,0xAF,0xB7,0xE6,0xFE,0x64,0x41,0x03,0x41,0x57,0x7E,0x7F,0xDF, + 0x23,0x41,0xE3,0x38,0x7B,0xA2,0xEB,0xBF,0x03,0x39,0xC2,0x38,0x55,0x5E,0x5A,0xF8, + 0x03,0x41,0xA1,0x30,0x2E,0x37,0xAF,0x3B,0x43,0x41,0x03,0x41,0x22,0xA8,0xAB,0x0A, + 0x43,0x41,0xE2,0x38,0xFE,0xFA,0xE2,0xFA,0x03,0x39,0xC2,0x38,0x8A,0x2D,0x2F,0x2B, + 0x23,0x39,0xC2,0x30,0xFB,0x7C,0xFA,0xEB,0xE3,0x30,0x81,0x28,0x52,0x5A,0x7F,0xDF, + 0xA1,0x28,0x40,0x20,0xF8,0x6E,0xFA,0xBA,0x61,0x20,0x41,0x18,0xEA,0xAA,0xB0,0x00, + 0xA2,0x28,0x41,0x18,0x55,0xFF,0xFF,0x2F,0xA2,0x20,0x61,0x20,0xB5,0xA9,0xAB,0x88, + 0xA1,0x20,0x61,0x20,0xBE,0xAF,0xA7,0x0B,0xA2,0x28,0x81,0x20,0x8D,0xB7,0xBB,0xB8, + 0xA2,0x28,0x81,0x20,0xBE,0x3E,0xAA,0xE2,0xC2,0x28,0x81,0x20,0x2F,0xA2,0xAF,0xBF, + 0xA2,0x28,0x82,0x20,0x08,0x8A,0x7E,0xE9,0xA2,0x28,0x81,0x20,0xAC,0x7A,0xFF,0xFB, + 0xA2,0x28,0x81,0x20,0xBF,0x5E,0x6F,0x9F,0x24,0x39,0xA2,0x28,0xAF,0xBD,0xB5,0xD5, + 0x03,0x39,0xA2,0x28,0xA0,0x88,0xAA,0xA9,0x03,0x39,0xC2,0x30,0xEF,0xA7,0x7E,0x97, + 0xA1,0x38,0xE2,0x30,0xF7,0xD5,0xA7,0xF7,0xC2,0x30,0x81,0x28,0x68,0xFA,0xBF,0xF8, + 0xC2,0x30,0x81,0x28,0x35,0xEC,0xFF,0xBA,0xE2,0x30,0xA2,0x30,0x07,0x21,0x2D,0xBB, + 0xE2,0x30,0xA2,0x28,0x0C,0x80,0x20,0xBE,0xE3,0x30,0xC2,0x28,0x3B,0xBC,0x2E,0xDF, + 0x03,0x31,0xA2,0x28,0x56,0xD7,0xE2,0xBF,0xC2,0x30,0xA2,0x28,0x5D,0x7D,0x62,0x58, + 0xA2,0x28,0x81,0x20,0x2F,0x25,0x2F,0x0A,0xC2,0x28,0xA2,0x28,0xBE,0x53,0x5D,0x55, + 0xE3,0x30,0xA2,0x28,0xF7,0xFA,0xAB,0x27,0xE3,0x30,0xA2,0x28,0x0B,0x6E,0xAF,0xCA, + 0x24,0x39,0xC2,0x30,0xEF,0xC9,0xA5,0xD5,0x03,0x31,0xA2,0x28,0x5E,0xFA,0x7E,0xAA, + 0xE3,0x30,0xA2,0x28,0xBE,0x1F,0x97,0xB5,0xE3,0x30,0xC2,0x30,0x64,0xE0,0xA0,0x3D, + 0x04,0x39,0xC2,0x30,0xFF,0xE5,0xC3,0xAE,0x03,0x39,0xC2,0x30,0xD4,0xD6,0x77,0xB7, + 0x03,0x39,0xC2,0x30,0x2D,0xBD,0xFD,0x6B,0x03,0x39,0xC2,0x30,0xCA,0x82,0xC8,0x82, + 0x03,0x39,0xA2,0x28,0xBA,0xBA,0xE8,0xFC,0x03,0x31,0xC2,0x30,0x77,0xF5,0xA5,0x55, + 0xE3,0x30,0xA2,0x28,0x7D,0xFF,0xF6,0xBE,0x24,0x39,0xC2,0x28,0x75,0xFD,0xAD,0x25, + 0x03,0x31,0xA2,0x28,0xFD,0xDF,0xF2,0xE8,0xC2,0x28,0x82,0x28,0x22,0x0A,0xA8,0xBE, + 0xE3,0x30,0xA2,0x28,0x02,0x82,0x7B,0xDD,0x03,0x31,0xC3,0x28,0x7E,0xEF,0xAF,0xCD, + 0x03,0x39,0xC3,0x30,0xC2,0x8B,0xFB,0x9A,0x03,0x31,0xC2,0x30,0xEB,0xF7,0x5E,0xD7, + 0x03,0x31,0xA2,0x28,0xA8,0xBA,0x7B,0xFB,0x03,0x39,0xC2,0x28,0x9A,0xA0,0x5E,0x5D, + 0xE2,0x30,0xC2,0x28,0xAF,0x3E,0x6D,0xF9,0x03,0x31,0xC2,0x28,0x97,0xD7,0x95,0x15, + 0x03,0x31,0xC2,0x28,0xFB,0x36,0x2A,0x88,0x23,0x39,0xE3,0x30,0x7D,0xEA,0x6B,0xBF, + 0x03,0x31,0xE2,0x30,0xB5,0xF3,0xA3,0x35,0x43,0x39,0x03,0x31,0x7F,0xFF,0x8F,0x6D, + 0x23,0x39,0xC2,0x30,0xDA,0xAC,0x8A,0x2E,0x02,0x39,0xC2,0x30,0x65,0x32,0xA2,0x28, + 0x64,0x49,0xE2,0x38,0x2D,0x29,0xAF,0xA7,0x85,0x51,0x44,0x49,0x8B,0xAA,0xDF,0xDD, + 0x84,0x51,0x23,0x41,0x8A,0xFF,0x3D,0x8A,0x68,0x6A,0x64,0x49,0xBD,0xBD,0xBD,0x3F, + 0x8C,0x93,0x88,0x72,0xA5,0x2D,0x29,0x2D,0xAC,0x93,0x4C,0x8B,0xA1,0xAE,0x2A,0xEE, + 0xAC,0x93,0x4B,0x8B,0xA0,0xAB,0xEE,0x7F,0xAD,0x93,0x2B,0x83,0xA2,0x88,0xF8,0xDD, + 0xCC,0x93,0xEA,0x7A,0x22,0xAA,0xFE,0x7F,0x6B,0x8B,0xA9,0x72,0xA8,0xA0,0xA2,0x7E, + 0x4B,0x83,0x47,0x62,0x00,0x8A,0xAA,0x77,0x4B,0x83,0x07,0x5A,0x20,0x88,0xFE,0x55, + 0x4B,0x83,0x27,0x62,0x02,0x02,0xAB,0xF5,0xAC,0x8B,0x89,0x6A,0x00,0x8A,0xAB,0xFD, + 0xAC,0x8B,0x89,0x72,0x00,0xA0,0xFA,0x5F,0x8C,0x8B,0x07,0x5A,0xA0,0xFA,0x5F,0x57, + 0x6B,0x8B,0x27,0x62,0x00,0xBD,0x75,0x55,0xAD,0x93,0x68,0x62,0x00,0x0A,0xBD,0x55, + 0xED,0x93,0xEA,0x7A,0x82,0x8A,0xAA,0xBD,0xAD,0x93,0x8C,0x8B,0xA8,0xA8,0xEF,0xFD, + 0xAC,0x93,0x6C,0x8B,0x2B,0xA1,0xCD,0xA5,0xCC,0x93,0x6C,0x8B,0xAA,0xEA,0xED,0x3F, + 0xCD,0x93,0x8C,0x8B,0xAC,0x4F,0xA9,0x7B,0xCC,0x93,0x8B,0x8B,0x8C,0xFD,0xEB,0xCA, + 0xAC,0x93,0x8C,0x8B,0xD2,0xF2,0x9F,0x36,0xED,0x9B,0x8C,0x8B,0x89,0xF9,0x95,0xDE, + 0x43,0x51,0xE2,0x40,0xCA,0x7F,0xEA,0xFE,0x43,0x49,0xE2,0x40,0xF9,0x61,0xEF,0xAD, + 0x43,0x49,0xE2,0x40,0xEE,0xEB,0xB7,0xBF,0x23,0x49,0x02,0x41,0xDA,0xDF,0xF2,0xEA, + 0x43,0x49,0xE2,0x40,0xBB,0x6B,0x78,0x5F,0x22,0x41,0xC1,0x38,0x2A,0xAF,0xBF,0xB5, + 0x23,0x49,0xE2,0x38,0x5F,0x2B,0x3B,0xD7,0x03,0x41,0xC2,0x38,0xEA,0x7C,0xFC,0xF6, + 0x02,0x41,0xC2,0x38,0x0B,0x8B,0xED,0xEB,0x02,0x41,0xA1,0x38,0x00,0x01,0x09,0x0B, + 0x23,0x49,0xE2,0x40,0x37,0x3A,0xBE,0xF6,0x03,0x49,0x22,0x41,0xAA,0xB9,0xF7,0xAE, + 0x64,0x51,0xE2,0x40,0x35,0x17,0xBF,0xAE,0x6A,0x93,0xA5,0x59,0x0B,0x0B,0x2D,0xF5, + 0xAA,0x9B,0x87,0x7A,0x8A,0x82,0xEE,0x7D,0x6A,0x93,0xC7,0x82,0x80,0xA0,0xFF,0x5D, + 0x49,0x93,0xA7,0x7A,0x80,0x2A,0xFE,0x5F,0x29,0x8B,0xA7,0x82,0xF8,0xEA,0xBF,0xD7, + 0xE8,0x82,0xA7,0x7A,0x7E,0xFE,0xA0,0x50,0x09,0x8B,0x66,0x72,0x22,0xAA,0xDA,0x7F, + 0x09,0x8B,0xC5,0x61,0xF0,0xFE,0x7F,0x5F,0x06,0x6A,0xE5,0x61,0xBC,0x3E,0x7C,0x57, + 0x26,0x6A,0xC4,0x61,0x28,0x20,0x0A,0xFD,0x46,0x6A,0xE5,0x61,0x0A,0xAA,0xB6,0xF7, + 0x67,0x72,0xA4,0x59,0x00,0xA8,0xFA,0x5E,0x25,0x6A,0x63,0x51,0x00,0xF8,0x5E,0x55, + 0xA5,0x59,0x03,0x49,0xB0,0xFC,0xFF,0xBF,0x84,0x51,0x23,0x49,0xA0,0xAA,0x0D,0x2E, + 0x84,0x51,0x02,0x41,0x7A,0x72,0x7E,0xFE,0x64,0x49,0x02,0x41,0x7D,0xFF,0x3D,0x0F, + 0xC5,0x51,0xE2,0x40,0xFD,0xBF,0xAE,0xA0,0x85,0x51,0x23,0x41,0xAA,0x2A,0xA9,0xAB, + 0xA5,0x51,0x44,0x49,0xBF,0xA7,0x2F,0xFE,0xA5,0x51,0x44,0x49,0xFF,0xD6,0x78,0xFB, + 0x84,0x49,0x44,0x49,0xEF,0x7F,0x5B,0x6B,0x64,0x49,0x23,0x41,0x6F,0xCA,0xAA,0xE2, + 0x64,0x49,0x03,0x41,0xAE,0xFF,0xFE,0xDC,0x44,0x49,0xE2,0x38,0xA0,0xAA,0xEE,0xDE, + 0x44,0x49,0xE3,0x40,0xA2,0xAB,0xEB,0xBF,0x23,0x41,0x03,0x41,0xF0,0xBE,0x57,0xD0, + 0x44,0x41,0xE2,0x38,0xDF,0xFF,0xFE,0xB8,0x23,0x41,0xE2,0x38,0x7E,0xFF,0xD8,0xBA, + 0x44,0x49,0xE3,0x38,0x9D,0xB7,0xAB,0x82,0x64,0x49,0x03,0x41,0x2B,0xEA,0xEF,0x55, + 0x43,0x41,0xE2,0x38,0x70,0x7A,0x7A,0x7F,0x03,0x39,0xA1,0x30,0xAA,0xBB,0x2B,0xF5, + 0x03,0x39,0xC2,0x30,0xE2,0x6A,0x78,0x7A,0xE3,0x38,0x81,0x28,0x7C,0x5E,0x77,0xEF, + 0xA2,0x28,0x61,0x20,0xFE,0x7A,0x7B,0x7A,0xA2,0x28,0x61,0x20,0xF7,0xED,0x2D,0x09, + 0xA2,0x20,0x61,0x20,0x25,0x0C,0x08,0x2A,0xC2,0x28,0x81,0x20,0xBA,0xEA,0x02,0x25, + 0xC2,0x28,0x81,0x20,0xBD,0xA5,0xBB,0xFF,0xA2,0x28,0x81,0x20,0x1A,0xBA,0xFF,0xCA, + 0xA2,0x28,0x81,0x20,0xE2,0xCB,0x2B,0xAF,0xA2,0x28,0x81,0x20,0xA8,0xBE,0xFB,0xD7, + 0xA2,0x28,0x82,0x20,0xAE,0xEF,0xEF,0xBF,0xA2,0x28,0x61,0x20,0xAA,0xFB,0xDF,0xFC, + 0xA2,0x28,0x61,0x20,0x3E,0xAE,0xBF,0x3F,0xA2,0x30,0x81,0x20,0x3F,0xBE,0x37,0x3E, + 0x03,0x39,0xA2,0x28,0xBD,0xAF,0xA9,0xAF,0xE3,0x38,0xC2,0x30,0xAD,0xA9,0x08,0x80, + 0xE2,0x38,0xC2,0x30,0xEA,0x66,0xFE,0xF4,0xE3,0x38,0xA2,0x28,0x5E,0xFB,0xFA,0xF8, + 0xC2,0x30,0xA2,0x28,0xFA,0xBF,0x3C,0x13,0xE2,0x30,0xA3,0x28,0xEE,0xEB,0xAA,0xEA, + 0xE3,0x30,0xA2,0x28,0xB7,0xEB,0x25,0xF5,0xC2,0x28,0xA1,0x28,0x30,0xF8,0x57,0x55, + 0xC2,0x28,0x61,0x28,0x02,0x88,0xAA,0xAE,0xC2,0x28,0x81,0x20,0xA8,0xFA,0x7A,0x7E, + 0xC2,0x28,0x82,0x28,0xAB,0x0E,0x0D,0x2B,0xE3,0x30,0xA2,0x28,0x5D,0xC3,0xFB,0xBB, + 0xE3,0x30,0xA2,0x28,0xB5,0xD5,0x55,0x56,0xE3,0x30,0xA2,0x28,0xAE,0xAB,0x01,0x03, + 0x03,0x31,0xA2,0x28,0x3F,0xFF,0xDE,0xBF,0xE3,0x30,0xC2,0x30,0x82,0x73,0xE3,0x00, + 0x03,0x39,0xA2,0x28,0xF7,0xA7,0x3F,0x0E,0x03,0x39,0xC3,0x30,0xB5,0xFE,0xCE,0xAA, + 0x24,0x39,0xE3,0x30,0x59,0x6B,0x59,0x7F,0xE2,0x30,0xA2,0x30,0x0A,0x0A,0x2F,0xB5, + 0x03,0x39,0xC2,0x30,0xEB,0xAA,0xFF,0xFD,0x44,0x41,0xA2,0x30,0xAF,0x8D,0xAF,0xEF, + 0x23,0x39,0xC2,0x30,0x5E,0x7A,0xAC,0x28,0x03,0x31,0xC2,0x30,0x75,0x5E,0xBC,0xEA, + 0xE3,0x30,0xA1,0x28,0xBA,0xE0,0xBA,0xD6,0x03,0x31,0xC2,0x30,0x2B,0xEE,0x2F,0xDF, + 0x03,0x31,0xC2,0x30,0x7A,0x88,0x2A,0xFB,0xE3,0x30,0xA2,0x28,0x55,0x57,0xDC,0x28, + 0xC2,0x30,0xA2,0x28,0x79,0x62,0x72,0x52,0xE3,0x30,0x81,0x20,0x0B,0xB7,0xB5,0xEF, + 0xE3,0x30,0xC2,0x28,0xE0,0xB0,0xEF,0xE5,0xE3,0x30,0xC2,0x28,0xBA,0xEF,0x8E,0xAD, + 0xE3,0x30,0xC2,0x28,0xA6,0x07,0xFE,0x6F,0x03,0x31,0xC2,0x30,0x55,0xD7,0xBD,0x9B, + 0xE2,0x30,0xC2,0x28,0xED,0xB3,0x00,0x00,0x23,0x39,0xC2,0x28,0xDD,0xFF,0xFF,0xCA, + 0x23,0x39,0xE3,0x30,0x8F,0x2F,0x7F,0xFB,0x03,0x31,0xC2,0x30,0x88,0xFE,0xFE,0xBF, + 0x03,0x39,0xC2,0x28,0x37,0xB7,0xBF,0xFB,0x03,0x39,0xE2,0x30,0x82,0xA2,0xFD,0xB5, + 0x23,0x39,0xE2,0x30,0x9F,0x9E,0x1F,0x3F,0x23,0x41,0xE2,0x38,0xD5,0xB7,0x9B,0x06, + 0x85,0x49,0x03,0x39,0xBD,0xBD,0xAF,0x2F,0xC5,0x51,0x64,0x49,0x55,0x9D,0xEB,0x32, + 0xE5,0x59,0x64,0x49,0xFD,0xB5,0xEB,0x2A,0xC9,0x7A,0xA5,0x51,0xB5,0xBD,0xAF,0x2F, + 0x8C,0x93,0xA8,0x72,0xAD,0xFD,0xFF,0x8A,0x4A,0x8B,0x87,0x72,0x88,0xDF,0x57,0xA0, + 0x0A,0x83,0x47,0x6A,0x00,0xFE,0xDF,0xF8,0xE9,0x7A,0x26,0x62,0x08,0xFD,0xDD,0xAA, + 0xC8,0x72,0x26,0x62,0xE8,0x5F,0xFF,0xBF,0xA8,0x72,0x06,0x5A,0xF8,0x77,0xFE,0x02, + 0xA9,0x72,0xE6,0x51,0x57,0x75,0xEB,0x02,0xC9,0x72,0xE6,0x51,0x55,0x77,0xBA,0x00, + 0xA9,0x72,0x07,0x5A,0xF5,0xBF,0xBB,0x00,0xC9,0x72,0x27,0x62,0xF7,0xFF,0xE8,0x2A, + 0xA9,0x72,0x47,0x62,0xEB,0xE9,0xEF,0x0A,0xA9,0x72,0x07,0x62,0xFF,0x7F,0xF8,0xB8, + 0x68,0x6A,0x06,0x5A,0xB9,0xEA,0x82,0x88,0x68,0x6A,0x27,0x62,0x56,0xFE,0xB0,0x20, + 0x0A,0x7B,0x06,0x5A,0x2D,0xF7,0xFF,0x7F,0x8C,0x8B,0x47,0x62,0x00,0x2B,0xAD,0xB5, + 0xAD,0x93,0x4B,0x83,0x2F,0xAE,0xFF,0x75,0xAD,0x93,0x6B,0x8B,0x0A,0x3F,0xB5,0x7B, + 0xAC,0x8B,0x6B,0x8B,0x2C,0x2F,0xB5,0x25,0xAC,0x93,0x6C,0x8B,0x00,0xEC,0xAA,0x7E, + 0xCD,0x93,0x6B,0x8B,0x5C,0x57,0xA5,0xDB,0xAD,0x93,0x6B,0x8B,0x2C,0xAE,0xAE,0x1E, + 0x23,0x49,0xC2,0x40,0xF6,0x82,0xA8,0xA8,0x23,0x49,0xE2,0x40,0xAB,0xAE,0xBA,0xE2, + 0x43,0x51,0xE2,0x40,0x8A,0xE3,0xEF,0xE7,0x23,0x49,0xE2,0x40,0xCF,0xB7,0x2B,0xAA, + 0x23,0x49,0xE2,0x40,0x57,0xD5,0xDC,0xAA,0x23,0x49,0xC1,0x38,0xA7,0xAE,0xEA,0x8A, + 0x23,0x49,0xE2,0x38,0xBF,0xBD,0xAF,0x2E,0x24,0x41,0xE2,0x40,0xD5,0x47,0xFB,0xEF, + 0x03,0x41,0xE2,0x38,0x5E,0x5C,0x28,0x80,0x23,0x41,0xC1,0x40,0x2D,0xAF,0xAA,0xAA, + 0x43,0x49,0xE2,0x40,0xBE,0xBE,0x9B,0x00,0x22,0x49,0x03,0x41,0x62,0x60,0xEA,0xAE, + 0x23,0x49,0xE2,0x40,0x0A,0x2A,0xF7,0xF7,0xC4,0x59,0x02,0x41,0x2F,0xA5,0x55,0x55, + 0x46,0x72,0x02,0x49,0x0A,0xBF,0xFD,0x75,0xA7,0x7A,0xA3,0x59,0x02,0x2F,0xAD,0xB5, + 0xC8,0x82,0x25,0x72,0xA0,0xF2,0xBE,0xD5,0xC7,0x82,0x45,0x72,0xA8,0xAA,0xFD,0x75, + 0xE7,0x82,0x46,0x72,0xA0,0xAA,0xAB,0xFD,0x86,0x7A,0xC4,0x61,0xC0,0x40,0x78,0x5E, + 0x06,0x6A,0x64,0x51,0xA2,0xBE,0xDF,0x57,0xE5,0x61,0x43,0x51,0x80,0xAC,0xFE,0x55, + 0xE5,0x61,0x43,0x51,0x00,0x0A,0xAE,0xA5,0x05,0x6A,0x84,0x51,0xA8,0xEE,0x7F,0xDA, + 0xC5,0x61,0x43,0x51,0xF2,0x6A,0x78,0xFA,0x83,0x51,0x03,0x49,0xAA,0xFF,0x7A,0xAA, + 0x64,0x51,0x23,0x49,0xAD,0xE5,0xC5,0x7D,0x64,0x49,0x23,0x49,0x08,0x02,0x03,0x03, + 0x63,0x49,0x22,0x41,0xE6,0x8C,0x00,0x0E,0xC6,0x59,0x23,0x41,0xBD,0x2D,0x2F,0x8B, + 0xC5,0x59,0x44,0x41,0xA2,0xA8,0x6A,0xDE,0xA5,0x51,0x64,0x49,0x6A,0xE6,0x3D,0xBB, + 0x85,0x49,0x44,0x49,0xE2,0xE8,0xF8,0x9E,0x64,0x49,0x44,0x49,0xA2,0x7A,0xF8,0xFB, + 0x85,0x51,0x24,0x41,0xA3,0xEF,0xFB,0xFD,0x64,0x49,0x23,0x49,0x30,0x83,0xA9,0xED, + 0x43,0x49,0x03,0x41,0xFC,0xBC,0xAA,0xB2,0xE6,0x61,0x23,0x41,0x55,0x55,0xF7,0x2D, + 0xE6,0x61,0x03,0x41,0x55,0xDF,0xBF,0x00,0xE6,0x61,0x23,0x41,0x55,0xFA,0x82,0x00, + 0xC5,0x61,0x03,0x41,0x55,0x77,0xFE,0x80,0x64,0x49,0x03,0x41,0x75,0xFF,0xBF,0xA8, + 0x85,0x49,0x03,0x41,0x7B,0x5A,0xFB,0xCA,0x23,0x41,0xE2,0x38,0x2F,0x2F,0xBE,0x7A, + 0x23,0x41,0xC2,0x30,0xEB,0x6B,0xA0,0xE2,0x03,0x39,0xA2,0x30,0xFD,0x2F,0x2A,0xAA, + 0x03,0x39,0xC2,0x30,0xE2,0xE2,0x80,0x00,0x03,0x39,0xA2,0x28,0x77,0x7F,0x7C,0x78, + 0xC2,0x28,0x61,0x20,0x7E,0xFE,0xBE,0x3F,0xE3,0x30,0x61,0x20,0xFD,0xAF,0x2A,0x00, + 0x04,0x31,0x81,0x20,0x5D,0xD7,0xA8,0x80,0xE3,0x30,0x81,0x20,0xD5,0xFE,0xA2,0xE8, + 0xE2,0x28,0xA2,0x28,0x5F,0x7B,0xFE,0xF2,0xA2,0x28,0x81,0x20,0xC8,0x48,0x40,0xE0, + 0xA2,0x28,0x81,0x20,0xFD,0x69,0xBF,0xB7,0xA2,0x28,0x61,0x20,0xAE,0xAF,0x0F,0x0A, + 0xA2,0x28,0x82,0x28,0xB7,0x3F,0x3F,0xF3,0xC2,0x30,0x82,0x28,0x54,0xF6,0x7F,0xF5, + 0xA1,0x28,0x61,0x20,0xBE,0xCF,0xFD,0xEF,0xC3,0x30,0x82,0x28,0xF7,0xFD,0xDD,0x49, + 0x03,0x41,0x82,0x28,0xAF,0x0D,0x3F,0x0B,0x23,0x41,0xC3,0x38,0x6F,0xFB,0xE0,0x08, + 0x23,0x41,0xA1,0x30,0xDD,0xAF,0xE8,0x28,0xE2,0x38,0xA2,0x30,0xF8,0xFA,0xE8,0xE8, + 0xC2,0x30,0xA2,0x28,0xBF,0xDE,0xD8,0x58,0xC2,0x30,0x81,0x28,0x00,0xAA,0xF8,0xFA, + 0xC2,0x28,0x81,0x28,0x3A,0xBB,0xBB,0xAB,0xE2,0x30,0x81,0x28,0x7F,0xEB,0xA3,0xAA, + 0xC3,0x30,0x81,0x28,0xF5,0xFF,0xBE,0x02,0xC2,0x28,0x81,0x28,0xE7,0xF7,0xFF,0xA8, + 0xA2,0x28,0x81,0x20,0x02,0x05,0x2D,0x80,0xC3,0x30,0x81,0x28,0x0A,0xAB,0x7F,0xD5, + 0xC2,0x28,0x81,0x20,0x2A,0x2B,0xD7,0xDD,0x03,0x39,0xA2,0x28,0x2B,0x23,0xAD,0x0D, + 0x03,0x39,0xE3,0x28,0xFF,0x94,0xA6,0x08,0xE2,0x30,0xC2,0x28,0x80,0x88,0x26,0x26, + 0x03,0x39,0xC2,0x30,0xAA,0xFC,0xF8,0xF6,0x03,0x39,0xC3,0x30,0x5E,0xAB,0xA3,0xF8, + 0x03,0x39,0xE3,0x30,0x61,0x7A,0x78,0x68,0xE3,0x30,0xA2,0x30,0xDA,0x7A,0xAA,0x02, + 0xC2,0x30,0xA2,0x30,0x22,0xAB,0xB8,0x2C,0x03,0x39,0xC2,0x30,0xF3,0x25,0x25,0xED, + 0x23,0x39,0xE2,0x30,0x6A,0xFE,0xFA,0xA3,0x03,0x39,0xE2,0x30,0xAD,0xAD,0xF6,0xB8, + 0x03,0x31,0xC2,0x30,0xD7,0x6B,0x7A,0x7A,0xE2,0x30,0xA2,0x28,0xA2,0xBE,0xEF,0xFA, + 0x03,0x39,0xC2,0x28,0x9D,0xFC,0xFA,0x59,0xE2,0x30,0xA2,0x28,0xAC,0xBE,0xCE,0xAF, + 0xE2,0x30,0xA1,0x28,0x5A,0xFA,0xFB,0xBA,0xC2,0x28,0xA1,0x28,0x27,0x0E,0x00,0x00, + 0xE3,0x30,0xC2,0x28,0xCD,0x0B,0x25,0x2D,0xE3,0x30,0xC2,0x30,0xE5,0xBE,0xA0,0x20, + 0x03,0x39,0xC2,0x28,0xF7,0xFB,0x2A,0x6A,0x03,0x31,0xC2,0x28,0xDA,0xFA,0xAB,0xAA, + 0x03,0x31,0xC2,0x28,0x3F,0xBD,0xAF,0xF7,0x03,0x31,0xE2,0x30,0xC4,0x3E,0xF9,0x63, + 0x03,0x31,0xC2,0x30,0x08,0x2C,0xC0,0x82,0x03,0x31,0xC2,0x28,0xAC,0x70,0x60,0x80, + 0x03,0x31,0xC2,0x30,0xB4,0xAB,0xFD,0x7A,0x23,0x39,0xC2,0x30,0xFE,0x97,0xAD,0x27, + 0x44,0x41,0x03,0x39,0xDD,0xB6,0xE3,0xE3,0x64,0x49,0x23,0x41,0x5F,0x5D,0x4F,0xA3, + 0x85,0x51,0x03,0x39,0x25,0xBD,0xAF,0xEC,0xC5,0x51,0x43,0x41,0xE2,0xAA,0xBF,0xD5, + 0x26,0x62,0x43,0x49,0xAF,0x2F,0x2F,0xBD,0x0D,0xA4,0x26,0x62,0xBD,0xAD,0x2F,0x0F, + 0x6E,0xAC,0x6B,0x8B,0xED,0xAF,0x0A,0x00,0x6E,0xAC,0xED,0x9B,0x57,0x2A,0x82,0x00, + 0x6E,0xAC,0x2A,0x83,0x7F,0xA8,0x20,0x00,0x6E,0xAC,0x2A,0x83,0x55,0xFE,0xAA,0x00, + 0x6F,0xAC,0xE9,0x7A,0x55,0xFE,0xA2,0x08,0x2E,0xA4,0xE9,0x7A,0x55,0x7F,0xEC,0x80, + 0x8B,0x8B,0xA9,0x72,0xFD,0xFA,0xA2,0xA0,0x4B,0x8B,0xC9,0x72,0x77,0xFE,0x72,0xF8, + 0x09,0x7B,0xC9,0x72,0xBB,0xEB,0x82,0x6A,0xE9,0x7A,0xA8,0x72,0x35,0x17,0xEE,0xFA, + 0xE9,0x7A,0xA8,0x72,0x69,0xBA,0x02,0xA6,0xE9,0x72,0x67,0x6A,0xD6,0x7F,0xAE,0xE8, + 0xC9,0x72,0x67,0x6A,0x56,0xDE,0xFE,0xD0,0xA8,0x72,0x67,0x6A,0x4F,0xA3,0xF7,0xBB, + 0x88,0x6A,0x47,0x62,0x67,0x4B,0x76,0xA8,0xA8,0x72,0x06,0x5A,0x2F,0x5F,0xFA,0xBB, + 0x6C,0x8B,0x47,0x62,0x0A,0x2D,0xB5,0x55,0x8B,0x8B,0xA8,0x6A,0x80,0x00,0x0B,0xAD, + 0xAC,0x93,0x6B,0x83,0xFF,0xAB,0xE9,0xBD,0x8B,0x8B,0x4B,0x83,0xEE,0xEA,0xEA,0x26, + 0x8C,0x8B,0x2A,0x83,0xAE,0xF7,0xAB,0xA2,0xAC,0x93,0x4B,0x83,0xAB,0xAB,0x6A,0xFA, + 0x23,0x49,0xE2,0x40,0x3A,0xBA,0xAC,0x7A,0x23,0x49,0xE2,0x40,0x2C,0x0A,0xAD,0x41, + 0x02,0x49,0xE2,0x40,0x28,0xBA,0xBE,0x07,0x23,0x49,0xE2,0x40,0xB0,0xEE,0xE7,0x8B, + 0x23,0x49,0xE2,0x40,0x8A,0x08,0x28,0xAE,0x23,0x49,0xC2,0x38,0x2B,0x26,0xAA,0xBA, + 0x23,0x49,0xE2,0x40,0x8B,0xAE,0x2E,0x3C,0x22,0x41,0xE2,0x40,0x6B,0x3E,0x20,0x2A, + 0x23,0x49,0x02,0x41,0x61,0xEB,0xEC,0x77,0x23,0x41,0xE2,0x38,0x2B,0xBA,0xAF,0xEB, + 0x43,0x49,0x02,0x41,0x3F,0xFD,0xCF,0x85,0xE2,0x48,0x22,0x41,0xBD,0xA9,0xEB,0xBF, + 0x23,0x49,0xE2,0x40,0xFD,0xBF,0xEE,0x62,0x03,0x49,0xC2,0x40,0x0A,0xFA,0xFE,0xFF, + 0x63,0x51,0xC2,0x40,0xBD,0xB5,0x3F,0xBF,0x25,0x6A,0x63,0x51,0x09,0x8D,0x8F,0xAD, + 0x25,0x6A,0xC4,0x61,0x0F,0xED,0x0F,0x22,0x47,0x72,0xE5,0x61,0xA2,0xED,0xE5,0xD7, + 0x46,0x72,0xC5,0x59,0x8A,0xAE,0xFB,0x56,0xE5,0x61,0x43,0x51,0x20,0xF8,0xB8,0x5E, + 0xA4,0x59,0x02,0x49,0xF8,0x5E,0x57,0x57,0x24,0x49,0xA3,0x40,0xE8,0xFE,0xDF,0xB7, + 0x84,0x59,0xE2,0x40,0x0F,0x2D,0x2D,0x2D,0xC4,0x59,0x84,0x59,0xC2,0xAA,0x8D,0xEB, + 0xC5,0x59,0x63,0x51,0xDE,0xEA,0x82,0xA2,0xA4,0x59,0x63,0x51,0xD7,0xDC,0x60,0x72, + 0x84,0x51,0x43,0x49,0xF5,0xCF,0x8A,0x2B,0xA4,0x51,0x64,0x51,0x79,0xED,0x7B,0x5D, + 0xA4,0x51,0x43,0x49,0xB7,0xB5,0xAF,0x2B,0xA5,0x51,0x44,0x49,0x80,0xA0,0xB8,0xD8, + 0x84,0x51,0x44,0x49,0xAA,0xE8,0xF7,0xFF,0x84,0x49,0x44,0x49,0x01,0xA1,0xFD,0xDE, + 0x64,0x49,0x23,0x41,0x08,0xAA,0x7A,0x80,0x64,0x49,0x23,0x41,0x2E,0xE2,0xEF,0xDF, + 0x64,0x51,0x23,0x49,0xAF,0x0A,0xBE,0x27,0xA4,0x59,0x23,0x49,0xDF,0x7F,0xDE,0x3B, + 0x06,0x6A,0x02,0x41,0xF5,0xBF,0x2B,0x0E,0x06,0x6A,0x64,0x51,0x0D,0x0B,0x82,0xA0, + 0x47,0x72,0x43,0x51,0x8A,0xA2,0xA3,0xD7,0xE5,0x61,0x83,0x59,0x88,0xBA,0xE2,0x55, + 0xE6,0x61,0x84,0x51,0xE0,0xAB,0xED,0x7F,0x85,0x51,0x03,0x41,0xD8,0xF8,0x7A,0x5A, + 0x64,0x49,0x02,0x41,0x2A,0xFF,0x7D,0x55,0x23,0x41,0xC2,0x38,0x68,0xE0,0xEA,0xBA, + 0x23,0x41,0xE3,0x38,0x82,0x03,0xEB,0xF9,0x03,0x39,0xC2,0x30,0x8A,0xA8,0xF0,0x7E, + 0x23,0x39,0xC2,0x30,0xAB,0xAF,0xFF,0xD5,0x03,0x39,0x82,0x20,0x70,0xF0,0xF0,0xFA, + 0xC2,0x28,0x61,0x20,0x3F,0xB7,0xBD,0x17,0x03,0x31,0xC3,0x28,0x0A,0x03,0x03,0xFD, + 0x03,0x31,0xC3,0x28,0x20,0x62,0x77,0x55,0xC3,0x28,0x62,0x28,0xA8,0x2A,0xA8,0xE8, + 0xC2,0x30,0x81,0x28,0x02,0xBC,0xAC,0xB7,0xC2,0x28,0x81,0x28,0xFA,0x7A,0x6F,0xAF, + 0xA2,0x30,0x81,0x20,0xEF,0xFD,0x5F,0x28,0xC3,0x30,0x81,0x28,0xED,0xF5,0x35,0x3C, + 0x44,0x41,0x81,0x28,0xD5,0xBF,0xBB,0x82,0x24,0x41,0xA2,0x30,0x57,0x5A,0xA8,0x82, + 0xE3,0x38,0x61,0x28,0x57,0xFF,0xEA,0xA0,0xA2,0x30,0x82,0x28,0x8D,0xB7,0xBB,0x88, + 0x24,0x41,0xA2,0x30,0xAD,0x2F,0xAD,0xAD,0x44,0x49,0x03,0x41,0xAF,0xBA,0xAB,0x9F, + 0x44,0x49,0x03,0x39,0xDE,0x7C,0x7E,0xC0,0x23,0x41,0xA2,0x30,0xFE,0xEA,0xEA,0xFC, + 0xE2,0x38,0x81,0x28,0x7A,0xEA,0xAA,0x00,0xC2,0x30,0x81,0x28,0xFF,0x7A,0xE8,0xDA, + 0xE2,0x30,0x81,0x20,0xFF,0xAD,0x0B,0x2A,0x24,0x39,0xC2,0x28,0xFD,0xBF,0xAF,0x0A, + 0x24,0x39,0xE3,0x30,0x55,0xE7,0x0B,0x02,0x44,0x39,0xC2,0x30,0x5F,0x7A,0xE8,0x0A, + 0x44,0x39,0xA2,0x28,0x57,0x57,0xFF,0xE8,0x03,0x31,0x82,0x28,0x77,0xFF,0xE2,0xAA, + 0xE3,0x30,0x81,0x28,0x77,0xFF,0xBE,0x02,0x04,0x39,0xA2,0x28,0x09,0xAD,0x2F,0x3A, + 0x24,0x39,0xE2,0x30,0xAA,0xEF,0xEF,0xFD,0xE2,0x30,0xA2,0x28,0x00,0x02,0x00,0xF8, + 0xE3,0x30,0xA2,0x28,0xBE,0xA6,0xFA,0xE3,0xC2,0x30,0xA2,0x28,0x00,0x0E,0x2D,0x2F, + 0x03,0x39,0xC3,0x30,0xC2,0xEB,0xFF,0xF7,0xE2,0x30,0xA1,0x30,0xC8,0xA9,0xE6,0xAE, + 0xE2,0x30,0xC2,0x30,0x57,0x57,0xD5,0x8D,0x03,0x39,0xC2,0x30,0xB5,0x3D,0x97,0xD7, + 0x44,0x39,0xE2,0x30,0xFB,0xDE,0xAE,0xF7,0x03,0x31,0xE2,0x30,0x03,0x82,0xBE,0xB6, + 0x03,0x31,0xC2,0x30,0x8F,0x8A,0x62,0xF8,0xE2,0x30,0xA2,0x28,0xEA,0x7A,0x6F,0xEC, + 0xE3,0x30,0xA2,0x28,0xFD,0xA9,0xAD,0x8B,0xE3,0x30,0xA2,0x28,0xAD,0xEB,0x6B,0x7A, + 0xE2,0x28,0xA1,0x28,0xBF,0x6F,0x55,0xA5,0xC2,0x28,0xA2,0x28,0x80,0x8B,0xF9,0xF8, + 0xE2,0x28,0xA1,0x28,0xAA,0xDA,0xF7,0x55,0xE3,0x30,0xA1,0x28,0x23,0x0E,0xAB,0x9B, + 0x03,0x31,0xC2,0x28,0xE3,0xB2,0xEB,0xDF,0x03,0x31,0xE3,0x30,0xCD,0xEF,0xA5,0xF7, + 0x02,0x31,0xC2,0x30,0x5B,0xCA,0xDE,0xFE,0x03,0x31,0xC2,0x28,0xA8,0xBB,0xFD,0xEB, + 0x23,0x31,0xC2,0x30,0xFF,0x7E,0xF7,0xD5,0x23,0x31,0xC2,0x30,0xCB,0xFF,0xFB,0x9E, + 0x02,0x39,0xC2,0x30,0x7A,0xE2,0xFA,0xAC,0x24,0x39,0xC2,0x30,0xB5,0xA5,0x25,0xB5, + 0x64,0x41,0xE2,0x38,0xF3,0xFF,0xD7,0x57,0x85,0x49,0x24,0x41,0xFB,0xAD,0xAD,0x29, + 0xA5,0x51,0x43,0x41,0xDD,0xFD,0x6B,0x8A,0xC6,0x59,0x43,0x49,0x75,0xFD,0x97,0x27, + 0x09,0x83,0x43,0x49,0xFD,0xBD,0x2F,0x2F,0xAF,0xB4,0xA8,0x72,0xAD,0xAF,0x2F,0x2A, + 0xD0,0xBC,0x6E,0xAC,0x75,0xFF,0xA3,0xA2,0xAF,0xB4,0x4E,0xAC,0xFF,0x7E,0xBA,0xFE, + 0x8F,0xB4,0x6E,0xAC,0xDD,0xBA,0x0A,0x0F,0xAF,0xB4,0x4E,0xAC,0xDF,0xBA,0x00,0xA2, + 0xAF,0xB4,0x6E,0xAC,0x57,0xF5,0x2A,0x00,0xAF,0xB4,0x0D,0xA4,0x6A,0xAA,0xE8,0x20, + 0x4F,0xAC,0x6B,0x8B,0x57,0x58,0x78,0xC0,0x4B,0x8B,0x0A,0x83,0xEE,0xFA,0x5F,0x5A, + 0x0A,0x7B,0xC9,0x72,0xA2,0xE0,0xE8,0x68,0xE9,0x7A,0xA8,0x72,0xFA,0x62,0x5A,0x7A, + 0xA8,0x72,0x47,0x62,0x20,0x00,0xEA,0xDA,0xC9,0x72,0x47,0x62,0x02,0x8E,0x8F,0xB5, + 0xE9,0x7A,0x88,0x6A,0x7F,0x9E,0x83,0xCA,0xC9,0x72,0x67,0x6A,0xFD,0xBF,0x38,0xAA, + 0xC9,0x72,0x67,0x62,0x5A,0xFA,0x88,0xC0,0xA8,0x72,0x47,0x62,0xDF,0xF8,0xE0,0xE8, + 0x87,0x6A,0x27,0x62,0x56,0xF7,0x6E,0xCB,0xE9,0x7A,0x06,0x5A,0x2F,0xFF,0xD5,0x57, + 0x6B,0x83,0x06,0x5A,0x00,0x02,0x2D,0x35,0x8C,0x8B,0x4B,0x83,0xEA,0x3A,0x2C,0x35, + 0x8C,0x8B,0x4B,0x83,0xB8,0xE8,0x30,0x9A,0x8C,0x8B,0x4B,0x83,0x9E,0xBA,0xAE,0xDC, + 0x23,0x49,0xE3,0x40,0xFA,0xE8,0xBF,0x2D,0x23,0x49,0xE2,0x40,0xA5,0xAD,0xFA,0x5E, + 0x23,0x41,0xC2,0x40,0x7F,0xFC,0xBE,0xFA,0x23,0x41,0xC2,0x40,0xAA,0xA9,0x2A,0xAB, + 0x23,0x49,0xE2,0x40,0xBE,0x9E,0xFE,0xEA,0x23,0x49,0xE2,0x40,0x56,0xDE,0x1E,0xED, + 0x23,0x49,0xE2,0x40,0xAF,0xFF,0xFE,0x88,0x43,0x49,0xE2,0x40,0xFF,0xEF,0xA7,0xAC, + 0x43,0x49,0xE2,0x40,0xFB,0x6B,0xE0,0xD0,0x23,0x41,0xE2,0x40,0xAB,0x89,0x8B,0xAA, + 0x43,0x49,0x03,0x41,0xF5,0xD7,0xB7,0xA4,0x43,0x49,0x03,0x41,0x9F,0x3E,0xA8,0xBF, + 0x43,0x49,0xE3,0x40,0x78,0xC8,0xAF,0xEF,0x02,0x41,0xC2,0x40,0xBF,0xDF,0x5C,0xA0, + 0x23,0x49,0xE2,0x40,0x3F,0x3F,0xDD,0xF7,0xE5,0x61,0x03,0x49,0x2F,0x3F,0xB5,0xF5, + 0x05,0x6A,0xA4,0x59,0x0A,0xAE,0xC2,0x2D,0x26,0x6A,0x84,0x59,0xA8,0xE2,0x7A,0x7A, + 0xE5,0x61,0x03,0x49,0xA8,0xEA,0xFE,0x7F,0x84,0x59,0xE2,0x40,0xA0,0xE0,0xFF,0xDD, + 0x03,0x49,0xC2,0x40,0xA8,0xEA,0xFE,0x9A,0x03,0x49,0xC2,0x40,0xBA,0x88,0x78,0x9A, + 0x85,0x59,0xE2,0x40,0x3D,0x3D,0x35,0x27,0xE6,0x61,0xA5,0x59,0xED,0xD6,0xB6,0x09, + 0xE6,0x61,0xA5,0x59,0x5D,0x76,0xDA,0xBB,0xC5,0x59,0x64,0x51,0x5A,0x60,0xFC,0xF8, + 0x84,0x51,0x43,0x51,0xAA,0x8B,0x8B,0x04,0xC5,0x51,0x64,0x51,0xFD,0xFD,0xED,0xBF, + 0xC5,0x59,0x84,0x51,0xB5,0xBA,0x6D,0xD8,0xA5,0x51,0x64,0x49,0xF8,0xEE,0xD6,0x58, + 0x85,0x51,0x44,0x49,0xEC,0xBA,0xEF,0xBF,0x84,0x49,0x23,0x41,0xF8,0x5E,0xFA,0x80, + 0x85,0x51,0x23,0x49,0xFB,0xFB,0x6A,0xFA,0x64,0x49,0x23,0x49,0x97,0x6F,0xDF,0xFA, + 0x25,0x6A,0x23,0x49,0xF5,0x3D,0x0F,0x23,0x65,0x72,0xC4,0x59,0xB5,0x8E,0x22,0xEA, + 0x66,0x72,0xA3,0x59,0xAA,0xA8,0xF8,0x7E,0x06,0x6A,0x84,0x51,0xA8,0xA8,0xEA,0x5F, + 0xC5,0x59,0x64,0x51,0x56,0xD4,0x7E,0x7B,0x64,0x51,0x23,0x49,0x80,0x08,0xFA,0x57, + 0xC5,0x59,0x43,0x49,0xCA,0xAB,0xEB,0xFD,0x64,0x49,0x03,0x41,0xFA,0x5E,0x7C,0xDC, + 0x23,0x41,0xA2,0x30,0xAA,0xAA,0xFA,0x7A,0x03,0x39,0xC2,0x38,0xA2,0xAE,0xB7,0x25, + 0x03,0x39,0xC2,0x30,0x3B,0xBF,0x5F,0xD0,0xE3,0x38,0x61,0x28,0xB0,0xE8,0xA8,0xAA, + 0xC2,0x30,0x61,0x28,0x2A,0xAB,0xEE,0xFA,0xC2,0x28,0x81,0x28,0xAA,0xFD,0xB5,0xDD, + 0xA2,0x28,0x61,0x20,0x3F,0xBA,0xB8,0x2A,0xE3,0x30,0xA2,0x28,0x2F,0xAB,0xAB,0xFD, + 0xE3,0x30,0xA2,0x28,0x7E,0x7A,0xBC,0xB6,0xC3,0x30,0x82,0x28,0xFF,0xEA,0x0A,0x80, + 0xE3,0x30,0x82,0x20,0xDF,0xD5,0xFB,0xEF,0x44,0x41,0xA2,0x28,0xD5,0xFD,0xAD,0x2F, + 0x44,0x41,0xA2,0x30,0xBD,0x2F,0x88,0x80,0x65,0x49,0x03,0x39,0xD7,0xFF,0xEF,0x3D, + 0x65,0x49,0xC3,0x38,0xEA,0xE8,0xFA,0x58,0x24,0x41,0xC2,0x38,0x0A,0x2A,0x3E,0xFD, + 0x23,0x41,0xE3,0x38,0xDF,0xE6,0xE8,0xA0,0x23,0x41,0xA2,0x30,0xD7,0xEF,0xAA,0x0A, + 0x03,0x41,0xE2,0x38,0x7D,0x6D,0xD7,0x5C,0x44,0x49,0xE2,0x38,0xFF,0xCD,0xB5,0xB5, + 0x85,0x51,0x23,0x41,0xFF,0xFD,0x8D,0xC9,0x84,0x51,0x03,0x39,0x57,0xFF,0xAB,0xA2, + 0x43,0x49,0xE2,0x38,0x5F,0x7E,0x78,0x60,0xE2,0x30,0xA2,0x30,0x7F,0x7F,0xFC,0xD7, + 0xE2,0x30,0xA1,0x28,0x3D,0xB5,0xBD,0xDF,0x03,0x39,0xA2,0x28,0x02,0x2F,0xBF,0x57, + 0x24,0x39,0xC2,0x30,0xA0,0x82,0xEF,0xF5,0x44,0x41,0xE3,0x30,0x2D,0x2D,0xAD,0xFD, + 0x45,0x39,0xC3,0x30,0xEC,0xFA,0x7A,0xDE,0x23,0x39,0xC2,0x30,0xF8,0xFB,0xAB,0xAD, + 0xE3,0x30,0xA2,0x28,0x28,0xC2,0xB8,0xE0,0xE3,0x30,0xC2,0x28,0x08,0x02,0x20,0x0D, + 0x24,0x39,0xC2,0x28,0xBF,0xFF,0xFF,0x54,0x03,0x31,0xA2,0x28,0x5A,0x54,0x76,0x7F, + 0xE3,0x30,0xA2,0x28,0xE9,0xFB,0x7D,0x7E,0xC2,0x30,0x82,0x28,0x3E,0x3F,0xAB,0xC2, + 0x03,0x39,0xC2,0x30,0xAF,0x8F,0xFB,0xDB,0x03,0x39,0xC2,0x30,0xAF,0x02,0xA2,0xF8, + 0xE2,0x30,0x81,0x28,0xC2,0xC8,0x60,0xC8,0xE2,0x30,0xA1,0x28,0x2A,0xAD,0xEF,0xBD, + 0xE2,0x30,0xC2,0x30,0x02,0xDB,0xEB,0x63,0x03,0x31,0xC2,0x30,0x28,0xA8,0xA0,0x8B, + 0x03,0x31,0xC2,0x30,0x52,0x5E,0xBB,0xF7,0xE3,0x30,0xA2,0x28,0xA8,0xE2,0x80,0x7C, + 0xE3,0x30,0xA2,0x28,0x62,0xFB,0x97,0xF7,0xE3,0x30,0xC2,0x28,0x5D,0x45,0x8D,0x25, + 0xE2,0x30,0xC2,0x28,0x89,0xAB,0x7F,0x77,0xE2,0x30,0xA1,0x28,0x5A,0xDA,0xAA,0x20, + 0xE3,0x30,0x81,0x20,0xDF,0xAE,0x8A,0x8A,0xE2,0x30,0xA2,0x28,0xFB,0xE9,0x8A,0x22, + 0x03,0x31,0xC2,0x30,0x7F,0xF2,0xCA,0xFE,0x23,0x39,0xE3,0x30,0x7F,0xFE,0xDD,0x3F, + 0x23,0x39,0xE3,0x30,0x5F,0xFD,0xEF,0x8B,0x23,0x39,0xC2,0x28,0xFB,0xD7,0xEF,0xB8, + 0x03,0x39,0xC2,0x30,0x57,0x57,0x5C,0x78,0x23,0x39,0xC2,0x30,0xD7,0xD5,0xBF,0xBD, + 0x03,0x39,0xC2,0x30,0x96,0xFF,0xAB,0xBE,0x03,0x39,0xC2,0x30,0xBF,0xBD,0xB7,0x17, + 0x03,0x39,0xC2,0x30,0x3E,0xEE,0xB8,0xBA,0xA5,0x49,0x03,0x39,0xAB,0x2D,0x2D,0xBD, + 0xC5,0x59,0x84,0x49,0xB9,0xFA,0xBB,0xF9,0x06,0x62,0x84,0x51,0xB5,0xAD,0x27,0x2D, + 0xAD,0x93,0x26,0x62,0xB5,0x2D,0x2D,0x0B,0xF0,0xBC,0x0E,0xA4,0xA9,0x2F,0x0F,0x2A, + 0xF0,0xC4,0xAF,0xB4,0x7B,0xEE,0xBE,0x78,0xF0,0xC4,0x8F,0xB4,0x7F,0x78,0xFA,0xBF, + 0xD0,0xBC,0x6E,0xB4,0xF7,0xF7,0xEC,0xFE,0xD0,0xBC,0x8F,0xB4,0xFF,0xBB,0x3D,0xBD, + 0xD0,0xBC,0x8F,0xB4,0xFB,0xBA,0xA8,0xA8,0xCF,0xBC,0x8F,0xB4,0xB6,0xEB,0xE2,0xAB, + 0xAF,0xB4,0x2E,0xA4,0x78,0x68,0xA8,0xA0,0x6E,0xAC,0x2B,0x83,0x57,0x5E,0xFA,0xE8, + 0x6C,0x8B,0xEA,0x7A,0x5F,0x57,0xAF,0xA8,0x2B,0x83,0xA9,0x72,0x5B,0x7A,0x78,0x68, + 0xC9,0x72,0x47,0x62,0xF6,0x7F,0x3A,0xE0,0x87,0x6A,0x26,0x62,0xBE,0xAE,0xBA,0x48, + 0xC9,0x72,0x46,0x62,0xAE,0x2E,0xAF,0x2D,0xE9,0x7A,0xA8,0x72,0x7D,0x7C,0x7E,0x7D, + 0x09,0x7B,0xA8,0x72,0x5B,0x89,0x8B,0x8B,0xE9,0x7A,0x88,0x6A,0x7E,0xFE,0xE2,0x20, + 0xC9,0x72,0x68,0x6A,0x77,0xEB,0xEE,0x80,0x88,0x6A,0xE6,0x59,0x7E,0x7A,0xEA,0x80, + 0x27,0x62,0xC5,0x51,0x29,0xAF,0xDE,0xAC,0x4B,0x83,0xE6,0x51,0x0B,0x35,0xD5,0x55, + 0x6B,0x83,0x06,0x5A,0x00,0x00,0x0A,0xB5,0x8C,0x8B,0x2A,0x7B,0xBA,0xAA,0xB8,0xF5, + 0x02,0x49,0xE2,0x40,0x8B,0x8E,0x9E,0x37,0x22,0x49,0xC2,0x38,0xB7,0xDF,0xBB,0xFC, + 0x03,0x49,0xE2,0x38,0xDA,0xFC,0x7A,0xE2,0x03,0x49,0xE2,0x38,0xAA,0xFA,0xBF,0x2E, + 0x23,0x41,0xE2,0x40,0xCA,0x8A,0x9C,0x3C,0x23,0x49,0xE2,0x40,0x07,0x88,0xBA,0xE8, + 0x23,0x49,0xE2,0x40,0xA8,0xA8,0xB8,0xD7,0x23,0x49,0x02,0x41,0x75,0x54,0x78,0xD8, + 0x64,0x49,0x02,0x41,0xDE,0xBB,0xB3,0xEB,0x43,0x49,0xE2,0x40,0x96,0xFA,0xE2,0xA8, + 0x23,0x49,0xE2,0x40,0x2C,0xDE,0xAE,0x3E,0x23,0x41,0xE2,0x40,0xAE,0xFA,0xF3,0x56, + 0x23,0x49,0xC2,0x38,0xAA,0xA2,0xB5,0x37,0x23,0x49,0xE2,0x40,0x72,0x40,0xA8,0xEE, + 0x23,0x49,0xE2,0x40,0x17,0xBB,0xAB,0xB3,0x23,0x49,0xE2,0x40,0xA6,0xAF,0xA1,0x80, + 0xA5,0x59,0x02,0x41,0x2F,0x2D,0xBD,0xF7,0xC5,0x61,0x23,0x49,0xE0,0xFA,0x7F,0x55, + 0x44,0x49,0xE3,0x40,0xE6,0xBC,0xFA,0xE6,0x03,0x49,0xC2,0x40,0x2A,0xA8,0xFA,0x5F, + 0xE2,0x40,0xC2,0x38,0xA8,0x26,0x1F,0x3B,0x03,0x49,0xC2,0x40,0xBF,0xAE,0x7A,0xFA, + 0xA5,0x59,0x03,0x49,0x35,0x25,0x35,0xA5,0x06,0x62,0xA4,0x59,0xAF,0xEB,0x89,0x8D, + 0x06,0x62,0xA4,0x59,0xEF,0xFF,0xDF,0x5C,0xE5,0x61,0x84,0x51,0x7A,0x7E,0x6B,0xEA, + 0xC5,0x59,0x63,0x51,0xD7,0xBB,0x03,0x09,0xC5,0x59,0x84,0x51,0xD7,0xBE,0xBF,0xFC, + 0xC5,0x59,0x64,0x51,0xE8,0xD8,0xFF,0xFE,0x84,0x51,0x44,0x49,0xF8,0xEE,0xBF,0xBE, + 0xA5,0x51,0x64,0x49,0x5D,0x7D,0xA3,0x7B,0xA4,0x49,0x44,0x49,0xEF,0x7F,0x5F,0xF9, + 0x64,0x49,0x23,0x41,0xA0,0x80,0x22,0x0E,0x64,0x51,0x23,0x49,0x1C,0x3F,0x2A,0x0B, + 0x88,0x7A,0xC5,0x59,0xFD,0xAF,0x29,0x35,0x46,0x72,0xC3,0x61,0xCA,0x6A,0xC0,0xE0, + 0x05,0x6A,0xA3,0x59,0x7E,0xFA,0xE8,0xE8,0x84,0x59,0xE2,0x38,0x00,0xA0,0xF0,0x70, + 0x64,0x51,0xA1,0x30,0x80,0xFA,0xFA,0x57,0x44,0x49,0xA2,0x30,0x2A,0xAF,0x35,0xDF, + 0x64,0x49,0x23,0x41,0x20,0x0A,0x03,0xBD,0x84,0x49,0x03,0x39,0x5B,0x7A,0xF8,0x7A, + 0x03,0x39,0xA2,0x30,0xE8,0xA8,0x2A,0x00,0x23,0x41,0xC2,0x30,0xF5,0xFB,0x82,0x02, + 0x03,0x39,0xC2,0x30,0xF2,0xF0,0xF7,0xE6,0xE3,0x30,0xA2,0x30,0xFE,0xFE,0xFC,0xCA, + 0xC2,0x30,0x82,0x28,0x5C,0xE8,0xA2,0x22,0xC2,0x28,0x81,0x20,0xFB,0xF2,0xEA,0xF8, + 0xC2,0x28,0x81,0x20,0xB5,0x97,0xA5,0xAD,0xA2,0x30,0xC3,0x28,0xFF,0xD7,0x55,0xD7, + 0xE3,0x28,0xA2,0x28,0xBF,0x1D,0x97,0xFF,0xE3,0x30,0xA2,0x28,0xFA,0xFE,0x57,0xDD, + 0xE3,0x30,0xA2,0x28,0x77,0xA7,0xB5,0xBD,0x44,0x41,0xE3,0x30,0x29,0x0B,0x02,0x03, + 0x85,0x51,0x03,0x39,0x5F,0xBA,0x2A,0x2A,0x64,0x49,0x23,0x41,0x15,0x2F,0x8A,0xA0, + 0x65,0x49,0xC2,0x38,0x7A,0xFE,0xFE,0x68,0x03,0x39,0xC2,0x38,0xF9,0xE1,0xAA,0xAA, + 0x23,0x41,0xE3,0x38,0xA3,0xBF,0xBF,0xFF,0x23,0x41,0xE2,0x38,0xEA,0xFC,0x76,0x76, + 0x03,0x41,0xE2,0x38,0x0A,0x09,0xAB,0x83,0x23,0x49,0xC2,0x40,0x2E,0x3A,0xFE,0x5F, + 0x65,0x49,0xE2,0x40,0x0B,0xBB,0xAF,0x5D,0x64,0x49,0x03,0x41,0x00,0x02,0x2D,0xB5, + 0x64,0x49,0x03,0x41,0x48,0x40,0xE0,0x6B,0x23,0x41,0xA1,0x30,0xD5,0x5F,0x7E,0xE8, + 0xC2,0x30,0x61,0x28,0xE8,0x6A,0xA2,0xA2,0xC2,0x30,0x81,0x28,0xF5,0xFD,0xAA,0x0A, + 0xE3,0x38,0x61,0x28,0x0B,0x2F,0xAA,0xA2,0x03,0x39,0xA1,0x28,0x80,0x82,0xAA,0xAB, + 0x03,0x31,0xA2,0x30,0xEA,0x8A,0x0A,0x8A,0x03,0x31,0xA2,0x28,0x8A,0xBE,0xFA,0x7E, + 0xE3,0x30,0x81,0x20,0xE2,0xEF,0xF7,0x7F,0xC2,0x30,0x81,0x28,0x0A,0x3B,0xAF,0xCD, + 0xE3,0x30,0xA2,0x28,0xEA,0x8B,0x89,0x5D,0xE3,0x30,0xA2,0x28,0xFB,0xFF,0xFF,0xDA, + 0xC2,0x30,0xA2,0x28,0xEE,0x7D,0xEA,0xE2,0xE2,0x30,0xA2,0x28,0x6B,0xF9,0x57,0x55, + 0xE2,0x30,0xA2,0x28,0x02,0xAB,0xC9,0x89,0x03,0x39,0xA2,0x28,0xB8,0xCB,0xBF,0x7D, + 0xE3,0x30,0xA2,0x28,0xAB,0x2B,0xEF,0xFD,0xE2,0x30,0xA2,0x28,0xEE,0xF4,0xEA,0x2B, + 0xE2,0x30,0xA2,0x28,0xEB,0xE8,0xBA,0x7A,0xE2,0x30,0xC2,0x28,0x09,0x09,0x87,0x7D, + 0xE2,0x30,0xC2,0x28,0x28,0x72,0x7F,0xE5,0xE2,0x30,0xA2,0x28,0xBC,0x82,0xA2,0xAE, + 0xE2,0x30,0xC2,0x28,0xF5,0x77,0xA0,0x3B,0xE3,0x30,0xA1,0x28,0x0D,0xCD,0xFF,0x5B, + 0xE2,0x30,0xA2,0x28,0xBA,0xBF,0xAF,0xBB,0x03,0x31,0xC2,0x28,0x7E,0x7F,0xF7,0xEB, + 0x03,0x31,0xA1,0x28,0x2F,0xAF,0xA7,0x1E,0x03,0x39,0xE2,0x30,0xB7,0xB2,0x5E,0xFF, + 0xE2,0x30,0xA2,0x28,0xB0,0xF0,0xF2,0xF8,0x03,0x31,0xC2,0x28,0x0B,0x3D,0x95,0xD5, + 0x03,0x31,0xC2,0x30,0x02,0xBB,0xF7,0x7D,0x23,0x39,0xE3,0x30,0xF8,0xFE,0xE5,0xF5, + 0x23,0x39,0xE3,0x38,0x5E,0xF3,0x7D,0x55,0x03,0x39,0xC2,0x30,0x87,0xAE,0xBE,0x3E, + 0x03,0x39,0xE3,0x30,0xBF,0x21,0x21,0x31,0x03,0x39,0xA1,0x28,0xFE,0x7C,0xD8,0xB8, + 0x03,0x39,0xC2,0x30,0xB3,0xAF,0xB9,0xD5,0x44,0x49,0xC2,0x30,0x29,0x07,0x2D,0xBD, + 0xA4,0x51,0x23,0x41,0x22,0xAF,0xBF,0x3D,0x6B,0x8B,0xA4,0x51,0xF5,0xA5,0x25,0x2D, + 0xF0,0xC4,0x4B,0x8B,0xBD,0x2F,0x02,0x02,0x31,0xCD,0xB0,0xB4,0xBD,0xAB,0x82,0x02, + 0x31,0xC5,0xAF,0xBC,0xDF,0xF8,0xA8,0x80,0x10,0xC5,0x8E,0xB4,0x57,0x77,0xFA,0x80, + 0xD0,0xBC,0x4E,0xAC,0xBA,0xFE,0xFE,0x78,0xCF,0xB4,0x6E,0xB4,0xDF,0xFD,0xED,0x75, + 0xAF,0xB4,0x6E,0xB4,0x3C,0xBA,0x7A,0x7D,0xCF,0xBC,0x4E,0xAC,0xA2,0xEA,0xBE,0xDF, + 0xAF,0xB4,0x4E,0xAC,0xF8,0x7E,0x7F,0x57,0x6E,0xAC,0xCC,0x9B,0x58,0xEE,0xAA,0xAA, + 0x4E,0xA4,0x2B,0x83,0x77,0x7F,0xA8,0x80,0xCC,0x9B,0xA9,0x72,0x7F,0x7E,0x7A,0xE8, + 0xEA,0x7A,0x68,0x6A,0xFE,0xFF,0xDA,0xF0,0xA8,0x72,0x47,0x62,0x5E,0xFA,0xCA,0x20, + 0xC8,0x72,0x46,0x62,0xA5,0x2B,0xEA,0xFA,0xE9,0x7A,0x87,0x6A,0xEB,0x8F,0xAD,0x2A, + 0x09,0x7B,0xC9,0x72,0xA9,0xA9,0x3B,0x09,0x2A,0x83,0xC9,0x72,0x7B,0xFB,0xB3,0xCB, + 0x0A,0x7B,0x88,0x6A,0xBF,0xEA,0xDA,0xFC,0xC9,0x72,0x68,0x62,0x7C,0xEA,0x8A,0xB8, + 0xA9,0x6A,0x06,0x5A,0x5F,0xDE,0xF8,0xC8,0x47,0x62,0xC5,0x51,0x7F,0x72,0xF0,0xE0, + 0x88,0x6A,0xA5,0x49,0x37,0x57,0x57,0x5F,0xEA,0x72,0x64,0x41,0x02,0xAF,0xFD,0x55, + 0x43,0x49,0xE2,0x38,0xF7,0xAE,0xE8,0xEB,0x23,0x49,0xE2,0x38,0x7E,0xEE,0xEB,0xFA, + 0x23,0x49,0xE2,0x40,0xAB,0x09,0xC5,0xF7,0x23,0x49,0xC1,0x38,0xA8,0xE8,0xBA,0xBD, + 0x23,0x49,0x02,0x41,0x1F,0xA9,0xDF,0xDE,0x23,0x49,0x02,0x41,0xE0,0xE0,0xD8,0x57, + 0x23,0x49,0xE2,0x40,0xD7,0xBD,0x80,0x00,0x43,0x49,0x02,0x41,0x5F,0x69,0xE3,0xFB, + 0x43,0x49,0x02,0x41,0xA3,0xFE,0xEB,0xEB,0x23,0x49,0x02,0x41,0xAA,0x9A,0x2A,0xB7, + 0x43,0x49,0xE2,0x40,0xBB,0x2E,0xDB,0x5F,0x23,0x41,0xE2,0x40,0x5A,0xDE,0x57,0x77, + 0x23,0x49,0xC2,0x40,0xF5,0xAE,0xAB,0xAB,0x23,0x49,0xC2,0x38,0xCA,0x2B,0xE8,0x5A, + 0x23,0x49,0xE2,0x40,0x3B,0xAB,0xAB,0xED,0x23,0x49,0xE2,0x40,0xAE,0xCA,0xCA,0x4F, + 0x03,0x49,0xE1,0x38,0x23,0xA9,0xE7,0x6F,0x03,0x41,0xC2,0x40,0x02,0x20,0x32,0x02, + 0x23,0x49,0xC2,0x38,0xCA,0x6A,0x68,0xE8,0x03,0x41,0xA1,0x38,0xF2,0xA6,0xAD,0x8A, + 0x03,0x49,0xC2,0x38,0xDF,0xEA,0x82,0xBA,0x23,0x49,0xE3,0x40,0xFA,0xEA,0xBD,0xBD, + 0xA5,0x59,0x03,0x49,0x2D,0x35,0x35,0x25,0x46,0x6A,0xC5,0x59,0x65,0xAF,0x8F,0x0F, + 0x26,0x6A,0xC4,0x59,0xDE,0xFB,0x7B,0xFC,0xE5,0x59,0x84,0x51,0x6A,0xEA,0xAB,0xAB, + 0xE5,0x61,0x84,0x51,0xFD,0xF7,0x32,0x2A,0xA4,0x59,0x64,0x49,0xFE,0xFF,0x08,0x00, + 0xA4,0x51,0x23,0x49,0x8A,0xEA,0xFE,0x7F,0x64,0x49,0x23,0x41,0xC0,0x60,0xAA,0xBE, + 0x85,0x51,0x64,0x49,0x4F,0x95,0x99,0x59,0x84,0x49,0x44,0x49,0xC5,0x5E,0x5A,0xF7, + 0x64,0x49,0x23,0x41,0xAA,0x6B,0x2B,0xA8,0x64,0x51,0x03,0x41,0x8B,0xBE,0xFC,0xDE, + 0x47,0x72,0x44,0x49,0x0F,0xAD,0xB9,0xB5,0x88,0x7A,0xE5,0x61,0xE8,0xF7,0x77,0xDD, + 0x05,0x62,0x43,0x49,0xA0,0xE0,0x68,0x5E,0x63,0x51,0x41,0x28,0xE0,0xF8,0x7A,0x7E, + 0xC2,0x38,0x41,0x20,0x22,0xAA,0xFF,0x7D,0xE2,0x38,0x61,0x28,0xB0,0xF2,0xAB,0xFD, + 0x44,0x41,0xC2,0x30,0x0B,0xBD,0xFD,0xF5,0x43,0x41,0xC2,0x30,0x62,0x7F,0xFF,0x7F, + 0x44,0x41,0xE2,0x30,0xE9,0xAF,0x39,0xCF,0x24,0x41,0xE3,0x30,0x8B,0x8B,0xFE,0xFE, + 0x03,0x39,0xE3,0x30,0xFC,0xA0,0x9E,0x57,0x03,0x31,0xC3,0x30,0xA7,0xF6,0x7C,0xF0, + 0xC2,0x28,0xA2,0x28,0xBE,0xFE,0xBA,0x5D,0xC2,0x28,0x81,0x20,0xF0,0x0B,0x29,0xBD, + 0xC2,0x28,0x81,0x20,0xAA,0xAA,0xBE,0xFF,0xC3,0x28,0xA2,0x28,0x0B,0x09,0x03,0xA2, + 0xC2,0x28,0xA2,0x28,0x90,0x7C,0x68,0xC8,0xC3,0x30,0x82,0x20,0xA2,0xEB,0xAF,0x3F, + 0xE3,0x30,0xA2,0x28,0x3D,0xBB,0x3A,0x3F,0x65,0x49,0x03,0x39,0xA9,0x29,0xAD,0x2D, + 0x85,0x51,0x03,0x39,0x8A,0xBA,0xFE,0x5E,0x44,0x49,0xC2,0x30,0x00,0xA0,0xAA,0xFF, + 0x44,0x49,0xC2,0x30,0x70,0xE8,0xAF,0x55,0x23,0x41,0xC3,0x30,0xB2,0xAA,0x8A,0x6F, + 0x03,0x41,0xE3,0x38,0xF8,0x5A,0x5B,0x55,0x23,0x41,0xC2,0x38,0xFF,0xF5,0xD7,0x56, + 0x23,0x41,0xE2,0x38,0xEA,0xE9,0xE9,0xAE,0x03,0x41,0xC2,0x38,0x5F,0xFE,0xEC,0xE0, + 0xE3,0x40,0xC2,0x38,0x69,0xDA,0xBA,0xBE,0x24,0x49,0xC2,0x38,0x0B,0x27,0xAF,0xAB, + 0x44,0x49,0xE2,0x38,0xC2,0xEB,0x77,0x7F,0x23,0x41,0xC2,0x38,0xE2,0xE0,0x6A,0xAD, + 0xE2,0x38,0xA1,0x28,0xFA,0x7C,0xEA,0xC0,0xC2,0x30,0xA2,0x28,0xEE,0x75,0x4F,0xFA, + 0xE3,0x30,0x81,0x28,0xFA,0x6A,0x70,0xEA,0xE3,0x30,0x82,0x28,0x29,0xAB,0xBB,0xD7, + 0xE3,0x30,0x81,0x20,0xA0,0xA2,0xD6,0x5D,0xC2,0x28,0x81,0x28,0xA0,0x80,0x3E,0xBD, + 0xE3,0x30,0xA2,0x28,0x7D,0xF7,0xFF,0x07,0xC2,0x30,0x81,0x28,0xF5,0xDD,0xBF,0x00, + 0xE3,0x30,0x81,0x28,0x7D,0xAF,0xAB,0x82,0xE3,0x30,0xA2,0x28,0x55,0x57,0xFF,0xAA, + 0xE3,0x30,0xA2,0x28,0xFF,0xFD,0x5F,0xE0,0xC3,0x30,0x81,0x28,0x6E,0x75,0x57,0x78, + 0xE2,0x30,0x82,0x28,0x89,0xFD,0x75,0x55,0xC2,0x28,0x81,0x28,0xEA,0x7B,0xBE,0x8B, + 0xC2,0x28,0xA2,0x28,0x35,0x55,0x55,0x7B,0xC2,0x30,0xA2,0x28,0x2D,0x25,0xED,0xFF, + 0xE2,0x30,0xC2,0x28,0xEB,0xBF,0xFD,0xA3,0x23,0x31,0xC2,0x28,0x7D,0x7F,0x5B,0xEB, + 0xE2,0x30,0xA2,0x28,0x2F,0xFF,0xD7,0xEA,0xE3,0x30,0xA2,0x28,0xAE,0xAF,0xAD,0xAA, + 0xE3,0x30,0xA2,0x28,0xAE,0x97,0xF7,0xEA,0x03,0x31,0xC2,0x28,0xFB,0xAF,0x89,0xAF, + 0x03,0x31,0xC2,0x30,0xDF,0xEA,0xC8,0xA2,0x03,0x31,0xC2,0x28,0xE3,0xEF,0xBF,0xBF, + 0x24,0x39,0xC2,0x30,0xB7,0x0D,0xBE,0xBF,0x44,0x41,0xE3,0x30,0xBD,0x27,0xAF,0xAB, + 0x23,0x39,0xC2,0x30,0x5E,0x7A,0x68,0xFC,0x03,0x39,0xA1,0x28,0xFD,0xFF,0xAD,0x0F, + 0x03,0x39,0xC2,0x30,0xFB,0xBB,0xEF,0xEE,0x03,0x39,0xC2,0x30,0xFF,0x7A,0x7A,0xBB, + 0xE3,0x30,0xC2,0x30,0xFB,0xAB,0x2F,0xE7,0xE3,0x38,0x03,0x31,0xC2,0x8A,0xE2,0xEA, + 0x03,0x39,0xC3,0x30,0xAA,0x7B,0x28,0x2A,0x23,0x39,0xE2,0x38,0x55,0x5D,0x7F,0x7C, + 0x03,0x39,0xC2,0x30,0xFF,0xFB,0x95,0xAB,0x44,0x49,0xE3,0x38,0xBD,0xBF,0xBB,0x2B, + 0x26,0x62,0x44,0x49,0xFD,0xBD,0xBD,0x29,0xEC,0x9B,0xC4,0x59,0x2D,0x2D,0x2F,0x2F, + 0x31,0xC5,0x8E,0xB4,0x2B,0x0B,0x8D,0x05,0x31,0xCD,0x10,0xC5,0xAA,0xBF,0xFC,0xC3, + 0x31,0xCD,0x10,0xC5,0x40,0xA9,0x82,0x2B,0x31,0xCD,0x10,0xC5,0xDE,0x6A,0xF0,0x60, + 0x30,0xC5,0xAF,0xB4,0x5E,0xFA,0xAA,0x88,0xEF,0xC4,0x6E,0xAC,0x5D,0x7A,0xE8,0x00, + 0xEF,0xBC,0x4D,0xAC,0x7F,0x5F,0x7F,0xE8,0x8F,0xB4,0x4D,0xAC,0xBF,0xAD,0x55,0x55, + 0x8F,0xB4,0x2D,0xAC,0xFF,0x78,0xFF,0xDF,0x8F,0xB4,0x4E,0xAC,0x55,0xF9,0xBA,0xB8, + 0x8F,0xB4,0xEC,0x9B,0x7E,0x72,0x68,0xFA,0x0D,0x9C,0x0A,0x83,0x78,0xE0,0xE8,0xA0, + 0x6B,0x8B,0xA9,0x72,0x7F,0x7A,0xEA,0xA0,0xE9,0x7A,0x67,0x6A,0x77,0xDA,0xA8,0xE8, + 0xC9,0x72,0x66,0x6A,0xBD,0xAF,0xAA,0x22,0xE9,0x72,0xA8,0x72,0xBD,0xAB,0x0F,0x35, + 0x0A,0x7B,0xC8,0x72,0x2D,0xBF,0x2D,0xAF,0x4B,0x83,0xE9,0x7A,0x3D,0xBF,0xAB,0xAF, + 0x4B,0x83,0xE9,0x7A,0x5E,0x7E,0xDE,0xFC,0x2A,0x83,0x89,0x6A,0x5A,0xFA,0xA8,0xA0, + 0xEA,0x7A,0x88,0x6A,0x55,0x76,0xBC,0xB8,0xA9,0x6A,0x06,0x5A,0x5E,0xF2,0xA8,0x88, + 0x47,0x62,0xA5,0x49,0x5E,0xEF,0xEA,0xE0,0xE6,0x51,0x24,0x39,0xFF,0x6E,0xEA,0x60, + 0x23,0x49,0xC2,0x38,0xAA,0x20,0xAB,0xAD,0x23,0x49,0xE2,0x40,0x8E,0xAE,0x96,0x57, + 0x23,0x49,0xC1,0x38,0x68,0x72,0xDA,0xFE,0x44,0x49,0xE2,0x40,0x55,0x75,0xFF,0x37, + 0x23,0x49,0xE2,0x40,0x2F,0xE1,0xE2,0xF8,0x23,0x49,0xE2,0x40,0xDE,0x55,0x55,0x1D, + 0x23,0x49,0xE2,0x40,0x23,0x0B,0x2B,0xAD,0x23,0x49,0xE2,0x40,0xCA,0x9A,0xFB,0xFB, + 0x43,0x49,0x02,0x41,0x2B,0xE5,0xD5,0x7E,0x22,0x41,0xC2,0x38,0xA0,0x28,0xA8,0x7E, + 0x23,0x49,0xC2,0x38,0xDF,0xD6,0xDC,0xAF,0x02,0x41,0xE2,0x38,0xAD,0x02,0x02,0x02, + 0x03,0x41,0xE2,0x40,0x43,0x76,0xD7,0xE9,0x03,0x41,0xC1,0x38,0xFB,0xED,0xCF,0x80, + 0x02,0x49,0xE2,0x38,0x2A,0xAB,0xBD,0x75,0x02,0x41,0xE1,0x40,0x73,0x0A,0x80,0xC0, + 0x02,0x41,0xC1,0x38,0xCA,0x26,0x2F,0x8B,0x22,0x41,0xE2,0x38,0xFB,0xEB,0xB7,0x95, + 0x02,0x41,0xC2,0x38,0xE0,0x00,0xAE,0x5E,0x02,0x41,0xC2,0x38,0xEB,0xE8,0xD8,0xFA, + 0x03,0x49,0xE2,0x40,0x7F,0x55,0x95,0x97,0x03,0x49,0xC2,0x40,0x0A,0xE7,0xA8,0xFE, + 0xE5,0x61,0x03,0x49,0xA5,0x35,0xB5,0xB5,0x26,0x6A,0xC5,0x59,0x0B,0x29,0x82,0x80, + 0x26,0x6A,0xC5,0x59,0xE8,0xFA,0x7E,0xFF,0xE5,0x61,0xA4,0x59,0xEE,0x8C,0xC0,0x02, + 0xE5,0x61,0xA4,0x51,0x2B,0xBF,0xDA,0x60,0xE5,0x59,0x43,0x49,0xFA,0xE8,0x6A,0xEA, + 0x64,0x49,0x23,0x41,0x78,0xEE,0xF8,0xCA,0x44,0x49,0xE2,0x38,0x2A,0x26,0xAA,0xAA, + 0x64,0x49,0x02,0x39,0xA8,0xAA,0xFE,0xD7,0x65,0x49,0x24,0x41,0xB5,0xB5,0xE5,0xF7, + 0x64,0x49,0x03,0x39,0x28,0xBB,0xDF,0xDE,0x64,0x49,0x03,0x41,0x7A,0x7C,0xD2,0xE2, + 0xA5,0x59,0x03,0x41,0x2D,0x95,0x95,0x55,0x06,0x6A,0x84,0x51,0x2A,0x62,0xEF,0xFD, + 0xC5,0x59,0xE2,0x40,0xF8,0x7E,0x5A,0xAA,0x64,0x49,0x41,0x28,0x7F,0x5F,0x7F,0xA8, + 0xE3,0x38,0x41,0x28,0xDD,0x7D,0xFB,0xC8,0xA2,0x30,0x41,0x20,0x2B,0xA9,0x0A,0x22, + 0x03,0x39,0xA1,0x28,0x2D,0x29,0xFD,0xDD,0x22,0x39,0xC2,0x30,0x57,0xF6,0xDF,0xF5, + 0x43,0x41,0xE2,0x30,0xAF,0xA9,0x8B,0xFF,0x03,0x39,0xA2,0x28,0x88,0xEE,0xBE,0xF5, + 0xE3,0x30,0xA2,0x28,0x3A,0xB6,0xD7,0xD5,0xE3,0x30,0x61,0x20,0x80,0xA8,0x6A,0x5A, + 0xA2,0x28,0x61,0x20,0xBE,0xFE,0xDF,0x57,0xA2,0x28,0x61,0x20,0xA3,0xAB,0xBF,0xE9, + 0xA2,0x28,0x82,0x20,0xA4,0x35,0xEB,0x09,0xC2,0x28,0x82,0x20,0x02,0x02,0x0B,0x0F, + 0xE2,0x28,0xA2,0x28,0xF8,0x6A,0x7A,0x7F,0xC2,0x28,0x82,0x28,0x2F,0xAF,0xEA,0x22, + 0x03,0x39,0xA2,0x28,0xAD,0x27,0x2F,0x3F,0x44,0x41,0x03,0x39,0x25,0xAD,0xF3,0xCB, + 0x44,0x41,0xA2,0x28,0xE0,0xFE,0x7E,0x7F,0xC2,0x30,0x61,0x20,0x80,0xFE,0x5A,0x5F, + 0xC2,0x30,0x61,0x20,0xA2,0xBE,0xFF,0xF5,0xE2,0x38,0x81,0x28,0xA3,0x3B,0xBD,0xFF, + 0xE2,0x38,0x81,0x28,0x2A,0xAA,0xEF,0x75,0xE3,0x38,0x81,0x28,0x08,0xAA,0xBE,0xD7, + 0x23,0x41,0xA2,0x30,0x22,0xBB,0xAD,0xAD,0x23,0x41,0xE3,0x38,0xF8,0xAA,0x9B,0x5F, + 0x23,0x41,0xC3,0x38,0x7F,0xFA,0x3E,0xBF,0x23,0x41,0xE3,0x38,0x0D,0xED,0x9E,0xDF, + 0x23,0x41,0xE2,0x38,0xFA,0x6B,0xEA,0xEA,0x24,0x41,0xE2,0x38,0xED,0x2F,0xBD,0x7D, + 0x23,0x41,0xC2,0x30,0xFA,0xEA,0xF8,0xFB,0xE2,0x38,0xA2,0x28,0xFE,0x7A,0xF8,0xFE, + 0xC2,0x30,0xA2,0x28,0xFD,0xFD,0xBA,0x20,0xC3,0x38,0x61,0x20,0x5E,0xFE,0xFE,0xF8, + 0xA2,0x28,0x61,0x20,0xFA,0xEE,0xBE,0x20,0xC2,0x28,0x81,0x28,0xB5,0xA5,0xE9,0x7C, + 0xC3,0x28,0x82,0x28,0x0B,0xAF,0xD5,0x75,0xE3,0x30,0x81,0x28,0x0A,0x2B,0xAF,0x75, + 0xE3,0x30,0xA2,0x28,0x02,0x00,0xAF,0x75,0xE3,0x30,0xA2,0x28,0xA8,0x2A,0x2E,0x3F, + 0x03,0x31,0xC2,0x30,0x7A,0x7A,0xFE,0x00,0x03,0x39,0xA2,0x28,0x7E,0xEA,0xFA,0xE8, + 0xC2,0x30,0x82,0x28,0x56,0xBA,0x8A,0x00,0xC1,0x28,0x82,0x28,0xBB,0xFE,0xFA,0x3E, + 0xE3,0x30,0xA2,0x28,0xBF,0xD7,0x7B,0xBF,0xE3,0x30,0xA2,0x28,0xFA,0x0A,0x3A,0xAA, + 0x03,0x31,0xC2,0x30,0x8A,0x82,0xBB,0x17,0x03,0x31,0xC2,0x28,0xA2,0xF0,0xFE,0xD6, + 0xE2,0x30,0xC2,0x28,0xE8,0x8A,0x2A,0x20,0x03,0x31,0xE2,0x30,0x7C,0x40,0x0A,0x0B, + 0x03,0x31,0xC2,0x30,0xF7,0xA7,0xBF,0x0E,0xE2,0x30,0xC2,0x28,0x3F,0x3F,0xB5,0x95, + 0x03,0x31,0xC2,0x28,0x3A,0xDA,0xDC,0xAE,0x03,0x31,0xC2,0x28,0xDA,0xD7,0xEE,0xEB, + 0x03,0x39,0xC2,0x30,0x0A,0x3E,0x9D,0xF5,0x24,0x39,0xE3,0x30,0x83,0xAA,0xFA,0x59, + 0x03,0x39,0xC2,0x30,0xA8,0x80,0x6C,0x7E,0x23,0x39,0xA2,0x28,0xB7,0xA7,0x8A,0x2A, + 0x44,0x41,0xC2,0x30,0x77,0xFF,0xFA,0xF3,0x23,0x39,0xE2,0x30,0xB5,0x5D,0x6F,0xAB, + 0x23,0x39,0xC2,0x30,0xEF,0x7E,0x7A,0xA0,0x03,0x39,0xC3,0x30,0x8A,0xFF,0xFF,0x3E, + 0x23,0x41,0xC2,0x30,0x8B,0xA1,0xBB,0xD7,0xE2,0x40,0x03,0x39,0xB7,0xD7,0x5F,0xDE, + 0x43,0x41,0xE3,0x38,0xFD,0x3F,0xED,0xF7,0x85,0x49,0x03,0x39,0xBF,0xBF,0x3D,0x0F, + 0x47,0x6A,0x65,0x49,0x2D,0xAD,0x2F,0x2F,0x2D,0xA4,0x67,0x6A,0x2D,0x2D,0x2F,0x0B, + 0x10,0xC5,0x8E,0xB4,0x0D,0x8B,0x89,0xAD,0x31,0xC5,0xF0,0xC4,0x83,0xED,0xF5,0xFF, + 0x10,0xC5,0xCF,0xBC,0x00,0x08,0x0F,0x97,0x31,0xC5,0xCF,0xBC,0x0A,0xBB,0xFE,0xB6, + 0x30,0xC5,0xF0,0xBC,0xEE,0x5A,0x5F,0x7F,0x30,0xC5,0xF0,0xBC,0xBF,0x79,0xF2,0xEE, + 0x10,0xC5,0xAF,0xB4,0x60,0x80,0x82,0x88,0x10,0xC5,0x4D,0xAC,0x7F,0xFA,0xA8,0x22, + 0xF0,0xC4,0x2D,0xA4,0xD7,0xD7,0xEA,0xE0,0xAF,0xBC,0x4E,0xAC,0xAE,0xFD,0xDD,0x9C, + 0x8F,0xB4,0x4E,0xAC,0x5E,0xBE,0x83,0xB7,0x6F,0xAC,0xCD,0x9B,0x5A,0x78,0xEA,0xE8, + 0xCC,0x9B,0x6B,0x8B,0x5E,0x5A,0xFA,0xE0,0xAB,0x93,0xC9,0x72,0x57,0x7E,0xEA,0x80, + 0x4A,0x83,0xA8,0x72,0x75,0xD5,0xD6,0xF8,0xE9,0x7A,0x88,0x6A,0x36,0x2D,0x32,0x22, + 0x2A,0x83,0xC9,0x72,0x7E,0xEE,0x3B,0xFF,0x4A,0x83,0xE8,0x7A,0xBD,0x2F,0x2F,0x17, + 0x6B,0x83,0x0A,0x83,0xEE,0xEE,0x2F,0xB6,0x4B,0x83,0xE9,0x7A,0xBD,0xFA,0xB8,0x08, + 0x4B,0x83,0xC9,0x72,0x5F,0x6B,0xEA,0x20,0x2B,0x83,0x88,0x6A,0x57,0x7F,0x7F,0xF8, + 0xC9,0x72,0x27,0x5A,0x5A,0x5E,0xAA,0xE8,0x27,0x5A,0x44,0x41,0x78,0xE0,0xA0,0x80, + 0x23,0x49,0xE2,0x38,0xB7,0xF7,0xA9,0xC1,0x03,0x49,0xE2,0x38,0xB4,0x27,0x2D,0x3F, + 0x02,0x49,0xE2,0x40,0x5A,0xC8,0x6C,0xFB,0x23,0x49,0xE2,0x40,0x2B,0x32,0x77,0xBF, + 0x02,0x49,0xE2,0x40,0x8F,0xAC,0xAD,0x0A,0x23,0x49,0xE2,0x40,0xAD,0xFB,0xE8,0x5A, + 0x23,0x49,0xE2,0x40,0xBB,0xAA,0x38,0x77,0x43,0x49,0x03,0x41,0x57,0x7E,0x7D,0xD5, + 0x23,0x49,0xE2,0x40,0xDA,0x7F,0xAF,0x0B,0x02,0x41,0xC1,0x38,0xFA,0x8B,0xAB,0xEA, + 0x23,0x41,0xC2,0x38,0xB0,0xEE,0xAB,0xA9,0x44,0x41,0xE2,0x40,0xF7,0xBF,0xFD,0xF5, + 0x23,0x41,0xC2,0x40,0xAF,0xBA,0xFC,0x7E,0x23,0x49,0xE2,0x38,0xEA,0xEA,0xEE,0xED, + 0x03,0x41,0xE2,0x38,0x99,0x0B,0x01,0x01,0x23,0x41,0xE2,0x40,0xDB,0x57,0xD7,0x97, + 0x23,0x41,0xC2,0x38,0xDF,0x9E,0xBA,0x2A,0x23,0x41,0xE2,0x40,0xD5,0xFF,0x2F,0xAB, + 0x03,0x41,0xC2,0x38,0xFF,0xB8,0x20,0xA0,0x23,0x49,0xE2,0x40,0xDF,0xFB,0xFA,0xA9, + 0x03,0x49,0xE2,0x38,0xA8,0x22,0x8A,0xA2,0x03,0x49,0xE2,0x40,0x7F,0xE8,0xF8,0x5A, + 0xA4,0x59,0xE2,0x40,0x3D,0xBD,0xA5,0x35,0x46,0x6A,0xE5,0x61,0xBE,0xFB,0xA1,0x09, + 0x46,0x6A,0xC5,0x59,0x7F,0x6E,0xFF,0xA0,0x06,0x62,0xC5,0x59,0xDF,0xF5,0x3F,0x25, + 0x05,0x62,0x83,0x51,0xE2,0xFA,0x68,0xE8,0xA5,0x51,0x43,0x49,0x70,0x7E,0xDE,0xD7, + 0x43,0x49,0x03,0x41,0xE2,0xEA,0xC8,0x9C,0x64,0x49,0x03,0x39,0x2B,0xAA,0xE9,0xF9, + 0x64,0x49,0x03,0x39,0x7C,0xB7,0xBF,0xFF,0x44,0x41,0x23,0x41,0xAF,0xA7,0x29,0x20, + 0x44,0x49,0x23,0x39,0xDF,0xB7,0xB6,0x09,0x44,0x41,0x03,0x41,0x7A,0x58,0xFC,0x9C, + 0x44,0x41,0xE2,0x38,0x77,0xF6,0xE3,0xEB,0x84,0x51,0xE2,0x38,0x02,0x39,0x97,0x55, + 0xE5,0x59,0x43,0x49,0x0E,0x0A,0x23,0xD5,0xE5,0x59,0x43,0x41,0x78,0xC0,0x80,0xE2, + 0x23,0x41,0xA2,0x30,0x6C,0xF8,0xFC,0x58,0xE3,0x38,0x81,0x28,0x5F,0x7E,0xF8,0x7B, + 0xC1,0x30,0x81,0x20,0x6B,0x9F,0xDE,0x3A,0xC2,0x30,0xA1,0x28,0x9B,0x2A,0x2A,0xFC, + 0x03,0x31,0xA2,0x28,0x88,0xFB,0xBF,0x5F,0xC2,0x28,0x82,0x20,0x26,0xAE,0xE8,0xCA, + 0xC2,0x28,0x61,0x20,0x0A,0x8A,0x7F,0x57,0x81,0x20,0x41,0x18,0xE0,0xE8,0xFF,0xFF, + 0x82,0x20,0x61,0x20,0xDD,0xDF,0xAF,0x08,0xC2,0x28,0x81,0x20,0xF5,0xBD,0xB5,0x95, + 0xC2,0x28,0x81,0x20,0x2F,0x2F,0x0B,0x2F,0xC2,0x28,0xA2,0x28,0x0F,0x2A,0x3B,0x28, + 0xE3,0x28,0xA1,0x20,0xEE,0x2B,0xEF,0x6F,0xE3,0x30,0xA2,0x28,0xFA,0x83,0xF5,0x95, + 0x03,0x31,0xA2,0x28,0x35,0x95,0xFF,0x5A,0x44,0x41,0xC2,0x30,0x8A,0xEF,0xFF,0xDD, + 0x03,0x39,0xA2,0x28,0xFC,0xFA,0x7A,0x7F,0xC2,0x28,0x61,0x28,0x7E,0xE8,0x28,0x82, + 0xC2,0x30,0x61,0x20,0xF5,0xEF,0x32,0xB2,0xC2,0x28,0x81,0x28,0x7F,0xFA,0xCA,0x80, + 0xA1,0x28,0x61,0x20,0xFB,0x7C,0x7A,0x7C,0xA2,0x28,0x61,0x28,0xBF,0x57,0xEA,0xCA, + 0xE3,0x38,0x61,0x20,0x0B,0x0B,0x8F,0xED,0xE2,0x38,0xC2,0x30,0x80,0x00,0x07,0x85, + 0x24,0x41,0xE2,0x38,0xD5,0x95,0x8D,0xBF,0x23,0x41,0xE3,0x38,0xBF,0xF6,0xBF,0x97, + 0x23,0x41,0xE3,0x38,0xFA,0xA6,0x2E,0x28,0x23,0x41,0xC2,0x38,0xBE,0xF6,0x3A,0x20, + 0x03,0x39,0xC2,0x38,0x60,0x68,0xF8,0xC2,0xC2,0x30,0xA2,0x30,0x02,0x00,0xB8,0xFE, + 0xE3,0x38,0xA2,0x30,0xDE,0x5A,0x7B,0x6D,0xC2,0x30,0x81,0x28,0xA8,0xAF,0xB4,0xAE, + 0xE3,0x30,0xA2,0x28,0xD3,0xB8,0xAB,0x35,0xE3,0x30,0x61,0x20,0x78,0x7A,0xE8,0xA0, + 0xA2,0x28,0x61,0x20,0xBB,0xFF,0xFB,0xA0,0xA2,0x28,0x81,0x20,0xBD,0xFF,0x5E,0xFF, + 0xA2,0x28,0x61,0x20,0x02,0x0A,0x2F,0xA7,0xC2,0x28,0x81,0x28,0x0B,0xA2,0xFA,0xFA, + 0x03,0x39,0x81,0x28,0x02,0xBF,0xAD,0xFD,0x04,0x39,0xA2,0x28,0xE0,0xF8,0xFB,0xFE, + 0xC2,0x28,0x82,0x28,0xA8,0xAA,0xF8,0xDA,0xC2,0x28,0x81,0x20,0xAA,0x8B,0xEB,0x7F, + 0xC2,0x28,0x82,0x28,0x0E,0x28,0xF8,0x65,0xE3,0x30,0x81,0x28,0x8A,0x2F,0xB7,0xED, + 0xE3,0x30,0xA2,0x28,0x3C,0x7E,0x7F,0x7D,0xE3,0x30,0xA2,0x28,0x3E,0x35,0x2D,0xF5, + 0x03,0x31,0xA2,0x28,0x2A,0xAB,0x3F,0xB5,0x24,0x39,0xE2,0x30,0x7F,0xFF,0xDF,0xEB, + 0x03,0x31,0xC2,0x30,0xAA,0xB8,0x76,0xD7,0xE2,0x30,0xC2,0x28,0x78,0xE2,0xCB,0x88, + 0x03,0x31,0xC2,0x30,0x2D,0xEF,0xCF,0xEF,0x03,0x31,0xA2,0x28,0xC2,0xAA,0xFF,0x5E, + 0xE2,0x30,0xA2,0x28,0x2A,0xAA,0xAA,0xA9,0x03,0x39,0xC2,0x30,0x52,0x5F,0xB6,0xB5, + 0x04,0x39,0xC3,0x30,0xEF,0x2D,0xAB,0xBE,0x23,0x39,0xC2,0x30,0xB7,0xFA,0xFA,0x82, + 0x23,0x39,0xC2,0x30,0xA0,0x82,0x02,0x62,0x23,0x41,0xC2,0x30,0x1E,0xBC,0xA0,0x20, + 0x23,0x41,0x03,0x39,0x2B,0x19,0x85,0x29,0x44,0x49,0xC2,0x38,0xFE,0xDF,0xFF,0x02, + 0x23,0x41,0xC2,0x38,0xD6,0xBE,0xA2,0x2A,0x64,0x49,0xE3,0x38,0xD7,0xFF,0xAB,0xAB, + 0x85,0x51,0x03,0x39,0x75,0xFF,0xAB,0x0A,0xC6,0x59,0x24,0x49,0xBD,0x3B,0x2B,0x2B, + 0x89,0x72,0xE6,0x59,0x35,0x25,0xBD,0xBF,0x2E,0xAC,0xC9,0x7A,0x09,0x2D,0xBD,0xF5, + 0x10,0xC5,0xCC,0x9B,0x0A,0x0A,0xAD,0xF5,0x10,0xC5,0x8F,0xB4,0x22,0x22,0x0A,0xFD, + 0xF0,0xC4,0xCF,0xBC,0x37,0x57,0x7A,0x8B,0x10,0xC5,0xCF,0xBC,0xBF,0xF9,0xE3,0xAA, + 0x10,0xC5,0xCF,0xBC,0xAA,0xEF,0xFE,0x9A,0x10,0xC5,0xF0,0xBC,0xA2,0x90,0x34,0x32, + 0x31,0xC5,0xF0,0xBC,0xFE,0x7B,0xEB,0xFE,0x10,0xC5,0xD0,0xBC,0xB1,0x2A,0x28,0xAB, + 0xF0,0xBC,0xAF,0xBC,0xE8,0x88,0xEA,0x82,0xF0,0xC4,0x6E,0xB4,0x5F,0xEA,0xA0,0x00, + 0x10,0xC5,0x4E,0xAC,0x57,0xFF,0xEA,0x88,0x8F,0xB4,0x2D,0xA4,0x5F,0xF8,0xF8,0xF0, + 0x2D,0xA4,0xAC,0x93,0xFB,0xFA,0xA8,0x82,0x0D,0x9C,0x8B,0x93,0x57,0x77,0xFA,0xA8, + 0xED,0x9B,0x09,0x7B,0x7F,0xA2,0x00,0x00,0xED,0x9B,0xC8,0x72,0xD5,0x5F,0xE8,0xA0, + 0x8B,0x8B,0xC9,0x7A,0xFF,0xFF,0xBF,0x88,0x4A,0x83,0xE9,0x7A,0x97,0xBB,0xFF,0xE8, + 0x6B,0x8B,0x0A,0x7B,0xDF,0xBF,0xAF,0x2B,0x6B,0x8B,0x2A,0x83,0xB6,0xEA,0xD3,0xDE, + 0x6B,0x8B,0x2A,0x83,0x9E,0xFE,0xDB,0xFA,0x6C,0x8B,0xC9,0x72,0x5E,0x7A,0xE0,0xAA, + 0x0A,0x7B,0xA9,0x6A,0x6D,0x7B,0xBC,0xB0,0xE9,0x72,0x26,0x5A,0x57,0x5A,0x7A,0x78, + 0x23,0x41,0xE2,0x40,0x6B,0xED,0xF4,0xAE,0x23,0x49,0xE2,0x40,0x96,0x2A,0xAE,0xCB, + 0x44,0x49,0xE2,0x40,0xF9,0xEC,0xF2,0xFF,0x23,0x49,0x02,0x41,0x7D,0xDD,0x77,0xAE, + 0x23,0x49,0xE2,0x40,0xB8,0x25,0xBD,0xB8,0x23,0x49,0xE2,0x40,0xF2,0xD8,0xD8,0xF8, + 0x23,0x49,0xE2,0x40,0xAB,0x0F,0xBA,0xA9,0x43,0x49,0xE2,0x40,0xB7,0xAF,0x82,0xFE, + 0x03,0x41,0xC2,0x38,0x00,0x80,0xD0,0xDA,0x03,0x41,0xC2,0x38,0x62,0xBF,0xB7,0xBF, + 0x03,0x41,0xC2,0x38,0x8B,0xD8,0x92,0xAC,0x03,0x41,0xE2,0x40,0xB3,0xC2,0x8A,0xDD, + 0x02,0x41,0xC2,0x38,0x7E,0xBB,0xB2,0xA2,0x03,0x41,0xE2,0x38,0x0A,0xE5,0x7D,0xED, + 0x03,0x41,0xE2,0x40,0xBA,0x00,0x09,0xDF,0x23,0x41,0xE2,0x40,0x3F,0xAE,0xD6,0x75, + 0x03,0x41,0xA2,0x38,0x08,0xA8,0xA8,0xB7,0x03,0x41,0xC1,0x38,0x82,0xBE,0xE2,0x78, + 0x02,0x41,0xE2,0x40,0x51,0xC3,0x8D,0xD5,0x23,0x41,0xE2,0x40,0xBD,0xAD,0xBD,0x73, + 0x02,0x41,0xE1,0x40,0xC0,0xC0,0xEA,0xE2,0x22,0x41,0xC1,0x40,0xFD,0x9F,0xD7,0xDF, + 0xC5,0x59,0xE2,0x40,0x37,0x3D,0xB5,0xB5,0x47,0x6A,0xE5,0x61,0xAF,0xC2,0xC9,0x89, + 0x47,0x6A,0xE5,0x61,0x63,0x7B,0x7B,0x6E,0x05,0x62,0xA4,0x59,0xAF,0xFA,0xE2,0x82, + 0x06,0x62,0x64,0x51,0xEC,0xFC,0xFA,0x7A,0x43,0x49,0x03,0x41,0x78,0x78,0xF8,0x5C, + 0x23,0x41,0xE2,0x38,0xBE,0xB5,0xE5,0xAA,0x23,0x41,0xC2,0x30,0xA2,0xFB,0x7A,0xFA, + 0x44,0x41,0xE2,0x30,0xBF,0xAB,0xAF,0xA9,0x44,0x41,0x24,0x39,0x02,0x8A,0x02,0xC2, + 0x44,0x41,0x03,0x39,0x02,0xCB,0x83,0x82,0x44,0x41,0x03,0x41,0xDC,0xFE,0xEB,0xAA, + 0x43,0x41,0xE3,0x38,0x6B,0xF2,0xFA,0xBA,0xE2,0x38,0xA1,0x30,0x8E,0xBA,0x4A,0x68, + 0x44,0x49,0xC2,0x30,0xAF,0xAD,0xBD,0xBD,0x84,0x49,0xE3,0x38,0x82,0xB9,0xEF,0x5D, + 0x23,0x41,0xA2,0x28,0x58,0xF8,0x7E,0xFF,0xC2,0x28,0x81,0x28,0xAA,0xEF,0xF7,0xEA, + 0xE2,0x28,0x81,0x20,0x3E,0x3F,0xFF,0xED,0xE2,0x30,0xA2,0x28,0x7E,0xF8,0xFE,0xFF, + 0xC2,0x28,0xA2,0x28,0xDF,0xFF,0xFF,0x22,0xA2,0x28,0x61,0x20,0x80,0xF0,0x70,0x78, + 0x81,0x20,0x41,0x18,0x78,0xFE,0xFE,0xFB,0x81,0x20,0x41,0x18,0xFB,0xAA,0x8A,0x0A, + 0xA2,0x28,0x61,0x20,0xEF,0x6F,0xAA,0x2B,0xC2,0x28,0x61,0x20,0xAD,0xAB,0x37,0xAE, + 0xC2,0x28,0x81,0x20,0x29,0x85,0xAA,0xBA,0xE3,0x30,0xA2,0x28,0xFF,0xCA,0xCE,0xAA, + 0x03,0x29,0xA2,0x28,0xF7,0x5F,0xFD,0xFE,0xE2,0x30,0xA2,0x28,0xB7,0xB5,0xDD,0x5A, + 0xE3,0x30,0xA2,0x28,0x6A,0x62,0x72,0xFF,0xC2,0x30,0xA2,0x28,0xE3,0x66,0x75,0x65, + 0xA2,0x28,0x81,0x20,0x02,0xB8,0x56,0x7C,0xC2,0x28,0x81,0x20,0xA2,0xB3,0xF5,0xFD, + 0xC2,0x28,0xA2,0x28,0x33,0x01,0x28,0x23,0xE3,0x30,0x81,0x20,0xCA,0xEA,0xFF,0x7E, + 0xA2,0x28,0x81,0x20,0x57,0x69,0x7D,0xBF,0xA2,0x28,0x61,0x20,0xFB,0xFA,0xAA,0x80, + 0xA1,0x28,0x61,0x20,0x09,0x3F,0x8B,0x0E,0xE2,0x30,0x81,0x28,0x0F,0x9F,0xAF,0xBB, + 0x03,0x39,0xA2,0x30,0x20,0x0A,0xBF,0xFD,0x03,0x39,0xC2,0x30,0x0C,0x02,0x0B,0xBF, + 0x44,0x41,0x03,0x39,0xFA,0xFE,0x6B,0xFD,0x44,0x41,0x03,0x39,0x5E,0x77,0xDD,0x3B, + 0x44,0x41,0xE2,0x38,0x6F,0x7B,0x6B,0x63,0xE3,0x38,0xA2,0x30,0xDF,0x5F,0x7B,0x78, + 0xA2,0x28,0x61,0x28,0x00,0x00,0x2A,0x3E,0xE3,0x30,0xA2,0x30,0xDD,0x5F,0xFE,0x2D, + 0xE2,0x30,0x81,0x28,0x27,0xAF,0xBF,0xEE,0x03,0x31,0xC2,0x28,0xE2,0xED,0xDD,0x7D, + 0xE3,0x30,0xA2,0x28,0x54,0xAF,0x0F,0x8F,0xC3,0x28,0x81,0x28,0xF7,0xFE,0xFC,0xF0, + 0xA2,0x30,0x61,0x20,0xF7,0xFB,0xBE,0x2A,0x81,0x30,0xA2,0x28,0xD7,0x5C,0x56,0x5F, + 0xE3,0x30,0xA2,0x30,0xBD,0x2F,0x0B,0x2B,0xE3,0x30,0xC2,0x28,0x7C,0xF0,0xFA,0xBA, + 0xE3,0x30,0x81,0x20,0xFF,0xF6,0xDC,0x7E,0xA2,0x28,0x81,0x20,0x78,0x5C,0xA0,0x23, + 0xC2,0x28,0x61,0x20,0xFF,0xFD,0xAA,0x2A,0xC2,0x30,0x82,0x28,0x0D,0x0D,0x0F,0x00, + 0xC2,0x30,0x82,0x28,0xE0,0xE8,0xFC,0xF8,0xE3,0x30,0xA2,0x28,0xD5,0xB5,0x3D,0xEF, + 0xE3,0x30,0xA2,0x28,0xBF,0x9F,0x2F,0xBF,0x03,0x31,0xC3,0x30,0xAA,0xEA,0xBB,0xAF, + 0x03,0x31,0xA2,0x28,0x9F,0xF5,0x37,0xB7,0x03,0x31,0xA2,0x28,0x22,0xF2,0x7F,0x55, + 0x03,0x31,0xA2,0x28,0x8B,0xA2,0xBB,0x9D,0xE2,0x30,0xA2,0x28,0x5E,0xE0,0xE0,0xAA, + 0xE3,0x38,0xC2,0x28,0x57,0x7D,0xDD,0x7D,0x03,0x31,0xA2,0x28,0xA7,0xDD,0x5F,0x2B, + 0x03,0x39,0xC2,0x30,0x35,0xAF,0xBF,0x3F,0x44,0x41,0xE2,0x30,0xAB,0xA2,0x9A,0xF7, + 0x23,0x39,0xE2,0x30,0xE0,0xE2,0xE0,0x62,0x44,0x41,0xC1,0x30,0xAA,0xAF,0x2B,0x89, + 0x24,0x41,0xE2,0x38,0x36,0x26,0xBB,0x7A,0x64,0x49,0xE3,0x38,0xAB,0xBF,0xED,0xFF, + 0x64,0x49,0x03,0x41,0x95,0x37,0x2D,0x3D,0x44,0x49,0x03,0x41,0x08,0x38,0x27,0x2A, + 0xC6,0x59,0x24,0x41,0xAD,0xED,0xEB,0x2B,0x07,0x62,0x64,0x49,0xB7,0x3D,0xFF,0x0B, + 0xCA,0x7A,0x27,0x6A,0xA5,0x2F,0x8D,0x0B,0x2B,0x8B,0xCA,0x7A,0x3D,0x25,0xFD,0xEF, + 0xAC,0x9B,0x0A,0x83,0x2A,0xBD,0xD5,0x55,0x8F,0xB4,0x2A,0x8B,0x0A,0xBF,0xFF,0x55, + 0xF0,0xBC,0x8B,0x93,0x02,0x2A,0xBD,0x55,0xF0,0xC4,0x0D,0xAC,0x00,0x00,0x0B,0xBD, + 0x10,0xC5,0xAF,0xBC,0xAA,0x28,0x2A,0x2D,0x10,0xC5,0xF0,0xBC,0xD6,0x2A,0x86,0xAF, + 0x10,0xC5,0xCF,0xBC,0x9A,0x62,0xF8,0xFE,0x10,0xC5,0xAF,0xB4,0xAA,0x8E,0x7E,0xFB, + 0xF0,0xBC,0xAF,0xB4,0x2A,0xB2,0xB3,0xAF,0xF0,0xBC,0xD0,0xBC,0x05,0x2A,0x2E,0xBA, + 0x11,0xC5,0xAF,0xB4,0xAE,0xA6,0xAA,0xEB,0xF0,0xBC,0x4D,0xA4,0x58,0x78,0x48,0xE0, + 0x6D,0xAC,0x0D,0xA4,0xDF,0x7F,0x7A,0xF8,0x2D,0xA4,0xCC,0x9B,0x7C,0xAA,0xAA,0x0A, + 0x2D,0xA4,0xEC,0x9B,0xF5,0xBD,0x97,0x2E,0x2D,0xA4,0x0D,0x9C,0xCF,0x7F,0xFE,0xB3, + 0x4E,0xA4,0xCC,0x93,0x67,0xAA,0xA2,0x28,0x0D,0x9C,0x2A,0x83,0x7F,0xE8,0x00,0x00, + 0x0D,0x9C,0x2A,0x83,0x75,0xFF,0xEA,0x80,0xCC,0x93,0x2A,0x83,0x5F,0xFF,0xFA,0x00, + 0x0D,0x9C,0x2A,0x83,0x77,0xDF,0xEF,0x2A,0xEC,0x9B,0x2A,0x83,0x5D,0x7F,0xFE,0x20, + 0x8A,0x8B,0xE9,0x7A,0x5F,0xEB,0x58,0xA0,0x4A,0x83,0x68,0x6A,0x5F,0x5B,0xEA,0xA8, + 0x23,0x49,0xC2,0x38,0xAB,0xA6,0xA4,0x2A,0x44,0x49,0xE2,0x38,0xAD,0xB7,0xEA,0xAA, + 0x23,0x49,0xE3,0x40,0x38,0xAE,0xEE,0xCE,0x23,0x49,0x03,0x41,0x60,0xCE,0x2C,0x5A, + 0x23,0x49,0xE2,0x40,0xAA,0x0A,0xE0,0xFA,0x23,0x51,0x03,0x41,0xFA,0x7F,0xDD,0x55, + 0x43,0x49,0x02,0x41,0xFB,0x3B,0xA3,0xBB,0x23,0x49,0xC2,0x38,0xEA,0xBA,0x58,0xE8, + 0x23,0x41,0xA1,0x38,0xEA,0xAA,0xFA,0x68,0x03,0x41,0xA2,0x38,0xFF,0xBE,0xAB,0x89, + 0x03,0x41,0xC2,0x38,0xBC,0xB7,0xD4,0x2A,0x23,0x41,0xE2,0x40,0xD7,0x5E,0xDC,0xE7, + 0x03,0x41,0xC2,0x38,0x7A,0xFF,0xB7,0x2F,0x03,0x41,0xE2,0x40,0x05,0x15,0xA9,0x5C, + 0x03,0x41,0xE2,0x38,0x03,0xCA,0xD5,0x5D,0x03,0x41,0xC2,0x38,0xFE,0xA6,0xD6,0xD6, + 0x02,0x41,0xC2,0x38,0x3D,0x3B,0xAF,0xBF,0x03,0x41,0xE2,0x38,0x70,0x70,0x5C,0x5D, + 0xE2,0x40,0x02,0x39,0xE0,0x38,0xAA,0xB2,0x02,0x41,0xE2,0x38,0xF8,0xAB,0xBD,0xDD, + 0x02,0x41,0xC2,0x40,0xA2,0x22,0x00,0xAC,0x03,0x41,0xC2,0x40,0x2B,0x07,0x0E,0xA8, + 0x84,0x51,0xE2,0x40,0x35,0x3F,0x9D,0xF5,0x67,0x72,0xA4,0x59,0x2B,0x0B,0x09,0x81, + 0x67,0x72,0x05,0x62,0x5B,0x71,0xE8,0x6A,0x05,0x62,0xC5,0x59,0x2B,0x08,0x80,0xE8, + 0x05,0x62,0x63,0x49,0x60,0x7A,0xFA,0x6A,0x64,0x49,0xE2,0x38,0xF0,0xF8,0xF8,0x5A, + 0x44,0x41,0xE2,0x38,0xFE,0xDF,0xD7,0x3D,0x44,0x41,0x03,0x39,0x75,0xCE,0xA2,0x98, + 0x23,0x39,0xE2,0x38,0x8B,0xA2,0x03,0x20,0x23,0x39,0xC3,0x30,0x2A,0x6E,0xFE,0xF2, + 0x44,0x41,0xE3,0x30,0x0A,0x2B,0xBD,0xE7,0x44,0x41,0xE2,0x38,0xAA,0x20,0x8F,0xAD, + 0x44,0x41,0x23,0x39,0x57,0x18,0xD8,0x71,0x23,0x39,0xC2,0x30,0x5E,0xFC,0xF8,0xA8, + 0x03,0x39,0xC2,0x30,0xE9,0x7A,0xBA,0xA2,0x03,0x39,0xA1,0x28,0xE2,0xEA,0xF3,0x7B, + 0xC2,0x30,0xA1,0x28,0xA0,0xE8,0xBC,0xA5,0xE2,0x28,0x81,0x28,0xEA,0xA2,0xA8,0x6A, + 0xE2,0x30,0xA2,0x20,0xED,0xEF,0xBE,0x7B,0xE3,0x28,0x81,0x20,0x8A,0xA2,0xEA,0xDF, + 0xE3,0x28,0x82,0x20,0xE2,0x7A,0x77,0xFF,0xC2,0x20,0x61,0x20,0x5E,0x57,0x7F,0xFF, + 0xA2,0x28,0x61,0x20,0x7D,0xF3,0x8B,0x03,0xE3,0x30,0x81,0x20,0xD5,0xFD,0xA9,0x0A, + 0xC3,0x28,0x81,0x20,0xFD,0xFE,0xFC,0xA8,0x02,0x29,0xA2,0x28,0x75,0x7D,0xFF,0xDE, + 0xC2,0x28,0xA2,0x28,0xCA,0x80,0x8E,0xBA,0x03,0x31,0xC2,0x28,0xFD,0xED,0xD5,0x95, + 0x03,0x31,0xC2,0x28,0xF7,0x7F,0x7B,0xEA,0x03,0x29,0xA2,0x28,0xDF,0x5F,0xFE,0xFF, + 0x03,0x31,0xA2,0x28,0xDD,0x5D,0x5B,0xFB,0xE2,0x28,0xA2,0x28,0xED,0x7F,0xBE,0xEA, + 0xC2,0x28,0x81,0x20,0x97,0xFC,0x82,0xE0,0x81,0x28,0xC2,0x20,0xA7,0xBF,0xBA,0xEA, + 0xE3,0x30,0x81,0x20,0xBF,0x2F,0xFD,0xB7,0xC2,0x28,0x81,0x20,0x54,0x5E,0x58,0xFE, + 0xC2,0x28,0x81,0x20,0xFF,0x5F,0xFE,0x38,0xC2,0x28,0x81,0x20,0xEB,0x72,0x7A,0xF8, + 0xC2,0x28,0x81,0x20,0xDF,0xAB,0x83,0xEB,0xE2,0x30,0xA2,0x28,0x52,0x6B,0x7B,0x75, + 0xC2,0x30,0x81,0x20,0xAA,0xFE,0x75,0x57,0xC2,0x30,0x81,0x20,0x08,0x2F,0xAD,0xED, + 0x03,0x39,0x81,0x28,0x00,0xAA,0xAF,0xF5,0x23,0x41,0xC2,0x30,0x20,0x08,0x2D,0x9F, + 0x65,0x49,0x24,0x41,0x41,0xA2,0xBB,0xEB,0x44,0x41,0xA2,0x28,0x7A,0xF8,0xCA,0x78, + 0xC2,0x30,0x61,0x20,0xD6,0xFE,0xB8,0xAA,0xA2,0x30,0x82,0x20,0x08,0xA0,0x20,0xA0, + 0xC3,0x30,0x82,0x28,0xEA,0xEB,0xEB,0xFD,0xC2,0x30,0x81,0x28,0xB2,0x9F,0x7F,0xAF, + 0xC2,0x30,0x82,0x28,0x8A,0xAE,0xBD,0xFA,0x03,0x39,0xA2,0x28,0xD9,0xAF,0xAF,0xBD, + 0x03,0x39,0xA2,0x28,0xD5,0xBF,0x2E,0x0A,0x24,0x39,0xA2,0x30,0xD5,0xFB,0xAA,0xAA, + 0x03,0x39,0xA2,0x30,0xF7,0xFF,0xFE,0x22,0xE2,0x30,0xA2,0x28,0xFF,0xDF,0x53,0xC0, + 0xC2,0x30,0x82,0x28,0xBC,0x7E,0xBE,0xA2,0xE3,0x28,0x81,0x28,0xBD,0xF7,0x57,0xFF, + 0x03,0x31,0x82,0x28,0x3F,0xAF,0xBD,0xBD,0x03,0x39,0xC2,0x28,0x68,0xE0,0xC2,0x83, + 0xE3,0x30,0xA2,0x28,0x58,0xEA,0xC0,0xB0,0xE2,0x30,0xA2,0x28,0x27,0xF7,0xDF,0x7F, + 0xC2,0x30,0xA2,0x28,0x80,0xBA,0x59,0xA3,0xE3,0x30,0x81,0x28,0x0A,0xCA,0xDA,0xDF, + 0xC2,0x28,0x81,0x28,0x88,0x2A,0x0A,0xAD,0xC2,0x28,0xA2,0x28,0x77,0xB9,0xE2,0x22, + 0xC2,0x28,0x81,0x20,0x3E,0xEA,0xFE,0xF2,0xC3,0x30,0x81,0x20,0x02,0xAB,0xEE,0x6F, + 0xE3,0x30,0x81,0x20,0xA2,0xBB,0xBD,0xA5,0xE3,0x30,0xC2,0x28,0xA7,0xF7,0x65,0x75, + 0x03,0x39,0xC2,0x28,0x3B,0x3D,0x75,0xAD,0x02,0x39,0xA2,0x28,0x28,0xFF,0xBF,0xFF, + 0x03,0x39,0xA1,0x28,0xA0,0x8B,0xA9,0xAA,0x44,0x41,0xC1,0x30,0x29,0xFB,0x7D,0xF5, + 0x44,0x41,0xE2,0x38,0xDA,0x5B,0xD7,0x3D,0x84,0x49,0x03,0x39,0x5D,0xFF,0xC1,0xCA, + 0x44,0x49,0x03,0x41,0xAD,0xA5,0x25,0xFF,0x85,0x51,0x23,0x41,0xFD,0xBF,0x2F,0x0B, + 0xC6,0x59,0x64,0x49,0xA5,0xB5,0x3F,0x0F,0x27,0x6A,0xC5,0x59,0xAD,0x35,0xF5,0x2B, + 0xEA,0x82,0x48,0x6A,0x2D,0x2D,0x2D,0x09,0x2A,0x83,0xEA,0x7A,0xE9,0x7F,0x76,0x6A, + 0x2B,0x83,0xC9,0x7A,0xAE,0xAF,0xB5,0xBF,0x2A,0x8B,0xC9,0x7A,0x2F,0xE6,0xA6,0xAE, + 0x8C,0x9B,0xE9,0x7A,0x2B,0xBF,0xD7,0xFF,0xED,0xA3,0x2A,0x83,0x0B,0xB7,0xFD,0x55, + 0xAF,0xBC,0x2B,0x83,0x02,0xAF,0xFD,0xD5,0xF0,0xBC,0xAC,0x9B,0x00,0x02,0xAD,0x55, + 0xF0,0xBC,0x4D,0xAC,0x00,0x00,0x0A,0xE5,0xF0,0xBC,0xAF,0xB4,0x72,0xA2,0x0A,0x2F, + 0x11,0xC5,0xD0,0xBC,0xFD,0x7B,0xCA,0xEF,0x10,0xC5,0xD0,0xBC,0x7E,0x7F,0x6B,0xEA, + 0x10,0xC5,0xD0,0xBC,0xE5,0xFF,0xAF,0x6B,0xF0,0xBC,0x6E,0xAC,0xE8,0xA8,0xE0,0x60, + 0x8F,0xAC,0x0D,0xA4,0x74,0xDC,0xDA,0xFA,0x4E,0xAC,0x2D,0xA4,0x5E,0x5E,0x67,0x24, + 0x2D,0xA4,0xEC,0x9B,0x18,0x2E,0x00,0x00,0x2D,0xA4,0x0D,0xA4,0x50,0x08,0x9D,0x0A, + 0x4E,0xAC,0x0D,0x9C,0xFD,0x96,0xAE,0xDA,0x4E,0xA4,0x0D,0xA4,0xEA,0xAB,0xA7,0x9F, + 0x6E,0xA4,0x2D,0xA4,0x7D,0xE9,0x7D,0xB5,0x4E,0xA4,0xEC,0x9B,0x9E,0x22,0x80,0x0A, + 0x6E,0xAC,0x0D,0x9C,0xD7,0xB8,0x2A,0x02,0x6F,0xAC,0x0D,0x9C,0x7F,0xCF,0xAA,0xEE, + 0x4E,0xA4,0xAB,0x8B,0x57,0xA8,0xC0,0x02,0x4E,0xA4,0x2A,0x83,0x57,0xFE,0xAA,0xA0, + 0x44,0x49,0xE2,0x40,0xA5,0x6F,0x5A,0xFC,0x23,0x49,0xC2,0x38,0x88,0xEA,0xEA,0x7A, + 0x23,0x49,0xC2,0x38,0xE2,0xFA,0xFA,0xAD,0x23,0x49,0xE3,0x40,0x8A,0xEA,0xFA,0xBF, + 0x23,0x49,0xE3,0x40,0x9A,0xBB,0xE9,0xF0,0x23,0x49,0xE3,0x40,0x96,0x25,0xBF,0x9B, + 0x23,0x49,0xE2,0x40,0x82,0xA0,0x2E,0x7A,0x23,0x41,0xE2,0x40,0xAA,0x36,0xD7,0xF5, + 0x03,0x41,0xC1,0x38,0xF8,0xE8,0xA8,0x3E,0x02,0x41,0xA1,0x38,0xDA,0xF8,0xBA,0xEE, + 0x03,0x41,0xA2,0x38,0x03,0xAB,0xEF,0xFA,0x03,0x41,0xC2,0x38,0x88,0x9E,0x57,0x5F, + 0x03,0x41,0xC2,0x38,0x2F,0xFA,0xB9,0xF9,0x02,0x41,0xC2,0x38,0xEA,0xEB,0x6A,0xEF, + 0x23,0x49,0xC2,0x38,0xDA,0xFE,0xDC,0x7A,0xE2,0x40,0xC2,0x38,0x98,0x78,0x68,0xA8, + 0x02,0x41,0xC2,0x38,0xFF,0xFE,0xB3,0x03,0x02,0x41,0xC2,0x38,0xFE,0xB7,0xBA,0xB8, + 0x03,0x41,0xE2,0x40,0x95,0xF5,0xCD,0x06,0x03,0x41,0xE2,0x40,0xFF,0xF8,0x70,0x5C, + 0x02,0x41,0xC2,0x38,0x97,0xFE,0xAE,0xAA,0x03,0x41,0xA1,0x38,0x18,0x3A,0x0A,0x82, + 0x23,0x49,0xA0,0x38,0x2E,0xA8,0x2E,0x2D,0x66,0x72,0x84,0x51,0x0B,0x0B,0x09,0xA9, + 0x46,0x6A,0xE5,0x61,0xAA,0x9C,0x80,0x8A,0x27,0x6A,0xC5,0x59,0x6F,0xB7,0xAF,0xAC, + 0x06,0x62,0x63,0x49,0xFE,0x58,0x78,0x78,0x44,0x49,0xE2,0x38,0x7E,0x5E,0x5E,0x7C, + 0x44,0x41,0xE2,0x38,0xBD,0xD5,0xB5,0xCD,0x43,0x41,0x03,0x39,0x74,0x5F,0x5F,0x5F, + 0x23,0x39,0xE3,0x38,0x2A,0x57,0x5A,0xAB,0x24,0x39,0x03,0x39,0x81,0xD3,0x7F,0xD7, + 0x24,0x41,0xE3,0x30,0xBA,0xAA,0xED,0x6E,0x03,0x39,0xE3,0x30,0x2D,0xEF,0x7E,0xA2, + 0x23,0x39,0xE3,0x38,0x00,0x2A,0xBD,0x9F,0x43,0x41,0x03,0x39,0x4A,0x69,0xFF,0x7F, + 0x44,0x41,0xE2,0x30,0xFB,0x7A,0xEF,0xE3,0x23,0x39,0xC1,0x30,0x7F,0xFD,0xFB,0x28, + 0x03,0x39,0xA1,0x28,0x5F,0x56,0xDE,0xA8,0xC2,0x28,0x81,0x20,0x7A,0xBA,0xA3,0x02, + 0xE3,0x30,0x81,0x20,0x6D,0xBF,0xFC,0xEA,0xE3,0x30,0x81,0x20,0x5F,0xFF,0x8A,0x2A, + 0x03,0x31,0xA2,0x28,0xD5,0xF7,0xBE,0xA8,0xE2,0x30,0x82,0x20,0x5F,0xAE,0x2E,0x22, + 0xE3,0x30,0xA2,0x28,0xE5,0xFF,0x2F,0x28,0xE3,0x30,0xC2,0x28,0x6B,0x69,0x6F,0x55, + 0xE3,0x30,0xA2,0x28,0xEB,0xA9,0xEB,0xFA,0xE3,0x30,0xA2,0x28,0xAA,0xA9,0xAB,0xB8, + 0x03,0x31,0xC2,0x28,0xF7,0xF7,0xF5,0xB5,0xE3,0x30,0xA2,0x28,0xF2,0xBA,0xFE,0xA8, + 0x03,0x31,0xC2,0x28,0xEA,0x6B,0x7F,0xFB,0xE3,0x30,0xC2,0x28,0x9A,0x27,0x23,0x8B, + 0x03,0x31,0xA2,0x28,0xAA,0xFA,0xF8,0xDE,0xE3,0x28,0xA2,0x28,0xBA,0xBB,0xAE,0xAE, + 0xE2,0x28,0xA2,0x28,0x5E,0xFA,0xAA,0x0E,0xE3,0x28,0xA2,0x28,0xD5,0xDE,0xD6,0xEE, + 0xA2,0x28,0x61,0x20,0x8A,0xE8,0xD8,0x98,0xC2,0x28,0x81,0x20,0x2B,0xB9,0xED,0x5D, + 0xE2,0x28,0xA2,0x20,0xDE,0xF2,0x5D,0x55,0xC2,0x28,0x82,0x20,0xC2,0x62,0xFA,0x68, + 0xA2,0x20,0x61,0x20,0x00,0x82,0xB8,0x3A,0xC2,0x28,0x81,0x20,0xEA,0xFF,0xD7,0x57, + 0xA2,0x28,0x61,0x20,0xFA,0xFA,0x7A,0xF2,0xA2,0x28,0x81,0x20,0x3F,0x97,0x95,0x3F, + 0xC2,0x30,0x61,0x20,0x2F,0xFA,0x6E,0xBA,0xC2,0x30,0x81,0x28,0x28,0xF7,0xB5,0xED, + 0x44,0x41,0xC2,0x30,0x0B,0xAD,0xBD,0xDD,0x24,0x39,0xC2,0x30,0xD8,0xBA,0xAA,0xFE, + 0xE3,0x30,0xA2,0x30,0x97,0xA8,0xA0,0xA2,0xE3,0x38,0xA2,0x30,0x5E,0x5F,0xDE,0xB8, + 0xE2,0x30,0x81,0x28,0x7F,0xEE,0xAA,0xA2,0xE3,0x30,0xA2,0x28,0x95,0x37,0x2E,0xAB, + 0x03,0x39,0xA2,0x28,0xDF,0xB6,0xEA,0x8A,0xE2,0x30,0xA2,0x30,0x01,0x0A,0x2A,0x9A, + 0x03,0x39,0xC2,0x30,0xFA,0xBF,0xAE,0x0F,0x43,0x41,0xE3,0x38,0xFB,0x7D,0x78,0xEA, + 0x44,0x41,0x03,0x39,0xF5,0x2D,0xF9,0xA2,0x64,0x41,0xE3,0x38,0x57,0xA8,0x8A,0x2A, + 0x44,0x41,0xC2,0x30,0x5D,0x5F,0xEC,0xAA,0x24,0x41,0xA2,0x28,0xD5,0xF7,0xAA,0xE8, + 0xE3,0x30,0xA2,0x28,0x83,0x08,0x2E,0xA7,0xE3,0x30,0xC2,0x28,0x00,0xE8,0xB8,0x7E, + 0xE3,0x30,0xA2,0x28,0xA0,0xBC,0x3E,0xFA,0xC2,0x30,0xA2,0x28,0x5E,0x5E,0x7C,0xFE, + 0xE2,0x28,0x82,0x28,0xC7,0xFF,0xFB,0xBE,0xA2,0x28,0x81,0x20,0xA8,0x6E,0x36,0x32, + 0xC2,0x28,0x61,0x20,0x2F,0xBF,0xD7,0xBB,0xC2,0x28,0x81,0x28,0x02,0x8A,0xF2,0xE8, + 0xC2,0x28,0xA2,0x28,0x3E,0x27,0xB9,0x0D,0xC2,0x30,0x82,0x28,0x6E,0xA8,0xFA,0xC0, + 0xC2,0x28,0x81,0x28,0xB5,0x97,0x9F,0xBE,0xE2,0x30,0xA2,0x28,0xBF,0x9F,0x9F,0x95, + 0x03,0x31,0xC2,0x28,0xFB,0xFF,0xEF,0x2B,0x03,0x39,0xC2,0x30,0x5F,0x5A,0xF8,0xC0, + 0xE2,0x30,0xA2,0x30,0x88,0xBB,0xBB,0xA2,0x03,0x39,0xC1,0x30,0xBD,0xBF,0xAB,0xA3, + 0x23,0x41,0xE2,0x38,0xAD,0xE7,0xF7,0xBF,0x64,0x49,0x03,0x39,0x80,0xE3,0xFB,0xED, + 0x64,0x49,0x02,0x39,0x7E,0xFA,0xA9,0x8B,0xC5,0x51,0x43,0x41,0xBD,0x0F,0xAF,0xFF, + 0xE6,0x59,0x64,0x51,0xA5,0xBE,0xEA,0x37,0x68,0x6A,0xC6,0x59,0xBD,0x2B,0x3D,0x2B, + 0xEA,0x82,0x68,0x6A,0x29,0x2B,0x0D,0x2F,0x2A,0x83,0xCA,0x7A,0xAA,0xA8,0xBB,0xB6, + 0x2A,0x83,0xEA,0x7A,0xEE,0x62,0x6A,0xFB,0x2A,0x83,0xEA,0x7A,0xDE,0xFF,0xDD,0xC9, + 0x2B,0x83,0xC8,0x7A,0xAB,0x2B,0xA5,0x77,0x2A,0x83,0xC9,0x7A,0x0F,0xBC,0xFE,0x6F, + 0x6B,0x8B,0xC9,0x7A,0x2F,0xAF,0xED,0xFD,0x8C,0x93,0xEA,0x7A,0x00,0x02,0xEB,0xF5, + 0x0D,0xA4,0x0A,0x83,0x02,0xAE,0xFD,0x7D,0xEF,0xBC,0x6B,0x8B,0x0A,0xAB,0xF5,0xD5, + 0xF0,0xBC,0x8C,0x93,0x00,0x00,0xAB,0xBD,0xF0,0xBC,0x90,0xB4,0x20,0x02,0x03,0xFD, + 0x30,0xC5,0xCF,0xBC,0xEF,0xBB,0xBA,0xF1,0x10,0xC5,0x8F,0xB4,0x6C,0xF8,0xE8,0xE8, + 0xAF,0xB4,0x2D,0xA4,0xDA,0xE8,0xE8,0xFB,0x6E,0xAC,0x0C,0xA4,0xA6,0x23,0x2F,0x88, + 0x6E,0xAC,0x2E,0xA4,0x7E,0xE0,0xF3,0x80,0x6F,0xAC,0x2E,0xA4,0x7F,0x57,0xD7,0xFE, + 0x6E,0xAC,0x0D,0xA4,0x76,0x7F,0xBF,0xCA,0x4E,0xAC,0x0D,0x9C,0xAD,0xE3,0x02,0x8A, + 0x4E,0xAC,0x0D,0xA4,0x2B,0x3B,0xCA,0xA0,0x6E,0xAC,0x0D,0xA4,0xAD,0xFA,0x22,0x2E, + 0x8F,0xB4,0x2D,0xAC,0xBA,0xE6,0xBB,0xAA,0x6E,0xAC,0x2E,0xA4,0x6A,0xEA,0x6E,0x3A, + 0x6E,0xAC,0x2E,0xA4,0xEF,0xBF,0xAA,0xA8,0x4E,0xA4,0x0D,0x9C,0xF0,0x68,0xF8,0x00, + 0x23,0x49,0xC2,0x38,0x88,0xFA,0xFB,0x68,0x02,0x41,0xC2,0x38,0x7B,0xFD,0xFD,0xB7, + 0x03,0x41,0xC2,0x38,0xB2,0xEA,0xBC,0x0E,0x23,0x41,0xC2,0x40,0x7E,0xFA,0xA2,0xAA, + 0x23,0x49,0xE3,0x40,0x23,0x0B,0xAF,0xF7,0x23,0x49,0xE3,0x40,0x3B,0x28,0x8F,0x8C, + 0x23,0x41,0xE2,0x40,0xDF,0x20,0x88,0x77,0x03,0x41,0xE2,0x38,0xAF,0xF0,0xEB,0x89, + 0x02,0x41,0xC2,0x38,0xAF,0xEF,0xC7,0xFB,0xE2,0x40,0xC2,0x38,0x36,0x9F,0xE7,0x77, + 0x03,0x41,0xC2,0x38,0xC2,0xE3,0xB5,0xB5,0x04,0x41,0xC2,0x38,0xE2,0xFA,0x76,0x57, + 0x03,0x41,0xC2,0x38,0xBF,0xB6,0xBE,0xAF,0x23,0x41,0xE2,0x40,0xED,0xFD,0x95,0x8B, + 0x23,0x49,0xC2,0x38,0xDE,0xFF,0xDF,0x35,0x03,0x41,0xC2,0x38,0xFA,0xAE,0xFF,0xAA, + 0x03,0x41,0xE2,0x38,0xFB,0x6B,0x8A,0x25,0x23,0x41,0xC2,0x38,0xA7,0x2F,0x8B,0xFB, + 0x02,0x41,0xC2,0x38,0xA8,0x9A,0xFF,0xDB,0x23,0x41,0xC2,0x38,0xFA,0xFD,0xFD,0x35, + 0x03,0x41,0xE2,0x38,0xEF,0x42,0x6F,0x8E,0x03,0x41,0xA1,0x38,0x88,0xA2,0xBF,0x27, + 0x23,0x49,0xC2,0x40,0xB5,0x17,0x9E,0xBF,0x66,0x72,0x44,0x51,0x2B,0xA9,0x2D,0x0D, + 0x87,0x72,0x06,0x62,0xFF,0x7A,0x78,0xFC,0x26,0x6A,0xE5,0x59,0xEA,0x98,0xAA,0x8A, + 0x06,0x62,0x64,0x49,0x68,0x70,0x6C,0xFA,0x44,0x41,0xE3,0x38,0x7E,0x7C,0xFF,0xDF, + 0x03,0x39,0xC2,0x30,0x03,0x0A,0x02,0xAB,0x03,0x39,0xE2,0x30,0x00,0x20,0x0F,0x03, + 0x23,0x39,0xE3,0x38,0x01,0x2B,0xFE,0x5F,0x24,0x41,0x03,0x39,0x56,0x77,0x73,0x57, + 0x23,0x41,0xE3,0x30,0x8E,0xFD,0xB2,0xAA,0x24,0x39,0x03,0x39,0x42,0x5F,0xA9,0x7E, + 0x44,0x41,0x03,0x39,0x5F,0x4B,0x82,0x03,0x44,0x41,0xE2,0x30,0x5F,0x7F,0xE2,0xE0, + 0x23,0x39,0xE3,0x38,0xF5,0x7D,0xFF,0x82,0x23,0x39,0xE3,0x38,0x02,0x02,0xFE,0xF9, + 0x44,0x39,0xE3,0x30,0xFF,0xFF,0xAF,0x89,0x24,0x39,0xC2,0x30,0xDF,0xFA,0xE8,0x2A, + 0x03,0x31,0xC2,0x28,0xD5,0xFD,0xBA,0x80,0x03,0x31,0xC2,0x28,0xBF,0xFF,0x6A,0x60, + 0x03,0x31,0xE3,0x30,0x6D,0xAD,0xFE,0xF9,0x03,0x31,0xC2,0x28,0xEE,0xAF,0x0A,0xC2, + 0x03,0x31,0xC2,0x28,0xB9,0x88,0x00,0x00,0x24,0x39,0xC2,0x30,0x77,0xF2,0xA2,0xE2, + 0x24,0x31,0xC2,0x30,0x7F,0xEF,0xAE,0xA2,0xE3,0x30,0xC2,0x30,0xDB,0xAB,0x20,0x82, + 0x03,0x39,0xA2,0x28,0xFF,0xF7,0xA8,0xCA,0x24,0x39,0xC2,0x30,0x7C,0xF5,0x75,0xFD, + 0x23,0x31,0xE3,0x30,0x5D,0xDB,0x7B,0x5D,0x03,0x31,0xC2,0x28,0xBF,0x2E,0xFF,0xF5, + 0x03,0x31,0xA2,0x28,0xFE,0xB8,0xFA,0xA9,0xE3,0x30,0xA2,0x28,0xAA,0xEA,0x40,0x82, + 0xE3,0x30,0xC2,0x28,0x9D,0x9F,0xAD,0x0D,0xA2,0x30,0xE3,0x28,0xB9,0x79,0x7D,0xFD, + 0xE3,0x28,0x82,0x20,0xDF,0x9E,0x88,0x08,0xC3,0x28,0x81,0x20,0x5B,0xF3,0xE2,0xA8, + 0xC3,0x28,0x82,0x20,0xFB,0xFF,0xFA,0x6B,0xC2,0x28,0x82,0x20,0x7E,0x5F,0x7E,0x7A, + 0xA2,0x28,0x82,0x20,0x55,0xD9,0xB6,0xAA,0x61,0x28,0xA2,0x20,0xBF,0xA5,0xBD,0xFD, + 0xA2,0x20,0x61,0x20,0xB8,0xBF,0xDE,0xF8,0xA2,0x28,0x82,0x20,0x2A,0xF3,0x59,0xD5, + 0xA2,0x28,0x82,0x20,0xAE,0x97,0xDF,0x7B,0xA2,0x28,0x82,0x20,0x0B,0x0D,0x02,0xC2, + 0xE3,0x30,0x82,0x28,0x2F,0x3F,0x3D,0x3D,0x23,0x39,0xC2,0x30,0x7A,0xEB,0xFA,0xF8, + 0xE3,0x30,0xA2,0x28,0xAE,0xBF,0xF7,0xE0,0xE3,0x30,0xA2,0x28,0x82,0x3E,0x2F,0x2F, + 0x23,0x39,0xC2,0x30,0xDF,0x9F,0x7E,0xFC,0xE2,0x30,0xC1,0x30,0x80,0x80,0xA7,0x56, + 0x03,0x39,0xC2,0x30,0xAB,0xAA,0xAB,0x0F,0x23,0x39,0xC2,0x30,0xDF,0xBE,0xEA,0xE8, + 0x23,0x39,0xC2,0x30,0x23,0x09,0xAB,0xF7,0x44,0x41,0xE2,0x38,0x3A,0xBE,0xFE,0xBD, + 0x64,0x49,0x24,0x41,0x8E,0xAD,0xAD,0xA5,0x64,0x41,0x24,0x41,0xBF,0x8B,0x88,0xC0, + 0x64,0x41,0xE3,0x30,0xFE,0x7C,0x7A,0xF0,0x24,0x39,0xC2,0x30,0x62,0xFF,0x77,0x77, + 0xE2,0x30,0x82,0x28,0x2E,0xAE,0xE7,0xFE,0xE3,0x30,0xA1,0x28,0xD7,0xBD,0xEB,0x0B, + 0x03,0x39,0xA2,0x28,0xAD,0x8B,0xBF,0xCB,0xE3,0x30,0xA2,0x28,0xAF,0x2E,0x3A,0x9C, + 0xC2,0x30,0x82,0x28,0xEE,0xFC,0xB8,0xBA,0xA2,0x28,0x81,0x20,0x30,0xF8,0x3E,0x06, + 0xC2,0x28,0x81,0x20,0xAA,0x1B,0xDE,0x2E,0xC2,0x28,0x61,0x28,0xE8,0x2A,0xA0,0xA8, + 0x02,0x31,0xA2,0x28,0x35,0xF5,0xFF,0xFF,0xE2,0x30,0xA2,0x28,0x7A,0x5A,0x78,0x5A, + 0xC2,0x28,0x81,0x20,0xB6,0xEE,0xAF,0x0D,0x03,0x31,0x82,0x28,0xFF,0xBE,0xEB,0x8D, + 0x23,0x39,0xC2,0x30,0x2D,0x0F,0x89,0xAF,0x23,0x39,0xE3,0x30,0xC0,0x80,0x01,0x0F, + 0x23,0x39,0xE2,0x30,0x57,0xFA,0xFE,0x28,0x44,0x41,0xE2,0x38,0x7B,0xE8,0x83,0x82, + 0x23,0x41,0xE2,0x38,0x6F,0xFA,0x22,0x00,0x64,0x49,0x02,0x39,0xCD,0xBD,0xBF,0xFF, + 0x85,0x51,0x23,0x41,0xA9,0x8B,0x8B,0x2A,0x85,0x51,0x64,0x49,0x09,0xCA,0xF2,0x2E, + 0x06,0x62,0x64,0x51,0xAF,0x39,0xAD,0x2F,0xC9,0x7A,0x26,0x62,0xBD,0xA5,0xAD,0x2D, + 0xE9,0x7A,0xA9,0x72,0x25,0x21,0xAA,0xAC,0x0A,0x83,0xA9,0x7A,0x28,0xA2,0x5A,0x6A, + 0x0A,0x83,0xC9,0x7A,0xB0,0xA1,0xB5,0xBD,0x0A,0x83,0xC9,0x7A,0xAB,0xFF,0xEB,0x7F, + 0x0A,0x83,0xC9,0x7A,0xEC,0x02,0x23,0x2D,0x2B,0x83,0xC9,0x7A,0xAF,0xFF,0xA0,0xA0, + 0x2B,0x83,0xA9,0x7A,0x8B,0xFA,0x7A,0xF0,0x0A,0x83,0xC9,0x7A,0x6E,0xBA,0x01,0x29, + 0x2A,0x83,0xEA,0x82,0x8D,0x8D,0xA2,0xF0,0x6C,0x8B,0x0A,0x83,0x09,0xB5,0xBD,0xB7, + 0xAD,0x93,0x0A,0x83,0x0A,0xAF,0x9F,0xD7,0x6F,0xAC,0x0A,0x83,0x02,0xAF,0xFF,0xFD, + 0xD0,0xBC,0x4B,0x8B,0x00,0x2A,0xAF,0xF5,0x10,0xBD,0x0D,0xA4,0x20,0xA8,0xCB,0xF5, + 0xCF,0xB4,0x4E,0xAC,0x5C,0x7C,0xFA,0x7F,0x8F,0xB4,0x4E,0xAC,0x69,0xB1,0x2F,0xD7, + 0xAF,0xB4,0x4E,0xAC,0x7F,0x9B,0xD3,0xB3,0x8F,0xB4,0x4E,0xAC,0xD7,0x7F,0xBE,0x88, + 0x8F,0xB4,0x4E,0xAC,0x57,0x3A,0x8A,0xCA,0x6E,0xAC,0x2D,0xA4,0xB6,0xBC,0x2C,0x2A, + 0x8F,0xAC,0x4E,0xAC,0x5E,0x7F,0x6B,0xAF,0xAE,0xAC,0x4E,0xAC,0x5D,0xFD,0x7D,0xFE, + 0x8F,0xB4,0x2D,0xA4,0xBA,0xB9,0xAB,0xA0,0xAF,0xAC,0x4D,0xAC,0x9F,0xF5,0xF7,0xFF, + 0x6E,0xB4,0x4E,0xA4,0x2A,0xEA,0xF8,0xF8,0x8F,0xAC,0x4E,0xAC,0x5E,0x5D,0xF9,0x6A, + 0x23,0x49,0xC2,0x40,0xFE,0xBA,0xFE,0xE7,0x02,0x41,0xC2,0x38,0xBF,0xEE,0xBF,0xBA, + 0x03,0x41,0xE2,0x40,0x0B,0x01,0x81,0xAA,0x23,0x41,0xE2,0x40,0x27,0xB9,0x0F,0xFD, + 0x23,0x49,0xE2,0x40,0xBF,0x2F,0x87,0x39,0x23,0x49,0xE2,0x38,0xE8,0x58,0xDF,0x96, + 0x23,0x41,0xC2,0x40,0xB9,0xAB,0xBA,0xB8,0x03,0x41,0xC2,0x38,0xAB,0x7F,0xD8,0x5C, + 0x03,0x41,0xC2,0x38,0x8B,0xC1,0xF3,0x5E,0x03,0x41,0xA1,0x38,0xAF,0xA8,0x02,0x2F, + 0x03,0x41,0xC2,0x38,0xEF,0xA2,0x60,0xAA,0x03,0x41,0xC2,0x38,0x37,0x82,0xC3,0xAF, + 0x03,0x41,0xC2,0x38,0x3E,0xFA,0xF9,0xBF,0x03,0x41,0xC2,0x38,0xC2,0x68,0x4E,0xFF, + 0x02,0x41,0xA1,0x38,0x3D,0xAE,0xAE,0xAA,0x03,0x41,0xC2,0x38,0x02,0xB2,0xAD,0x8E, + 0x03,0x41,0xE2,0x38,0x7F,0x7F,0xED,0xAD,0x02,0x41,0xC1,0x38,0xE9,0x38,0xF2,0xEB, + 0xE2,0x40,0xC2,0x38,0xDA,0xF0,0x02,0x0B,0x02,0x41,0xC2,0x38,0xEE,0xF7,0x5E,0x9A, + 0xE2,0x40,0xC2,0x38,0x08,0x2C,0x1B,0x02,0xE2,0x40,0xC2,0x38,0x27,0xA2,0xE0,0xCA, + 0x03,0x49,0xE2,0x38,0xB6,0xB7,0xBF,0xAD,0x46,0x6A,0x43,0x49,0x0B,0x09,0x0D,0x0D, + 0x86,0x72,0x25,0x6A,0xFE,0xFE,0x6A,0x60,0x26,0x6A,0xE5,0x61,0xF8,0x7C,0x70,0x12, + 0x05,0x62,0x23,0x41,0x70,0xE0,0xE8,0xA0,0x23,0x41,0xC2,0x30,0xAA,0x98,0xD8,0xF8, + 0x03,0x39,0xE2,0x30,0xEF,0xEA,0x7A,0x5B,0x03,0x39,0xE2,0x30,0xAB,0x2D,0x35,0x95, + 0x24,0x39,0xC3,0x30,0xFE,0x9E,0xF2,0xFA,0x03,0x39,0xE3,0x30,0xE8,0x6E,0xE3,0xEE, + 0x23,0x39,0xE3,0x38,0x2B,0xBD,0xEF,0xFD,0x23,0x39,0xE2,0x38,0xA8,0x08,0xBE,0x7F, + 0x23,0x39,0xE2,0x38,0x02,0x0E,0xAF,0xAB,0x44,0x39,0xE3,0x30,0xCA,0x8A,0xF7,0xBE, + 0x44,0x41,0xE3,0x30,0xE2,0xAA,0x3A,0xBF,0x64,0x41,0xE3,0x30,0x7D,0x7B,0xF0,0xE2, + 0x44,0x41,0xE3,0x30,0xF5,0x55,0xFB,0xA2,0x24,0x39,0xE3,0x30,0x2B,0x87,0x5B,0x7B, + 0x24,0x39,0xE3,0x30,0xA0,0xA8,0xEB,0xB9,0x24,0x39,0xE3,0x30,0x7A,0xFA,0xBE,0xB2, + 0x24,0x39,0xE3,0x30,0xE7,0xFE,0xBA,0xBA,0x23,0x39,0xE3,0x30,0x1F,0xBB,0xA2,0x80, + 0x44,0x39,0xE3,0x30,0xFC,0xDF,0xD5,0xFB,0x24,0x39,0xE3,0x30,0x82,0xAA,0xBD,0xAE, + 0x23,0x39,0xE2,0x30,0x8A,0x3A,0xAB,0xED,0x24,0x39,0xE3,0x30,0x7F,0xFC,0xFC,0xFE, + 0x24,0x39,0xC2,0x30,0x4B,0x8A,0x8A,0xAE,0x03,0x39,0xE3,0x30,0x59,0x82,0x06,0x25, + 0x24,0x39,0xC2,0x28,0x5B,0xFB,0xA2,0xE2,0x03,0x31,0xC2,0x28,0xF5,0xFF,0xEE,0xA8, + 0xE3,0x30,0xC2,0x28,0xBA,0xEA,0xE7,0xA8,0x03,0x31,0xC2,0x28,0x4B,0xBD,0xB5,0xAF, + 0x03,0x31,0xC2,0x28,0xAF,0xDE,0x94,0xF8,0x03,0x31,0xC3,0x28,0x5A,0xFA,0xFE,0xBE, + 0x03,0x31,0xC3,0x28,0x75,0x55,0xDE,0x6B,0xE3,0x28,0xA2,0x20,0xDE,0xBE,0xBA,0xAA, + 0xC3,0x28,0x82,0x20,0x8A,0xE0,0x40,0x80,0xC2,0x28,0x82,0x20,0x7A,0xAA,0xAA,0x30, + 0xC2,0x28,0xA2,0x20,0x7D,0x35,0xAB,0xEC,0xC3,0x28,0x82,0x20,0x57,0xDC,0xD8,0x7B, + 0xC3,0x28,0x82,0x20,0x5E,0x5F,0xFB,0x2A,0xC2,0x28,0x62,0x18,0xAF,0xAB,0xEA,0xA8, + 0xA2,0x28,0x62,0x20,0x3A,0xF8,0xBE,0xBE,0xA2,0x28,0x82,0x20,0xA0,0xEE,0xEF,0xDF, + 0xC3,0x30,0x81,0x20,0x0B,0x2B,0xBF,0xED,0x03,0x31,0xA2,0x28,0x80,0x22,0xFB,0x55, + 0xE3,0x30,0xA2,0x28,0xC0,0xC0,0xE3,0xA5,0xE3,0x30,0xA2,0x28,0x9F,0xFB,0x6B,0xEE, + 0x03,0x39,0xA2,0x28,0x2B,0x2F,0xAD,0xEF,0x03,0x39,0xC2,0x30,0xFA,0x8A,0x8B,0xAB, + 0x03,0x39,0xE3,0x30,0xFD,0xAE,0x23,0x02,0x03,0x39,0xA2,0x28,0xA2,0xEA,0xEA,0x7E, + 0xC2,0x30,0x81,0x28,0x08,0x8A,0xEB,0xEA,0x03,0x39,0xA1,0x30,0xAA,0x2F,0xEB,0xAD, + 0x44,0x41,0xC2,0x30,0x02,0x2B,0xEF,0xD7,0x65,0x49,0xE2,0x30,0xA0,0xA2,0xAF,0xD5, + 0x65,0x49,0x03,0x39,0xF2,0xF2,0x8B,0xE9,0x24,0x41,0xA2,0x30,0x72,0xE8,0xE8,0xFA, + 0xE3,0x30,0x82,0x28,0xFE,0xDF,0xFA,0xB8,0xE3,0x30,0x81,0x28,0x09,0xAF,0xBB,0xAE, + 0x03,0x39,0xA2,0x28,0x8B,0xBB,0xF6,0xBF,0x03,0x39,0xA2,0x28,0xFE,0xAE,0xFA,0x72, + 0xC2,0x30,0x82,0x28,0xFE,0xEC,0x98,0xF8,0xC2,0x30,0x81,0x28,0x37,0xF6,0xE2,0xA0, + 0xE2,0x30,0xA2,0x28,0xA6,0xAB,0x89,0xAD,0xE2,0x30,0xA1,0x28,0xF5,0xF5,0xEE,0xA8, + 0xE2,0x30,0x82,0x28,0xB9,0xEA,0xBA,0x02,0xE3,0x30,0xA1,0x28,0x5A,0xB3,0xEA,0xEA, + 0xC2,0x28,0x81,0x28,0x05,0xAF,0xBF,0xBE,0x23,0x39,0xC2,0x28,0x25,0xF5,0x5D,0xD7, + 0x24,0x39,0xC3,0x30,0x36,0xAB,0xE9,0xEE,0x23,0x39,0xC2,0x30,0x0F,0xF9,0x5F,0xEF, + 0x23,0x39,0xE2,0x30,0x38,0x0D,0x2B,0x03,0x64,0x49,0x23,0x41,0xB5,0x05,0xA5,0xD5, + 0x63,0x49,0x03,0x39,0xFF,0xFF,0xEF,0xFC,0x44,0x49,0x03,0x41,0xF5,0x05,0xFD,0x97, + 0xA5,0x51,0x23,0x41,0x2F,0x2F,0x2D,0x35,0x47,0x6A,0x84,0x49,0xF5,0xBD,0xA7,0x0F, + 0x68,0x6A,0xC5,0x59,0xF5,0x2D,0x02,0x08,0xC9,0x7A,0x68,0x6A,0x1D,0x9D,0xA9,0x8F, + 0xE9,0x7A,0xA9,0x72,0xB6,0x27,0xCD,0x0B,0x0A,0x83,0xC9,0x7A,0x5A,0x62,0x59,0x55, + 0xE9,0x7A,0xA9,0x7A,0x8A,0x8E,0xAA,0xFE,0x0A,0x83,0xA9,0x72,0x3D,0xAF,0x03,0xB8, + 0x0A,0x83,0xA9,0x72,0x89,0x8E,0xBB,0xEB,0x2A,0x83,0xC8,0x7A,0x20,0xEA,0xAB,0x2D, + 0x4B,0x8B,0xEA,0x7A,0xE3,0xEE,0xDE,0xFA,0x2A,0x83,0xEA,0x7A,0xBF,0xBE,0x8B,0xAB, + 0x4B,0x8B,0xEA,0x7A,0xBF,0x8F,0xEE,0x57,0x2A,0x83,0xE9,0x7A,0x28,0x2A,0xEE,0xB7, + 0x4A,0x8B,0xE9,0x7A,0xF8,0xFB,0xF3,0xFB,0x4B,0x8B,0xEA,0x7A,0x01,0xBB,0x3A,0xB8, + 0x6B,0x8B,0x0A,0x83,0x02,0xFE,0xD7,0xDE,0xEC,0x9B,0x2A,0x83,0x0A,0xBB,0x9D,0x75, + 0x2D,0xA4,0x29,0x83,0x00,0x2A,0xFF,0x55,0x4E,0xAC,0x6B,0x8B,0x00,0x00,0x2B,0xDD, + 0x8F,0xB4,0xCD,0x9B,0x00,0x0A,0x0A,0xA9,0xAF,0xB4,0x4E,0xAC,0xEE,0x8A,0xAA,0x7F, + 0x8F,0xB4,0x6E,0xAC,0x7D,0xAD,0xA2,0x6E,0x8F,0xB4,0x2D,0xA4,0xDA,0xAA,0xA8,0xB2, + 0x8F,0xB4,0x6E,0xAC,0xD6,0xBC,0xE5,0x3E,0x8F,0xB4,0x4E,0xAC,0x0A,0xAE,0x8E,0xA4, + 0xAF,0xB4,0x6E,0xAC,0xFF,0x75,0xE7,0xFA,0xAF,0xB4,0x4D,0xAC,0x37,0xA7,0x2A,0xAA, + 0xAF,0xB4,0x4D,0xAC,0xF7,0x6E,0x28,0x28,0xD0,0xB4,0x6E,0xAC,0x77,0x7E,0xEA,0xAA, + 0x23,0x41,0xE2,0x40,0x75,0xBD,0xCB,0xA2,0x23,0x41,0xE2,0x40,0x7F,0xEF,0x6C,0xFB, + 0x03,0x41,0xE2,0x40,0x4B,0xF3,0x53,0x73,0x23,0x49,0xC2,0x38,0xFF,0xFF,0xFF,0x3E, + 0x23,0x41,0xC2,0x38,0x2B,0x7F,0xEA,0xEF,0x23,0x41,0xC2,0x40,0x3C,0xAF,0xED,0xAD, + 0x23,0x49,0xC2,0x38,0xFE,0xFF,0xEB,0xE2,0xE2,0x40,0xC2,0x38,0x9C,0xAC,0xEA,0x56, + 0x02,0x41,0xC2,0x38,0xD5,0xFD,0xEF,0x2F,0x03,0x41,0xA1,0x30,0x35,0xBF,0x2B,0x0A, + 0x03,0x41,0xE2,0x38,0xEC,0xFE,0xFE,0xF8,0x23,0x41,0xC2,0x38,0xBD,0x37,0xDE,0xBB, + 0x03,0x41,0xC2,0x38,0xEF,0x8A,0xA2,0xE8,0xE2,0x40,0xC2,0x38,0x27,0x8F,0x02,0x00, + 0xE2,0x40,0xC2,0x38,0x22,0xAA,0xFE,0xEE,0x03,0x41,0xC2,0x38,0xBB,0xE2,0xDF,0x55, + 0x03,0x41,0xC2,0x38,0x02,0xCA,0x55,0x79,0x03,0x41,0xA1,0x30,0x8A,0xFF,0xBF,0xAA, + 0x03,0x41,0xE2,0x38,0x57,0xEC,0xD2,0x5A,0x03,0x41,0xC2,0x38,0xB2,0x82,0x09,0x2D, + 0x03,0x41,0xC2,0x38,0x8B,0xAF,0xCE,0x62,0xE2,0x40,0xA2,0x38,0xC2,0xE0,0xC8,0x9A, + 0x02,0x41,0xC2,0x38,0x0D,0x95,0xBF,0x2F,0xA7,0x7A,0x43,0x49,0x29,0xAD,0x2D,0x2D, + 0x86,0x72,0x46,0x6A,0x6A,0x92,0xE2,0xF6,0x26,0x6A,0x05,0x62,0x90,0xD2,0x70,0x50, + 0x05,0x62,0x63,0x49,0x60,0x78,0xE0,0x60,0x63,0x49,0xC2,0x30,0x7B,0x7E,0xFC,0x7E, + 0xE2,0x38,0xC2,0x30,0xBA,0xEF,0x76,0xA2,0x03,0x39,0xC2,0x30,0x97,0xFE,0xAD,0xA7, + 0x23,0x39,0xE2,0x38,0x55,0x79,0xCB,0x6A,0x23,0x39,0xE2,0x30,0x5D,0xFE,0x2F,0xAA, + 0x23,0x39,0xE3,0x38,0xEF,0xAF,0x2D,0xEF,0x23,0x39,0xC2,0x38,0x63,0xAA,0xAA,0xAE, + 0x43,0x41,0x03,0x39,0xF9,0xEF,0x78,0xFE,0x24,0x39,0x03,0x39,0xBC,0x27,0xA5,0x95, + 0x44,0x41,0x03,0x39,0x06,0x3F,0xBE,0xEA,0x65,0x41,0x03,0x39,0xE3,0xAA,0x2F,0xFA, + 0x44,0x41,0x03,0x39,0xBA,0xF8,0xFE,0xEE,0x44,0x41,0x03,0x31,0x7B,0xBA,0xE3,0xA0, + 0x44,0x39,0x03,0x31,0x5D,0x92,0x00,0x88,0x44,0x39,0x03,0x31,0x5D,0x57,0x57,0x78, + 0x24,0x39,0xE2,0x30,0xAA,0xAA,0xA7,0x9F,0x44,0x39,0xE2,0x30,0xA2,0xAA,0xFF,0xDF, + 0x23,0x39,0x03,0x39,0xB2,0x22,0xC1,0x79,0x24,0x39,0xE3,0x38,0xEA,0x78,0x70,0xA2, + 0x03,0x39,0xA2,0x28,0x82,0xA2,0xAC,0xAA,0x24,0x39,0xC3,0x30,0xBF,0xFD,0xBF,0xA8, + 0x03,0x39,0xE3,0x30,0xAB,0xB0,0xA0,0xA0,0x23,0x39,0xE3,0x30,0xAD,0xAF,0xEF,0xD7, + 0x24,0x39,0xE3,0x30,0x8A,0xAB,0xDF,0x57,0x23,0x39,0xE3,0x30,0xFE,0xFF,0xA3,0xBF, + 0x03,0x31,0xE3,0x30,0xDA,0x78,0x5E,0xFE,0x03,0x31,0xA2,0x28,0xAA,0xEA,0xAA,0x08, + 0x24,0x39,0xC2,0x28,0x7F,0x7F,0xDB,0x62,0x23,0x31,0xE3,0x30,0xF5,0x7F,0xFF,0x73, + 0x24,0x31,0xC2,0x28,0xEC,0xE2,0xEB,0x7F,0xE3,0x28,0xC3,0x28,0xD7,0xBE,0x5E,0x57, + 0x04,0x31,0xC3,0x28,0x7F,0x5E,0xEB,0x2C,0xE3,0x28,0xC3,0x28,0x5F,0xC8,0x62,0x80, + 0xE3,0x28,0xA2,0x20,0xBF,0x8E,0x8A,0x82,0xE3,0x28,0xA2,0x20,0x6B,0xB2,0xF2,0xAA, + 0xC2,0x28,0x82,0x20,0xAB,0xF0,0xBA,0xA8,0xC2,0x28,0xA1,0x28,0x6E,0x53,0xB7,0x02, + 0xC2,0x28,0x82,0x20,0x7F,0x76,0xFE,0x6E,0xC2,0x28,0x82,0x20,0xD5,0xF5,0xBF,0xAB, + 0xC3,0x28,0x82,0x20,0x6F,0xFA,0xFE,0x5A,0xA2,0x28,0x82,0x20,0xBF,0xAF,0xF6,0xA5, + 0xC2,0x28,0x82,0x20,0x0E,0xFB,0xFA,0xD5,0xC2,0x30,0xA2,0x28,0x89,0x2B,0x97,0x5B, + 0xE3,0x30,0xA2,0x28,0xBE,0xBC,0xAF,0x9B,0x03,0x31,0xC2,0x30,0x29,0x29,0x05,0xAB, + 0x03,0x39,0xE3,0x30,0xFF,0x7C,0xFE,0xFF,0x44,0x41,0x81,0x28,0x7F,0x7F,0x7A,0xEC, + 0x03,0x31,0xA2,0x30,0x7D,0xFD,0xF5,0xBF,0xE2,0x30,0xA2,0x28,0xA1,0xA7,0xB7,0xFE, + 0xE3,0x30,0xA2,0x30,0xFF,0xBF,0xAE,0xE2,0x82,0x38,0xE3,0x30,0x77,0xFD,0xF7,0xBF, + 0x03,0x39,0xC2,0x30,0xA2,0xF2,0x59,0xDD,0xE2,0x30,0xA1,0x30,0xA0,0xF0,0x5A,0x6A, + 0xC2,0x30,0x81,0x28,0xB8,0x5C,0xFE,0x0F,0xE2,0x30,0xC2,0x30,0xF5,0x6D,0xAD,0xAB, + 0xE3,0x30,0xA2,0x30,0x1A,0x0E,0x08,0x2A,0xE3,0x30,0xC2,0x30,0x7A,0x72,0x45,0xCA, + 0xC2,0x30,0xA2,0x28,0xDF,0x66,0xFF,0x48,0xC2,0x28,0xA2,0x28,0x3B,0x8A,0x8B,0xFE, + 0xE2,0x30,0xA2,0x28,0x2F,0xAD,0x75,0x29,0x23,0x39,0xC2,0x28,0xFF,0xDF,0xB9,0xA2, + 0x03,0x39,0xC2,0x28,0xAE,0x7E,0xB8,0x28,0x23,0x39,0xC2,0x28,0x5F,0x6A,0xA8,0xA0, + 0x03,0x31,0xA1,0x28,0x75,0x5F,0xBC,0xAA,0xE3,0x30,0xA2,0x28,0x2B,0x8B,0xAA,0x88, + 0x03,0x39,0xC3,0x30,0xAA,0xBD,0xFA,0xBE,0x43,0x41,0xE2,0x30,0xB5,0x95,0xFF,0xAA, + 0x44,0x41,0x02,0x39,0xCE,0x80,0xCA,0xEB,0x64,0x49,0x03,0x39,0xBF,0xCF,0x7B,0x55, + 0x44,0x49,0xE2,0x38,0xB8,0xAA,0xA5,0x35,0xA5,0x51,0x03,0x41,0x55,0x5D,0xBB,0x2A, + 0x67,0x6A,0x23,0x41,0xF5,0xBD,0xAF,0x2A,0x67,0x6A,0xC5,0x51,0x25,0x2F,0xAB,0x00, + 0xA8,0x72,0x47,0x6A,0xBD,0x3F,0xFF,0xEF,0xE9,0x7A,0x67,0x72,0xAB,0x0F,0xE9,0xEF, + 0xC9,0x7A,0x88,0x72,0x08,0xA8,0x2A,0xBF,0xC9,0x7A,0xA9,0x72,0xC5,0x61,0xFA,0x5C, + 0xEA,0x7A,0x89,0x72,0x2F,0x3D,0xA5,0xAF,0x0A,0x83,0xA9,0x7A,0x3A,0xB8,0xFA,0xFF, + 0xE9,0x7A,0xA8,0x7A,0x7A,0x40,0xEE,0x3F,0xE9,0x7A,0xA9,0x72,0x01,0xEF,0xA4,0xB8, + 0x0A,0x83,0xC9,0x7A,0x8F,0xB5,0xBF,0xFF,0x2A,0x83,0xC9,0x7A,0xAA,0x2A,0x0B,0x25, + 0x2A,0x83,0xC9,0x7A,0x5E,0xFC,0xEE,0xE2,0x2A,0x83,0xE9,0x7A,0x76,0xD5,0xCD,0xAD, + 0x0A,0x83,0xEA,0x7A,0xEA,0x02,0x32,0x5F,0x29,0x83,0xEA,0x7A,0xD8,0xEC,0x82,0x03, + 0x4B,0x8B,0xA8,0x72,0xA0,0x80,0xA2,0xFE,0x4B,0x8B,0xC9,0x72,0x2B,0x3E,0x3F,0xFD, + 0x4A,0x8B,0x0A,0x83,0xFC,0xEE,0xD5,0xDD,0x8B,0x93,0xE9,0x7A,0x2B,0xAB,0xFF,0x7D, + 0x0D,0xA4,0x2A,0x83,0x0A,0xBD,0xF5,0x55,0x4E,0xAC,0x2A,0x8B,0x02,0xAB,0xBF,0xF5, + 0x8F,0xAC,0xAC,0x93,0x00,0x8A,0xA9,0xB5,0x8F,0xAC,0x4E,0xAC,0xA5,0xF5,0xFF,0x55, + 0x8E,0xB4,0x4E,0xAC,0xAC,0x8B,0xB2,0xFF,0x8E,0xB4,0x4D,0xA4,0xBF,0x1D,0x07,0xAE, + 0xAF,0xB4,0x6E,0xAC,0x9A,0x2A,0x2B,0x02,0xCF,0xBC,0x6E,0xAC,0xFE,0xFF,0x9F,0xF7, + 0xAF,0xB4,0x8F,0xAC,0x1B,0x2E,0xE0,0xC0,0xCF,0xB4,0x8F,0xB4,0xCA,0xC0,0xAB,0xF2, + 0x23,0x49,0xC2,0x38,0xAA,0xFE,0xDD,0xBF,0x23,0x41,0xE2,0x40,0x7B,0x7F,0x9D,0xA7, + 0x03,0x41,0xE2,0x38,0x95,0x92,0xEA,0xA3,0x23,0x41,0xE2,0x38,0xDA,0x7F,0x5A,0x78, + 0x02,0x41,0xA2,0x30,0xAE,0xAA,0x2D,0xAE,0x03,0x41,0xA1,0x30,0x0A,0xAC,0xDA,0xFA, + 0x03,0x41,0xA1,0x30,0xB0,0xA2,0xAF,0xAF,0x03,0x41,0xA1,0x30,0xEF,0xFE,0xBA,0x08, + 0x03,0x41,0xC2,0x38,0xAB,0xEF,0xAF,0x37,0x03,0x41,0xA2,0x38,0x48,0xBA,0x2B,0x20, + 0x03,0x41,0xE2,0x38,0xB3,0x5A,0x76,0xAE,0x03,0x41,0xC2,0x38,0xB0,0xB8,0x6E,0x7E, + 0x03,0x41,0xE2,0x38,0x62,0xCB,0x85,0xAD,0x24,0x41,0xC2,0x38,0xD7,0xD6,0x7F,0xFB, + 0xE2,0x38,0xC2,0x38,0xFC,0x16,0x15,0x2B,0x23,0x41,0xC2,0x38,0xFF,0x8B,0xBE,0x5F, + 0x03,0x41,0xA1,0x30,0xE2,0xAB,0xDE,0xAF,0x03,0x41,0xE2,0x38,0xC3,0x63,0x50,0xDC, + 0x02,0x41,0xE2,0x38,0x5F,0x7D,0x38,0xB9,0x03,0x41,0xC2,0x38,0xB3,0xDB,0x9A,0xAA, + 0x03,0x41,0xC2,0x38,0xF0,0xC2,0xEE,0xDE,0x03,0x41,0xC2,0x38,0x55,0xED,0x2F,0xAF, + 0x03,0x41,0xC2,0x38,0xF3,0xE3,0xEA,0xFA,0x67,0x72,0x02,0x41,0x2D,0x2D,0x2D,0x2D, + 0x87,0x72,0x05,0x62,0xA8,0xE0,0x78,0xFA,0x46,0x72,0xE5,0x61,0xDF,0xB6,0xFF,0xFC, + 0x05,0x62,0x43,0x49,0xE0,0xE0,0x60,0xE0,0x63,0x41,0xE2,0x38,0x7F,0x5F,0x5E,0xDC, + 0x03,0x39,0xC2,0x30,0x2A,0x2A,0x8A,0x27,0x03,0x39,0xE3,0x30,0x7B,0xE2,0xBC,0xAE, + 0x03,0x39,0xE3,0x30,0x1E,0x6E,0x73,0x58,0x23,0x39,0xE2,0x30,0xC0,0xCB,0xE3,0xFA, + 0x23,0x39,0xE2,0x30,0x6B,0xAA,0x3D,0x95,0x23,0x39,0xE3,0x38,0xD7,0xD7,0xFC,0xD5, + 0x23,0x39,0xE2,0x30,0x82,0xEA,0xAE,0x7B,0x44,0x41,0xE3,0x30,0xAB,0xAE,0xE7,0xFB, + 0x23,0x39,0x03,0x39,0x01,0x42,0xC2,0x66,0x44,0x41,0x03,0x39,0xFA,0xAB,0xEB,0xD5, + 0x44,0x41,0x03,0x39,0x27,0x0F,0xAB,0xAB,0x44,0x41,0xE3,0x30,0x80,0x28,0x36,0xEE, + 0x44,0x41,0x03,0x39,0xA8,0xE2,0x7A,0xAA,0x44,0x41,0xE2,0x30,0xFE,0xFF,0x6B,0x62, + 0xE3,0x38,0x03,0x31,0xFF,0x2A,0xAA,0x9E,0x03,0x39,0xE3,0x30,0xFF,0x23,0xAF,0x7E, + 0x03,0x39,0xC2,0x30,0x0A,0x0E,0x03,0x2B,0x44,0x41,0xE2,0x30,0xAB,0x2F,0xFD,0xE5, + 0x24,0x39,0xE3,0x38,0x8F,0x8B,0x0F,0xFD,0x44,0x41,0x04,0x39,0xFF,0xE6,0x5A,0x58, + 0x44,0x41,0xE3,0x30,0xFF,0x7F,0xFA,0xAB,0x24,0x41,0xE3,0x38,0xBF,0xB6,0xF8,0xF8, + 0x03,0x39,0xC2,0x30,0xE0,0xCA,0xAA,0xA0,0x23,0x39,0xC2,0x30,0x2B,0x2F,0xFF,0x7F, + 0x23,0x39,0xC2,0x28,0xBA,0x3E,0xF7,0x95,0x03,0x31,0xE3,0x30,0x80,0x78,0xDF,0x75, + 0x24,0x39,0xE3,0x30,0x7A,0x7B,0xFD,0x65,0x03,0x31,0xC3,0x28,0xBA,0xAF,0xBE,0xB2, + 0x24,0x39,0xC2,0x28,0x7F,0xFF,0xEF,0xAE,0x03,0x31,0xC2,0x28,0xFF,0xE9,0xCD,0xCA, + 0x04,0x31,0xC2,0x28,0x2A,0xEF,0xE5,0xEE,0x04,0x31,0xC3,0x28,0x68,0x63,0x69,0xFD, + 0xE3,0x30,0xC3,0x28,0xDA,0x7D,0x59,0x57,0x03,0x31,0xC3,0x28,0x75,0xDD,0xFD,0xAD, + 0xE3,0x30,0xA2,0x28,0xF6,0xF7,0x0A,0x0A,0xE3,0x30,0xA2,0x28,0xEF,0xFF,0xFA,0xB8, + 0xE3,0x30,0xA2,0x28,0x67,0xFD,0xDC,0x38,0xC3,0x28,0xA2,0x28,0x51,0x6B,0x7A,0xC3, + 0xC3,0x28,0x82,0x20,0x7E,0xFF,0xBF,0xAF,0xA2,0x28,0x82,0x20,0x26,0x26,0x38,0xA8, + 0xA2,0x20,0x61,0x20,0xFE,0xFA,0xDA,0xAA,0xA2,0x28,0x61,0x18,0x38,0xBF,0x9F,0xFA, + 0xC2,0x28,0x81,0x20,0xB8,0x37,0xDF,0xDE,0x03,0x31,0xC2,0x28,0xAD,0xE9,0xAD,0x7D, + 0x23,0x39,0xC2,0x28,0xBF,0xBD,0xAF,0xAF,0x44,0x41,0xA2,0x30,0xFC,0x7E,0x7F,0xFE, + 0xE2,0x30,0x82,0x30,0x22,0x0A,0xAB,0x22,0xC2,0x30,0xC2,0x28,0x08,0x00,0xA0,0x2A, + 0x03,0x39,0xA2,0x30,0xEF,0xFD,0xBB,0x2B,0xE2,0x30,0xA1,0x30,0x7F,0xAB,0x00,0xA0, + 0xE2,0x30,0xC2,0x30,0x1B,0x2F,0x1B,0xD7,0x03,0x39,0xC2,0x30,0x7F,0xF3,0xAB,0x2D, + 0x02,0x39,0xA2,0x30,0xFF,0xDA,0xE0,0xA0,0x03,0x39,0xC2,0x30,0x7F,0x6E,0xEB,0xDD, + 0x03,0x39,0xA2,0x28,0xBF,0x1F,0x3F,0xAF,0x03,0x39,0xC2,0x28,0xFE,0xFB,0xF4,0x5F, + 0xE3,0x30,0xA2,0x28,0xBA,0xF2,0xD7,0xB5,0x03,0x31,0xA1,0x28,0xFE,0x7C,0xEB,0xEA, + 0x03,0x31,0xA1,0x28,0xA9,0xBF,0x2F,0xAA,0x44,0x41,0xE2,0x30,0xAB,0x0D,0x2D,0xAD, + 0x44,0x41,0x03,0x39,0x5E,0x5C,0x78,0x3E,0x85,0x49,0x03,0x39,0x5D,0xED,0xA7,0x8E, + 0x44,0x41,0xE2,0x30,0x55,0x5F,0x78,0xE8,0x44,0x41,0xE3,0x30,0x57,0xFF,0xEB,0x0B, + 0x23,0x39,0xE3,0x30,0xD5,0xE7,0xA3,0x88,0x43,0x41,0x03,0x39,0xFE,0xAB,0xAF,0xE7, + 0x43,0x41,0x03,0x39,0xA2,0x02,0x0B,0x0D,0x64,0x49,0x02,0x39,0xD7,0x97,0xA3,0xEF, + 0xC5,0x51,0x23,0x41,0xD5,0xAF,0x2F,0x2B,0x06,0x5A,0x64,0x51,0xB5,0x8F,0xAE,0x03, + 0x67,0x6A,0x06,0x5A,0xB5,0xBF,0xFB,0xBD,0x67,0x6A,0x27,0x62,0x28,0x08,0x88,0x2F, + 0xA9,0x6A,0x47,0x6A,0xFA,0xB6,0x3F,0xAF,0xC9,0x72,0x67,0x6A,0x8D,0xB7,0xEE,0x8B, + 0xC9,0x7A,0x68,0x6A,0x1F,0xEB,0x8A,0x2E,0xC9,0x72,0x68,0x72,0xEA,0xAF,0x4A,0xAA, + 0xEA,0x7A,0x68,0x72,0x2A,0x02,0x2B,0xD7,0xE9,0x7A,0xA9,0x7A,0xB7,0xFD,0xED,0x29, + 0x0A,0x7B,0x88,0x72,0xDF,0x5F,0xFE,0xA8,0x2A,0x83,0xA8,0x72,0xFF,0x35,0xDD,0xFF, + 0x0A,0x83,0xA9,0x72,0x2A,0x2A,0xAB,0xDE,0x0A,0x83,0xC9,0x7A,0xB7,0xB0,0x80,0x8D, + 0x2B,0x83,0xC9,0x7A,0x7E,0x6D,0x5C,0xFB,0x0A,0x83,0xA9,0x72,0xAB,0xDB,0xDE,0x2A, + 0x0A,0x83,0xA8,0x7A,0x4A,0xF9,0xBF,0xF8,0x09,0x7B,0xA9,0x7A,0x82,0xAA,0x2A,0x9E, + 0x2A,0x83,0xC9,0x7A,0x5F,0xA8,0xA2,0xAB,0x2A,0x83,0xC9,0x7A,0x75,0xD7,0xAA,0xAC, + 0x2B,0x83,0xE9,0x7A,0x9B,0xA6,0xFF,0x22,0x2A,0x83,0xC9,0x7A,0xE8,0xEE,0x7A,0x62, + 0x0A,0x83,0xC9,0x7A,0x08,0xE2,0x0D,0xAF,0x4B,0x8B,0xC9,0x7A,0x02,0xDD,0x7E,0x76, + 0xAC,0x9B,0x0A,0x7B,0x2A,0xBD,0x75,0xD5,0x2D,0xA4,0x0A,0x83,0x02,0xAF,0xFF,0x5D, + 0x6E,0xAC,0x4B,0x8B,0x02,0x0A,0xBD,0xF5,0x8E,0xAC,0xAC,0x93,0x20,0x00,0xAA,0xFD, + 0x8F,0xB4,0x2D,0xA4,0xA8,0x2A,0x2B,0x09,0xAF,0xB4,0x6E,0xAC,0xF7,0xBA,0xB8,0xAB, + 0xF0,0xB4,0x8F,0xB4,0xDB,0xF7,0xD7,0xFD,0xAF,0xB4,0x8F,0xB4,0x20,0x88,0x0E,0x02, + 0x44,0x41,0xE2,0x40,0xFD,0xBD,0xF7,0xDF,0x23,0x49,0xC2,0x38,0xAB,0xA7,0xEA,0x8A, + 0x43,0x49,0xC2,0x38,0xFB,0xF7,0x9E,0xE3,0x03,0x41,0xC2,0x38,0x78,0x6A,0xCA,0xCC, + 0x22,0x39,0xC2,0x38,0xDF,0x79,0xFF,0xD7,0xE2,0x38,0xC2,0x38,0x1F,0xAF,0x36,0xB0, + 0x03,0x41,0xC2,0x38,0xCB,0x96,0x52,0x7F,0x03,0x41,0xC2,0x38,0x0F,0x2E,0xEA,0xEE, + 0x03,0x41,0xA1,0x30,0x36,0xBE,0xAB,0xA2,0x02,0x41,0xC2,0x38,0x38,0xF8,0xEB,0xEA, + 0x22,0x39,0xC2,0x38,0xF7,0xF6,0xFC,0xFA,0x02,0x39,0xC2,0x38,0x96,0xDE,0xD4,0xBE, + 0x02,0x41,0xC2,0x38,0xA6,0x25,0x8A,0xAA,0x03,0x41,0xC2,0x38,0xA7,0xB7,0xF7,0xBF, + 0x03,0x41,0xC2,0x38,0xA2,0x60,0x6E,0xFA,0x03,0x41,0xA1,0x30,0x9E,0xFB,0xE2,0xEA, + 0x03,0x39,0xC2,0x38,0xDB,0x27,0x03,0xBF,0x23,0x39,0xC2,0x38,0xFE,0x5F,0xF7,0xFD, + 0x03,0x41,0xE2,0x38,0x9A,0xB5,0xA9,0x47,0x03,0x41,0xC2,0x38,0xCF,0xEF,0x8A,0x8F, + 0xE2,0x38,0xC2,0x30,0x88,0x2E,0x1A,0x2E,0x03,0x41,0xC2,0x38,0x2F,0xB5,0xDE,0xEF, + 0xE2,0x40,0xA2,0x38,0x00,0xB8,0xFA,0xBE,0x66,0x72,0x23,0x49,0x2D,0x2D,0x2D,0x2D, + 0x66,0x72,0x05,0x62,0xF0,0x42,0x4A,0xE8,0x26,0x6A,0x06,0x62,0x54,0x5E,0xFE,0x80, + 0x46,0x6A,0x84,0x51,0xFE,0x58,0xFA,0xFA,0x64,0x49,0xE2,0x38,0xDE,0x5A,0x7E,0x58, + 0x03,0x39,0xC2,0x30,0x03,0x02,0xB8,0xD8,0x23,0x39,0xC2,0x30,0xBF,0xF8,0x7C,0x5A, + 0x03,0x39,0xC2,0x30,0x5A,0x5F,0x55,0xD5,0x03,0x39,0xC2,0x30,0xED,0xAF,0xEB,0xEB, + 0x24,0x39,0xC2,0x30,0x36,0xBF,0xFB,0xBF,0x03,0x39,0xE2,0x30,0xEF,0xF0,0xBD,0x97, + 0x03,0x39,0xA1,0x28,0xA2,0xAA,0xBC,0x78,0x23,0x39,0xC2,0x30,0xE2,0xA2,0xFF,0x6D, + 0x03,0x39,0xC2,0x30,0xAA,0x22,0x2A,0xFD,0x23,0x39,0xC2,0x30,0x8A,0x00,0x2A,0x2B, + 0x44,0x41,0x03,0x39,0xA2,0xED,0x7E,0xB3,0x24,0x39,0xE2,0x38,0xF2,0x22,0xB0,0x88, + 0x44,0x41,0xE3,0x38,0xA0,0xA0,0xBB,0xF6,0x44,0x41,0xE3,0x38,0x6A,0x6A,0x2A,0xBB, + 0x23,0x39,0xE3,0x38,0xF5,0xE5,0x7F,0xA2,0x03,0x39,0xC2,0x30,0x0E,0x2A,0x80,0x6A, + 0x24,0x39,0xC2,0x30,0x2D,0x2E,0xAF,0x3F,0x44,0x41,0xE3,0x30,0xE7,0xFF,0xFD,0xA5, + 0x24,0x39,0xC2,0x30,0xFF,0x7F,0xFF,0xAA,0x03,0x39,0xE3,0x30,0x03,0x09,0x81,0x0B, + 0x44,0x41,0xC2,0x30,0x0A,0xAF,0xFE,0x7F,0x44,0x41,0x04,0x39,0x5A,0x32,0xCF,0xAF, + 0x44,0x41,0xE3,0x38,0x56,0x7E,0xE8,0xEE,0x23,0x39,0xE3,0x30,0x7F,0xD7,0xFD,0xAA, + 0x03,0x39,0xC2,0x28,0x2B,0x08,0x70,0xA0,0x23,0x39,0xE3,0x30,0x5F,0x7E,0x6C,0xAD, + 0x03,0x31,0xC3,0x30,0xBB,0x3E,0x22,0xA0,0x23,0x39,0xE3,0x30,0xBF,0x3F,0xDF,0xAF, + 0x24,0x39,0x03,0x31,0x55,0x5C,0xFE,0x8B,0x23,0x31,0xE3,0x30,0x67,0xCD,0xEB,0xE0, + 0x04,0x31,0xE3,0x30,0x7D,0xB7,0x28,0xD6,0x03,0x31,0xC2,0x28,0x5A,0xF8,0xEC,0xAE, + 0xE3,0x30,0xC2,0x28,0x57,0x56,0x5A,0x0A,0xE3,0x30,0xC2,0x28,0xAF,0x0D,0xED,0x28, + 0x03,0x31,0xC2,0x28,0x97,0xDC,0xEF,0xFA,0xE3,0x30,0xC2,0x30,0xF0,0x72,0xAA,0xE3, + 0xE3,0x30,0xC2,0x28,0xB4,0x67,0xFF,0x2B,0xE3,0x30,0xA2,0x28,0xFF,0xFB,0xEB,0xE8, + 0xE2,0x28,0xA2,0x20,0xF7,0xEB,0xEA,0xAA,0x82,0x28,0xA2,0x20,0xDF,0xFD,0xFD,0x5F, + 0xC2,0x28,0xA2,0x20,0x5D,0xA5,0xD5,0x5C,0xC2,0x28,0x81,0x20,0x6E,0xF2,0x68,0xA7, + 0xC2,0x28,0x81,0x20,0xDF,0xD7,0x7E,0x80,0xC2,0x28,0x81,0x20,0x23,0xBF,0x5F,0x7F, + 0x03,0x39,0x81,0x20,0x0A,0x22,0xAD,0xB5,0x24,0x39,0xC2,0x30,0xEC,0xAA,0x2F,0xBD, + 0x24,0x39,0xC2,0x30,0x5D,0x75,0xEE,0x68,0xE2,0x30,0x82,0x28,0x7F,0xFE,0xAA,0x00, + 0xE3,0x38,0xC2,0x28,0x2B,0xA9,0x0B,0xAB,0x03,0x39,0xE2,0x30,0x9E,0xAE,0xBF,0x5D, + 0xE2,0x30,0xC2,0x30,0x57,0xFD,0xAF,0x9A,0x02,0x39,0xC2,0x30,0x3D,0xAD,0xA3,0xBF, + 0x03,0x39,0xC2,0x30,0xFA,0x5E,0xEF,0xAE,0xE3,0x30,0xC2,0x30,0x57,0x9F,0xD5,0x57, + 0x23,0x39,0xC2,0x30,0xFF,0x77,0x5D,0xB5,0x03,0x31,0xA2,0x28,0xF2,0x7A,0xF2,0xF8, + 0xE3,0x30,0xA2,0x28,0x9F,0xB5,0x0F,0x8A,0x03,0x31,0xC2,0x30,0x83,0xAA,0x82,0x0B, + 0x03,0x39,0xE2,0x30,0x5C,0x99,0xB6,0xD7,0x23,0x39,0xE2,0x30,0xB5,0xF7,0x87,0xAB, + 0x43,0x39,0xE2,0x30,0x2A,0xBE,0xBE,0xFA,0x64,0x41,0x03,0x39,0x80,0xFB,0x7F,0x7B, + 0x44,0x41,0xE2,0x30,0xE8,0xAE,0xFE,0xFF,0x44,0x39,0xE2,0x30,0x8F,0xFE,0x29,0xB7, + 0x23,0x39,0xC2,0x30,0x00,0x88,0x70,0xAA,0x23,0x39,0xE2,0x30,0xE7,0xD4,0xA6,0x0E, + 0x64,0x41,0x03,0x39,0xF1,0x7B,0x75,0x55,0x64,0x49,0xE2,0x38,0x2D,0xAF,0xA9,0x2F, + 0xE6,0x59,0x64,0x49,0xA9,0xAD,0xCF,0x29,0x26,0x62,0xC5,0x51,0xD9,0xF9,0xE2,0xFA, + 0x47,0x62,0xE6,0x59,0x3F,0xB7,0x97,0xB5,0x68,0x6A,0xE6,0x59,0x22,0x03,0xB7,0xAE, + 0xA9,0x72,0x47,0x6A,0xB5,0x9F,0xBF,0x2D,0xC9,0x72,0x68,0x6A,0xAA,0xFA,0xEA,0x6B, + 0xC9,0x72,0x88,0x6A,0xB5,0xDA,0xBA,0x4E,0xC9,0x7A,0x88,0x6A,0xEE,0xEB,0x0F,0x35, + 0xC9,0x7A,0x88,0x72,0xD7,0xED,0xE2,0x30,0xEA,0x82,0x88,0x72,0x2D,0xA7,0xB7,0xF7, + 0x0A,0x83,0xA9,0x72,0x0A,0xAF,0xB7,0xFD,0xE9,0x7A,0xA9,0x72,0xF2,0x40,0x6A,0xFD, + 0xC9,0x7A,0x88,0x72,0x38,0x3A,0x8B,0xC3,0x0A,0x83,0xC9,0x7A,0xA7,0xE7,0x66,0xD5, + 0xEA,0x82,0x88,0x72,0x08,0xAA,0x5E,0xAB,0x2B,0x8B,0xC9,0x7A,0xBF,0xAF,0x35,0x2D, + 0x2A,0x83,0xEA,0x7A,0x58,0x5E,0x58,0x57,0x0A,0x83,0xC9,0x7A,0x55,0x5B,0x90,0xF0, + 0x0A,0x83,0xA9,0x72,0x02,0xBE,0x37,0xB5,0x2B,0x83,0xC9,0x7A,0xA2,0xA8,0xE2,0x5E, + 0x0A,0x83,0xEA,0x7A,0xC3,0x57,0x57,0x7E,0x2B,0x83,0xEA,0x82,0x83,0x3D,0x09,0xEB, + 0x2A,0x83,0xC9,0x7A,0x7B,0xFA,0xFC,0x6A,0x0A,0x83,0xC9,0x7A,0xFC,0xCA,0xAA,0xE8, + 0x2A,0x83,0xEA,0x7A,0x9D,0xB5,0x5F,0x5F,0x2A,0x83,0xEA,0x7A,0xAA,0xB7,0x69,0x7F, + 0x6B,0x8B,0xE9,0x7A,0x0B,0x2F,0xF5,0x5F,0xAC,0x93,0xE9,0x7A,0x00,0x2A,0xAD,0x55, + 0x4E,0xAC,0x4B,0x8B,0x0A,0xAB,0xFD,0x55,0x6E,0xAC,0x8C,0x93,0x00,0x0A,0x2F,0xD5, + 0x8F,0xB4,0xED,0x9B,0x00,0x00,0x02,0xBD,0xF0,0xBC,0x6F,0xAC,0xAA,0x8B,0xEB,0xFD, + 0x23,0x41,0xE2,0x40,0xFD,0xDB,0x0B,0x80,0x23,0x49,0xE2,0x40,0xA2,0x5E,0x58,0x50, + 0x03,0x41,0xC2,0x38,0x00,0xA2,0xEE,0x0A,0x03,0x41,0xA1,0x30,0xF8,0x62,0xA0,0xB0, + 0x03,0x41,0xC2,0x38,0x95,0x2D,0xEB,0xFE,0x23,0x41,0xE2,0x38,0xD7,0xF5,0x65,0xBB, + 0x03,0x41,0xE2,0x38,0xD7,0x35,0x1B,0xC1,0x23,0x41,0xE2,0x38,0x77,0x6A,0xEF,0x6F, + 0x03,0x41,0xC2,0x38,0xA3,0xBF,0xFB,0x7A,0x02,0x39,0xC2,0x38,0xAA,0xBA,0x20,0xBD, + 0x03,0x41,0xC2,0x38,0x78,0xD4,0x7E,0xFE,0xE2,0x38,0xC2,0x38,0x3E,0xBD,0x33,0x6E, + 0x03,0x41,0xC2,0x38,0xAA,0xA2,0x82,0xBD,0xE2,0x38,0xC2,0x38,0xCA,0xC0,0x00,0x02, + 0x23,0x41,0xC2,0x38,0xFF,0xFB,0x5F,0x75,0x02,0x39,0xC2,0x38,0x55,0xF7,0xBF,0x8F, + 0x03,0x41,0xC2,0x38,0xF4,0x7C,0x7B,0xA2,0x23,0x39,0xC2,0x38,0xB5,0xF5,0xFF,0xFF, + 0xE2,0x38,0xA1,0x30,0x20,0x04,0x8A,0x28,0x03,0x39,0xC2,0x38,0xFF,0x2F,0x0F,0xCD, + 0x02,0x41,0xE3,0x38,0xD7,0x55,0x5B,0x5D,0x03,0x41,0xA2,0x30,0x8D,0xAF,0x7E,0xEB, + 0xE3,0x40,0xA2,0x38,0xBF,0xA8,0x22,0x0D,0x67,0x72,0x23,0x49,0x2D,0x2D,0x2D,0x09, + 0x66,0x72,0x26,0x6A,0x55,0xE8,0x80,0x12,0x66,0x72,0x06,0x62,0xFA,0xDA,0xB8,0xFA, + 0x46,0x6A,0x64,0x49,0xF8,0x7A,0x7E,0xDA,0x64,0x49,0xE2,0x38,0x5C,0x76,0x7E,0x5F, + 0x23,0x39,0xE2,0x30,0xD5,0x97,0xFA,0x7F,0x23,0x39,0xA2,0x30,0xBA,0xA8,0xAE,0x7F, + 0x03,0x39,0xE3,0x30,0x57,0x62,0xA2,0x0B,0x03,0x31,0xA2,0x30,0xAB,0x2A,0x02,0x2A, + 0x03,0x31,0xC2,0x30,0xFE,0xE7,0x96,0xFE,0x24,0x39,0xE3,0x30,0xFB,0xBF,0xBD,0xFD, + 0x03,0x39,0xC2,0x30,0x78,0x66,0xD4,0xFE,0x03,0x39,0xC2,0x30,0x27,0x2B,0x0F,0x8A, + 0x03,0x39,0xC2,0x30,0xCA,0x6B,0xAA,0x80,0x03,0x39,0xC2,0x30,0x29,0xAF,0xBA,0x2A, + 0x44,0x41,0xE2,0x30,0x8B,0xC7,0xD5,0x55,0x23,0x39,0xE3,0x38,0xCB,0xFE,0xBC,0xFC, + 0x23,0x39,0xE3,0x38,0xFE,0xA7,0xEB,0xBA,0x03,0x39,0xE3,0x30,0x00,0xA2,0x22,0x20, + 0x24,0x39,0xE3,0x38,0x3A,0x8A,0xDA,0x58,0x44,0x41,0xE3,0x30,0x74,0x7F,0x5F,0xFB, + 0x23,0x39,0xC2,0x30,0x2F,0xFF,0xFF,0xFE,0x24,0x41,0xE2,0x30,0x27,0xE1,0xFF,0xBF, + 0x44,0x41,0x03,0x39,0x53,0x7F,0xD5,0xF7,0x44,0x41,0x04,0x39,0x55,0x5F,0xE8,0xAA, + 0x24,0x39,0xE3,0x38,0x6B,0x82,0xF8,0xBC,0x23,0x39,0xE3,0x38,0xAB,0xF7,0xBF,0x8F, + 0x23,0x39,0xC2,0x30,0x8A,0x3E,0x26,0xAA,0x23,0x39,0xE3,0x38,0xAA,0xAA,0xFE,0x56, + 0x24,0x39,0x03,0x39,0x55,0xBE,0x3B,0x95,0x24,0x39,0xE2,0x30,0xAA,0x20,0x2C,0x9E, + 0x24,0x39,0xE3,0x30,0x5A,0xD8,0xFE,0xBF,0x24,0x39,0xE3,0x30,0xDF,0x7F,0xDF,0x60, + 0x03,0x31,0xC2,0x30,0x02,0x2A,0xAA,0xF7,0x24,0x31,0xC2,0x30,0xB8,0xBA,0xBD,0xBF, + 0x23,0x39,0xC2,0x28,0xFB,0xBF,0xAA,0xA3,0x23,0x31,0xE3,0x30,0xD5,0x75,0xDE,0xBE, + 0x03,0x31,0xC2,0x28,0xBF,0xBF,0xAB,0xAA,0x03,0x31,0xC2,0x28,0x9E,0xDF,0xE8,0xA8, + 0x03,0x31,0xC2,0x30,0xAA,0x2D,0xEB,0xFA,0x04,0x31,0xA2,0x28,0xE2,0xEC,0x6F,0xEF, + 0xE3,0x30,0xC2,0x28,0xAF,0xBA,0x2D,0x95,0xE3,0x30,0xC2,0x28,0x6E,0xD7,0x76,0xFC, + 0xE2,0x30,0xC2,0x28,0x7F,0x67,0x77,0x7D,0xE3,0x30,0xA2,0x28,0x8F,0x82,0xFB,0x9F, + 0xE2,0x28,0x82,0x20,0xFC,0x7F,0xBF,0xEE,0xC2,0x28,0x82,0x20,0xEF,0xBF,0xAA,0xA2, + 0x03,0x29,0xA2,0x28,0xF9,0xEF,0xFD,0xDF,0xC2,0x28,0x81,0x20,0x7E,0xFC,0xFF,0xEE, + 0xA2,0x28,0x81,0x20,0x27,0x95,0xDF,0x7A,0xE3,0x30,0x81,0x20,0x02,0xAF,0xFF,0x5D, + 0x24,0x39,0x81,0x20,0x8A,0xEB,0xB9,0xF5,0x03,0x31,0xA2,0x28,0xAB,0x2A,0xAA,0xDB, + 0x23,0x39,0xE2,0x30,0xF5,0x0E,0xB2,0xFB,0x23,0x39,0xC2,0x28,0x5A,0x68,0xEA,0xBA, + 0x03,0x31,0xA1,0x30,0xBA,0x82,0x82,0xAA,0x02,0x31,0xC2,0x28,0xBD,0xBD,0x7D,0xFE, + 0x02,0x39,0xA1,0x28,0xAA,0xA8,0xFA,0xE9,0x03,0x39,0xC2,0x30,0xEF,0x7A,0x52,0x5F, + 0x03,0x31,0xC2,0x30,0x2D,0x07,0x0A,0x02,0x24,0x39,0xC2,0x30,0x7C,0xBA,0xAA,0xF2, + 0xE3,0x30,0xA2,0x28,0xEA,0x80,0xFA,0x96,0x24,0x39,0xC2,0x28,0xAF,0xA7,0xA7,0x0F, + 0x03,0x39,0xE3,0x30,0x9F,0xBE,0xB8,0x70,0x03,0x39,0xE3,0x30,0x00,0x0A,0x03,0xBF, + 0x44,0x41,0x03,0x39,0x5F,0xBF,0x08,0x38,0x65,0x41,0xE3,0x30,0x6F,0xF6,0x5E,0x54, + 0x03,0x31,0xC2,0x28,0xB0,0xEA,0xF8,0x57,0x03,0x31,0xC2,0x30,0xBF,0xBF,0xDF,0xF9, + 0x23,0x39,0xC2,0x28,0x2E,0xAE,0x4B,0x5F,0x03,0x31,0xA2,0x28,0x00,0x8A,0xAB,0xA7, + 0x64,0x41,0xC2,0x30,0xBF,0xBF,0xBD,0x3F,0x85,0x49,0xE2,0x38,0xB9,0x2F,0xA2,0x02, + 0x07,0x62,0x85,0x49,0xBD,0xAF,0xAB,0xBB,0x47,0x6A,0xE5,0x59,0x5F,0xFF,0xB7,0xBF, + 0x48,0x6A,0xC6,0x59,0xBF,0x2F,0x25,0x2F,0x68,0x6A,0x27,0x62,0x29,0x0E,0x22,0x02, + 0xA9,0x72,0x47,0x62,0xA7,0xEE,0xAA,0xAB,0xA8,0x72,0x68,0x6A,0xFF,0x0F,0xE7,0x9B, + 0xA9,0x72,0x67,0x6A,0x8E,0xBB,0x9A,0x08,0xA9,0x72,0x88,0x6A,0x16,0x0E,0x2E,0x4A, + 0xC9,0x7A,0x88,0x6A,0xA8,0xBE,0xEF,0xFD,0xA9,0x72,0x68,0x6A,0x8A,0xA0,0x9E,0x2A, + 0xEA,0x82,0x68,0x6A,0xAE,0xEB,0xEF,0x73,0xE9,0x7A,0x88,0x72,0xFA,0xCA,0xDA,0xFD, + 0xC9,0x7A,0x88,0x72,0x0A,0x3F,0x2F,0xA3,0x0A,0x83,0x88,0x72,0x30,0xA2,0x6A,0xDF, + 0xEA,0x7A,0x88,0x72,0xA8,0xBB,0xFB,0x9E,0x0A,0x83,0xA8,0x72,0x2F,0xAF,0xAF,0xD5, + 0x0A,0x83,0xA9,0x72,0xA2,0xBA,0xDF,0x5F,0x2B,0x83,0xC9,0x7A,0xEA,0xBF,0x15,0x5D, + 0x0B,0x83,0xCA,0x7A,0xDD,0xFF,0x7E,0xAF,0x0A,0x83,0xC9,0x7A,0x6C,0xFF,0xFF,0x8A, + 0x2B,0x83,0xC9,0x7A,0x3F,0xED,0xBB,0x71,0x0A,0x83,0xA9,0x7A,0x28,0xBE,0x2B,0x6D, + 0x4B,0x8B,0xCA,0x7A,0x2A,0x2A,0xEB,0xF5,0x2B,0x8B,0xC9,0x7A,0x60,0x76,0xF2,0xFE, + 0x0A,0x83,0xC9,0x7A,0x88,0xEE,0xAF,0x9A,0x4B,0x8B,0xE9,0x7A,0x7D,0xFD,0xB3,0x2A, + 0x2A,0x83,0xC9,0x7A,0xBE,0x77,0xFC,0xD8,0x0A,0x83,0xA8,0x72,0x3F,0x2D,0x8B,0xAE, + 0x4B,0x8B,0xEA,0x7A,0x0B,0xA7,0xE7,0xBF,0x8C,0x93,0xE9,0x7A,0x2A,0xBB,0xAF,0x7E, + 0xCD,0x9B,0x0A,0x83,0x02,0xAA,0xBF,0x7D,0x8F,0xB4,0x4B,0x8B,0x2A,0xAB,0xFD,0x55, + 0x03,0x41,0x23,0x39,0x82,0x00,0x08,0x23,0x23,0x41,0xA2,0x38,0xE8,0x7A,0xF8,0xFE, + 0x02,0x41,0xC2,0x38,0xBA,0xB9,0x69,0xEA,0xE2,0x38,0xC2,0x38,0xF8,0xBB,0x0B,0x0F, + 0x02,0x41,0xA2,0x30,0xCA,0xAB,0x83,0x82,0x23,0x41,0xE2,0x38,0xEB,0x6D,0xFC,0xFB, + 0x23,0x41,0xE2,0x38,0x65,0xD5,0x57,0x95,0x23,0x41,0xC2,0x38,0xFB,0x3B,0xDF,0x5B, + 0x03,0x41,0xC2,0x38,0xFC,0x58,0x6E,0xFF,0x02,0x39,0xC2,0x30,0xAE,0x3B,0xFB,0xDE, + 0x03,0x41,0xC2,0x38,0xDE,0xB8,0x20,0x3B,0x23,0x41,0xC2,0x38,0x56,0xDF,0xFE,0xFC, + 0x03,0x41,0xA2,0x30,0xAB,0xEB,0xE7,0xB0,0x03,0x41,0xE2,0x38,0xE1,0x09,0x9D,0x55, + 0x03,0x41,0xC2,0x38,0x77,0xC4,0x8A,0x8A,0x03,0x41,0xC2,0x38,0x4D,0x59,0x5B,0xE2, + 0x03,0x41,0xE2,0x38,0xFC,0xDF,0x57,0x56,0x03,0x39,0xC2,0x38,0xAE,0xF0,0x5A,0x5D, + 0x03,0x39,0xC1,0x30,0xEF,0xBD,0xBE,0x8B,0x03,0x41,0xC2,0x38,0xB5,0xBF,0x5F,0xCE, + 0x03,0x39,0xC2,0x38,0xFA,0x8A,0x7F,0xF7,0xE3,0x38,0xC2,0x38,0x6C,0x7E,0x7F,0xF7, + 0x03,0x41,0xA1,0x30,0x25,0xAF,0xAB,0xFE,0x88,0x72,0x64,0x49,0x0D,0x2D,0x2D,0x2D, + 0x87,0x72,0x47,0x6A,0xB8,0x3A,0xB6,0xF3,0x66,0x72,0xC4,0x59,0xE2,0x7A,0x78,0x7E, + 0xE5,0x59,0x44,0x49,0xF8,0x7E,0x5E,0x7A,0x43,0x41,0xE2,0x38,0x5C,0x7E,0xEF,0x78, + 0x03,0x39,0xC2,0x30,0x6A,0xA0,0xA2,0xBA,0x03,0x39,0xA2,0x30,0x7A,0xBA,0xAA,0x80, + 0x03,0x39,0xC2,0x30,0x88,0xE2,0x62,0x5A,0x03,0x31,0xC2,0x30,0x23,0x8A,0x2F,0x2A, + 0x03,0x39,0xA2,0x28,0xAA,0xBA,0x60,0xE0,0x03,0x31,0xC2,0x28,0x2E,0xBD,0x95,0x9D, + 0x03,0x31,0xC2,0x28,0xAA,0x2C,0x9C,0xF6,0x03,0x31,0xC2,0x30,0xEE,0xAA,0xFA,0x68, + 0x03,0x31,0xE2,0x30,0xBF,0x5F,0x97,0xE9,0x23,0x31,0xC2,0x28,0xEA,0xCA,0xFF,0xF8, + 0x03,0x39,0xE2,0x30,0xBE,0x6B,0xDE,0x52,0x03,0x39,0xE3,0x30,0x00,0xDE,0x3E,0xAA, + 0x03,0x39,0xE3,0x30,0x42,0x82,0x3D,0xF7,0x24,0x39,0xC2,0x30,0x82,0xAA,0xAB,0xF7, + 0x03,0x39,0xE3,0x30,0xA0,0xF0,0x42,0xF0,0x24,0x39,0xC2,0x30,0x8A,0xAB,0xFF,0xDE, + 0x03,0x39,0xE3,0x30,0xB8,0x28,0xF2,0x92,0x23,0x39,0xE3,0x30,0xBE,0xAE,0xAE,0xBF, + 0x44,0x41,0x03,0x39,0xDB,0x9F,0x07,0xAF,0x44,0x41,0x03,0x39,0xE7,0xD6,0xBE,0x1E, + 0x44,0x41,0x04,0x39,0x77,0x1D,0xFB,0xA0,0x44,0x41,0x03,0x39,0xB5,0x6F,0xFE,0xDA, + 0x24,0x41,0x03,0x39,0x55,0x95,0xBF,0xBC,0x24,0x39,0xC2,0x30,0xBB,0xA2,0x80,0x22, + 0x24,0x39,0xC2,0x30,0xFF,0x5F,0x5A,0xF8,0x03,0x39,0xC2,0x30,0x2A,0x8F,0xF7,0xBA, + 0x24,0x39,0xE3,0x30,0x8F,0xA9,0xFF,0xBF,0x24,0x39,0xE3,0x30,0x62,0xC0,0xDE,0xFE, + 0x24,0x39,0xC2,0x30,0xFD,0xAA,0xAA,0xEB,0x03,0x31,0xC2,0x30,0xAF,0x0F,0x28,0xA0, + 0x03,0x31,0xA2,0x30,0xA2,0xE8,0x22,0x2A,0x24,0x39,0xE3,0x30,0x2E,0x0F,0x9F,0xDE, + 0x24,0x39,0xE3,0x30,0x6F,0xEA,0xF2,0xEB,0x03,0x31,0xE3,0x30,0x62,0x7F,0x5F,0xB2, + 0x23,0x39,0xE3,0x30,0xD5,0x55,0xC5,0xF3,0x24,0x39,0xC2,0x30,0x77,0x7F,0x7B,0xEA, + 0x03,0x31,0xC3,0x30,0xF5,0xED,0x8F,0x8D,0xE3,0x30,0xC2,0x28,0x7E,0x78,0x74,0x70, + 0xE3,0x30,0xC2,0x28,0x55,0xFB,0xBB,0xFF,0xE2,0x28,0x82,0x28,0x2E,0xAA,0x28,0x02, + 0xE3,0x30,0xA2,0x20,0xBF,0xEE,0xBC,0xF4,0x03,0x31,0xC2,0x28,0x7D,0x7F,0x53,0xDD, + 0xC2,0x28,0xA2,0x20,0x3A,0xAF,0x2A,0x0E,0xE2,0x28,0xA2,0x20,0x57,0x5E,0x5F,0x7C, + 0x81,0x28,0xA2,0x20,0xFF,0x9F,0xFF,0xFD,0xC2,0x28,0x81,0x20,0xFB,0xEF,0xAA,0x2D, + 0xA2,0x28,0x81,0x20,0xB7,0xAE,0xA0,0xC8,0xC2,0x28,0x61,0x20,0x2A,0xBA,0xFF,0xFF, + 0x03,0x31,0x81,0x20,0x0A,0xB9,0xFF,0x75,0x03,0x31,0xA2,0x28,0x28,0xBA,0x7F,0x55, + 0x03,0x31,0xC2,0x30,0x22,0xAA,0x2F,0xA5,0x03,0x39,0xE2,0x30,0xDE,0x2A,0x02,0x9F, + 0x23,0x39,0xC2,0x28,0x75,0xB7,0xAA,0x3A,0x24,0x31,0xC2,0x30,0x7D,0xAB,0xBA,0xF8, + 0x24,0x39,0xE3,0x30,0xEB,0xEE,0xA5,0xE1,0x24,0x39,0xC2,0x28,0xFA,0x7A,0x68,0x7B, + 0xE3,0x30,0xA2,0x28,0x17,0xBF,0xB6,0xA8,0x03,0x39,0xA1,0x28,0x0E,0x2E,0x9F,0xBF, + 0x23,0x39,0xC2,0x30,0x62,0xAA,0x8E,0x83,0x24,0x39,0xE3,0x38,0xAD,0xBD,0x37,0xAD, + 0x44,0x41,0xE2,0x30,0xAA,0xAF,0xEA,0x62,0x24,0x39,0xC3,0x28,0xF8,0x7E,0xFB,0xFE, + 0xE3,0x30,0xA2,0x28,0xD6,0x5C,0xEE,0xB8,0x03,0x31,0xA2,0x28,0xAD,0xAF,0xAA,0x2E, + 0x03,0x31,0xA1,0x28,0xFE,0xFF,0xDC,0x0E,0x03,0x31,0xC2,0x28,0xA5,0xA5,0xA3,0x08, + 0x64,0x41,0xE2,0x30,0xBD,0xBD,0xAB,0x2B,0xA5,0x49,0x64,0x49,0x21,0x2F,0xAD,0x33, + 0xE6,0x59,0xA5,0x51,0xB1,0xA5,0xAD,0x0B,0x48,0x62,0x06,0x5A,0xE7,0x55,0x9F,0x49, + 0x68,0x6A,0x06,0x5A,0x3D,0xB5,0xDE,0xF7,0x68,0x6A,0xE6,0x59,0x08,0x0A,0x2A,0xA7, + 0xA9,0x72,0x48,0x6A,0x5C,0xFE,0xE0,0x3D,0xA9,0x72,0x48,0x6A,0x22,0xBA,0xF7,0xFE, + 0xC9,0x72,0x68,0x6A,0xB8,0xBB,0xBA,0x9F,0xCA,0x7A,0x27,0x62,0xBA,0x82,0x86,0x08, + 0xA9,0x72,0x68,0x6A,0x0E,0x03,0xBF,0x98,0xA9,0x72,0x88,0x6A,0xF4,0xA7,0x94,0x24, + 0xC9,0x7A,0x88,0x72,0x70,0x6F,0xDA,0xB2,0xE9,0x7A,0x88,0x72,0xD9,0xF5,0xA2,0xB3, + 0xE9,0x7A,0xA9,0x72,0xCD,0xF6,0xDC,0x5F,0xE9,0x7A,0xA9,0x72,0xFD,0x80,0xE2,0x6E, + 0xE9,0x7A,0x89,0x72,0xBA,0x92,0x2B,0xBA,0xE9,0x7A,0xA8,0x72,0xDF,0x72,0x73,0xDA, + 0x0A,0x7B,0x88,0x6A,0xEE,0xBF,0xB5,0x2F,0x2A,0x83,0xC9,0x72,0xD7,0x3F,0xF5,0xFE, + 0x2A,0x83,0xC9,0x7A,0xFD,0xB4,0xAA,0xDD,0x2A,0x8B,0xA8,0x7A,0x2F,0xEE,0x7A,0x76, + 0x0A,0x83,0xA9,0x7A,0xE2,0xAB,0x89,0xEB,0xEA,0x7A,0xA9,0x7A,0xED,0x5D,0xA8,0xA8, + 0x0A,0x83,0xA9,0x72,0xA5,0xAD,0xAE,0xAE,0x0B,0x83,0xCA,0x7A,0xBF,0x95,0xAF,0x6B, + 0x0B,0x83,0xCA,0x7A,0xDE,0xD7,0xDE,0x79,0x4B,0x8B,0xC9,0x7A,0x2B,0xAF,0xF5,0xFD, + 0x2A,0x83,0xC9,0x7A,0xF0,0xA2,0xA6,0x0E,0x2A,0x83,0xC9,0x7A,0xD7,0xE8,0xC0,0xA8, + 0x0A,0x83,0xC9,0x7A,0x28,0x09,0xED,0x83,0x4B,0x8B,0xE9,0x7A,0xA8,0x8B,0xBD,0x8D, + 0x4A,0x83,0x09,0x7B,0x8E,0x6F,0xCB,0xAF,0x4B,0x8B,0xE9,0x7A,0x0A,0x3B,0x9E,0x7F, + 0x03,0x41,0xC2,0x38,0x06,0xAA,0xC3,0xE0,0x03,0x41,0xA2,0x30,0x78,0xEA,0xBE,0xEF, + 0x03,0x41,0xA2,0x38,0xAB,0xBB,0xEB,0xCD,0xE2,0x38,0xA1,0x30,0x08,0x0A,0x08,0xC8, + 0x03,0x41,0xC2,0x38,0xBA,0xA5,0x97,0x17,0x23,0x41,0xE2,0x38,0x6F,0x75,0xFE,0xFE, + 0x23,0x41,0xC2,0x38,0xB7,0xEF,0xE0,0x53,0x03,0x41,0xC2,0x38,0xE0,0xFA,0x57,0x73, + 0x03,0x41,0xE2,0x38,0x55,0x56,0xFF,0x6F,0x23,0x41,0xC1,0x30,0xDF,0xD7,0xBF,0xBB, + 0x03,0x41,0xC2,0x38,0xAF,0xA7,0x2A,0x3C,0x03,0x41,0xC2,0x38,0xEB,0xAF,0x27,0xB7, + 0x03,0x41,0xC2,0x38,0xA0,0xDA,0xF0,0xA0,0x03,0x39,0xC2,0x38,0xEF,0xEA,0x6A,0xFB, + 0x03,0x39,0xC2,0x38,0x37,0xD7,0xAF,0xEB,0x03,0x41,0xC2,0x38,0xE8,0xC0,0xC2,0xDE, + 0x03,0x41,0xC2,0x38,0xEB,0xD3,0x7B,0xDA,0x03,0x41,0xA1,0x30,0x7F,0xFA,0xFD,0xCA, + 0xE2,0x38,0xC2,0x38,0x8D,0x0D,0xC5,0x2E,0xE2,0x38,0xC2,0x38,0x84,0x74,0x95,0xA4, + 0xE2,0x38,0xC2,0x38,0xC1,0xF2,0x00,0x08,0x03,0x41,0xA2,0x38,0xB7,0xBF,0xBB,0xA2, + 0x03,0x41,0xC2,0x38,0x57,0x7F,0xEB,0x4B,0x67,0x72,0x03,0x41,0x29,0x0D,0x0D,0x0D, + 0x87,0x72,0x26,0x6A,0xA0,0xAA,0x7A,0x78,0x47,0x6A,0x64,0x51,0xE8,0x68,0xF8,0xFA, + 0xA4,0x51,0x03,0x41,0xFC,0xDE,0x7E,0xFA,0x44,0x49,0xC2,0x30,0xE8,0xBE,0xFF,0xFE, + 0x03,0x39,0xC2,0x30,0x28,0xF8,0xF8,0xE0,0x03,0x39,0xC2,0x30,0xAA,0xA7,0xE5,0xF5, + 0x23,0x39,0xC2,0x30,0xDF,0xBE,0xAB,0x2F,0x03,0x31,0xA2,0x30,0x0A,0xAA,0x88,0xE2, + 0x03,0x31,0xC2,0x30,0xC2,0xBA,0xBA,0x6E,0x03,0x31,0xC2,0x28,0xAA,0xBA,0x7F,0x5F, + 0x03,0x31,0xC2,0x28,0x7E,0x2A,0x88,0x02,0x03,0x31,0xC2,0x30,0x6A,0xE2,0x7C,0xB8, + 0x03,0x31,0xC2,0x28,0x8B,0xCB,0xF9,0x8E,0x23,0x39,0xC3,0x30,0xBC,0xFF,0x7F,0x5F, + 0x03,0x31,0xC2,0x30,0xE2,0x3F,0x8B,0xAB,0x03,0x31,0xC2,0x28,0x02,0x02,0x23,0x7B, + 0x03,0x39,0xE3,0x30,0xFA,0xEF,0x1E,0xDB,0x24,0x39,0xC2,0x30,0xB9,0xF7,0xFC,0xE0, + 0x03,0x39,0xC2,0x30,0xA2,0xEB,0xAB,0xAA,0xE3,0x30,0xA2,0x30,0x08,0x28,0x2A,0x8F, + 0x24,0x41,0xE3,0x30,0xD7,0xAC,0xAA,0x80,0x24,0x39,0xE3,0x30,0x7B,0xBB,0xAE,0xAF, + 0x24,0x39,0xE3,0x30,0x03,0x2A,0x5F,0x9F,0x44,0x41,0xE3,0x30,0x2A,0x2A,0xA7,0x95, + 0x64,0x41,0x03,0x39,0xFA,0xD8,0x5F,0xF7,0x24,0x39,0x03,0x39,0x74,0xF4,0x54,0x57, + 0x23,0x39,0xC3,0x30,0xE2,0x9A,0xEE,0xBB,0x24,0x39,0xE3,0x38,0x27,0xAF,0xAA,0xAA, + 0x24,0x39,0xE3,0x38,0xFA,0xA2,0xEB,0xFF,0x44,0x39,0xE3,0x38,0x5F,0xFF,0x7E,0xFD, + 0x24,0x39,0x03,0x39,0x54,0x6D,0xF9,0xDD,0x23,0x39,0xE3,0x30,0xFE,0xD8,0xA8,0xB6, + 0x03,0x39,0xE3,0x30,0xA9,0xE5,0x17,0x74,0x24,0x39,0xE3,0x30,0x5E,0x15,0x0F,0xB5, + 0x44,0x39,0xE3,0x30,0xF5,0xE9,0xFF,0xE3,0x24,0x39,0xC2,0x28,0x3A,0xB8,0xAE,0x9A, + 0x23,0x39,0xC3,0x28,0xDF,0xFF,0x2A,0x0A,0x23,0x39,0xE3,0x30,0xFF,0xFB,0xFC,0x68, + 0xE4,0x38,0x23,0x31,0xEF,0xEA,0xFB,0xAB,0x23,0x39,0xE3,0x30,0xD7,0xFF,0xEC,0xBB, + 0x23,0x39,0xC2,0x30,0x8D,0xAE,0xEE,0xFE,0x03,0x31,0xC3,0x30,0xF8,0xF8,0xBB,0x87, + 0x03,0x31,0xC2,0x28,0xF7,0xA7,0x09,0x03,0x03,0x31,0xC2,0x28,0xF7,0xFE,0x0A,0xF8, + 0xE2,0x30,0xC2,0x28,0x56,0xD7,0xD7,0x57,0xE2,0x28,0xA2,0x28,0xAB,0x80,0xEA,0x8A, + 0x03,0x31,0xC2,0x28,0xD9,0xFB,0x6F,0x75,0x03,0x31,0x81,0x20,0x72,0xE2,0xEA,0xAB, + 0xC2,0x28,0x81,0x20,0x78,0x3E,0x2A,0x00,0xE3,0x30,0x81,0x20,0xA9,0x63,0xCA,0xBB, + 0xA2,0x28,0x81,0x20,0xEB,0x2B,0xEA,0xA0,0xA2,0x28,0x82,0x20,0x3F,0xAF,0xBA,0xFA, + 0xA2,0x28,0x61,0x20,0xAF,0xD7,0xFF,0xF2,0xC2,0x28,0x61,0x20,0x8A,0xBB,0xF7,0x7F, + 0xE3,0x30,0x81,0x20,0x2B,0xB7,0xBD,0xD5,0xE3,0x30,0xA2,0x28,0x20,0x02,0xDB,0x5F, + 0x03,0x31,0xA2,0x28,0x2A,0xAA,0x9F,0xF5,0x24,0x39,0xC2,0x28,0x3A,0xBA,0xED,0xD5, + 0x24,0x39,0xE3,0x30,0x67,0xF7,0x35,0xFF,0x04,0x31,0xE3,0x30,0x7D,0x67,0x1D,0x57, + 0x03,0x31,0xC2,0x28,0x7E,0xA8,0xAE,0xB5,0x03,0x31,0xC2,0x28,0xF5,0xAF,0x2A,0x88, + 0x44,0x39,0xE2,0x30,0xCF,0xBD,0x8F,0x2D,0x23,0x39,0xE2,0x30,0xAF,0xAE,0xCA,0x28, + 0x24,0x39,0xC2,0x28,0x80,0xE2,0xEA,0x60,0x03,0x39,0x82,0x28,0x02,0x80,0xAB,0xB5, + 0x03,0x31,0xC2,0x28,0x5E,0x27,0xA5,0x95,0x03,0x31,0xC2,0x28,0x2F,0x9F,0xF7,0xFE, + 0x03,0x31,0xC2,0x28,0x88,0x2E,0x3E,0x3F,0x44,0x39,0xE3,0x30,0xBF,0xFD,0xAF,0x2F, + 0xA5,0x49,0x23,0x39,0xBD,0x2D,0x2F,0x2B,0xC5,0x51,0x85,0x49,0xB1,0x0B,0xA8,0x02, + 0x06,0x5A,0xC6,0x51,0x9D,0xB5,0x23,0x32,0x27,0x62,0xC6,0x59,0x0B,0xFB,0x6A,0xBA, + 0x27,0x62,0xC6,0x51,0x80,0xB8,0xEA,0x2A,0x47,0x62,0x07,0x62,0xAA,0xAE,0x2F,0x39, + 0x68,0x6A,0x27,0x62,0x0E,0xBE,0xDF,0xAA,0x88,0x6A,0x48,0x6A,0xDC,0xEE,0x97,0xBD, + 0xC9,0x72,0x48,0x6A,0xBF,0x2F,0xBF,0xDF,0xEA,0x7A,0xA9,0x72,0xBB,0xEB,0x7F,0xD6, + 0xEA,0x7A,0x88,0x6A,0x5E,0x7B,0x7F,0x2B,0xE9,0x7A,0x88,0x6A,0xE5,0x89,0xE0,0xAE, + 0xE9,0x7A,0x88,0x72,0xF2,0xE5,0xB5,0xAC,0xEA,0x7A,0x89,0x72,0x5B,0xFF,0xBE,0x8E, + 0xC9,0x7A,0x88,0x72,0xB0,0xFA,0xD2,0xA0,0xE9,0x7A,0x88,0x72,0xAE,0xAD,0xBF,0xFF, + 0xEA,0x7A,0x88,0x72,0xAB,0xEA,0x72,0x62,0xE9,0x7A,0xA8,0x72,0xFA,0xEE,0xF9,0x29, + 0x0A,0x83,0xA9,0x72,0x29,0xCB,0xA2,0xEB,0x2A,0x83,0xC9,0x7A,0xEB,0xAA,0x2F,0xBD, + 0x0A,0x83,0xC9,0x7A,0x54,0x3A,0xAA,0xFA,0x0A,0x83,0xC9,0x7A,0x57,0xA8,0xA8,0xF7, + 0x2A,0x83,0xA9,0x7A,0xB7,0xA3,0xAA,0xB2,0x2A,0x83,0xC9,0x7A,0x75,0xFF,0xA2,0xA2, + 0x0A,0x83,0xA9,0x72,0xBE,0xBA,0x5E,0x7C,0x0A,0x83,0xA9,0x72,0xFF,0xA2,0xFA,0x5B, + 0x0B,0x83,0xCA,0x7A,0xEA,0xFF,0xFD,0xFD,0xEA,0x7A,0xA9,0x72,0x20,0x22,0xDA,0xA0, + 0x2A,0x83,0xA9,0x72,0x8A,0xEF,0x7F,0x7E,0x2B,0x83,0xA9,0x72,0xAA,0x2D,0xBF,0xF7, + 0x2A,0x83,0xC9,0x7A,0xB2,0xB8,0xFE,0xDF,0x4B,0x8B,0xEA,0x7A,0xCB,0x21,0x8E,0x5D, + 0x4B,0x83,0xE9,0x7A,0xFE,0xDE,0xAB,0x7B,0x0A,0x83,0xC9,0x7A,0xB0,0xFF,0xBA,0xF6, + 0x03,0x41,0xA1,0x30,0xB0,0xF2,0xBA,0x8B,0xE2,0x38,0xA1,0x30,0xBC,0xFB,0x28,0xBC, + 0x03,0x41,0xC2,0x38,0x55,0x5E,0xEA,0xAF,0x23,0x41,0xC2,0x38,0x75,0x3D,0xBD,0x9E, + 0x23,0x41,0xC2,0x38,0xAD,0xE7,0x26,0xAF,0x23,0x41,0xE2,0x38,0xD7,0xD7,0x5E,0xB8, + 0x02,0x39,0xC2,0x38,0x6A,0xEA,0x68,0xA8,0x02,0x39,0xC2,0x38,0xFF,0x6F,0x5A,0x7C, + 0x22,0x41,0xC2,0x38,0x5B,0x5D,0x7D,0x7F,0x03,0x41,0xA1,0x30,0x8B,0xAB,0xFD,0xE5, + 0x03,0x41,0xC2,0x38,0xF4,0x5A,0x5B,0x7A,0x23,0x39,0xC2,0x38,0xBD,0xD7,0xFD,0x5F, + 0x03,0x39,0xA1,0x30,0x2A,0xAF,0xE6,0xEA,0xE2,0x38,0xC2,0x38,0x08,0x2A,0xCA,0x7B, + 0x02,0x39,0xC2,0x38,0xFB,0xF7,0x7F,0xEB,0xE2,0x38,0xC2,0x30,0xAC,0x0E,0xC9,0x4F, + 0xE2,0x38,0xC2,0x38,0x08,0x02,0xA2,0x20,0x03,0x41,0xC2,0x38,0xAA,0xDE,0xF9,0x4F, + 0x03,0x41,0xC2,0x38,0xFC,0xF8,0xFA,0xFD,0x03,0x39,0xC2,0x38,0xFA,0xBB,0xDF,0xD5, + 0x03,0x41,0xA2,0x38,0xFA,0x7A,0xFE,0xB8,0xE2,0x38,0xA2,0x30,0xA2,0x9B,0xBC,0x3C, + 0x03,0x41,0xC2,0x38,0xAB,0xAA,0xBA,0xE7,0x67,0x72,0x02,0x41,0x0D,0x2D,0xAD,0x35, + 0x87,0x72,0x06,0x62,0x78,0x68,0x6A,0xEA,0x06,0x6A,0x63,0x49,0xE0,0xE8,0xFC,0x7E, + 0x84,0x51,0x23,0x41,0x7C,0xFE,0x7E,0xCB,0x23,0x41,0xE2,0x30,0xFE,0xFC,0x7C,0x5C, + 0x03,0x39,0xC2,0x30,0xA0,0xFE,0xAF,0xE7,0x03,0x39,0xC2,0x30,0xF5,0xD5,0xAB,0xBD, + 0x03,0x39,0xC2,0x30,0xCB,0x6F,0xEA,0xCB,0xE3,0x30,0xC2,0x28,0xE0,0xFC,0xB0,0xE0, + 0x03,0x31,0xA2,0x28,0xBB,0xAE,0xFE,0x58,0xE3,0x30,0xC2,0x28,0xBC,0xF6,0x3D,0x09, + 0x24,0x39,0xC2,0x30,0x2A,0x8B,0xE7,0xFF,0x23,0x39,0xA2,0x28,0xA2,0xFB,0xF7,0xF7, + 0x03,0x31,0xC2,0x30,0xA6,0xAE,0x8B,0xAB,0x03,0x31,0xC2,0x30,0xDA,0x50,0xF2,0xAA, + 0xE3,0x30,0xC2,0x28,0x2A,0x2F,0xBC,0x28,0x23,0x39,0xC2,0x28,0xFF,0xFF,0xFB,0xA2, + 0x03,0x31,0xC2,0x30,0x0B,0x2B,0x2F,0x0A,0x23,0x39,0xE3,0x30,0x7A,0x7A,0xDF,0xD7, + 0x03,0x39,0xE3,0x30,0x8B,0xEB,0xF2,0xD2,0x03,0x39,0xC2,0x30,0xA8,0x38,0xFF,0x6F, + 0x24,0x39,0xC2,0x30,0xA0,0xFA,0x7F,0xED,0x24,0x39,0xE3,0x30,0xCF,0xE5,0xFF,0xF7, + 0x24,0x39,0xE3,0x30,0x8B,0x8B,0x8E,0x9C,0x24,0x39,0xE3,0x30,0x3F,0x2F,0xB3,0xFA, + 0x44,0x41,0xE2,0x30,0xB2,0xF8,0xEE,0x7D,0x43,0x39,0xE2,0x38,0xFA,0xAA,0xAA,0xBF, + 0x44,0x41,0x03,0x39,0xBD,0xAB,0xAD,0xF7,0x44,0x41,0x03,0x39,0x77,0x7E,0xB7,0x68, + 0x44,0x41,0xE3,0x38,0x7F,0x4A,0xEA,0xFF,0xE3,0x38,0x23,0x31,0xEF,0xAA,0xAE,0xAF, + 0x03,0x39,0xC3,0x30,0x00,0xE2,0xDA,0xA3,0x24,0x41,0xE3,0x30,0xAF,0xBF,0xA9,0x8A, + 0x24,0x39,0xC2,0x30,0xFA,0xFE,0xBE,0x7C,0x24,0x39,0xC2,0x30,0xAD,0xEB,0xAA,0xE2, + 0x24,0x39,0xE3,0x30,0x63,0x7B,0x7F,0xED,0x03,0x31,0xC2,0x30,0x00,0xAB,0xAD,0xEA, + 0x43,0x39,0xE2,0x30,0xBD,0xEA,0xAC,0xEB,0x23,0x39,0x03,0x31,0x4C,0x50,0x70,0x5A, + 0x24,0x39,0xE3,0x30,0x5F,0xFF,0xEB,0xA8,0x03,0x31,0xE2,0x30,0xC1,0xFA,0xF7,0x5E, + 0x24,0x39,0xE3,0x30,0xBF,0xFF,0xEB,0xCB,0x03,0x39,0xA2,0x28,0x22,0x28,0x2A,0x2B, + 0x44,0x39,0xE3,0x30,0x75,0x77,0x7C,0xFA,0x03,0x31,0xC2,0x30,0xC2,0xEE,0xDE,0x8A, + 0x03,0x31,0xC2,0x28,0x5D,0xFD,0xFF,0xA0,0x03,0x31,0xC2,0x28,0x55,0x57,0xB7,0x1F, + 0x03,0x31,0xC2,0x28,0xD5,0xF5,0xBA,0x20,0x24,0x31,0xC2,0x28,0x5F,0x5B,0x73,0x6F, + 0xE3,0x30,0xC2,0x28,0xDD,0xF7,0x55,0x7F,0xE3,0x28,0xA2,0x28,0x7A,0xD8,0xAA,0xAB, + 0xC2,0x28,0xA2,0x20,0x5A,0xEB,0x0B,0x8F,0xC2,0x28,0xA2,0x20,0x7F,0xEC,0xEB,0xB7, + 0xC2,0x28,0x82,0x20,0x5A,0x5A,0xDC,0xFA,0xC3,0x28,0x82,0x20,0x5D,0x57,0xFC,0xAA, + 0xC2,0x20,0x61,0x18,0xF7,0xFF,0xBA,0xA2,0xA2,0x28,0x81,0x20,0x0F,0x15,0xF7,0x78, + 0xA2,0x28,0x61,0x20,0x2A,0xBA,0xBB,0xBF,0xE2,0x30,0x82,0x20,0xBA,0x2F,0xFB,0xF5, + 0x03,0x31,0xA2,0x28,0x3A,0xBE,0x5F,0xD5,0x03,0x31,0xA2,0x28,0x22,0x2C,0x2E,0xBD, + 0xE3,0x30,0xA2,0x28,0xA8,0x80,0xF8,0x5F,0x03,0x31,0xA2,0x28,0x8C,0x8E,0x57,0x55, + 0x44,0x39,0xA2,0x28,0x2B,0xAF,0xAF,0xFD,0x65,0x41,0x03,0x31,0xBE,0xE8,0xE3,0x7D, + 0x24,0x39,0xC2,0x28,0xE8,0x78,0x5E,0x5E,0xE3,0x30,0xA2,0x28,0xE3,0xC2,0xBF,0x8B, + 0x03,0x31,0xC2,0x28,0xEF,0x8A,0xAB,0x3F,0x23,0x39,0xC2,0x28,0xDF,0xF7,0xE2,0xAB, + 0x23,0x39,0xE3,0x30,0xF7,0xAF,0xAF,0x0D,0xA5,0x49,0x03,0x39,0xA5,0x25,0xAF,0x2B, + 0x06,0x5A,0x65,0x41,0xAD,0x8B,0xAB,0xEA,0x06,0x5A,0xA5,0x51,0xAB,0x2E,0x09,0xA2, + 0xC6,0x59,0x05,0x52,0xAB,0xEE,0xFB,0xEA,0x27,0x62,0xC5,0x59,0xA7,0xAD,0x8B,0xA2, + 0x48,0x6A,0xE6,0x59,0xBA,0xFD,0xDB,0x82,0x88,0x6A,0x06,0x5A,0xD7,0xD7,0xDF,0xAA, + 0xA9,0x72,0x47,0x62,0xEF,0x2D,0xAD,0x3B,0x89,0x6A,0x48,0x6A,0xFA,0xA0,0x82,0x8B, + 0x88,0x6A,0x48,0x6A,0xAF,0xAA,0xAA,0xDF,0xCA,0x7A,0x68,0x6A,0x8B,0x03,0x2B,0xBD, + 0xE9,0x7A,0x68,0x6A,0x22,0xFB,0xFA,0xF7,0xE9,0x7A,0xA9,0x72,0xFD,0xBB,0xAF,0xD5, + 0xE9,0x7A,0x68,0x6A,0xBA,0x9F,0xFE,0xA8,0xC9,0x7A,0x68,0x6A,0x80,0x28,0xEA,0xFC, + 0xE9,0x7A,0x88,0x72,0x63,0xB2,0x03,0xAF,0xE9,0x7A,0x88,0x72,0xFF,0xBD,0x2B,0x00, + 0xEA,0x7A,0x88,0x72,0x8A,0xBA,0x6A,0x7C,0xE9,0x7A,0xA9,0x72,0x82,0x0B,0xAF,0x6D, + 0xE9,0x7A,0xA8,0x72,0x79,0x7A,0xA2,0xEA,0xE9,0x7A,0xA9,0x72,0xB8,0xE4,0xC0,0xB0, + 0xC9,0x7A,0x88,0x72,0xBC,0xDB,0xBB,0x7E,0xC9,0x7A,0x88,0x72,0x2B,0x2B,0xAF,0x15, + 0x0A,0x83,0xA9,0x72,0x22,0xBF,0xF9,0xFF,0x2B,0x83,0x88,0x72,0xA8,0xA3,0xBD,0xDF, + 0xEA,0x7A,0xA8,0x72,0xB8,0xFE,0xBC,0xAA,0xEA,0x7A,0x88,0x72,0xD2,0xBA,0xAA,0xA8, + 0x2B,0x83,0xC9,0x7A,0xFD,0x5D,0xB7,0xD5,0x0A,0x83,0xA9,0x72,0x20,0xB6,0x9E,0xA2, + 0x2B,0x83,0xC9,0x7A,0x5E,0xBF,0x3F,0xAD,0x2B,0x83,0xA8,0x7A,0x7B,0x2A,0x22,0x8A, + 0x0A,0x83,0xA8,0x72,0x89,0x2F,0xAB,0x8E,0x0A,0x83,0xC9,0x7A,0xC0,0xAA,0x00,0xBE, + 0xEA,0x82,0x0A,0x7B,0xEF,0xF5,0x6A,0xEF,0x2A,0x83,0xEA,0x7A,0x9E,0xB6,0x76,0x73, + 0x03,0x41,0xA1,0x30,0xA8,0xBC,0x76,0xD6,0x23,0x41,0xC2,0x38,0xE5,0x5D,0xEF,0xEF, + 0x03,0x41,0xA1,0x30,0xAF,0x39,0x0E,0x2A,0x03,0x39,0xC2,0x38,0xAA,0x2B,0x3D,0x96, + 0x03,0x41,0xC2,0x38,0x03,0xAB,0xA8,0x78,0x03,0x41,0xC2,0x38,0x28,0xBA,0x16,0xD5, + 0x02,0x41,0xE2,0x38,0xB2,0x38,0x5E,0x5E,0x03,0x41,0xA1,0x30,0xFE,0xF8,0xAA,0x2A, + 0xE2,0x38,0xA1,0x30,0xFF,0xDF,0xBE,0xE8,0x03,0x41,0xA1,0x30,0x29,0xAB,0xEB,0xFB, + 0xE2,0x38,0xA1,0x30,0xA0,0x2A,0xBE,0x0A,0x02,0x41,0xE2,0x38,0x5F,0x57,0x85,0xDD, + 0x03,0x41,0xA1,0x30,0xEA,0x7E,0x7A,0x82,0x23,0x41,0xC2,0x38,0x7B,0x5F,0x5D,0x7F, + 0x22,0x41,0xC2,0x38,0xD5,0xD7,0x77,0x7F,0xE2,0x38,0xA1,0x30,0xFC,0xFE,0xBC,0xA2, + 0x02,0x41,0xC2,0x38,0x55,0xED,0x83,0x68,0x03,0x39,0xC2,0x38,0xEB,0xEB,0x2B,0x4F, + 0x03,0x39,0xC2,0x38,0xD7,0xFB,0xAA,0xD6,0x02,0x41,0xA1,0x30,0xFE,0xFA,0xF8,0xB9, + 0xE2,0x38,0xA2,0x30,0x3A,0xAB,0xEA,0xAC,0xE2,0x38,0xA2,0x30,0x78,0xB9,0xA8,0x8A, + 0xE2,0x38,0xA1,0x30,0x8A,0x88,0xFF,0x5A,0x26,0x6A,0xC1,0x30,0x3D,0x35,0xB5,0xB5, + 0x66,0x6A,0xC5,0x59,0xA0,0xE2,0x7A,0x7A,0xE5,0x59,0x84,0x51,0x5C,0x7C,0xF7,0xEB, + 0xA4,0x51,0x64,0x49,0x6F,0x5E,0x5E,0xE2,0x64,0x49,0xE2,0x30,0x54,0x5E,0xD6,0xDF, + 0x23,0x39,0xC2,0x30,0xE5,0xC9,0xA8,0xE0,0x03,0x39,0xC2,0x30,0xAE,0xA7,0xCF,0xAF, + 0x24,0x31,0xC2,0x30,0xE7,0xDD,0xF7,0xDF,0x03,0x31,0xC2,0x30,0xAC,0xF0,0x56,0xD7, + 0x03,0x31,0xA2,0x28,0xD8,0xBE,0xFF,0xFF,0xE3,0x30,0xC2,0x28,0x2A,0x28,0xAE,0xFD, + 0xE3,0x30,0xC2,0x28,0x2C,0x2F,0x3A,0xAB,0x02,0x31,0xC2,0x28,0xD7,0xCF,0xEA,0xAB, + 0x03,0x31,0xE3,0x30,0x55,0xE7,0xBD,0x8D,0x03,0x39,0xA2,0x28,0xAA,0xE3,0xAA,0x82, + 0x03,0x31,0xE3,0x30,0x15,0x55,0x7D,0x7F,0x23,0x39,0xE3,0x30,0x62,0xF7,0x57,0x55, + 0x03,0x31,0xC2,0x28,0x08,0xFA,0xF6,0x7D,0x03,0x31,0xE2,0x30,0xD5,0xDE,0xF5,0xE5, + 0x03,0x31,0xC2,0x30,0xA3,0xA2,0x2A,0x2B,0x03,0x31,0xE2,0x30,0xCF,0xAA,0x0F,0x28, + 0x03,0x39,0xC3,0x30,0x89,0xC8,0x88,0xE8,0x03,0x39,0xA2,0x28,0x2F,0xBA,0xEE,0x2E, + 0x03,0x31,0xC2,0x30,0xA8,0x30,0x5F,0xFF,0x03,0x39,0xE3,0x30,0xE2,0xAA,0xED,0x73, + 0x24,0x39,0xE3,0x30,0xF3,0x79,0xFF,0xBD,0x23,0x39,0xE3,0x30,0xAA,0xF3,0xD7,0xD8, + 0x23,0x39,0xE3,0x30,0x22,0x2E,0x3F,0x2E,0x24,0x39,0xE2,0x30,0xA0,0x7A,0x7E,0x8A, + 0x23,0x39,0xE3,0x30,0xE8,0xE3,0x6A,0x6A,0x24,0x39,0xC2,0x38,0xAA,0xA8,0x8A,0xA9, + 0x23,0x39,0xE3,0x38,0xDF,0x58,0xF8,0xF6,0x24,0x39,0xC3,0x38,0x02,0x8B,0xAA,0x8A, + 0x44,0x41,0xC3,0x30,0xFE,0xDA,0xFA,0x22,0x24,0x39,0xC2,0x30,0xB3,0xDF,0xBE,0xCC, + 0x44,0x39,0xE3,0x30,0xED,0xED,0xF5,0x87,0x44,0x39,0x03,0x31,0x7E,0xFA,0xEE,0xAB, + 0x03,0x31,0xC2,0x30,0xE2,0xA2,0x00,0xA0,0x03,0x31,0xC2,0x30,0x08,0x2A,0x3E,0x3E, + 0x44,0x39,0xE2,0x30,0xA7,0x2B,0xAB,0xFB,0x24,0x39,0xE2,0x30,0xDC,0xB8,0x28,0xAA, + 0x24,0x39,0xE3,0x30,0xEA,0xF8,0xA8,0x00,0x24,0x39,0xC2,0x30,0xBD,0x23,0x00,0xA0, + 0x24,0x39,0xE3,0x30,0x27,0x3C,0xA0,0xAE,0x24,0x39,0xE3,0x30,0xFE,0x5E,0x7A,0xB2, + 0x23,0x39,0xE3,0x30,0x5E,0xEE,0xF8,0xC8,0x23,0x39,0xC2,0x28,0xFF,0xEF,0xFE,0xD2, + 0x03,0x31,0xC2,0x28,0xBB,0x3F,0xB6,0x2A,0x24,0x39,0xC2,0x30,0xFE,0xFA,0xF2,0x7A, + 0xE3,0x30,0xC2,0x28,0x5A,0x2A,0x0D,0x3D,0x03,0x31,0xC2,0x28,0x57,0x7E,0xFE,0x34, + 0x03,0x31,0xA2,0x20,0x6F,0xFF,0xAB,0xA8,0x03,0x31,0xC2,0x28,0x55,0xDD,0xF7,0x4B, + 0xE3,0x28,0xA2,0x20,0x57,0x9E,0xEA,0x00,0xE3,0x28,0xA2,0x28,0xFD,0xFF,0xF3,0xF3, + 0xC2,0x28,0xA2,0x20,0x97,0xA5,0x05,0x0E,0xC3,0x28,0x81,0x20,0xFE,0xE0,0x00,0x80, + 0xC2,0x28,0x82,0x20,0x55,0xD5,0xDB,0xA8,0xC3,0x28,0x82,0x20,0xFD,0xF5,0xB7,0x2B, + 0xC2,0x28,0x82,0x20,0xF7,0xD5,0xF7,0xAE,0xC3,0x28,0x81,0x20,0xAA,0x6F,0xBA,0xFC, + 0xA2,0x28,0x82,0x20,0xDF,0xFF,0xBF,0xBC,0xC2,0x28,0x82,0x20,0xFF,0x2F,0x2F,0x3E, + 0xE2,0x28,0xA2,0x28,0xAB,0xA7,0xF5,0xD5,0x03,0x31,0xC2,0x28,0x03,0x3B,0xA7,0xBD, + 0x03,0x31,0xA2,0x28,0x72,0xEA,0xBA,0xFA,0x03,0x31,0xA2,0x28,0xEF,0x35,0x3F,0x3E, + 0x24,0x39,0xC2,0x28,0xFF,0x9F,0x9F,0x3F,0x24,0x39,0x03,0x31,0x55,0xB5,0x3F,0x2A, + 0x85,0x41,0xE2,0x30,0xAD,0xA9,0x2F,0x2A,0xC6,0x51,0x63,0x41,0xBF,0xEA,0x09,0x02, + 0x06,0x5A,0xC6,0x51,0xA9,0xEB,0xB2,0x3E,0x06,0x5A,0xC5,0x51,0xF8,0xAA,0x92,0xE2, + 0x06,0x5A,0xA5,0x51,0xEB,0xB7,0xBF,0xA8,0x48,0x6A,0xE6,0x59,0xEF,0xB5,0x3B,0xAD, + 0x68,0x6A,0x06,0x5A,0xE9,0xA5,0xAF,0x2F,0x88,0x72,0x27,0x62,0xAF,0x29,0x25,0xF3, + 0xA9,0x72,0x68,0x6A,0x2E,0xAA,0xAA,0xF6,0xEA,0x7A,0x68,0x6A,0xFD,0xFF,0xF5,0xE3, + 0xCA,0x72,0x48,0x6A,0x5E,0x7F,0xEA,0x8A,0xC9,0x72,0x68,0x6A,0x2D,0xAE,0x23,0xC2, + 0xC9,0x7A,0x68,0x6A,0xEB,0xCA,0xB8,0x9A,0xC9,0x72,0x67,0x6A,0x8B,0xAF,0x57,0xFE, + 0xEA,0x7A,0x68,0x6A,0x83,0xA5,0xFD,0x7F,0xC9,0x7A,0x67,0x6A,0xB8,0xAF,0x37,0xAD, + 0xC9,0x7A,0x67,0x6A,0xAC,0x2F,0x6A,0x7E,0x0A,0x83,0xA9,0x72,0x8B,0xEF,0x7F,0xF5, + 0x0A,0x83,0xA8,0x72,0x78,0xFB,0xB5,0xFD,0x0B,0x83,0x88,0x72,0xFD,0x7F,0x68,0xBB, + 0xE9,0x7A,0x88,0x72,0xA8,0xF5,0xDD,0x63,0xE9,0x7A,0x88,0x72,0xB0,0xAA,0xAB,0xDF, + 0xE9,0x7A,0x88,0x72,0x7E,0xFE,0xAF,0x29,0xE9,0x7A,0x88,0x72,0x95,0xF7,0x7C,0x6E, + 0xEA,0x7A,0xA9,0x72,0xEB,0xCA,0x8D,0x6D,0xC9,0x7A,0x68,0x72,0x9A,0xF2,0xE8,0xAA, + 0xE9,0x7A,0x88,0x72,0xAB,0xFD,0x2D,0x0D,0xEA,0x7A,0x89,0x72,0xA2,0x82,0xF0,0xD0, + 0xEA,0x7A,0xA9,0x72,0xBF,0xBE,0xB7,0xF5,0xEA,0x7A,0x88,0x72,0x82,0x5A,0xB6,0xAA, + 0x0B,0x7B,0xA9,0x72,0xBD,0xDD,0xBE,0xF8,0x2B,0x83,0xA9,0x72,0x2A,0xEE,0xFF,0xFF, + 0x0A,0x83,0xA9,0x72,0xA2,0xF2,0xFD,0xB5,0x4B,0x83,0xC9,0x7A,0xFD,0xFF,0x35,0xA7, + 0x2B,0x83,0xE9,0x7A,0xFF,0xF7,0xDC,0x7F,0x2B,0x83,0xE9,0x7A,0xFA,0xF5,0xCD,0x7D, + 0xE2,0x38,0xA1,0x30,0x98,0x08,0x02,0x8A,0x03,0x41,0xC2,0x38,0xA9,0xF8,0x0A,0xAB, + 0x03,0x41,0xC2,0x38,0xFF,0xFF,0x0F,0x8B,0x03,0x41,0xA1,0x30,0xE6,0xBA,0xAA,0xA2, + 0x03,0x41,0xC2,0x38,0x7E,0x7F,0xCF,0xCB,0x02,0x39,0xA2,0x30,0x27,0x3B,0xAF,0x2F, + 0x03,0x41,0xC2,0x38,0xFA,0xFE,0xFC,0xF6,0x03,0x41,0xC2,0x38,0xB7,0x95,0x2F,0xAB, + 0x23,0x41,0xC2,0x38,0x5A,0x78,0xA8,0xFA,0xE2,0x38,0xA1,0x30,0x21,0xA0,0x8A,0x82, + 0x03,0x41,0xA1,0x30,0x2C,0xA2,0xAE,0xFD,0x23,0x39,0xC2,0x38,0xDF,0xFF,0xF5,0x45, + 0xE2,0x38,0xC2,0x38,0x00,0x0A,0x9E,0x7F,0x03,0x41,0xC2,0x38,0xDB,0x7B,0xAB,0xFF, + 0x23,0x41,0xC1,0x30,0x7B,0xFF,0xFF,0xBD,0x03,0x39,0xC2,0x38,0x5A,0x7E,0x06,0x8F, + 0x02,0x39,0xA1,0x30,0x62,0xFA,0xD2,0x7A,0xE2,0x38,0xC1,0x38,0xA9,0x43,0xCD,0x27, + 0xA2,0x38,0xE3,0x30,0xBA,0xFB,0xEA,0xAA,0x03,0x41,0xA1,0x30,0xBD,0x97,0xAE,0x2E, + 0x03,0x41,0xC2,0x38,0x5F,0x7B,0x5E,0x58,0xE2,0x38,0xA2,0x30,0x2E,0xA9,0x43,0x7B, + 0xC2,0x30,0x81,0x30,0xB8,0xB8,0xFF,0xAB,0x83,0x49,0xC2,0x30,0x25,0x35,0xB5,0x95, + 0x27,0x62,0xA5,0x59,0xE8,0xE9,0xAE,0xBD,0xE5,0x59,0x84,0x51,0xAA,0x28,0xEA,0x68, + 0xC5,0x51,0x22,0x41,0xFA,0x78,0xFA,0x82,0x23,0x41,0xC2,0x30,0xAA,0xAF,0xBC,0x98, + 0x23,0x39,0xC2,0x30,0xEA,0xEA,0x2A,0xFE,0x23,0x39,0xE2,0x30,0x57,0xEE,0xFE,0xBB, + 0x03,0x31,0xC2,0x28,0xEA,0x5A,0xB8,0xA8,0x03,0x31,0xC2,0x28,0x7E,0xBB,0xBE,0x20, + 0xE3,0x30,0xC2,0x28,0xD5,0xEF,0xFC,0x5C,0x03,0x31,0xC2,0x28,0xF7,0xEF,0x86,0xAB, + 0x23,0x39,0xC2,0x28,0x5F,0xFF,0x9F,0x25,0x03,0x31,0xC2,0x28,0xBD,0xB7,0xF8,0xC8, + 0x03,0x31,0xA2,0x28,0x8A,0x8A,0xBE,0x9E,0x03,0x31,0xA3,0x28,0xA2,0x20,0x80,0xA8, + 0x03,0x31,0xE3,0x30,0x55,0x5E,0x56,0xD5,0x23,0x31,0xC3,0x30,0xEF,0xEF,0xA7,0x36, + 0x23,0x39,0xC2,0x28,0xF5,0xFF,0xAE,0xF8,0x03,0x31,0xE3,0x30,0xED,0x33,0x98,0x97, + 0x03,0x31,0xC2,0x28,0x9A,0xFE,0xEE,0xAE,0x03,0x31,0xC2,0x28,0x00,0xE6,0xEB,0xEE, + 0x03,0x31,0xC3,0x30,0xAA,0xAB,0xA5,0xAF,0x24,0x39,0xC2,0x30,0x2F,0xBE,0x7A,0x76, + 0x24,0x39,0xC2,0x28,0xFB,0xB2,0xFB,0xA1,0x24,0x39,0xE3,0x30,0xFA,0xEF,0xCB,0x20, + 0x44,0x39,0xE3,0x30,0x3D,0xBD,0xFD,0xF7,0x44,0x39,0x03,0x39,0xDF,0xDA,0xDF,0x55, + 0x23,0x39,0xE3,0x38,0xA8,0xEB,0xEF,0x7F,0x23,0x39,0xE3,0x38,0x8A,0x8F,0x27,0xEF, + 0x03,0x39,0xC2,0x30,0x8E,0x6C,0xFC,0xE0,0x23,0x41,0xE3,0x30,0x7D,0xFD,0xA8,0xA2, + 0x03,0x39,0xE2,0x30,0xA7,0x16,0x5C,0xDC,0x64,0x41,0x03,0x39,0x55,0xDC,0x5D,0xED, + 0x45,0x41,0xE3,0x30,0xAA,0xFA,0x70,0x6A,0x23,0x39,0xE3,0x38,0x7B,0x4B,0x2F,0xBF, + 0x23,0x39,0xE3,0x30,0x0B,0xE3,0xE8,0xAA,0x23,0x39,0xE2,0x30,0x82,0x02,0x23,0xB5, + 0x24,0x39,0xE3,0x30,0x8F,0xC0,0x80,0xAA,0x23,0x39,0xE2,0x30,0xB7,0xFF,0xD9,0x6D, + 0x03,0x39,0xE2,0x30,0xF8,0xC0,0x78,0x4F,0x03,0x39,0xE3,0x30,0x95,0xD5,0xF5,0xEF, + 0x45,0x41,0xC2,0x30,0x08,0x8A,0x9F,0x57,0x24,0x39,0xE3,0x38,0x80,0xAA,0xFE,0x6F, + 0x24,0x39,0xE3,0x30,0xAA,0x62,0x7A,0xBA,0x23,0x39,0xE3,0x30,0xAF,0xA2,0xBA,0x98, + 0x23,0x39,0xE2,0x30,0xBE,0xDA,0x78,0xFA,0x24,0x39,0xE2,0x30,0x7A,0x7E,0xF7,0xA6, + 0x23,0x39,0xE3,0x30,0xFB,0xCA,0xA7,0x6C,0x03,0x31,0xC2,0x28,0xE0,0xC2,0x1A,0x22, + 0x44,0x39,0xE2,0x28,0xD5,0xFA,0xEA,0xFE,0x03,0x31,0xC2,0x28,0x37,0xE6,0xAA,0x83, + 0x03,0x31,0xC2,0x28,0xF6,0x8A,0x3A,0xAA,0x03,0x31,0xC2,0x28,0xE3,0xFE,0xBA,0x22, + 0x03,0x31,0xC3,0x28,0x7A,0xFD,0xFF,0xEA,0xE3,0x30,0xA2,0x28,0xFB,0x3E,0xEF,0xF7, + 0xE3,0x30,0xA2,0x28,0xBA,0xB2,0x2B,0x83,0xE3,0x30,0xA2,0x28,0x7A,0xBC,0xEA,0x83, + 0xE3,0x28,0x82,0x28,0xBA,0xED,0xCD,0x8A,0xC2,0x28,0xA2,0x28,0x4E,0x20,0x03,0x8A, + 0xE3,0x30,0xA3,0x28,0xFB,0xF2,0xA8,0x2E,0x03,0x31,0xA2,0x28,0xDF,0xBA,0xFF,0x8B, + 0xE2,0x28,0xA2,0x28,0x57,0xBF,0x0A,0x82,0xE3,0x30,0xA2,0x28,0x59,0x8F,0x00,0x0A, + 0x03,0x31,0xA2,0x28,0xD5,0x9D,0xAE,0x0A,0x03,0x31,0xC2,0x28,0x9F,0x2F,0x85,0x2A, + 0x24,0x39,0xE3,0x30,0x57,0x7F,0x4F,0xFF,0x03,0x39,0xE3,0x30,0x09,0x69,0x5D,0xB5, + 0x44,0x39,0xE3,0x30,0xBF,0xAD,0xB3,0x3F,0x65,0x41,0x24,0x39,0xA9,0x03,0x0B,0xA5, + 0x07,0x5A,0x65,0x49,0x7F,0xAF,0xAF,0x0F,0x06,0x5A,0xA5,0x49,0xBD,0xE9,0xEC,0x00, + 0x06,0x5A,0xC6,0x51,0xBF,0x06,0x83,0x0E,0x27,0x62,0xC5,0x51,0x2F,0xF7,0xCE,0xA2, + 0x26,0x62,0xC5,0x51,0xBE,0x9E,0xAB,0xAB,0x47,0x62,0x07,0x62,0xF3,0xEA,0x6E,0xDD, + 0x68,0x6A,0x07,0x62,0xB5,0x25,0x07,0x22,0xA9,0x72,0x48,0x6A,0x6B,0xA2,0xFF,0xAB, + 0xA9,0x72,0x48,0x6A,0x3A,0x3D,0xFF,0xFB,0xEA,0x7A,0x68,0x6A,0xFC,0xFB,0x7B,0x7D, + 0xEA,0x7A,0x89,0x72,0x2B,0xAA,0xFD,0xF5,0xC9,0x7A,0x88,0x6A,0x0B,0xAF,0x7F,0x6E, + 0xC9,0x7A,0x47,0x62,0x6A,0xA8,0x02,0x2B,0xE9,0x7A,0x68,0x6A,0x57,0xBF,0xEE,0x0A, + 0xC9,0x72,0x88,0x72,0xE8,0xEE,0x1F,0xFA,0xEA,0x7A,0x87,0x6A,0x75,0x77,0xAA,0x2F, + 0xC8,0x7A,0x67,0x6A,0x0A,0x8D,0xA8,0xA8,0xE9,0x7A,0x68,0x72,0x23,0xAA,0xAE,0xDE, + 0xE9,0x7A,0xA9,0x72,0xF1,0x42,0x80,0xA9,0xEA,0x7A,0x88,0x72,0x3F,0xE6,0xFC,0xAF, + 0xEA,0x7A,0xA9,0x7A,0xC2,0xA3,0xA9,0x58,0x0A,0x83,0xA8,0x72,0x7F,0x7A,0x62,0xC9, + 0xE9,0x7A,0x88,0x72,0x0B,0x37,0x97,0xA3,0x09,0x7B,0xA9,0x72,0xA4,0xF2,0xEB,0xD4, + 0xC9,0x7A,0x88,0x72,0xF8,0xCE,0x6A,0x63,0xEA,0x7A,0x88,0x72,0xCB,0xBF,0xAD,0x82, + 0x0A,0x7B,0xA8,0x72,0xED,0xA7,0x8B,0xA3,0x0A,0x7B,0xC9,0x7A,0xFB,0xAA,0xEA,0xFC, + 0xEA,0x7A,0x88,0x6A,0xFA,0xF6,0x8A,0x08,0xEA,0x7A,0x68,0x6A,0x8F,0xA7,0xB7,0xEA, + 0xEA,0x7A,0xA9,0x72,0x20,0x10,0xBF,0x5E,0xEA,0x7A,0xA9,0x72,0x85,0x02,0xB2,0xFD, + 0x0A,0x83,0xA9,0x72,0x5D,0xFD,0x7F,0x8E,0x0A,0x83,0xA9,0x72,0x27,0xB7,0xDD,0xEF, + 0x2A,0x83,0xC9,0x7A,0x8E,0xCB,0xA5,0xD5,0x0A,0x83,0xC9,0x7A,0x38,0x7E,0x7E,0xBA, + 0xE2,0x38,0xC2,0x38,0x5B,0x5B,0x0A,0xC8,0x23,0x39,0xC2,0x38,0xE7,0x26,0xEF,0xAA, + 0x23,0x39,0xC2,0x38,0xFD,0xFF,0xF3,0xFB,0x02,0x39,0xC2,0x38,0xEF,0xF8,0xEA,0x9F, + 0x03,0x41,0xA1,0x30,0xA2,0xAA,0xBA,0xFE,0x03,0x41,0xC2,0x38,0xA7,0x78,0x5A,0xD7, + 0xE2,0x38,0xC2,0x38,0xD0,0xBF,0x0F,0x21,0x23,0x41,0xC2,0x38,0x6D,0xFD,0xCF,0xE3, + 0x02,0x39,0xC2,0x38,0xFA,0x4A,0xE3,0xFF,0xE2,0x38,0xA1,0x30,0x20,0xB2,0x2F,0x2E, + 0x03,0x41,0xA1,0x30,0xB7,0x8A,0xEA,0xBA,0x02,0x39,0xC2,0x38,0xAB,0x8B,0x4B,0x78, + 0xE2,0x38,0xA1,0x30,0x88,0x20,0x02,0x0B,0xE2,0x38,0xA1,0x30,0xA0,0xA0,0x60,0xE8, + 0x03,0x41,0xC2,0x38,0xEF,0xD9,0xFF,0x2F,0x02,0x39,0xC2,0x38,0xB7,0xFF,0xFF,0x68, + 0x02,0x39,0xC2,0x38,0xF6,0xDA,0xF7,0xDD,0xE2,0x38,0xA2,0x30,0x8E,0x00,0x28,0x0C, + 0x03,0x41,0xC2,0x38,0x49,0xE7,0xF5,0xD7,0x03,0x39,0xC2,0x38,0x1D,0x2F,0x29,0x08, + 0x03,0x41,0xC2,0x38,0x6E,0x7A,0x78,0x78,0xC2,0x38,0xA1,0x30,0xC0,0xFA,0xFE,0x50, + 0xE2,0x38,0xA1,0x30,0x5F,0xE5,0x25,0x35,0x85,0x51,0xA1,0x30,0xB5,0xB5,0xB7,0x37, + 0xA8,0x72,0x43,0x49,0xBD,0xEF,0xEA,0xA2,0xE5,0x59,0x84,0x51,0x68,0xCB,0x0A,0x08, + 0xC5,0x51,0x84,0x49,0x42,0x62,0xFE,0x7E,0x23,0x41,0xC2,0x30,0xF8,0x50,0xF8,0xF8, + 0x03,0x39,0xC2,0x30,0xAF,0x6F,0x5F,0x80,0x03,0x31,0xC2,0x28,0x02,0x23,0x22,0x1F, + 0x03,0x31,0xE3,0x30,0xBE,0x5C,0x57,0x5F,0x24,0x39,0xE3,0x30,0x5A,0x7F,0xFD,0x6B, + 0x23,0x31,0xC2,0x30,0x77,0xFE,0x5F,0xBF,0x03,0x39,0xC2,0x28,0xFF,0x7B,0xAB,0xF2, + 0x03,0x31,0xC2,0x30,0x87,0xFD,0xEA,0xEA,0x03,0x31,0xA2,0x28,0xCA,0xEE,0x6B,0xBF, + 0x03,0x31,0xC2,0x30,0xD7,0xF5,0xB9,0x8B,0x03,0x31,0xC2,0x30,0xEA,0x78,0x7A,0x62, + 0x03,0x31,0xC2,0x30,0x83,0xBB,0xFB,0xF5,0x03,0x31,0xA2,0x30,0x28,0xAA,0xAE,0x8A, + 0x03,0x31,0xC2,0x30,0xE8,0xBA,0xE2,0x6A,0x03,0x31,0xC2,0x28,0x8A,0x0B,0xA9,0x3D, + 0x24,0x39,0xC2,0x30,0xFF,0x8E,0x2B,0x9F,0xE3,0x30,0xC2,0x28,0xEA,0xAE,0xEC,0xFE, + 0x24,0x39,0xE3,0x30,0x79,0xEA,0x7F,0x55,0x03,0x31,0xA2,0x30,0xBA,0xAE,0x2A,0x22, + 0x24,0x39,0xE3,0x30,0x89,0x5D,0x55,0x57,0x24,0x39,0xC2,0x30,0x82,0xEA,0xB7,0xBF, + 0x24,0x39,0xE2,0x30,0xFE,0x7A,0x6B,0x5F,0x03,0x39,0xC2,0x30,0xA2,0xBB,0xEB,0xCF, + 0x03,0x39,0xE3,0x30,0xA8,0x2E,0x2B,0x95,0x24,0x39,0xE2,0x30,0xEB,0xAA,0xFA,0x7F, + 0x03,0x39,0xE3,0x30,0xC1,0x68,0x78,0xF3,0x03,0x39,0xE3,0x30,0xC3,0xC7,0xEE,0x8B, + 0x44,0x41,0xC2,0x30,0xDF,0x2E,0xFF,0x7D,0x24,0x39,0xE3,0x38,0xE0,0xFA,0xEB,0xEB, + 0x44,0x41,0xE3,0x30,0xA3,0xEB,0x7F,0x5F,0x03,0x39,0xE3,0x38,0x9C,0xB8,0x5B,0x1B, + 0x24,0x39,0xE3,0x38,0xEB,0x8B,0xFD,0xD7,0x03,0x39,0xE3,0x30,0x20,0x00,0x82,0x83, + 0x44,0x41,0x03,0x39,0x55,0xAF,0xAD,0x6D,0x23,0x39,0xE3,0x30,0x0B,0x89,0xAA,0xB7, + 0x23,0x39,0xE2,0x38,0xCB,0xC2,0xC2,0xFA,0x24,0x39,0xE3,0x30,0xBD,0x6D,0xBF,0x17, + 0x24,0x39,0xC2,0x30,0xF7,0xAE,0xEC,0xB8,0x03,0x39,0xE3,0x30,0xFE,0x7D,0x9E,0x23, + 0x24,0x39,0xC3,0x30,0xAA,0xB5,0xBA,0xF8,0x23,0x39,0xC4,0x30,0x0A,0x2A,0xB2,0xAA, + 0x23,0x39,0x03,0x31,0x7F,0x7E,0xB6,0x95,0x23,0x39,0xE2,0x30,0xE7,0x2F,0x2C,0x32, + 0x44,0x39,0xE2,0x30,0xFB,0x7E,0xFA,0x8A,0x23,0x39,0xC2,0x28,0xAA,0x9A,0xBE,0x2A, + 0x23,0x39,0xE3,0x30,0x5A,0xFF,0xBE,0xAA,0x03,0x31,0xE3,0x30,0x29,0xFD,0xD7,0x2C, + 0x24,0x39,0xE3,0x30,0xF8,0xFF,0xFA,0xE2,0x24,0x39,0xE3,0x28,0xDF,0xDF,0xBA,0xB3, + 0x24,0x39,0xE3,0x30,0x73,0xFA,0xA0,0xAA,0x04,0x31,0xC3,0x28,0xD7,0xD7,0xBC,0x30, + 0x04,0x31,0xE3,0x30,0x55,0xF5,0xEB,0x70,0x24,0x31,0xE3,0x30,0x7F,0x8F,0xEF,0x97, + 0x03,0x31,0xC2,0x28,0xEF,0xE0,0xE8,0xA0,0x03,0x31,0xA2,0x28,0xB7,0xEA,0xA2,0xA0, + 0x03,0x31,0xC2,0x28,0x36,0xA2,0x03,0xA2,0x23,0x31,0xE3,0x30,0xD5,0xF7,0xFD,0xFA, + 0xE3,0x30,0x03,0x29,0x2F,0x2B,0xB0,0x20,0x24,0x39,0xC2,0x28,0xDF,0xFA,0xE2,0x22, + 0x24,0x39,0xE3,0x30,0xBF,0x83,0x81,0xAA,0x24,0x39,0x03,0x31,0x57,0x57,0xFF,0x3F, + 0x44,0x41,0xE3,0x30,0x7D,0xF8,0xEE,0xFE,0x24,0x39,0xE3,0x30,0x37,0xAA,0x22,0x20, + 0x64,0x41,0x03,0x31,0x27,0x2D,0xAB,0x2A,0xC5,0x51,0x43,0x39,0xD5,0xBF,0xAF,0x2A, + 0x07,0x5A,0xA5,0x49,0xB5,0xBF,0xBF,0x3F,0x27,0x62,0xE6,0x59,0xC8,0xAE,0x05,0x27, + 0x27,0x62,0xE6,0x59,0x2F,0xBC,0xD6,0x78,0x47,0x62,0xE5,0x59,0x6A,0xA2,0xBD,0x2D, + 0x27,0x62,0xC5,0x59,0x6E,0xC0,0xC8,0xE0,0x68,0x6A,0xE6,0x59,0x3D,0xAD,0x35,0xA5, + 0x88,0x6A,0x27,0x62,0xBF,0xD7,0xDF,0x87,0xA9,0x6A,0x48,0x6A,0xEF,0xAE,0xCB,0xE7, + 0xA8,0x6A,0x48,0x6A,0x7B,0x7F,0x77,0xDF,0x68,0x6A,0x47,0x62,0x8B,0xE3,0xF2,0xE1, + 0xA9,0x72,0x27,0x62,0x2F,0xBB,0xB7,0xEB,0xA9,0x72,0x68,0x6A,0x2C,0x8F,0x3D,0xBD, + 0xA9,0x72,0x48,0x6A,0x0B,0x02,0x72,0xF0,0xC9,0x7A,0x67,0x6A,0x2A,0xBB,0xEB,0xFD, + 0xE9,0x7A,0x88,0x72,0x78,0x2E,0xD9,0x55,0xC9,0x7A,0x47,0x62,0x2F,0x94,0xBA,0xAA, + 0xC9,0x7A,0x88,0x72,0xBA,0xBA,0x2A,0xEF,0xC9,0x7A,0x67,0x6A,0xEA,0xA2,0x00,0x8A, + 0xC9,0x7A,0xA8,0x72,0x8A,0xE9,0x72,0xFC,0xE9,0x7A,0x88,0x72,0xE3,0xEE,0x77,0x5F, + 0xEA,0x7A,0xA9,0x72,0x62,0xEB,0x9D,0x5F,0x0A,0x7B,0xA8,0x72,0xEF,0xFD,0xFF,0x9F, + 0x0A,0x7B,0xA8,0x72,0xCB,0xF3,0x6B,0xAB,0xE9,0x7A,0xA8,0x72,0xEC,0xAD,0x8F,0x7F, + 0x0A,0x7B,0xA8,0x72,0xD7,0xA7,0x0E,0x3B,0x0A,0x83,0xA9,0x6A,0xEE,0xD7,0xF7,0xE2, + 0xEA,0x7A,0xA9,0x72,0xE8,0x47,0xBF,0x5F,0xEA,0x7A,0xA9,0x72,0xBF,0xFA,0xFB,0x7E, + 0xEA,0x7A,0xA9,0x72,0x3C,0xAA,0xBC,0x4F,0xEA,0x7A,0x89,0x72,0x9A,0xFE,0x0E,0x06, + 0xEA,0x7A,0xA9,0x72,0x7E,0xB3,0xAE,0xFF,0xEA,0x7A,0x88,0x6A,0xEF,0x58,0xA2,0x00, + 0x0B,0x83,0xA9,0x72,0x82,0xBD,0x97,0xBF,0x0A,0x7B,0xC9,0x7A,0xFC,0xAB,0x62,0xCE, + 0x0A,0x7B,0xA8,0x72,0xDF,0xBE,0x3B,0xA3,0x0A,0x83,0xC9,0x7A,0x83,0x01,0xC0,0xFE, + 0x23,0x41,0xC2,0x38,0xFE,0xBC,0xFF,0x7F,0x02,0x39,0xC2,0x38,0xA0,0xBE,0xBF,0x7D, + 0x23,0x41,0xC2,0x38,0x5E,0xFA,0xBB,0xCF,0xC2,0x40,0x03,0x39,0xFB,0xEF,0xAB,0x9F, + 0x03,0x41,0xC2,0x38,0x5E,0xAC,0xA9,0xBD,0x03,0x41,0xC2,0x38,0xD5,0xFF,0xEA,0xC0, + 0x23,0x41,0xC2,0x38,0xBD,0xD5,0xD7,0x7F,0x03,0x41,0xC2,0x38,0x98,0x9D,0xF7,0xD5, + 0x03,0x41,0xA1,0x30,0x9A,0xE2,0x88,0xAF,0x03,0x39,0xC2,0x38,0xFF,0xAF,0x0A,0x2B, + 0x03,0x41,0xC2,0x38,0xDB,0xF8,0x7A,0xF6,0xE2,0x38,0xC1,0x30,0x78,0x18,0x00,0x82, + 0xE2,0x38,0xC2,0x38,0x7F,0x70,0x60,0x0F,0x03,0x41,0xA1,0x30,0x7E,0xEF,0xAB,0xAA, + 0x03,0x41,0xC2,0x38,0x8B,0x79,0x7E,0xFE,0xE2,0x38,0xA2,0x30,0x00,0x8A,0xF0,0x20, + 0xE2,0x38,0xC2,0x38,0x73,0xEB,0x00,0xE0,0xE3,0x38,0xC2,0x38,0x2C,0xDE,0xD4,0xF0, + 0xE2,0x38,0xC2,0x38,0x0B,0xE2,0x6B,0xED,0x03,0x41,0xC2,0x38,0xDE,0x55,0xFB,0xE3, + 0x03,0x39,0xA2,0x30,0xE2,0x6A,0xFA,0xDE,0xC2,0x38,0x81,0x30,0xBE,0xAA,0x28,0x37, + 0xE2,0x38,0xA2,0x30,0x25,0x3F,0x0A,0x03,0x26,0x62,0xE2,0x38,0xBD,0x35,0x2D,0x2D, + 0xC8,0x7A,0x47,0x6A,0x7F,0xEA,0xE2,0xC0,0x47,0x6A,0xE5,0x59,0x7B,0x78,0x7A,0xEA, + 0xE6,0x59,0x64,0x49,0xFC,0x7E,0x72,0x7A,0x43,0x41,0xC2,0x30,0xDE,0xDE,0xFE,0xF2, + 0x23,0x39,0xE2,0x30,0xF3,0x59,0xDE,0xFF,0x03,0x39,0xC2,0x28,0x7B,0xEB,0xAE,0xF0, + 0x03,0x31,0xE3,0x30,0x40,0x7A,0xDF,0xD7,0x03,0x31,0xC3,0x30,0x82,0x8A,0x3E,0xDE, + 0x03,0x31,0xE3,0x30,0x35,0xD7,0x57,0x59,0x03,0x31,0xC3,0x30,0xE0,0xF2,0xB0,0xB0, + 0x03,0x31,0xE3,0x30,0xB5,0x65,0x65,0xBD,0x03,0x31,0xC2,0x28,0xFF,0xFE,0xFA,0xA2, + 0xE2,0x30,0xC2,0x28,0x02,0x09,0x0B,0x30,0x03,0x31,0xC2,0x30,0xAB,0xD7,0xFF,0xFB, + 0xE3,0x30,0xC3,0x28,0x3A,0xAC,0x08,0xAA,0x03,0x31,0xC3,0x30,0xA2,0x8B,0x0A,0xA9, + 0xE3,0x30,0xC2,0x30,0x00,0x0C,0x83,0xD8,0xE3,0x30,0xC2,0x28,0x08,0x8C,0xB8,0x60, + 0x03,0x31,0xC2,0x28,0xBE,0xFB,0xA9,0xEB,0x03,0x39,0xC3,0x28,0xB7,0xF7,0xAA,0xEB, + 0x03,0x31,0xC2,0x30,0x9F,0x0E,0xEA,0xEB,0x03,0x31,0xC3,0x30,0x0F,0x2B,0x2F,0xAF, + 0x03,0x31,0xE3,0x30,0x86,0xE7,0x77,0xBD,0xA2,0x38,0x03,0x31,0xDF,0x7F,0xFF,0xBD, + 0x03,0x39,0xC2,0x30,0xB8,0xD8,0xDE,0xC2,0x03,0x39,0xC2,0x30,0x2F,0x1D,0x9F,0xDF, + 0x03,0x31,0xC2,0x30,0x97,0x08,0x0C,0x2A,0x03,0x39,0xE2,0x30,0xC0,0xE3,0xB6,0xA8, + 0x03,0x39,0xE2,0x30,0x32,0xBF,0xFF,0xA3,0x24,0x39,0xC2,0x30,0xA8,0xF7,0x9D,0xFF, + 0xE3,0x38,0xA2,0x30,0xB8,0xBE,0xBE,0xEE,0x03,0x39,0xC2,0x30,0xA2,0xA3,0xB9,0x0D, + 0x03,0x39,0xC3,0x30,0xB0,0xC8,0xAA,0xEA,0x24,0x39,0xC2,0x30,0x2B,0xFF,0x67,0xFE, + 0x03,0x39,0xE3,0x30,0x1B,0x15,0x2D,0x01,0x03,0x39,0xC3,0x30,0x00,0x0A,0xAE,0x3E, + 0x23,0x39,0xE3,0x30,0x8E,0x27,0x97,0x35,0x23,0x39,0xE3,0x38,0x7F,0xB0,0xAF,0xB7, + 0x03,0x39,0xC3,0x30,0x3B,0x07,0xFF,0x20,0x24,0x39,0xE3,0x30,0x7F,0x6E,0xAB,0xB8, + 0x44,0x41,0xE3,0x30,0xEB,0xEA,0x6A,0xDB,0x24,0x39,0xC2,0x30,0xBA,0xB6,0xBB,0x2A, + 0x03,0x39,0xE3,0x38,0x28,0x20,0xA0,0x28,0x24,0x41,0xE3,0x30,0xFE,0xDE,0xAB,0x03, + 0x24,0x39,0xE3,0x30,0x9F,0xD5,0x2E,0xAC,0x23,0x39,0xE2,0x30,0x2B,0x20,0x20,0x7A, + 0x44,0x39,0xE2,0x30,0x2E,0xAA,0xFE,0xF5,0x44,0x39,0xE2,0x30,0xAA,0xA8,0xA7,0xBD, + 0x44,0x39,0x03,0x31,0x2D,0x2B,0x9F,0x2E,0x44,0x39,0x03,0x39,0x57,0xFE,0xEB,0xA2, + 0x44,0x39,0xE3,0x30,0xEF,0x76,0xA8,0xE0,0x24,0x39,0x03,0x31,0xF9,0xF5,0x8B,0x03, + 0x44,0x39,0x03,0x31,0xB5,0xAA,0xEA,0x08,0x24,0x39,0xE3,0x30,0xBE,0xBC,0xA8,0x8A, + 0x24,0x39,0xC2,0x30,0xBF,0xF6,0x2E,0xA8,0x24,0x39,0xE3,0x30,0xB8,0x5A,0xFE,0xCA, + 0x24,0x39,0xE3,0x30,0xDA,0xBF,0xBD,0x23,0x24,0x39,0xE3,0x30,0x56,0xBE,0xFD,0xCE, + 0x24,0x39,0xE3,0x30,0xBA,0xCE,0x6B,0xCB,0x24,0x39,0xE3,0x30,0xB0,0xAB,0x69,0x6A, + 0x45,0x41,0xC2,0x30,0xF7,0xF7,0xAF,0xA8,0x24,0x39,0x03,0x31,0x9D,0xF5,0x96,0xA6, + 0x24,0x39,0xE3,0x30,0xEB,0xEA,0xEA,0x8B,0x24,0x39,0xE3,0x30,0x20,0x02,0x07,0x89, + 0x65,0x41,0x03,0x39,0x5C,0xF5,0xF7,0xF5,0x65,0x49,0x03,0x39,0xF7,0xFA,0xA3,0x8A, + 0xA6,0x49,0x44,0x41,0x7D,0x75,0x7F,0x0B,0xE7,0x51,0x65,0x41,0x3D,0xAD,0x2B,0x8A, + 0x06,0x5A,0xA5,0x51,0x9A,0xAB,0x2A,0x8A,0x07,0x62,0xA5,0x51,0xFE,0x9B,0xC2,0xE0, + 0x27,0x62,0xC6,0x59,0xC0,0xFE,0x5F,0x95,0x47,0x62,0xE6,0x59,0x3F,0xBD,0xBB,0x8F, + 0x88,0x6A,0xE6,0x59,0xD7,0xFB,0xA2,0xEA,0x68,0x62,0x06,0x5A,0xB7,0x3E,0x8A,0xEA, + 0x89,0x6A,0x27,0x62,0x89,0x0D,0xE9,0xEF,0x88,0x72,0x47,0x62,0xCA,0x79,0xFB,0xFE, + 0xA9,0x72,0x48,0x62,0xFE,0x6A,0x7B,0x7C,0x88,0x6A,0x48,0x6A,0xFF,0xAF,0xF5,0xFF, + 0x88,0x72,0x48,0x6A,0xE8,0x7E,0xFF,0x2F,0xA9,0x72,0x68,0x6A,0xDD,0xD5,0xE9,0x8A, + 0xA9,0x72,0x68,0x6A,0x76,0x9C,0xFE,0xBB,0xA9,0x72,0x47,0x6A,0xEC,0x98,0x37,0xB7, + 0xC9,0x72,0x88,0x6A,0x55,0x53,0x2A,0x8D,0xC9,0x72,0x88,0x72,0xED,0xAE,0xB8,0xB6, + 0xE9,0x7A,0x88,0x72,0x6F,0xFF,0x5E,0xF8,0xC9,0x7A,0x88,0x72,0x6F,0xAF,0xDA,0x8B, + 0xA8,0x72,0x48,0x6A,0x08,0x0A,0xDC,0xF8,0xC9,0x7A,0x68,0x6A,0x2A,0xBC,0xF7,0xFA, + 0xE9,0x7A,0x88,0x72,0x7A,0xE6,0x0F,0xAB,0xC9,0x72,0x68,0x6A,0x32,0x76,0xFF,0xBC, + 0xE9,0x7A,0x88,0x72,0xA8,0x2B,0xF2,0xB5,0x0A,0x7B,0xA8,0x72,0x5F,0x77,0xC3,0x3A, + 0xEA,0x72,0x88,0x6A,0x3F,0xFE,0x6A,0xEC,0x0A,0x7B,0xA9,0x72,0x8A,0xAF,0xF7,0x7F, + 0xEA,0x7A,0x88,0x6A,0xBA,0x22,0x7A,0xEB,0xEA,0x7A,0xA9,0x72,0x5B,0xA0,0xA9,0x29, + 0xEA,0x7A,0x88,0x6A,0x0F,0xAB,0xA7,0x0F,0x0B,0x83,0x67,0x6A,0x0A,0xC2,0xFE,0x97, + 0xE9,0x7A,0xA9,0x72,0xDF,0xBE,0xA3,0x4F,0x2A,0x7B,0xCA,0x7A,0xED,0x7D,0xFF,0x6F, + 0x0A,0x7B,0xC9,0x7A,0x72,0xBF,0x2F,0x2F,0x2A,0x83,0xC9,0x72,0xF5,0xCF,0xC3,0xEB, + 0xE9,0x7A,0x87,0x6A,0xC0,0x40,0xAA,0xA8,0x0A,0x7B,0xA9,0x72,0xE5,0x25,0xAC,0xEF, + 0x03,0x41,0xC2,0x38,0xEE,0xC8,0xF6,0xE6,0x03,0x41,0xC2,0x38,0xA9,0xCB,0xCF,0xEF, + 0x03,0x41,0xE2,0x38,0xE7,0x55,0x85,0xA9,0x03,0x41,0xC2,0x38,0x8B,0xFB,0x7A,0x68, + 0x03,0x41,0xC2,0x38,0xBA,0xFB,0xA1,0xCB,0x23,0x41,0xC2,0x38,0xEA,0x3B,0xDE,0x9A, + 0xC3,0x40,0x02,0x39,0xFF,0xBF,0xF5,0xDF,0x03,0x41,0xC2,0x38,0xD7,0x2D,0xE2,0xFA, + 0x03,0x41,0xA2,0x30,0xBF,0xFF,0x62,0xCA,0xE3,0x38,0xA1,0x30,0xB0,0x9F,0xAD,0x3D, + 0xE2,0x38,0xC2,0x30,0x2F,0x7C,0x20,0x80,0x03,0x41,0xC2,0x38,0x3F,0x2D,0x8B,0xBF, + 0x03,0x41,0xA1,0x30,0xBE,0xB6,0xAE,0x82,0x03,0x41,0xC2,0x38,0xF6,0xFF,0x26,0xBA, + 0x03,0x41,0xC2,0x38,0xFF,0xDF,0x7A,0x8F,0xC2,0x38,0xE2,0x30,0x3A,0xA2,0x20,0x2B, + 0xC2,0x38,0xE2,0x30,0xAA,0x80,0x20,0xAB,0x03,0x41,0xA1,0x30,0xEB,0xEF,0xF9,0x8E, + 0x03,0x39,0xC2,0x38,0x7F,0x7F,0x7E,0xFE,0x03,0x39,0xA2,0x30,0xE3,0xE3,0xEB,0x7A, + 0xE2,0x38,0x81,0x30,0x62,0x5E,0xBA,0xAF,0xE3,0x38,0x81,0x28,0x97,0xA7,0x82,0x88, + 0x03,0x39,0xA2,0x30,0xE1,0xEB,0xFD,0xB5,0xC7,0x7A,0xE2,0x38,0x2D,0x2D,0x2D,0x25, + 0x08,0x83,0x67,0x6A,0xE2,0x6A,0xFA,0xEA,0x67,0x6A,0x64,0x49,0xA8,0xE8,0xE0,0x78, + 0xC5,0x59,0x03,0x39,0xF0,0xFE,0xD6,0x57,0x44,0x41,0xE2,0x30,0xEB,0xF2,0x72,0xEA, + 0x23,0x39,0xC2,0x28,0x2A,0xFA,0x6F,0xEE,0x03,0x31,0xC2,0x28,0xB0,0xA9,0xFD,0xE9, + 0x03,0x31,0xC2,0x28,0xAB,0xEE,0xAF,0xAF,0x03,0x31,0xC2,0x30,0xF2,0x82,0xB2,0xA1, + 0x03,0x31,0xC3,0x30,0xEB,0x01,0x2F,0xBA,0x03,0x31,0xC2,0x28,0xE2,0xE8,0x80,0x42, + 0x03,0x31,0xC2,0x28,0x3E,0x2B,0x2A,0xAD,0x03,0x31,0xC3,0x30,0x0E,0x0B,0xE8,0xF8, + 0xE3,0x30,0xC2,0x28,0xEC,0xCE,0xA7,0x02,0x03,0x31,0xC3,0x30,0xBD,0x9D,0xD7,0xBF, + 0xE3,0x30,0xC2,0x28,0xA2,0xEA,0xF0,0xE7,0xE3,0x30,0xC2,0x28,0x02,0x01,0x6A,0x86, + 0x03,0x31,0xC3,0x30,0xFA,0x2E,0x63,0x63,0x03,0x31,0xC2,0x28,0xFA,0x92,0xDB,0xBF, + 0x03,0x31,0xC2,0x30,0xFE,0xFE,0xAB,0x8E,0x03,0x31,0xC3,0x30,0x7B,0xFF,0x2A,0x0E, + 0x03,0x31,0xA2,0x28,0xFA,0xD6,0xFE,0xCC,0xE3,0x30,0xA2,0x28,0x22,0xFA,0xA1,0x0B, + 0x03,0x31,0xC2,0x28,0x2A,0xA9,0x5F,0x7E,0x03,0x31,0xC2,0x30,0x7C,0xF7,0x65,0x73, + 0xE3,0x30,0xC2,0x28,0x00,0x2B,0x95,0xDA,0x23,0x39,0xC2,0x28,0xF2,0xCB,0xF7,0xB7, + 0x03,0x31,0xE2,0x30,0xC3,0xC2,0xCF,0x57,0x23,0x31,0xC2,0x30,0xA7,0x6E,0xE3,0xE3, + 0x03,0x31,0xC2,0x30,0x02,0x20,0xEC,0x68,0x03,0x39,0xC2,0x30,0x88,0x00,0xF8,0x0B, + 0x03,0x39,0xC2,0x30,0x7E,0xEA,0xA2,0x0A,0x03,0x39,0xC3,0x30,0x2A,0x37,0xAB,0xDB, + 0x24,0x39,0xE3,0x30,0xEE,0xAA,0xAE,0xF5,0x24,0x39,0xC3,0x30,0xC2,0x7A,0xB8,0xB2, + 0x24,0x39,0xE3,0x30,0xA9,0xAF,0xAB,0xB7,0x24,0x39,0xE3,0x30,0x55,0xDE,0xF7,0x7A, + 0x24,0x41,0xE3,0x30,0x09,0xBE,0xBD,0x65,0x24,0x39,0xE3,0x38,0xB4,0x36,0xF4,0xD7, + 0x24,0x41,0xC3,0x30,0x8A,0x88,0xE3,0xDA,0x24,0x39,0xE3,0x38,0x57,0xFB,0xE2,0x2F, + 0x24,0x39,0xE3,0x38,0x6D,0x7A,0x72,0xEC,0x24,0x39,0xE3,0x38,0x33,0x3B,0x39,0xB7, + 0x24,0x39,0xE3,0x30,0xBF,0xB6,0xA2,0xA2,0x24,0x39,0x03,0x39,0xBE,0x55,0x5F,0x55, + 0x23,0x39,0xE4,0x30,0xFA,0xEA,0xEB,0xA2,0x03,0x39,0xC2,0x30,0x3F,0xBF,0xEE,0x02, + 0x24,0x39,0xE3,0x30,0xDF,0xD7,0xFC,0xAB,0x03,0x31,0xC2,0x30,0x22,0xBF,0x2E,0x00, + 0x24,0x39,0xE2,0x30,0x3A,0xBF,0x78,0xA8,0x65,0x41,0xE3,0x30,0xE3,0xBB,0xA5,0xA7, + 0x64,0x41,0x04,0x31,0x7B,0xEE,0xF0,0xAB,0x44,0x39,0x03,0x31,0xAA,0xE2,0xE8,0x70, + 0x44,0x41,0x24,0x39,0xCB,0x79,0x55,0x35,0x44,0x39,0x04,0x39,0x6A,0x6B,0x7A,0xBA, + 0x24,0x41,0x03,0x31,0xF7,0xBE,0xA7,0x0E,0x64,0x41,0x03,0x39,0xFD,0xF7,0xE5,0xFF, + 0x44,0x41,0xE3,0x30,0xF2,0xE2,0xC2,0xAA,0x44,0x39,0xE3,0x30,0x62,0x62,0xBB,0xAB, + 0x44,0x41,0xE3,0x30,0xEB,0x73,0xBA,0xB2,0x24,0x41,0x03,0x31,0x7F,0xAF,0xBB,0x08, + 0x44,0x41,0xE3,0x30,0xB7,0xFB,0xBA,0xA8,0x44,0x41,0x03,0x39,0x7E,0xFA,0x2F,0x01, + 0x65,0x41,0x03,0x39,0xDD,0xF7,0xCA,0x23,0x65,0x41,0x04,0x39,0x75,0xF7,0x2E,0x0C, + 0xC6,0x51,0xE3,0x38,0x5F,0x5F,0xAF,0x2B,0xC6,0x51,0x24,0x39,0xBD,0xFD,0x2B,0x00, + 0x27,0x62,0x85,0x49,0xF5,0xBD,0xA3,0xA2,0x27,0x62,0xA5,0x49,0xBD,0xFE,0xAE,0x0A, + 0x27,0x62,0xC6,0x51,0xED,0xEF,0xFA,0xA8,0x07,0x62,0xE6,0x59,0xBA,0x95,0xB5,0x2F, + 0x47,0x6A,0xE6,0x59,0xBD,0xAB,0x02,0x80,0x47,0x62,0x07,0x62,0x3D,0x62,0x02,0x00, + 0x88,0x6A,0x27,0x62,0xD2,0x42,0x7D,0x5F,0x68,0x6A,0x07,0x62,0xAE,0xAA,0x1F,0xBD, + 0xA8,0x72,0x47,0x6A,0x7D,0xAA,0xAF,0xDF,0xA9,0x72,0x47,0x62,0xA7,0xBF,0xB8,0xFA, + 0xA8,0x72,0x48,0x62,0xEF,0x5E,0xFE,0xA8,0xA9,0x72,0x27,0x62,0xAA,0x3E,0xA7,0x2A, + 0xA9,0x72,0x68,0x6A,0xD6,0x77,0xCF,0x9E,0xCA,0x72,0x48,0x6A,0xAD,0xAB,0xAB,0x78, + 0xA8,0x72,0x47,0x62,0xAA,0x2E,0xFF,0xB8,0xA9,0x72,0x67,0x6A,0xEE,0x46,0xA0,0x02, + 0xA8,0x72,0x47,0x62,0x0B,0x89,0x27,0x02,0xC9,0x7A,0x88,0x6A,0xAA,0x9B,0x6F,0xE1, + 0xEA,0x7A,0x67,0x6A,0xF8,0xB6,0xBF,0xFD,0xC9,0x72,0xA8,0x72,0xAD,0x15,0xBF,0x7A, + 0xC9,0x72,0x68,0x6A,0x7C,0xFB,0xC9,0xAB,0xC9,0x72,0x89,0x72,0x43,0x89,0xBF,0xAA, + 0xEB,0x7A,0xA9,0x72,0xD5,0xD5,0xF3,0xAF,0xC9,0x72,0x88,0x6A,0xF5,0xF5,0x96,0xE2, + 0xC8,0x72,0x68,0x6A,0xFE,0xFA,0x2B,0x1F,0xC9,0x72,0x67,0x6A,0x30,0xAE,0xEA,0xAA, + 0xC9,0x72,0x88,0x72,0x00,0x0B,0x3D,0x9A,0xE9,0x7A,0x68,0x6A,0x68,0xEA,0xBC,0xFA, + 0xEA,0x7A,0x88,0x6A,0xD5,0xBB,0xA3,0xAD,0xEA,0x7A,0xA9,0x72,0x81,0x02,0x7E,0xAD, + 0xEA,0x7A,0xA9,0x72,0x39,0x28,0x03,0x2A,0x0A,0x7B,0xA8,0x72,0x56,0x8E,0x2C,0xBE, + 0x0A,0x7B,0xA9,0x72,0x57,0xF5,0x70,0xA0,0x0B,0x83,0x89,0x72,0x8F,0x6F,0x6F,0x9F, + 0xE9,0x7A,0xA9,0x72,0x0C,0x23,0x6E,0xD6,0x0A,0x7B,0xC9,0x72,0xE3,0xBD,0xBF,0xAD, + 0x2B,0x83,0xC9,0x72,0x5F,0x77,0xD7,0x2A,0x2B,0x83,0xA8,0x72,0xAF,0xAB,0xA6,0xF0, + 0x23,0x41,0xC2,0x38,0x54,0x5E,0x5E,0x5E,0x03,0x41,0xC2,0x38,0xBF,0x81,0xF9,0xA3, + 0x02,0x41,0xC2,0x38,0x8A,0x2A,0xBA,0xB5,0x03,0x41,0xE2,0x38,0xF3,0xD5,0xF7,0x56, + 0x03,0x41,0xC2,0x38,0x7C,0xE8,0xAA,0xF7,0x23,0x41,0xE2,0x38,0x73,0xEB,0xF5,0x55, + 0x03,0x39,0xC2,0x38,0x76,0xDE,0x90,0xDA,0x03,0x41,0xC2,0x38,0x6E,0x6E,0xFA,0xAA, + 0xE2,0x38,0xC2,0x30,0x0B,0x8D,0x27,0xDE,0x02,0x41,0xA1,0x30,0xB7,0xBA,0xAE,0xA8, + 0xE2,0x38,0xC1,0x38,0x40,0xFA,0x4B,0x7C,0xE2,0x38,0xC1,0x30,0x6E,0x37,0x22,0x01, + 0x02,0x41,0xA2,0x30,0xAA,0x86,0x22,0xE2,0x03,0x41,0xC2,0x38,0x7F,0xFA,0xF8,0xDF, + 0xE2,0x38,0xC2,0x38,0x29,0xB5,0xD8,0x3B,0xE2,0x38,0xC2,0x38,0xAF,0xBA,0x58,0xDF, + 0x03,0x39,0xC2,0x38,0xFB,0xD7,0x95,0xBA,0x03,0x39,0xC2,0x38,0xFE,0xBB,0x6A,0x58, + 0xE2,0x38,0xA2,0x30,0xAA,0xB8,0xFA,0xEE,0xC2,0x30,0x82,0x30,0xB0,0xF8,0xBA,0xB2, + 0x03,0x39,0xA2,0x30,0xF5,0xA5,0x2F,0xAF,0xE2,0x38,0xC2,0x30,0x0B,0x2C,0xF6,0x74, + 0xE2,0x38,0xA2,0x30,0xDF,0x5E,0x7A,0xFB,0x87,0x72,0xE2,0x38,0x0D,0x2D,0xBD,0xD5, + 0xA7,0x72,0x64,0x49,0x00,0xA8,0x7F,0x55,0x26,0x62,0x23,0x41,0x78,0x5E,0x7F,0x75, + 0x24,0x41,0xE3,0x38,0x1F,0xFB,0xE8,0xA0,0x23,0x39,0xE2,0x30,0xF8,0xD7,0xDF,0xEE, + 0x24,0x39,0xE2,0x30,0xFF,0x89,0x66,0x7E,0x03,0x31,0xC2,0x30,0xA8,0x33,0xBB,0xEA, + 0x23,0x39,0xE3,0x30,0xD5,0x75,0x75,0xDE,0x03,0x31,0xC3,0x30,0x0B,0xB7,0xF3,0xB0, + 0x03,0x31,0xC2,0x28,0xAF,0x7E,0xAB,0xC8,0x03,0x31,0xC3,0x30,0xF6,0xEE,0xAE,0xA7, + 0x23,0x39,0xC2,0x30,0x3D,0xFF,0xD7,0xDB,0x03,0x31,0xC2,0x30,0xFE,0xEE,0xAE,0xEA, + 0xE3,0x30,0xC2,0x28,0x2D,0x35,0x28,0x08,0x03,0x31,0xC2,0x30,0xE5,0x5E,0xAC,0xEB, + 0xE2,0x30,0xA2,0x28,0xA9,0xA7,0x2A,0x00,0xE2,0x30,0xC2,0x28,0x2F,0x0B,0xA8,0xA0, + 0x23,0x31,0xC2,0x30,0x6B,0xFF,0x7D,0x5F,0x03,0x31,0xC2,0x30,0xEF,0x2F,0x2F,0x3A, + 0x03,0x39,0xE3,0x30,0x55,0x55,0xB7,0x5E,0x24,0x39,0xE3,0x30,0xBF,0xDF,0xEF,0xED, + 0x03,0x39,0xC2,0x30,0xFE,0xFE,0xF8,0xF8,0x03,0x31,0xC2,0x28,0x97,0xD5,0xE6,0x0F, + 0x24,0x39,0xC2,0x28,0xF7,0xBF,0xB5,0xAF,0x03,0x31,0xC2,0x30,0xF2,0xC8,0xAA,0xCA, + 0xE3,0x30,0xC2,0x28,0xA2,0x7F,0xE6,0x20,0x03,0x31,0xC2,0x28,0xB6,0xAF,0xF7,0x7E, + 0x03,0x31,0xC2,0x30,0xFF,0xB6,0xBF,0xAD,0x04,0x31,0xE2,0x30,0xFD,0xF3,0x1E,0x25, + 0x03,0x31,0xC2,0x28,0xDF,0x7F,0x70,0x80,0x03,0x31,0xC2,0x30,0xAB,0xEB,0xFD,0xEA, + 0x03,0x31,0xE3,0x30,0x09,0x7B,0x7A,0x55,0x03,0x39,0xC3,0x30,0xB2,0xBE,0xA8,0xF7, + 0x03,0x39,0xE3,0x30,0xF5,0xBE,0x1B,0xBE,0x24,0x39,0xE3,0x30,0x7F,0xBF,0xFB,0xB2, + 0x24,0x39,0xE3,0x30,0xD6,0x7E,0xDA,0x7A,0x24,0x41,0x03,0x31,0xFF,0xEB,0xE3,0x8D, + 0x03,0x39,0xE3,0x30,0x55,0x77,0xE0,0xF8,0x24,0x41,0xE3,0x38,0xF5,0xBD,0xBD,0xD2, + 0x24,0x39,0xE3,0x30,0x57,0xAE,0x3A,0xAA,0x24,0x39,0xC3,0x38,0x0B,0xAA,0xBE,0xAA, + 0xE3,0x38,0x24,0x31,0xEA,0xAA,0xAE,0xA6,0x24,0x41,0xE3,0x30,0xEF,0x8A,0x88,0xAD, + 0x44,0x39,0xE3,0x38,0x7D,0xFD,0xF9,0xBF,0x24,0x39,0xC3,0x38,0xBA,0xAA,0x82,0x20, + 0x24,0x39,0x03,0x39,0x3E,0x6E,0xA0,0x5C,0x23,0x39,0xE3,0x30,0x09,0x2A,0xBA,0xDB, + 0x24,0x39,0x03,0x31,0x5A,0xB2,0x8B,0x7D,0x23,0x39,0xE3,0x30,0x00,0xF0,0x6A,0xAF, + 0x44,0x39,0x03,0x31,0xFD,0x8F,0xCF,0x67,0x65,0x41,0xE3,0x30,0xCF,0xEF,0x79,0xBF, + 0x44,0x39,0xE3,0x30,0x2B,0xAF,0xFF,0xF7,0x23,0x39,0xE3,0x30,0x00,0xB8,0xEE,0x7E, + 0x64,0x41,0xC2,0x30,0x2A,0xAF,0xFF,0x77,0x44,0x41,0x04,0x39,0x2C,0x20,0xAA,0x15, + 0x65,0x49,0x24,0x41,0x7E,0xEE,0xFB,0x0A,0x64,0x41,0x03,0x39,0x5A,0xFA,0xEA,0x28, + 0x64,0x41,0x03,0x39,0xFF,0xA5,0xAE,0x3C,0x86,0x49,0x03,0x39,0xF7,0xAD,0x8A,0x88, + 0x65,0x41,0x04,0x39,0xDF,0xEB,0x38,0x00,0x85,0x49,0x24,0x39,0xD5,0xBF,0xBB,0x02, + 0x85,0x49,0x24,0x39,0x7D,0xFF,0xB8,0xE0,0xA6,0x51,0x23,0x39,0xF9,0xEB,0x8A,0xAA, + 0x85,0x49,0x24,0x41,0xF7,0x0A,0x02,0x8E,0xA5,0x51,0x44,0x41,0xD5,0xAE,0xFE,0x0B, + 0xE6,0x59,0x85,0x49,0x95,0x3D,0x3F,0xDF,0x06,0x5A,0xC6,0x51,0xBF,0x3F,0xE3,0x9B, + 0x27,0x62,0xC5,0x51,0x20,0x08,0xA9,0x29,0x47,0x62,0x06,0x5A,0xD5,0xF5,0x7D,0xBD, + 0x48,0x6A,0x07,0x5A,0xFF,0xAF,0xA5,0x27,0x48,0x62,0xE6,0x59,0xF7,0xBA,0x2F,0x87, + 0x68,0x6A,0x06,0x5A,0xFA,0xEA,0x8B,0x87,0x67,0x6A,0x27,0x62,0x4A,0xB0,0x3E,0xBF, + 0x68,0x6A,0x06,0x5A,0x2A,0xBE,0x7C,0x7B,0x88,0x6A,0x27,0x62,0x97,0xD9,0xBD,0x0F, + 0xA8,0x72,0x47,0x62,0xDF,0xBF,0xCA,0x82,0xC9,0x72,0x67,0x6A,0x2B,0x35,0xD5,0x57, + 0xA8,0x72,0x68,0x6A,0xBB,0xE8,0xA8,0xFF,0xA9,0x72,0x47,0x62,0xDF,0x55,0x6B,0x2A, + 0xA9,0x72,0x47,0x62,0x9E,0xB5,0x27,0xBE,0xC9,0x72,0x88,0x6A,0x7A,0xEA,0x6A,0xCF, + 0xA9,0x72,0x47,0x62,0xEA,0x22,0x09,0x02,0xC9,0x72,0x88,0x6A,0x39,0x96,0x5F,0x57, + 0xC9,0x72,0x88,0x72,0x80,0xEA,0xBE,0xFD,0xC9,0x7A,0x68,0x6A,0xC9,0xAB,0xAA,0xB7, + 0xC9,0x72,0x67,0x6A,0xC9,0xE0,0xA8,0xDA,0xA8,0x72,0x68,0x6A,0x70,0x9F,0xDF,0xEA, + 0xC9,0x7A,0x68,0x6A,0xFA,0xBF,0xB3,0xA5,0xA9,0x72,0x68,0x6A,0x2E,0xAA,0x98,0xDB, + 0xCA,0x7A,0x68,0x6A,0x28,0xBF,0xFE,0xEF,0xC9,0x72,0x68,0x6A,0xE0,0xAE,0x89,0xB9, + 0xC9,0x7A,0x68,0x6A,0xB7,0x05,0x8E,0xEA,0xE9,0x7A,0x88,0x6A,0xBB,0xBA,0xA2,0xD5, + 0xEA,0x7A,0x88,0x6A,0x7A,0xE8,0x5A,0x79,0xCA,0x7A,0x67,0x6A,0x8A,0xC1,0x2B,0x0A, + 0xC9,0x72,0x89,0x72,0x99,0xB7,0x26,0xB2,0xC9,0x72,0x68,0x6A,0x28,0xAB,0xF7,0xFC, + 0xC9,0x72,0x26,0x62,0x00,0x00,0x02,0xA6,0xE9,0x7A,0x87,0x6A,0xBA,0xEE,0xA3,0xA7, + 0xEA,0x7A,0x88,0x6A,0x02,0xAB,0xFB,0xFA,0xCA,0x7A,0x68,0x6A,0x39,0xFA,0x2A,0x0F, + 0xCA,0x7A,0x68,0x6A,0x0A,0x8D,0x2A,0xAB,0x0A,0x83,0xA9,0x72,0x2B,0xAF,0xF5,0x56, + 0x0A,0x7B,0xC9,0x72,0xEA,0xF8,0xFB,0x95,0x0A,0x7B,0xA8,0x72,0xA0,0x7E,0xDA,0x7F, + 0x03,0x41,0xC2,0x38,0xFF,0x9B,0x73,0xDB,0x03,0x41,0xC2,0x38,0x6A,0x50,0xF2,0xE2, + 0x03,0x41,0xA2,0x38,0xEF,0xF2,0x7A,0x6B,0x02,0x39,0xA1,0x30,0xAB,0xA3,0xF9,0xFB, + 0x02,0x41,0xA2,0x30,0xBE,0xAA,0x26,0x8F,0x03,0x39,0xC2,0x38,0xFF,0xE8,0xBC,0xF6, + 0xE2,0x38,0xA1,0x30,0xA0,0xFA,0xD7,0xD7,0xE3,0x38,0xA1,0x30,0x02,0x83,0xBE,0x16, + 0xE2,0x38,0xA2,0x30,0xAA,0xA3,0x8A,0x00,0x02,0x39,0xC2,0x38,0xAE,0xD6,0xAF,0x99, + 0xE2,0x38,0xA1,0x30,0xA0,0xF0,0xDE,0xAA,0x03,0x41,0xC2,0x38,0xDF,0xAF,0x2F,0x79, + 0x03,0x39,0xC2,0x38,0x9A,0xEC,0xFE,0xEF,0x02,0x39,0xA1,0x38,0xEA,0xA8,0x6A,0xBA, + 0xE2,0x38,0xA2,0x30,0xFA,0xAB,0xA3,0xA0,0xE2,0x38,0xC2,0x38,0x05,0xA3,0xC2,0x60, + 0xE2,0x38,0xC2,0x30,0x02,0x8F,0xBF,0xEF,0xE2,0x38,0x81,0x30,0xB0,0xDB,0xD3,0x7A, + 0xE3,0x38,0xA2,0x30,0x4A,0x7A,0xDD,0xFD,0x03,0x39,0xA2,0x30,0x5D,0x9D,0x35,0xDD, + 0x03,0x39,0xC2,0x30,0x9A,0xEA,0xEA,0xDF,0x03,0x39,0xA2,0x28,0xBC,0x18,0xEE,0xEB, + 0x03,0x39,0x81,0x30,0xBE,0xEC,0xBF,0x7D,0xE3,0x38,0xA1,0x30,0x0B,0xAB,0xFF,0x75, + 0x23,0x41,0xA2,0x30,0x0B,0xEF,0x7D,0xDF,0x24,0x41,0x81,0x30,0x82,0xAE,0xFF,0xD7, + 0x24,0x41,0xA1,0x30,0xA0,0xBA,0xFF,0xD5,0x23,0x39,0xE3,0x30,0xAE,0xAA,0x7B,0x69, + 0x03,0x39,0xC2,0x30,0xFA,0xF2,0xFF,0xFF,0x03,0x31,0xC2,0x30,0x29,0x35,0xBF,0xFF, + 0x03,0x31,0xC2,0x28,0x80,0xBE,0xFB,0xFD,0x24,0x39,0xC3,0x28,0xDA,0x7B,0xCF,0xFA, + 0x24,0x39,0xC2,0x30,0x73,0x6D,0xDD,0x97,0xE3,0x30,0xC3,0x28,0x0B,0xE3,0xA2,0xE8, + 0x03,0x31,0xC3,0x30,0xBA,0x3E,0xAA,0xAB,0x03,0x31,0xC2,0x28,0xA8,0xE0,0x6A,0xFA, + 0xE3,0x30,0xC2,0x28,0x18,0x1F,0x8F,0xBF,0x03,0x31,0xC2,0x30,0xE7,0xFE,0xBF,0xFD, + 0x03,0x31,0xC2,0x28,0xEB,0xE7,0xDE,0x73,0x03,0x31,0xC2,0x28,0xEA,0xAB,0xEC,0xDD, + 0xE3,0x30,0xC2,0x28,0xB2,0xD7,0x80,0x3A,0x24,0x39,0xC2,0x30,0x2B,0xEB,0xB9,0x5B, + 0x23,0x39,0xC3,0x30,0xFE,0xF9,0xEA,0xE2,0x24,0x39,0xC2,0x30,0x82,0x7B,0xFD,0xD7, + 0x03,0x39,0xE3,0x30,0xE7,0x75,0x55,0x54,0x04,0x39,0xE3,0x30,0x09,0x55,0x55,0x55, + 0xE3,0x30,0xC2,0x30,0x08,0xA0,0xB0,0x00,0x03,0x31,0xC2,0x28,0x8F,0x8A,0x2A,0xA7, + 0x03,0x31,0xC2,0x30,0x80,0xAA,0xB5,0x36,0x03,0x31,0xC3,0x30,0xFE,0xF0,0xFE,0xEE, + 0x03,0x39,0xA2,0x30,0xAB,0xFA,0xED,0xBE,0x24,0x39,0xC2,0x30,0x0F,0x0F,0xBB,0xF7, + 0x24,0x39,0xC2,0x30,0xA7,0x3E,0xBF,0xEF,0x03,0x39,0xC3,0x30,0x76,0xEE,0xCA,0x80, + 0x03,0x31,0xA2,0x30,0xAA,0x22,0xAA,0xB2,0x03,0x31,0xC2,0x30,0xDE,0xBA,0x2B,0x3A, + 0x03,0x31,0xC2,0x30,0xAA,0xB8,0x70,0x70,0x03,0x31,0xC2,0x28,0x00,0x20,0xBF,0x2D, + 0x03,0x39,0xE3,0x30,0xE8,0xA6,0x5E,0x5F,0x24,0x39,0xE3,0x30,0x2F,0x2F,0x77,0x75, + 0x03,0x39,0xE3,0x30,0x8B,0x20,0x20,0x3A,0x24,0x39,0x03,0x39,0x7F,0x6F,0x25,0xF5, + 0x24,0x41,0x03,0x39,0x63,0x5B,0x5E,0x56,0x44,0x39,0xE3,0x38,0xFD,0xFF,0x7F,0xA5, + 0x24,0x39,0xE3,0x38,0x7F,0x7F,0xFA,0xA3,0x24,0x39,0xE3,0x38,0xA5,0x37,0xBE,0xFF, + 0x03,0x39,0xC3,0x30,0x00,0x00,0xE2,0xE2,0x24,0x39,0xC3,0x38,0xA0,0x2A,0xB2,0xA2, + 0x44,0x41,0xE3,0x38,0xDE,0xAE,0x3E,0x37,0x44,0x41,0xE3,0x30,0xDF,0xBB,0xEE,0x2E, + 0x44,0x41,0xE3,0x30,0xEA,0x53,0x6E,0xE8,0x44,0x41,0xE3,0x30,0xBA,0x0A,0xAD,0xEF, + 0x24,0x39,0x03,0x39,0x80,0x98,0x95,0x15,0x44,0x39,0x03,0x39,0xFF,0x97,0xAF,0xA8, + 0x65,0x41,0xE3,0x30,0xD7,0x7E,0x2A,0x2E,0x24,0x41,0x03,0x39,0x5D,0x79,0x6F,0x48, + 0x44,0x41,0xC3,0x30,0x7F,0x7B,0xAB,0x02,0x45,0x41,0x03,0x39,0x15,0xD5,0x7D,0xAF, + 0x65,0x41,0xE2,0x30,0x28,0x2F,0xBD,0xF7,0x85,0x49,0x23,0x39,0x0A,0x80,0xAA,0x6D, + 0x85,0x49,0x44,0x41,0xBE,0x32,0x82,0x09,0xA5,0x49,0x44,0x41,0xFE,0xFA,0xAA,0x3E, + 0xA6,0x49,0x45,0x41,0xB6,0xB6,0x9E,0xFE,0xC6,0x51,0x65,0x49,0xEA,0x8A,0xE7,0x97, + 0xA5,0x51,0x65,0x49,0xAB,0x22,0xAA,0x3F,0xC6,0x51,0x85,0x49,0x7D,0xE6,0x1E,0xAB, + 0xC6,0x51,0x65,0x49,0x77,0x9F,0xB6,0x0E,0x06,0x5A,0x44,0x41,0xAD,0xAB,0xAA,0x2A, + 0x27,0x62,0x85,0x49,0xAD,0x3F,0x2F,0x2E,0x47,0x62,0xC6,0x59,0xF6,0x8A,0xAA,0xAE, + 0x27,0x62,0xE6,0x59,0x25,0x3B,0xF2,0xC8,0x47,0x62,0x06,0x5A,0xE2,0xBF,0xA9,0x57, + 0x47,0x62,0x07,0x62,0xBF,0xF2,0x22,0x8E,0x88,0x6A,0x06,0x5A,0xAD,0xFF,0xFF,0x3B, + 0x67,0x6A,0x06,0x62,0xAE,0xFD,0xFB,0x60,0x67,0x6A,0xE6,0x59,0x3A,0xAF,0xCD,0x27, + 0x67,0x6A,0x26,0x62,0x7A,0xB2,0xFB,0xB8,0x88,0x6A,0x27,0x62,0xBF,0xA2,0x9A,0xD5, + 0xA8,0x72,0x68,0x6A,0x3B,0xBF,0xFF,0xF5,0x88,0x6A,0x27,0x62,0x80,0x2E,0xA7,0xBE, + 0x88,0x6A,0x27,0x62,0xD2,0x7A,0xBA,0xBA,0xA8,0x72,0x07,0x62,0x2B,0xF7,0xD7,0xFE, + 0xA8,0x72,0x47,0x62,0xEA,0xC8,0xAB,0x2D,0xC9,0x72,0x68,0x6A,0x2A,0x23,0xFF,0x55, + 0xC9,0x72,0x68,0x6A,0x2A,0xAA,0x2B,0x25,0x0A,0x83,0x88,0x6A,0xFF,0x7F,0x7A,0xA2, + 0xC9,0x72,0x68,0x6A,0x78,0xEA,0xEA,0xA0,0xEA,0x7A,0x68,0x6A,0xF5,0x9E,0x2F,0xFF, + 0xC9,0x72,0x88,0x6A,0xD6,0x9F,0xF8,0x9B,0xA9,0x72,0x68,0x6A,0xE2,0x66,0xFE,0xFA, + 0xA9,0x6A,0x48,0x6A,0xBF,0xDF,0xFF,0x3B,0x89,0x6A,0x48,0x6A,0x68,0x4A,0xBE,0x28, + 0xC9,0x72,0x48,0x62,0x8A,0xAF,0xE7,0xFF,0xC9,0x72,0x68,0x6A,0xA8,0xE8,0x7F,0x5F, + 0xCA,0x7A,0x68,0x6A,0xCA,0x8A,0x3B,0x29,0xE9,0x7A,0x88,0x6A,0xEF,0xF9,0x2A,0x83, + 0xC9,0x7A,0x67,0x6A,0x81,0xC3,0xCA,0xA6,0xEA,0x7A,0xA9,0x72,0xA1,0x85,0xAD,0x56, + 0xEA,0x7A,0x88,0x6A,0x7E,0x7A,0x68,0xE0,0xA9,0x72,0x47,0x62,0x02,0xE9,0xBF,0xAE, + 0xA8,0x72,0x47,0x62,0x8E,0x80,0x80,0xE8,0xE9,0x7A,0x88,0x6A,0x1D,0xFD,0x7D,0x1B, + 0xE9,0x7A,0x89,0x6A,0xFB,0x7E,0xEA,0xE2,0xEA,0x7A,0x88,0x6A,0xAB,0x8B,0xEF,0x37, + 0x0A,0x7B,0x89,0x6A,0x7B,0x7E,0xB0,0x22,0xC9,0x72,0x68,0x6A,0x0E,0x0A,0x2C,0x26, + 0x0A,0x7B,0xA9,0x72,0x8B,0xA2,0xD5,0xDD,0x09,0x7B,0xA9,0x72,0xAE,0x8F,0xAD,0xBF, +}; + +static const size_t pixel_1_width = 256; +static const size_t pixel_1_height = 256; +static const size_t pixel_1_size = 32768; +static const unsigned char pixel_1_data[32768] = +{ + 0xA8,0x6A,0x84,0x49,0x5B,0x55,0xAD,0x0D,0x46,0x62,0x23,0x39,0xD6,0xDF,0xFE,0xF8, + 0x06,0x5A,0x02,0x39,0xA2,0x57,0x7E,0xAE,0x67,0x62,0xE2,0x30,0xDF,0xFF,0x0B,0xFF, + 0xC5,0x49,0xE2,0x30,0xA2,0x5A,0xE8,0xBE,0x88,0x62,0x02,0x31,0x5F,0xAF,0x2F,0xD5, + 0xC5,0x49,0x03,0x39,0x5F,0x78,0x68,0xEF,0x67,0x5A,0xE2,0x30,0xFF,0x8B,0xBD,0x57, + 0xA5,0x49,0xE2,0x30,0xDE,0x70,0xBA,0x0A,0x47,0x62,0x23,0x39,0xEF,0x0F,0x55,0x57, + 0xE5,0x51,0xC2,0x30,0xDE,0x7A,0xFF,0x8A,0x26,0x5A,0x03,0x39,0x8B,0xAD,0x55,0x5F, + 0x06,0x5A,0x23,0x39,0x97,0xFF,0xF5,0x8F,0x47,0x62,0x64,0x49,0x82,0x7B,0x55,0xDF, + 0x47,0x62,0x43,0x41,0x5E,0x5F,0xEB,0x8F,0x27,0x5A,0x03,0x39,0x82,0x55,0xD7,0x7E, + 0x07,0x5A,0x23,0x41,0xDF,0x7D,0xCA,0xEF,0xC5,0x51,0x03,0x39,0xA2,0xF5,0x9E,0x5F, + 0x89,0x6A,0x44,0x41,0x55,0x5D,0xE3,0x5D,0xC5,0x51,0x02,0x31,0xEF,0xB5,0x1C,0x7B, + 0x27,0x5A,0x03,0x39,0x5F,0xFA,0xE2,0x57,0xC5,0x51,0x24,0x39,0xF5,0x25,0x97,0xFD, + 0xE5,0x51,0x03,0x39,0x7E,0xA8,0xEA,0xDF,0x26,0x5A,0x23,0x39,0xAD,0x0D,0xD7,0x8A, + 0xE5,0x51,0x03,0x39,0x7E,0xE8,0xFE,0xDF,0x67,0x62,0x44,0x41,0x2D,0xAD,0xD5,0x03, + 0x27,0x62,0x64,0x49,0xF0,0xF0,0x55,0xE8,0xE6,0x59,0x64,0x41,0xAB,0x7F,0x95,0x02, + 0x46,0x5A,0x84,0x49,0xF7,0x05,0x2D,0xFF,0x68,0x6A,0xE5,0x51,0xB5,0xAE,0xA8,0x2B, + 0x87,0x6A,0x06,0x5A,0xA7,0x2B,0xCB,0x8A,0x87,0x6A,0x23,0x41,0x20,0xA2,0xBF,0xF7, + 0x47,0x62,0xA5,0x51,0x00,0x02,0x8C,0xD7,0x87,0x6A,0x26,0x5A,0x6E,0x2E,0x88,0xFF, + 0xA7,0x6A,0x43,0x41,0x55,0x5E,0x7A,0x6A,0x27,0x5A,0x03,0x39,0xFF,0x83,0x8B,0xF5, + 0xA5,0x49,0x23,0x39,0xBD,0xB4,0x5E,0xF0,0x47,0x5A,0x02,0x31,0x7E,0xE0,0xFB,0xFF, + 0x26,0x52,0x03,0x39,0x2D,0x2D,0xD7,0x7F,0x26,0x52,0x23,0x39,0xDE,0x78,0x77,0xBD, + 0x26,0x5A,0x23,0x39,0x02,0xAB,0xF5,0xD7,0x54,0xE6,0xA5,0x51,0x0D,0xB5,0x55,0x55, + 0x96,0xEE,0x26,0x5A,0x00,0x00,0x03,0x2D,0xB6,0xF6,0x96,0xEE,0xBF,0xAF,0x8B,0xAD, + 0xD6,0xF6,0x96,0xEE,0xDF,0xFD,0xBD,0x2F,0xD7,0xF6,0x96,0xEE,0x0B,0x82,0x70,0x5E, + 0xD7,0xF6,0x96,0xEE,0x2E,0xAE,0x3D,0xB7,0xD7,0xF6,0x75,0xE6,0x78,0xBC,0xAA,0xFA, + 0xF7,0xF6,0xB6,0xEE,0xD5,0xED,0x8A,0xE5,0xF8,0xFE,0xB6,0xEE,0xF6,0xBF,0x02,0xDF, + 0xF7,0xF6,0xD7,0xF6,0x29,0x02,0x02,0x09,0x18,0xFF,0xF7,0xF6,0xBA,0x3E,0xF7,0x55, + 0x18,0xFF,0xF8,0xF6,0xEA,0xA0,0xAB,0x55,0x18,0xFF,0xF8,0xF6,0x55,0xD7,0xFE,0xB9, + 0x18,0xF7,0xD7,0xF6,0xAA,0xFA,0xDA,0xA0,0x18,0xF7,0xD7,0xF6,0x5F,0x7F,0xFF,0x6A, + 0xD7,0xF6,0x97,0xEE,0x20,0x0E,0xF8,0xC0,0xF7,0xF6,0x96,0xEE,0x22,0xAB,0xFA,0xAD, + 0xF7,0xF6,0x96,0xEE,0x5E,0x72,0xEB,0xBF,0x96,0xEE,0x51,0xC5,0x70,0x68,0xE0,0xE8, + 0x34,0xE6,0x10,0xC5,0x80,0x03,0x89,0x0D,0x14,0xDE,0xF3,0xDD,0x76,0x7C,0x5F,0x76, + 0x14,0xDE,0xF3,0xDD,0x7E,0xBF,0x8D,0x8B,0x14,0xDE,0xD3,0xDD,0xA9,0xAF,0xEB,0xFE, + 0x47,0x5A,0x23,0x41,0xF5,0x3D,0xA7,0xDE,0x88,0x6A,0x43,0x41,0x5D,0x80,0xA2,0x5D, + 0x86,0x62,0x22,0x39,0xFD,0xF8,0xFE,0xD7,0xC5,0x49,0xC2,0x30,0x5E,0xFA,0xAA,0x2E, + 0x27,0x5A,0x02,0x31,0xAF,0x0B,0xFD,0xFE,0xA5,0x49,0xE2,0x30,0xF8,0xE0,0xBD,0xAD, + 0x67,0x62,0x23,0x39,0x2F,0xB5,0x55,0xF2,0xA5,0x49,0x02,0x31,0x68,0x7E,0xB5,0x37, + 0x68,0x62,0xE2,0x30,0x0B,0xF5,0xFF,0xA0,0xC5,0x49,0xE2,0x30,0x70,0x7E,0xB5,0xBE, + 0x06,0x52,0xC2,0x30,0x0B,0xFD,0xB0,0xA2,0x85,0x49,0xE2,0x30,0xE0,0xAD,0x2E,0x98, + 0x07,0x62,0x03,0x41,0xAD,0xFD,0xE0,0xEB,0xC5,0x61,0x64,0x49,0x67,0xAD,0xAB,0x0F, + 0xE6,0x61,0x44,0x41,0xDF,0xF8,0xF0,0x6A,0xA5,0x49,0xE2,0x30,0xFD,0x27,0x36,0xFA, + 0x48,0x62,0x24,0x39,0x75,0xF0,0xFA,0xFF,0x27,0x5A,0xE2,0x30,0xBD,0x27,0xFF,0xFE, + 0xC8,0x6A,0x03,0x39,0x5F,0xF0,0x7F,0xFF,0x27,0x52,0xE2,0x30,0x2D,0xAF,0xFF,0xAA, + 0x06,0x52,0x24,0x41,0x7C,0xF8,0xFF,0xAA,0x68,0x62,0x23,0x39,0x2D,0xF5,0x57,0x5F, + 0x06,0x52,0x23,0x39,0x7A,0xFB,0x0A,0x0B,0x27,0x5A,0x02,0x31,0x0B,0xFD,0xDE,0xFE, + 0x06,0x52,0x42,0x39,0x7E,0xFF,0x02,0xBF,0x67,0x62,0x84,0x41,0xAD,0x55,0xE0,0x55, + 0xE6,0x51,0x03,0x31,0x80,0x5E,0x68,0xFE,0x46,0x62,0x43,0x39,0xFF,0x0F,0xAD,0x55, + 0x05,0x52,0x43,0x39,0xFE,0xA8,0xFC,0x55,0x27,0x62,0x23,0x31,0x03,0x0A,0xBF,0xD5, + 0x27,0x62,0xE2,0x38,0x00,0x2B,0xBF,0x5E,0x26,0x5A,0x02,0x39,0xDC,0x68,0xFA,0xD5, + 0x26,0x5A,0x23,0x41,0xFF,0x0B,0xF5,0x56,0x06,0x5A,0x44,0x41,0xB0,0x58,0xD5,0x25, + 0xC5,0x51,0x02,0x39,0x02,0x02,0xED,0xF0,0xC5,0x51,0x23,0x39,0xDE,0x5C,0x55,0xEB, + 0x68,0x62,0x02,0x39,0xA2,0xFF,0x55,0xAF,0xC6,0x51,0x23,0x39,0xA2,0x57,0x55,0x00, + 0x26,0x5A,0x03,0x39,0xFF,0x55,0xF7,0x82,0x26,0x5A,0x03,0x39,0xBD,0x55,0xFF,0x02, + 0x26,0x62,0x02,0x39,0x7E,0x55,0xAF,0x00,0x27,0x62,0x02,0x39,0xDD,0xDD,0xAE,0x00, + 0xF0,0xBC,0x44,0x49,0x35,0xF5,0xBF,0x2F,0xD7,0xF6,0xD2,0xD5,0x22,0x89,0x29,0x0B, + 0xD7,0xF6,0x96,0xEE,0x8B,0x43,0x68,0x78,0xB6,0xEE,0x76,0xEE,0xB6,0x9F,0x95,0x56, + 0xB6,0xF6,0x34,0xE6,0x02,0x22,0xAA,0xF5,0x96,0xEE,0xF3,0xDD,0xF0,0x9C,0xD6,0x97, + 0xF7,0xF6,0xD3,0xD5,0x2A,0xAA,0xBF,0x5F,0xF7,0xF6,0xD3,0xD5,0x88,0x0A,0x2A,0xB5, + 0x18,0xFF,0x75,0xE6,0xF7,0x5E,0xE8,0xBB,0xF7,0xF6,0x55,0xE6,0x02,0xB5,0x5F,0xFA, + 0xF7,0xF6,0x55,0xE6,0x20,0x00,0x2D,0x97,0x18,0xF7,0xD7,0xF6,0xF7,0xFF,0x8A,0xE9, + 0x18,0xFF,0xD7,0xEE,0xAA,0xFD,0xEA,0xEB,0x18,0xF7,0xD7,0xF6,0xE2,0xAA,0x57,0x5C, + 0xF7,0xF6,0xB7,0xEE,0xF8,0xA8,0xFF,0xFE,0xD7,0xF6,0x75,0xEE,0x2E,0xF0,0x40,0x82, + 0xD7,0xF6,0x55,0xE6,0xA0,0xE2,0xE2,0xC1,0x96,0xEE,0xD3,0xD5,0x60,0xE0,0xC0,0xC2, + 0x14,0xDE,0x51,0xCD,0x25,0x35,0xBF,0xFF,0x14,0xDE,0xF3,0xDD,0xD4,0xBE,0xBC,0xBA, + 0x34,0xE6,0xF3,0xDD,0xEB,0xEA,0xE2,0xFA,0x14,0xDE,0xF3,0xDD,0xB7,0xED,0xDB,0xF5, + 0x05,0x5A,0x43,0x41,0xD8,0x50,0x72,0xC0,0x47,0x62,0x63,0x41,0x03,0xAB,0x55,0x25, + 0x67,0x62,0x84,0x41,0x57,0x77,0x55,0x78,0xA5,0x49,0x63,0x41,0x00,0x6A,0xEB,0xFE, + 0xA5,0x49,0x02,0x39,0xA0,0x7B,0xA0,0xAA,0xA5,0x49,0x02,0x31,0x3E,0xB3,0x8F,0x9A, + 0xCA,0x8B,0xA4,0x49,0x55,0x7D,0xC9,0x55,0x85,0x41,0xE2,0x28,0x9E,0xBE,0xF8,0x58, + 0x47,0x5A,0x02,0x31,0xFF,0x0F,0xAF,0x75,0xA5,0x49,0x02,0x31,0x5E,0xC8,0xCA,0xFF, + 0x84,0x49,0xE2,0x30,0xAA,0x02,0xA9,0x77,0x84,0x49,0xE2,0x30,0xAB,0x22,0xA8,0x55, + 0xA4,0x51,0x02,0x39,0xAF,0xAE,0xBA,0x95,0x26,0x72,0x84,0x51,0xED,0xBD,0xAB,0x8B, + 0x06,0x6A,0x84,0x51,0x7E,0x7A,0x78,0x40,0x85,0x51,0xE3,0x38,0x80,0xAA,0x7E,0x5C, + 0x85,0x49,0xC2,0x30,0x00,0x2A,0x5D,0xFD,0x85,0x49,0xC3,0x30,0x00,0xAA,0x57,0xAF, + 0x85,0x49,0xE2,0x30,0x88,0xEE,0x55,0xAA,0xC5,0x51,0xE3,0x30,0xAA,0x7F,0x55,0x2A, + 0xC5,0x49,0x03,0x39,0xAA,0x55,0x55,0x28,0x06,0x52,0x03,0x39,0x5B,0xD5,0xB5,0x00, + 0x06,0x5A,0xE2,0x30,0xFF,0x55,0xAE,0x00,0x06,0x5A,0xE2,0x30,0xFF,0xB5,0x2B,0x00, + 0x27,0x5A,0x02,0x39,0x75,0x57,0xAA,0x00,0x06,0x5A,0x23,0x39,0x55,0x55,0x2A,0x00, + 0x05,0x5A,0xE2,0x30,0xD7,0xBF,0x00,0x20,0x07,0x5A,0xC2,0x30,0xD6,0xA8,0x80,0x22, + 0x07,0x62,0xE2,0x30,0x55,0xAA,0x00,0xAA,0x06,0x5A,0x03,0x31,0xD5,0x0A,0x20,0x00, + 0xC8,0x72,0x64,0x49,0x5B,0xFF,0xFA,0x0A,0xAC,0x93,0x84,0x49,0x55,0xFD,0x55,0x02, + 0xD0,0xB4,0xE6,0x59,0x55,0x55,0x55,0x0A,0x32,0xC5,0x06,0x5A,0x55,0x55,0x55,0x00, + 0xB4,0xD5,0x06,0x5A,0x55,0x55,0xF5,0x00,0x36,0xE6,0x06,0x5A,0x55,0x55,0xFF,0x00, + 0x55,0xE6,0x06,0x5A,0x55,0x55,0xAB,0x00,0x97,0xEE,0x27,0x62,0x55,0x55,0xAA,0x00, + 0x35,0xDE,0x26,0x62,0x55,0xD5,0x00,0x00,0x75,0xE6,0xE5,0x59,0x55,0xFF,0x00,0x00, + 0x75,0xE6,0x06,0x5A,0x55,0xAF,0x00,0x00,0x96,0xEE,0x27,0x62,0x55,0xAA,0x00,0x00, + 0xB6,0xEE,0xE8,0x7A,0xBD,0x0A,0x00,0x00,0xD7,0xF6,0x75,0xEE,0x0D,0x89,0xA2,0xA0, + 0xB6,0xF6,0x76,0xEE,0xE0,0x68,0x78,0xEA,0x96,0xEE,0xF4,0xDD,0xE8,0xE0,0x7A,0x7A, + 0xB6,0xF6,0xD3,0xD5,0xBF,0xBD,0xB5,0x2F,0xD7,0xF6,0x14,0xDE,0xF5,0xAB,0x82,0x00, + 0xB7,0xF6,0x55,0xE6,0x5D,0xBF,0xFE,0xE0,0xB6,0xEE,0x51,0xCD,0x5F,0x80,0x08,0x22, + 0x96,0xEE,0x92,0xCD,0x0B,0xB5,0xF8,0x80,0xF7,0xF6,0x34,0xDE,0xAA,0xAB,0xB5,0xF5, + 0xD7,0xF6,0x14,0xDE,0x6A,0xC0,0x02,0x0A,0xD7,0xF6,0x92,0xCD,0x02,0x2D,0xBE,0x80, + 0x18,0xFF,0x96,0xE6,0xAA,0x20,0x29,0x95,0x18,0xF7,0xD7,0xF6,0xEA,0xBA,0xAA,0xEA, + 0xF7,0xF6,0xB7,0xEE,0xEE,0xEC,0xF0,0xC0,0xD7,0xF6,0x96,0xEE,0xAA,0xBC,0xFA,0x6A, + 0xB6,0xEE,0x34,0xDE,0x8B,0x27,0xB4,0xBE,0x96,0xEE,0x34,0xE6,0xCB,0xEB,0xFD,0xB7, + 0xF3,0xDD,0x71,0xCD,0xDF,0xD6,0x5C,0x5C,0x34,0xE6,0xD3,0xDD,0xAF,0xA9,0x39,0xA9, + 0x34,0xE6,0x14,0xDE,0x78,0x53,0x5F,0x5E,0x34,0xE6,0xF3,0xDD,0xD5,0xB5,0xDF,0xFF, + 0x2A,0x83,0xC5,0x51,0x57,0x5E,0x5E,0x7C,0x84,0x49,0xE1,0x30,0x2B,0xD6,0x5C,0x00, + 0x67,0x62,0x22,0x39,0xFF,0x77,0x55,0x2B,0xA8,0x6A,0x23,0x39,0xFF,0x55,0xFF,0x00, + 0x27,0x62,0x02,0x31,0xFF,0x55,0xAA,0x00,0x27,0x5A,0x02,0x31,0x5F,0x7D,0x8A,0x80, + 0x06,0x5A,0x02,0x31,0x55,0x55,0xAA,0x00,0xE6,0x51,0xC2,0x28,0x5D,0xFF,0x00,0x20, + 0x07,0x5A,0xC1,0x30,0x55,0xFF,0x00,0xA2,0x06,0x5A,0xE2,0x30,0xD5,0xFF,0x00,0xAA, + 0x07,0x5A,0xC1,0x30,0x56,0xA2,0x00,0xAA,0x06,0x5A,0xE2,0x30,0x55,0x22,0x80,0xAE, + 0xC5,0x59,0x02,0x39,0xB5,0x00,0x00,0x00,0x26,0x72,0xC5,0x61,0x09,0xA9,0xEF,0xED, + 0x26,0x72,0xE5,0x69,0x4A,0xBF,0xFB,0x8B,0xAB,0xA3,0xC5,0x59,0x55,0x57,0x5D,0x2F, + 0x11,0xC5,0xC6,0x59,0x55,0x55,0x55,0x02,0x72,0xCD,0xE5,0x51,0x55,0x55,0x75,0x00, + 0xF3,0xD5,0xC5,0x51,0x55,0x55,0xFF,0x00,0x35,0xE6,0xE6,0x59,0x55,0x55,0xBF,0x00, + 0x55,0xE6,0xE6,0x59,0x55,0x55,0xAA,0x00,0xB6,0xEE,0x26,0x62,0x55,0x55,0xAA,0x00, + 0x34,0xDE,0xC6,0x51,0x55,0xFD,0x00,0x00,0x76,0xEE,0xE6,0x59,0x55,0xFF,0x00,0x00, + 0x76,0xE6,0xC5,0x59,0x55,0xAA,0x00,0x00,0x96,0xEE,0x26,0x62,0x55,0xAA,0x00,0x00, + 0xB7,0xF6,0xA8,0x7A,0x55,0x2A,0x00,0x00,0x76,0xEE,0xE9,0x7A,0xF5,0x20,0x00,0x00, + 0x76,0xEE,0x2E,0xA4,0xD5,0x00,0x00,0x00,0xD3,0xDD,0x26,0x6A,0xAA,0xC0,0xE0,0x78, + 0x4E,0xAC,0x06,0x62,0x3E,0xB7,0x55,0x55,0xB7,0xF6,0x8F,0xB4,0xAA,0x03,0x09,0x09, + 0xF8,0xFE,0x55,0xE6,0xD5,0xAE,0xAA,0x00,0x18,0xFF,0x76,0xEE,0x75,0xBF,0xA2,0x08, + 0xF7,0xF6,0x96,0xEE,0x5D,0xAE,0xA8,0xAC,0xD7,0xF6,0x96,0xEE,0xBD,0xAA,0x08,0x00, + 0xD7,0xF6,0xB7,0xEE,0x5D,0xEF,0xEC,0x8A,0xD7,0xF6,0x96,0xEE,0xEF,0xAA,0x82,0x82, + 0xD7,0xF6,0xB7,0xEE,0xF7,0xE7,0xEA,0xA8,0xD7,0xF6,0xB6,0xEE,0xEB,0xEB,0xFF,0xAA, + 0xB6,0xF6,0xD7,0xEE,0x8A,0x22,0xFA,0xEB,0xF7,0xF6,0xB6,0xEE,0x77,0x5F,0xFD,0xBB, + 0xF7,0xF6,0x96,0xEE,0x2A,0x8B,0x62,0x58,0xD7,0xF6,0x76,0xEE,0xE8,0xBB,0xFD,0x5D, + 0x96,0xEE,0x14,0xE6,0x00,0xE8,0xF8,0x7E,0xB6,0xF6,0x14,0xDE,0x5F,0xFD,0x2F,0x2D, + 0xF7,0xF6,0x55,0xE6,0xAD,0x0A,0xAA,0xAA,0xF7,0xF6,0xB7,0xF6,0x8A,0xA2,0xAA,0xAD, + 0xF7,0xF6,0xB6,0xEE,0x5E,0xFA,0xA8,0xAB,0xD7,0xF6,0x75,0xE6,0xDF,0xFA,0xAA,0x80, + 0xB6,0xEE,0x76,0xEE,0x37,0xBF,0xAA,0x00,0xD7,0xF6,0x55,0xE6,0xD6,0xA8,0x0A,0x2A, + 0xF7,0xF6,0x76,0xEE,0xBD,0xBF,0xAE,0xA8,0x38,0xFF,0xD7,0xF6,0xFF,0xED,0xBD,0x2F, + 0x18,0xFF,0xB7,0xEE,0x7E,0xAE,0xEA,0xA0,0x18,0xF7,0xB7,0xEE,0xA3,0xAD,0xDE,0xFA, + 0x18,0xF7,0xD7,0xF6,0x6A,0xEA,0xEB,0xFF,0xB7,0xEE,0x75,0xE6,0xA0,0x60,0x60,0x60, + 0x96,0xEE,0x92,0xD5,0xA8,0xB8,0xFA,0x5A,0x75,0xEE,0x14,0xDE,0xB6,0xF4,0xDE,0x56, + 0x55,0xE6,0x71,0xCD,0x5E,0x5C,0x5C,0x58,0x34,0xE6,0xB3,0xD5,0x8B,0x89,0x0B,0x01, + 0x34,0xE6,0xF3,0xDD,0xDA,0x5A,0x5E,0x5F,0x14,0xDE,0xD3,0xDD,0x0B,0xA2,0xEA,0x6F, + 0x35,0xE6,0xE5,0x59,0x56,0x7A,0xA0,0x00,0xF4,0xD5,0xA4,0x51,0x55,0x55,0xBA,0x00, + 0xF4,0xD5,0xC5,0x51,0x55,0x55,0xAA,0x00,0x35,0xE6,0x06,0x5A,0x55,0x55,0xAA,0x00, + 0x35,0xE6,0x26,0x62,0x55,0x55,0x8A,0x00,0x35,0xE6,0xA5,0x51,0x55,0xFF,0x00,0x00, + 0x35,0xE6,0xC5,0x51,0x55,0xBB,0x00,0x00,0x55,0xE6,0xC5,0x51,0x55,0xAA,0x00,0x00, + 0x75,0xEE,0x67,0x6A,0x55,0xAA,0x00,0x00,0x55,0xE6,0xE9,0x7A,0x55,0x22,0x00,0x00, + 0x55,0xE6,0xCC,0x93,0x55,0x02,0x00,0x00,0x76,0xEE,0x2E,0xA4,0xF5,0x20,0x00,0x00, + 0x55,0xEE,0xAC,0x9B,0x7B,0xC0,0xC0,0xC0,0x67,0x72,0xA4,0x61,0xF7,0xD6,0x54,0x5C, + 0x26,0x72,0xA4,0x61,0xAB,0x8B,0xA9,0x0F,0x2D,0xAC,0x26,0x72,0x35,0xB5,0x55,0x55, + 0x55,0xEE,0xE9,0x8A,0x02,0x03,0x0B,0x2D,0xB6,0xF6,0x75,0xEE,0xD5,0xAB,0xAA,0x8B, + 0xB6,0xF6,0x75,0xEE,0xFD,0xAB,0xA2,0x82,0xB6,0xF6,0x96,0xEE,0x55,0xEA,0xEA,0xEA, + 0xB6,0xF6,0x96,0xEE,0xA5,0x2B,0xBE,0x8F,0xB6,0xF6,0x96,0xEE,0xF3,0x88,0x32,0x0F, + 0xB6,0xF6,0x96,0xEE,0x2E,0x82,0x2A,0x08,0xB6,0xF6,0xD7,0xEE,0x22,0xC8,0x88,0xFC, + 0xF7,0xF6,0xB6,0xF6,0xE7,0xAA,0x0A,0x02,0xF8,0xFE,0xD7,0xEE,0xF5,0xEA,0x8A,0xAA, + 0xF7,0xF6,0xD7,0xF6,0xD5,0x0A,0x02,0x00,0xF7,0xFE,0xD7,0xF6,0xD7,0xFC,0xEA,0x7E, + 0xB6,0xF6,0xCB,0xA3,0x80,0xA0,0xE0,0x78,0xCF,0xBC,0x67,0x72,0x58,0x56,0x57,0x55, + 0x67,0x7A,0xC5,0x61,0xDE,0xFA,0xB8,0x30,0xD7,0xF6,0x2D,0xAC,0x09,0x09,0x09,0x09, + 0x18,0xFF,0xF7,0xF6,0xDF,0xBF,0xBD,0xFF,0x17,0xFF,0xF7,0xF6,0xEB,0xBB,0x82,0xAB, + 0xF7,0xF6,0xD7,0xF6,0x6C,0x5A,0xD0,0x30,0xF7,0xF6,0xD7,0xF6,0x55,0xFE,0xFF,0xEF, + 0xD7,0xF6,0xB6,0xEE,0x0B,0x2B,0x00,0x00,0xB7,0xF6,0xF7,0xEE,0xAA,0xEA,0xAE,0xEF, + 0xD7,0xF6,0xB7,0xEE,0x88,0x0A,0x02,0x80,0xF7,0xF6,0xB6,0xEE,0xFF,0xBE,0xAE,0xAE, + 0xB6,0xF6,0xF7,0xEE,0xAA,0xBA,0xBB,0xEE,0xF7,0xF6,0xB6,0xEE,0x0E,0x82,0xC2,0x78, + 0xD7,0xF6,0x96,0xEE,0x78,0x54,0x76,0x57,0x96,0xEE,0xF4,0xDD,0xA0,0xE8,0x6A,0x78, + 0x35,0xE6,0x91,0xCD,0xE0,0x70,0x5F,0x16,0x96,0xF6,0xF3,0xDD,0xAD,0xFD,0x03,0x00, + 0xB6,0xF6,0xB3,0xD5,0x0A,0xF7,0xFE,0xA8,0xD7,0xF6,0xF4,0xDD,0x02,0xAF,0xFD,0xFF, + 0xD7,0xF6,0x55,0xE6,0x00,0x0A,0x3D,0xD5,0xF7,0xF6,0xB6,0xEE,0xAA,0xAA,0x83,0xB5, + 0xD7,0xF6,0x96,0xEE,0xFE,0xF8,0x28,0x00,0xD7,0xF6,0x96,0xEE,0x0A,0xAE,0x9E,0xF8, + 0x18,0xF7,0xD7,0xF6,0xFF,0xFD,0xB5,0xA5,0x38,0xFF,0xF8,0xF6,0xA5,0xB5,0xDD,0xD7, + 0x38,0xFF,0xF8,0xF6,0xFA,0xE8,0x82,0x0B,0x18,0xFF,0xB7,0xF6,0xEA,0xFA,0xFA,0xDC, + 0xF7,0xF6,0x76,0xEE,0x82,0xAB,0xAF,0xB7,0xD7,0xF6,0x75,0xE6,0x7A,0x78,0x78,0xDA, + 0x55,0xE6,0x10,0xC5,0xF8,0xF8,0x58,0x58,0x55,0xEE,0xD3,0xDD,0xFA,0xF3,0xF2,0xE1, + 0x14,0xE6,0x10,0xC5,0xF0,0x60,0x60,0x40,0xD7,0xF6,0x92,0xD5,0xFD,0xBD,0xA9,0x2D, + 0x75,0xEE,0xF3,0xDD,0x7F,0x77,0x7E,0x80,0x34,0xE6,0x92,0xCD,0x6A,0x7A,0x6A,0x88, + 0xD6,0xF6,0x96,0xEE,0x5F,0x5E,0xEA,0xAE,0xB6,0xEE,0x75,0xE6,0x55,0xBB,0x02,0x00, + 0xB6,0xEE,0x75,0xE6,0xD5,0xAA,0x02,0x00,0xD7,0xF6,0x75,0xE6,0x55,0xEF,0xAA,0xA2, + 0xB6,0xEE,0x75,0xE6,0xFD,0xAA,0x20,0x00,0xB6,0xEE,0x75,0xEE,0xFF,0x22,0x00,0x00, + 0xD5,0xEE,0x76,0xEE,0xF7,0xFF,0xFF,0xFE,0x96,0xEE,0x75,0xEE,0x8B,0xC8,0x0A,0x08, + 0xB7,0xF6,0x75,0xEE,0xFF,0xFF,0xBE,0xAA,0xD6,0xF6,0x96,0xEE,0xF7,0xBF,0xAB,0xAA, + 0xD7,0xF6,0x96,0xEE,0xFF,0x2F,0x8A,0xA2,0xD7,0xF6,0x96,0xF6,0xDB,0xAA,0xAA,0xA8, + 0xB6,0xF6,0x6D,0xB4,0x60,0x40,0x60,0xC0,0x66,0x7A,0x84,0x61,0x7E,0xFE,0xFA,0xEC, + 0x27,0x7A,0x84,0x61,0x2D,0xBF,0xFF,0xDE,0x26,0x72,0xE6,0x71,0x25,0x2E,0xBF,0x6D, + 0xD3,0xDD,0x67,0x7A,0x25,0xB5,0xD5,0xD5,0x96,0xF6,0x8F,0xBC,0x00,0x02,0x02,0x09, + 0xB6,0xF6,0x96,0xEE,0x28,0x02,0x8A,0x0A,0xD6,0xF6,0x96,0xEE,0xFE,0xEA,0xAA,0xEA, + 0xB6,0xF6,0x96,0xEE,0x2A,0x02,0x22,0x00,0xB6,0xF6,0x96,0xEE,0xAA,0x82,0x20,0x08, + 0xD6,0xF6,0xB6,0xF6,0x5D,0xD5,0x6D,0xA5,0xD7,0xF6,0xB6,0xEE,0x2B,0x2B,0x2E,0x3A, + 0xD7,0xFE,0xF7,0xF6,0x75,0x57,0xD7,0x55,0x17,0xFF,0xF7,0xF6,0x5D,0xDF,0x7F,0x5B, + 0xD6,0xFE,0xF7,0xF6,0xD7,0xD7,0x55,0xA7,0xD6,0xF6,0xAF,0xBC,0x00,0x80,0xE0,0x78, + 0x35,0xEE,0x87,0x7A,0x78,0x5E,0x57,0x57,0xC7,0x8A,0x47,0x7A,0xFF,0xFF,0xAD,0x2F, + 0xAB,0xA3,0x46,0x72,0xD5,0x97,0x97,0x1F,0xF7,0xFE,0x8F,0xBC,0x09,0x0B,0x03,0x02, + 0x17,0xFF,0xF8,0xF6,0xEA,0x2E,0x2A,0xAA,0x18,0xFF,0xF7,0xF6,0x0A,0xA8,0xA2,0xCA, + 0xF7,0xF6,0xD7,0xF6,0xA8,0xA8,0xA8,0x82,0xF7,0xF6,0xD7,0xF6,0xFF,0x9F,0xFA,0x5A, + 0xD7,0xF6,0xD6,0xEE,0x82,0xA8,0x22,0x8A,0xF7,0xF6,0xD7,0xF6,0xDF,0x7B,0xD5,0x9D, + 0xF7,0xF6,0xB7,0xEE,0xAF,0xBA,0xEA,0xAA,0xF7,0xF6,0xD7,0xF6,0x5D,0xDD,0xF7,0x2B, + 0x17,0xFF,0xB7,0xEE,0xAF,0xAB,0xEA,0x78,0xF8,0xF6,0x96,0xEE,0xFC,0x7E,0x5F,0x5F, + 0x96,0xEE,0x34,0xE6,0x80,0xC8,0x68,0x5C,0x55,0xE6,0xB2,0xD5,0xE8,0xFA,0xFE,0x97, + 0xB7,0xF6,0xF3,0xDD,0x35,0x2D,0x0B,0x02,0xD7,0xF6,0xB6,0xF6,0xAD,0xA0,0x82,0xA2, + 0xD7,0xF6,0x96,0xEE,0x7E,0xAE,0xBA,0xA8,0xD7,0xF6,0x55,0xE6,0xD7,0x8A,0x22,0x2A, + 0xD7,0xF6,0x75,0xE6,0x5F,0xAF,0x28,0xA8,0xF7,0xF6,0x75,0xE6,0xBD,0xFF,0xFE,0x82, + 0xF7,0xF6,0x96,0xEE,0xA2,0x83,0x89,0x2F,0xF7,0xF6,0xB7,0xEE,0x5E,0xFA,0xB0,0xA0, + 0xF8,0xF6,0xB7,0xEE,0x0B,0x0B,0x8A,0xA2,0x18,0xF7,0xD7,0xEE,0x20,0x8A,0xAF,0xB7, + 0x38,0xFF,0xF8,0xF6,0x8F,0xB5,0xDF,0x57,0x38,0xFF,0x96,0xEE,0xF8,0x78,0x72,0x6A, + 0xD7,0xF6,0x35,0xE6,0x2E,0x3F,0xBE,0xDF,0xB6,0xF6,0x14,0xDE,0xB8,0xFC,0xDC,0x7C, + 0x34,0xE6,0x10,0xBD,0x58,0x5C,0x5C,0x5C,0x34,0xE6,0x92,0xCD,0x83,0xC1,0xC9,0xC9, + 0xF4,0xDD,0x51,0xC5,0x40,0x42,0x42,0x8B,0x76,0xEE,0xCF,0xB4,0x0B,0x2D,0xB5,0x25, + 0x95,0xEE,0x55,0xE6,0xEC,0x5E,0x5F,0xDC,0x96,0xEE,0x55,0xE6,0xD7,0xFB,0xAD,0xA9, + 0xD6,0xF6,0xB6,0xEE,0xB5,0xFD,0xFD,0xDD,0xD6,0xF6,0xB6,0xEE,0xF5,0xDF,0xF6,0xF9, + 0xD6,0xF6,0xB6,0xEE,0xAD,0xFF,0xBB,0xBB,0xD6,0xF6,0xB6,0xEE,0xFF,0xDF,0xBF,0xFF, + 0xD7,0xF6,0xB6,0xEE,0x77,0xFF,0xBA,0xFA,0xB6,0xF6,0xD6,0xEE,0x28,0xBA,0xAF,0xBA, + 0xB7,0xEE,0x95,0xEE,0x56,0xDF,0x57,0x76,0xB7,0xFE,0x95,0xEE,0xD5,0xD5,0x7F,0xF5, + 0xB5,0xF6,0x96,0xEE,0xAF,0xEE,0xFB,0xBF,0xD7,0xF6,0xB6,0xEE,0xAB,0x2B,0x8B,0x29, + 0xD7,0xF6,0xB6,0xEE,0xAE,0x28,0x02,0x80,0xD7,0xF6,0xB6,0xEE,0xBA,0xAA,0xA0,0x00, + 0xB6,0xF6,0x86,0x7A,0x80,0xE0,0x60,0x70,0x47,0x72,0x63,0x61,0xA8,0xAE,0xBA,0xDC, + 0x26,0x72,0x84,0x61,0x7A,0x70,0xF8,0xEA,0x07,0x72,0x64,0x61,0x0A,0xAB,0xBF,0xF7, + 0xA7,0x7A,0xA5,0x61,0x2F,0xBF,0xBD,0xF5,0x75,0xEE,0xA7,0x82,0x0B,0x2D,0x35,0xB5, + 0xD7,0xF6,0x75,0xF6,0xAA,0x2A,0xAA,0x81,0xD6,0xF6,0xB6,0xF6,0xDB,0xEE,0xB9,0xA3, + 0xD6,0xF6,0xB6,0xF6,0x5D,0x76,0x78,0xFF,0xB6,0xF6,0xB7,0xEE,0x88,0x22,0x88,0x20, + 0xD6,0xF6,0xB6,0xF6,0x37,0xBD,0xB7,0x9D,0xF7,0xF6,0xB6,0xEE,0xBB,0xBE,0xAF,0xAF, + 0xD6,0xFE,0xF7,0xF6,0xD5,0xDF,0x77,0x55,0xD7,0xFE,0xF7,0xF6,0x7D,0x55,0xF5,0xED, + 0xF7,0xFE,0x51,0xD5,0x00,0xA0,0xE0,0x78,0xF3,0xE5,0x46,0x72,0xE0,0x78,0x5E,0x57, + 0x67,0x7A,0x26,0x7A,0x89,0xFA,0x7A,0xFE,0xA7,0x8A,0x47,0x82,0x3B,0x0A,0xAF,0x8D, + 0xB2,0xDD,0x87,0x82,0x95,0x95,0xB5,0x35,0xF7,0xFE,0x55,0xEE,0x01,0x01,0x03,0x02, + 0x18,0xFF,0xF7,0xF6,0x3A,0x2A,0x2A,0x2A,0x37,0xFF,0xF8,0xF6,0xFE,0xFA,0xEE,0xAE, + 0xF7,0xF6,0xD7,0xF6,0xA0,0xE0,0xA8,0xBC,0xF7,0xF6,0xD7,0xF6,0x7A,0x6F,0xFE,0xDB, + 0xD7,0xF6,0xF7,0xEE,0x08,0x88,0x0A,0x22,0xF7,0xF6,0xD7,0xF6,0xD7,0xB5,0xB5,0xD5, + 0xF7,0xF6,0xD7,0xF6,0xDD,0xFD,0x3D,0x2B,0x18,0xFF,0xD7,0xF6,0x2D,0x8F,0x63,0x58, + 0xF7,0xF6,0x96,0xEE,0xF8,0xF8,0x7F,0x5F,0xB7,0xF6,0x35,0xE6,0xA8,0xEA,0x7A,0x7A, + 0x55,0xEE,0x92,0xCD,0xE0,0xE8,0x5A,0xDE,0xD7,0xF6,0x71,0xCD,0xB7,0x2D,0x0B,0x02, + 0xD7,0xF6,0xB6,0xF6,0x8D,0x0B,0x00,0x00,0xD7,0xF6,0xB7,0xEE,0xA8,0xAA,0x00,0x80, + 0xD7,0xF6,0xB7,0xEE,0xE8,0x8A,0xF8,0xFC,0xD7,0xF6,0xB6,0xEE,0x55,0x7F,0x8F,0x23, + 0xD7,0xF6,0xB6,0xEE,0x5D,0x55,0x77,0x6E,0xF7,0xF6,0x96,0xEE,0x2B,0x2F,0xBD,0xFF, + 0x18,0xFF,0xD7,0xF6,0xFF,0xAA,0x2B,0x2D,0x39,0xFF,0xF7,0xF6,0x5F,0x7F,0xEA,0xAA, + 0xF7,0xF6,0xD7,0xEE,0x2C,0x2E,0x02,0x00,0xF8,0xF6,0xD7,0xF6,0xA4,0xEC,0xDA,0xB8, + 0xF7,0xF6,0xB7,0xEE,0xA0,0xA2,0xC2,0xE0,0xD7,0xF6,0xB7,0xEE,0x40,0x6A,0xA2,0x22, + 0xB7,0xEE,0x14,0xDE,0x9E,0xDE,0xD8,0x58,0xD7,0xF6,0x34,0xE6,0x58,0x7A,0x72,0x62, + 0x14,0xDE,0x10,0xC5,0x5C,0xF8,0xF8,0xF8,0x34,0xE6,0x71,0xCD,0x89,0xA9,0xAD,0xAD, + 0xD3,0xDD,0x51,0xC5,0x8B,0x0B,0x0F,0xA5,0xB6,0xF6,0x10,0xC5,0x25,0x2D,0x2F,0x2F, + 0xB6,0xF6,0x34,0xE6,0xDA,0x58,0xF8,0x70,0x96,0xEE,0x35,0xE6,0x3F,0xB5,0xBD,0xBD, + 0xD6,0xF6,0xB6,0xEE,0x5B,0xF7,0xFD,0xBD,0xD6,0xF6,0xB6,0xEE,0x6F,0xBE,0xBA,0xB6, + 0xD6,0xF6,0xB6,0xEE,0xBF,0xE3,0xAD,0xA7,0xD6,0xF6,0xB6,0xEE,0xAF,0x6E,0xFF,0xEC, + 0xD6,0xF6,0xB6,0xEE,0xAD,0xBF,0xE3,0xEF,0xD6,0xF6,0xB6,0xEE,0x3F,0xEE,0xEE,0xFD, + 0xB6,0xF6,0x95,0xEE,0xFA,0xF6,0xFC,0xBE,0xB6,0xF6,0x96,0xEE,0xA5,0xED,0x7E,0xFE, + 0x96,0xF6,0xB6,0xEE,0x9F,0x6E,0x7F,0x7A,0xF6,0xF6,0xB6,0xEE,0xFD,0xBF,0xFF,0xAB, + 0xD7,0xF6,0xB6,0xEE,0xE0,0xE0,0x0A,0x08,0xB6,0xF6,0xF7,0xEE,0xAF,0xAF,0xAB,0xAB, + 0x55,0xEE,0xC4,0x61,0x70,0x70,0x70,0x70,0xE6,0x69,0x23,0x51,0x58,0x5E,0x5E,0x7F, + 0xE6,0x71,0x03,0x51,0x02,0x03,0x09,0xAD,0xA5,0x61,0x44,0x59,0xFA,0xBE,0x5C,0x58, + 0xC5,0x69,0x44,0x51,0x2F,0xAD,0xB5,0xF5,0xAB,0x9B,0xE6,0x69,0x2D,0xBD,0xB5,0xD5, + 0xB6,0xF6,0x6A,0x93,0x02,0x0B,0x09,0x25,0xD6,0xFE,0xD7,0xF6,0xFF,0xFF,0xDF,0xBE, + 0xD7,0xF6,0xB6,0xF6,0xBC,0xFE,0xEC,0xB8,0xD7,0xF6,0xB6,0xF6,0xD5,0xB7,0xBF,0xAB, + 0xD6,0xF6,0xB6,0xF6,0xFE,0xBE,0xAC,0xA0,0xF7,0xFE,0xB6,0xF6,0xBD,0xEF,0xBF,0xBE, + 0xD7,0xFE,0xF7,0xF6,0x55,0x57,0xFF,0xEF,0xD7,0xF6,0xB2,0xDD,0x00,0x00,0x80,0x60, + 0x76,0xEE,0x66,0x7A,0xE0,0x78,0x5E,0x5F,0x67,0x82,0x05,0x72,0xE8,0xFD,0xBF,0x2B, + 0x87,0x8A,0x05,0x7A,0xA7,0xAD,0x2F,0xEA,0x87,0x8A,0x25,0x7A,0x02,0xEA,0xFE,0xDF, + 0x76,0xEE,0x66,0x82,0x35,0x25,0x25,0x2D,0x18,0xFF,0xF7,0xFE,0x2D,0x09,0x29,0x01, + 0x38,0xFF,0x17,0xF7,0x57,0xDD,0x7F,0xFE,0x18,0xFF,0xF7,0xEE,0x88,0xE2,0xA0,0xC0, + 0xF7,0xF6,0xD7,0xF6,0xAC,0x2E,0xB8,0xAA,0xF7,0xF6,0xD7,0xF6,0xFF,0xFA,0x7A,0xBA, + 0xF7,0xF6,0xD7,0xF6,0x5A,0xF7,0x95,0xAA,0xF7,0xF6,0xD7,0xF6,0xD7,0x5E,0x5F,0x23, + 0x18,0xFF,0xB6,0xF6,0x2B,0x2B,0xA2,0x72,0x17,0xFF,0xB6,0xF6,0x5C,0x5F,0x57,0x55, + 0xB6,0xF6,0x54,0xE6,0xE0,0xA8,0xE8,0x78,0x75,0xEE,0x92,0xD5,0xA0,0xE8,0x78,0xFA, + 0xB7,0xF6,0x92,0xCD,0xB7,0x25,0x0B,0x02,0xF7,0xF6,0xB6,0xF6,0xAD,0xBB,0xAA,0xAB, + 0xF7,0xF6,0xD7,0xF6,0x5F,0xD5,0xFD,0x75,0xD7,0xF6,0xB7,0xEE,0xA8,0x00,0x00,0x00, + 0xD7,0xF6,0xB7,0xEE,0x3A,0xAA,0x0A,0xA8,0xD7,0xF6,0xB6,0xEE,0x28,0xFA,0xB8,0xFB, + 0xD7,0xF6,0xB7,0xEE,0xFE,0xBE,0x2F,0xB8,0xD7,0xF6,0xB7,0xEE,0x5F,0xFC,0xA2,0xA0, + 0xF7,0xF6,0xB7,0xEE,0x2D,0x3D,0xFF,0xFF,0x38,0xFF,0xF7,0xF6,0x2A,0xAB,0xAD,0xB5, + 0x39,0xFF,0xF7,0xF6,0x5E,0x58,0x60,0xC0,0xF7,0xF6,0xD8,0xF6,0xAA,0xAA,0x8B,0x78, + 0xF7,0xF6,0x96,0xEE,0x8A,0xE8,0x68,0x5F,0xD7,0xF6,0x96,0xEE,0x2A,0x2A,0x2F,0x2D, + 0xB7,0xF6,0x91,0xCD,0xB8,0xB8,0xE8,0xD8,0xD6,0xF6,0x54,0xE6,0x62,0xE2,0xA3,0xA9, + 0x14,0xDE,0x71,0xCD,0x74,0xFC,0x74,0xFC,0x34,0xE6,0x92,0xCD,0xAD,0xA5,0xB5,0xB5, + 0x71,0xCD,0xAF,0xB4,0xA8,0xAC,0xBE,0xD4,0xB6,0xF6,0x71,0xCD,0x0D,0x09,0x0B,0x2D, + 0xD7,0xF6,0x34,0xE6,0xF8,0xF8,0x78,0x7A,0x75,0xEE,0x34,0xE6,0x27,0xA7,0xBF,0xEF, + 0xD6,0xF6,0xB6,0xEE,0xFF,0xEA,0xBA,0xAB,0xD6,0xF6,0xB6,0xEE,0x29,0xAB,0xEC,0xEA, + 0xD6,0xF6,0xB6,0xEE,0xAA,0xAA,0x0A,0x0E,0xD6,0xF6,0xB6,0xEE,0xAA,0xAA,0xAA,0xA2, + 0xD6,0xF6,0xB6,0xEE,0xAA,0x86,0x7F,0x4A,0xD6,0xF6,0xB6,0xEE,0xFE,0xEA,0xBB,0xBA, + 0x96,0xF6,0xB6,0xEE,0xF9,0xFD,0xBD,0xED,0xB6,0xF6,0x96,0xEE,0xEE,0xAA,0xEE,0xCA, + 0x95,0xF6,0xB6,0xEE,0xDF,0x7F,0xDD,0x55,0xD6,0xF6,0xB6,0xEE,0x82,0x03,0x23,0x03, + 0xD6,0xF6,0xF7,0xEE,0x00,0x20,0x22,0xA0,0xD6,0xF6,0xB7,0xEE,0xA2,0x82,0x00,0x00, + 0xB6,0xF6,0xC4,0x59,0x70,0x70,0x70,0x60,0x85,0x59,0x23,0x49,0xE3,0xAE,0x5E,0xF7, + 0x85,0x59,0x23,0x51,0x2D,0xAE,0x7F,0x7F,0x85,0x61,0xE3,0x40,0xE0,0xF8,0xFB,0x5F, + 0x64,0x51,0xE3,0x40,0x2A,0x2F,0x2F,0x3D,0x87,0x72,0x84,0x59,0x3D,0xBD,0xBD,0x2D, + 0xCF,0xBC,0xA8,0x7A,0x2D,0xBD,0xF5,0xF5,0x96,0xF6,0x8B,0x93,0x00,0x0B,0xF5,0x55, + 0xB6,0xF6,0x8B,0x93,0x00,0x28,0xFF,0x55,0xB6,0xF6,0xAB,0x93,0x00,0x00,0x2A,0xD5, + 0xB6,0xF6,0xCF,0xBC,0x00,0x00,0x00,0xF5,0xD7,0xF6,0x31,0xCD,0x00,0x00,0x0A,0xB5, + 0xD7,0xFE,0x92,0xD5,0x00,0x00,0x00,0x7A,0x35,0xE6,0xE5,0x69,0x80,0xE0,0x78,0x5E, + 0xE8,0x8A,0xE5,0x71,0xDC,0xF7,0xFD,0xF5,0x87,0x8A,0x26,0x7A,0x29,0xA9,0xCA,0xEB, + 0x67,0x8A,0x06,0x7A,0x60,0xFC,0x9A,0x97,0xC8,0x92,0x06,0x7A,0xF5,0xBD,0x2F,0x0A, + 0xB6,0xF6,0x88,0x8A,0x0D,0x09,0x0B,0x0B,0x38,0xFF,0xF8,0xFE,0xBF,0xBD,0xBF,0xF7, + 0x18,0xFF,0x38,0xF7,0xAE,0xBA,0xAA,0xA8,0x38,0xFF,0xF7,0xF6,0xFA,0x7A,0xFA,0xF8, + 0xF7,0xF6,0xD7,0xF6,0xCE,0x32,0xA0,0x20,0xF7,0xF6,0xD7,0xF6,0xAC,0xBA,0xC2,0x00, + 0xF7,0xF6,0xD7,0xF6,0xA0,0xAA,0x8A,0x23,0x18,0xFF,0xD6,0xF6,0xBF,0x2F,0x8A,0x72, + 0x17,0xFF,0x96,0xEE,0xF8,0x7E,0xD7,0x57,0xB6,0xF6,0x55,0xE6,0x82,0xAA,0xE2,0x62, + 0x96,0xEE,0xB3,0xD5,0xA0,0xA8,0xFA,0xDF,0xD7,0xF6,0x14,0xDE,0xB5,0x0B,0x2B,0x02, + 0xF7,0xF6,0xD7,0xF6,0xD5,0x96,0xAF,0xFF,0xD7,0xF6,0xF6,0xEE,0x02,0x82,0x0A,0x00, + 0xF7,0xF6,0xB6,0xEE,0xEA,0xEA,0x7A,0xEA,0xD7,0xF6,0xB7,0xEE,0x80,0xC2,0xFB,0xAC, + 0xD7,0xF6,0xB7,0xEE,0xAA,0xEA,0x00,0x00,0xB7,0xF6,0xD7,0xEE,0xEA,0xFF,0xFF,0xAE, + 0xD7,0xF6,0xB7,0xEE,0x88,0x0A,0x2B,0xFF,0xD7,0xF6,0xB7,0xEE,0x88,0xA0,0x80,0xA0, + 0xD7,0xF6,0xF7,0xEE,0x88,0xA0,0x88,0xA0,0x18,0xFF,0xD7,0xF6,0x3D,0xBF,0xBD,0xF5, + 0x38,0xFF,0xF7,0xF6,0x82,0x8A,0xAB,0xBD,0x39,0xFF,0x97,0xEE,0xFE,0xFE,0x7C,0x78, + 0xB7,0xF6,0x76,0xE6,0xE8,0xE8,0xFF,0xFE,0xD7,0xF6,0x76,0xEE,0xAF,0xBF,0xBF,0xB5, + 0xB7,0xF6,0x30,0xC5,0xD8,0xD8,0xD8,0xF8,0xB7,0xF6,0x34,0xE6,0x83,0x8B,0x23,0x89, + 0x55,0xEE,0x92,0xCD,0x56,0x7C,0x5C,0xFC,0xF4,0xDD,0x71,0xCD,0x2D,0x2D,0x2F,0x2F, + 0x92,0xCD,0x4D,0xAC,0xFE,0xDC,0xD4,0x5C,0x35,0xE6,0x10,0xC5,0x2B,0x2D,0xBD,0xAD, + 0x96,0xEE,0x34,0xE6,0xE0,0xE2,0xA9,0xE9,0x55,0xE6,0x34,0xE6,0x92,0x1C,0x28,0x80, + 0xD6,0xF6,0xB6,0xEE,0xAB,0xEE,0xAE,0x2A,0xD6,0xF6,0xB6,0xEE,0x8A,0xAB,0xBA,0xA0, + 0xD6,0xF6,0xB7,0xEE,0xAA,0x03,0x28,0xAC,0xF7,0xF6,0xB6,0xEE,0xAB,0xEA,0xBB,0xEF, + 0xD6,0xF6,0xD7,0xEE,0x8A,0x8A,0xA2,0xAA,0xD6,0xF6,0xB6,0xEE,0x72,0xE0,0x80,0x80, + 0xD6,0xF6,0x96,0xEE,0xFF,0xFE,0xFE,0xEA,0x95,0xF6,0xD6,0xEE,0xBA,0xEA,0xF6,0xFF, + 0xD6,0xF6,0xB6,0xEE,0xF5,0xF7,0xFD,0xFF,0xD6,0xF6,0xF7,0xEE,0x28,0xA8,0x80,0x20, + 0xD6,0xF6,0xF7,0xEE,0x80,0x08,0x28,0x82,0xF6,0xF6,0xD7,0xF6,0x77,0x5F,0xFF,0xFE, + 0xD6,0xF6,0x4A,0x8B,0x60,0xC0,0x80,0x80,0x47,0x6A,0x03,0x41,0x77,0xD7,0x56,0xD4, + 0x44,0x49,0xE3,0x40,0xAB,0xA8,0xA0,0x60,0x23,0x49,0xE3,0x40,0x7A,0x68,0x5E,0x56, + 0x64,0x51,0xE3,0x40,0x3D,0xB5,0x35,0x3D,0xC8,0x7A,0xA5,0x59,0x2D,0x2D,0x2D,0xBD, + 0x4A,0x93,0xA8,0x7A,0x2F,0x2D,0x8B,0xCD,0x4B,0x93,0xA8,0x7A,0x80,0xE8,0x5E,0x57, + 0x09,0x83,0x47,0x72,0x00,0xAA,0xFF,0xD7,0x4A,0x8B,0x87,0x72,0x02,0xAF,0xF5,0xD5, + 0x0C,0xA4,0xE8,0x82,0x2A,0xAF,0xBD,0xBD,0x6E,0xB4,0x09,0x8B,0x2A,0xFA,0x7B,0x5F, + 0x6E,0xB4,0x05,0x6A,0x80,0x7A,0x5F,0x57,0xA8,0x82,0xC4,0x61,0xFC,0xBE,0xAF,0xAD, + 0x46,0x7A,0xC5,0x69,0xBC,0xFE,0xFE,0xD6,0x47,0x82,0xE5,0x79,0xE2,0xAF,0xB5,0x35, + 0xA8,0x92,0x06,0x7A,0xA7,0x89,0x8B,0x8B,0x2A,0x9B,0x67,0x8A,0x25,0x3D,0x2B,0x0B, + 0xF7,0xFE,0x0D,0xB4,0x09,0x03,0x01,0x09,0x38,0xFF,0xF7,0xF6,0xBF,0xFF,0xBF,0xFF, + 0x38,0xFF,0x17,0xF7,0xFF,0xBF,0xFD,0xFB,0x38,0xFF,0x17,0xF7,0x5E,0x5F,0xF7,0x7F, + 0x38,0xFF,0xF7,0xF6,0x57,0x5F,0x7F,0xFA,0x18,0xFF,0xF7,0xF6,0x77,0x5D,0xB5,0xAE, + 0x17,0xFF,0xB6,0xEE,0x2A,0x0A,0xC0,0x60,0xF7,0xFE,0x55,0xE6,0xA0,0xFC,0xFF,0xFF, + 0xB6,0xF6,0x75,0xEE,0x82,0x02,0xAB,0x57,0xB6,0xF6,0x55,0xE6,0x70,0x7A,0xBA,0xDF, + 0xF7,0xFE,0xB3,0xD5,0x97,0x0F,0x02,0xAA,0xF7,0xFE,0xD7,0xF6,0xD5,0x7A,0xEA,0xAB, + 0xF7,0xF6,0xD7,0xF6,0xE3,0xEF,0xE3,0xF9,0xF7,0xF6,0xD7,0xF6,0x55,0x5F,0x76,0xEA, + 0xF7,0xF6,0xB6,0xEE,0xAB,0xBF,0xBB,0xB2,0xD7,0xF6,0xB7,0xEE,0x08,0x80,0xE8,0x80, + 0xD7,0xF6,0xB7,0xEE,0xA0,0xA8,0xE8,0xA6,0xB6,0xF6,0xD7,0xEE,0xAB,0xAB,0xAF,0xFA, + 0xD7,0xF6,0xB7,0xEE,0xFF,0xBB,0xAA,0xEA,0xB7,0xF6,0xF7,0xEE,0xAA,0xAA,0xAA,0x6E, + 0xF8,0xF6,0xD7,0xF6,0xD5,0x55,0xFD,0x2B,0xF8,0xF6,0xD7,0xF6,0x0F,0x0B,0x0A,0x0A, + 0x18,0xFF,0xD7,0xF6,0x2A,0x2B,0xBB,0xFF,0x39,0xFF,0x97,0xEE,0x78,0x7A,0x72,0x6A, + 0x96,0xEE,0x76,0xE6,0xB8,0x80,0xA8,0xBD,0xB7,0xF6,0x56,0xEE,0x3F,0xBF,0xAF,0xAE, + 0xB7,0xF6,0x30,0xC5,0xD8,0xD8,0xF8,0x58,0xB7,0xF6,0x34,0xE6,0x09,0x89,0x29,0x89, + 0x76,0xEE,0x72,0xCD,0xF8,0xF8,0x78,0x58,0xD3,0xD5,0x71,0xCD,0x2B,0xAE,0xFE,0xD5, + 0x92,0xD5,0x6D,0xAC,0xD4,0x96,0x16,0x36,0x34,0xE6,0x92,0xD5,0xBD,0xAF,0x2B,0x0F, + 0x96,0xEE,0x34,0xE6,0xE1,0xEB,0xCB,0x8B,0x55,0xE6,0x35,0xE6,0xA2,0xBE,0xFA,0xAC, + 0xD6,0xF6,0xB6,0xEE,0xAA,0xAA,0xAA,0x02,0xD7,0xF6,0xB6,0xEE,0xAA,0xA8,0xBA,0x28, + 0xD6,0xF6,0xB7,0xE6,0x20,0x02,0xC0,0xA2,0xD6,0xF6,0xB6,0xEE,0x8A,0x2A,0x0B,0x02, + 0xD7,0xF6,0xD6,0xEE,0xAA,0x2A,0xB2,0x22,0xF8,0xF6,0xD6,0xF6,0x7D,0x5F,0x77,0xDD, + 0xD6,0xF6,0xB6,0xEE,0x56,0xF7,0x5E,0x9E,0xD6,0xF6,0xB6,0xEE,0x75,0xF5,0xD5,0xB6, + 0xD6,0xF6,0xB6,0xEE,0x9D,0xD7,0xFD,0xBB,0xF8,0xF6,0xD7,0xF6,0x5D,0xF5,0xFF,0xBD, + 0xF6,0xF6,0xD7,0xF6,0x55,0xDD,0xFC,0xFE,0xF6,0xF6,0xD7,0xF6,0xFD,0x75,0x5F,0x6E, + 0xF8,0xFE,0x76,0xE6,0x6A,0xE8,0xCA,0xAA,0x51,0xC5,0x02,0x41,0x56,0x56,0x54,0x5C, + 0x84,0x51,0x23,0x41,0xF7,0xFD,0x8D,0x9D,0x44,0x49,0x03,0x41,0x56,0x94,0xF4,0x36, + 0x06,0x62,0x03,0x41,0xB5,0xBF,0x2B,0x23,0x67,0x72,0xC5,0x59,0x29,0x0B,0x2A,0xD7, + 0x09,0x83,0x46,0x6A,0x2A,0xAB,0xFF,0xFD,0xA8,0x7A,0x27,0x6A,0xA8,0xE8,0xFE,0xFB, + 0x88,0x72,0x26,0x6A,0xA8,0x2E,0xEB,0x6F,0xA7,0x7A,0x26,0x6A,0x2F,0xBF,0xB7,0xD5, + 0x6A,0x93,0xA7,0x7A,0x29,0xBD,0xD5,0x55,0x6A,0x93,0x47,0x72,0xA0,0xA2,0xEA,0x7F, + 0x88,0x7A,0xA4,0x61,0x78,0x78,0x5E,0xDF,0x68,0x7A,0xE5,0x69,0x0D,0x2D,0xED,0xED, + 0x47,0x7A,0x23,0x59,0xB8,0xF8,0xDE,0xDE,0x26,0x82,0x84,0x69,0x2B,0x0B,0x0B,0x2D, + 0x67,0x8A,0x26,0x82,0x02,0xDA,0x7A,0xDD,0x49,0x9B,0x67,0x8A,0x2D,0x35,0xBD,0xE9, + 0xF7,0xFE,0x0C,0xB4,0x09,0x09,0x09,0x09,0x18,0xFF,0xF7,0xF6,0x2A,0x2A,0xBA,0xAA, + 0x38,0xFF,0xF7,0xF6,0x3B,0xAE,0xFB,0xEF,0x18,0xFF,0x38,0xF7,0xEB,0xAA,0xAA,0xA8, + 0x38,0xFF,0x18,0xFF,0xBA,0xAA,0x8A,0xFA,0x38,0xFF,0xD7,0xF6,0xAA,0xAA,0xCA,0x6A, + 0x18,0xFF,0xB6,0xEE,0x58,0x5E,0xF7,0xFF,0xD6,0xF6,0x96,0xEE,0xFF,0xFF,0x68,0x7A, + 0x95,0xEE,0x91,0xD5,0xA0,0xE0,0x70,0x88,0x76,0xEE,0xF0,0xC4,0xA2,0xB7,0x2D,0x02, + 0x55,0xEE,0x51,0xCD,0x2F,0xD7,0xF8,0xF0,0xD7,0xF6,0xD4,0xDD,0x02,0x03,0x0F,0x2D, + 0xF7,0xF6,0xD7,0xF6,0xA9,0x2B,0xBA,0xAD,0xD8,0xFE,0xF7,0xF6,0xD5,0x75,0x77,0xDD, + 0xF7,0xF6,0xD7,0xF6,0x5E,0xA7,0x88,0x56,0xF7,0xF6,0xB7,0xEE,0xAA,0xE8,0xEA,0xFF, + 0xF7,0xF6,0xB7,0xEE,0xFF,0xDE,0xF5,0xAB,0xF7,0xF6,0xB7,0xF6,0xFF,0xAB,0xAA,0x08, + 0xF7,0xF6,0xB7,0xEE,0xBF,0xAB,0x00,0x00,0xF8,0xF6,0xD7,0xF6,0x8A,0xEA,0xA0,0xAA, + 0xF8,0xF6,0xD7,0xF6,0x2A,0x0A,0xA2,0x6E,0xF7,0xF6,0xD8,0xF6,0x02,0x00,0xF8,0xFB, + 0xD7,0xF6,0xF8,0xEE,0xAA,0x82,0x22,0x0A,0x18,0xFF,0xB7,0xEE,0x4A,0xEA,0xEB,0xEF, + 0xB6,0xEE,0x76,0xEE,0x77,0x5F,0x5E,0x74,0x96,0xEE,0x55,0xEE,0x22,0x2A,0x2A,0x37, + 0xB6,0xF6,0x31,0xC5,0xD8,0xD8,0xD8,0xD8,0x96,0xEE,0x14,0xE6,0x01,0x09,0x0B,0x09, + 0x96,0xEE,0x72,0xCD,0x58,0x78,0x78,0x68,0x72,0xCD,0x51,0xC5,0x2A,0x9B,0xC2,0x7B, + 0xD3,0xD5,0xCF,0xBC,0x37,0x2F,0x2A,0x0B,0x34,0xE6,0xD3,0xD5,0x3D,0x39,0x3B,0xAF, + 0x96,0xEE,0x55,0xE6,0xCF,0xAB,0xA1,0xAB,0x76,0xEE,0x55,0xE6,0x57,0x57,0x9C,0x1E, + 0xD6,0xF6,0xB7,0xEE,0x80,0xA8,0xE8,0xA2,0xD7,0xF6,0xF6,0xEE,0x88,0xA0,0x00,0x00, + 0xD7,0xF6,0xD6,0xEE,0xAA,0xA8,0xAA,0xAA,0xD7,0xF6,0xF6,0xEE,0x20,0x2A,0xA8,0x80, + 0xF7,0xF6,0xD7,0xF6,0x59,0xD5,0xFD,0xBD,0xF7,0xF6,0xD7,0xF6,0xFF,0xDF,0xAF,0xA3, + 0xD6,0xF6,0xB7,0xEE,0xA8,0xEA,0xA0,0xB0,0xD6,0xF6,0xB6,0xEE,0xDB,0xFE,0xB2,0x82, + 0xD7,0xF6,0xB6,0xEE,0xBF,0xBE,0x6E,0xAE,0xF8,0xF6,0xD7,0xF6,0xBF,0x55,0xDD,0xD9, + 0xF7,0xF6,0xD7,0xF6,0x5F,0xFF,0xBF,0xEF,0xF7,0xF6,0xD7,0xF6,0xAA,0xAA,0xAE,0xE2, + 0xF7,0xF6,0xD7,0xF6,0x76,0x76,0x76,0xDD,0x54,0xE6,0x23,0x41,0x5C,0x5C,0x5C,0x58, + 0xC5,0x59,0xA2,0x38,0xBF,0xBD,0xBD,0x2B,0x06,0x62,0x23,0x49,0xF5,0xBF,0x0B,0x00, + 0x26,0x6A,0xA5,0x59,0xFD,0xFB,0xA0,0x80,0xE5,0x61,0xA5,0x59,0xBF,0x65,0xE6,0x38, + 0x47,0x6A,0xE6,0x61,0x2F,0xA5,0xFF,0x0B,0x47,0x72,0xE5,0x61,0x2A,0x3E,0xD7,0x5E, + 0x68,0x72,0xE5,0x61,0xE8,0xFE,0x55,0x55,0x46,0x6A,0xE5,0x61,0x8E,0xBF,0xBD,0x55, + 0xA8,0x7A,0xC5,0x61,0x02,0xAA,0xFF,0x5D,0x68,0x72,0xC4,0x61,0xE0,0x7A,0x57,0x55, + 0x88,0x82,0xA4,0x61,0xD5,0xAD,0x8F,0x0B,0xA8,0x82,0xA5,0x69,0xFE,0xFA,0x6A,0x70, + 0x85,0x61,0xE3,0x58,0xB8,0xFE,0xBF,0xAF,0x67,0x82,0x64,0x61,0xBD,0xB5,0xA5,0x25, + 0xA8,0x8A,0x26,0x82,0x7D,0xFD,0xAB,0x02,0x6A,0x9B,0x46,0x82,0xFD,0xBD,0xBF,0x17, + 0xF7,0xFE,0x8F,0xBC,0x09,0x09,0x03,0x03,0xF7,0xFE,0x17,0xF7,0xFA,0xEE,0xAE,0xEF, + 0x18,0xFF,0xF7,0xF6,0x2F,0xAB,0x82,0xAA,0x17,0xFF,0xF7,0xF6,0xAA,0xFA,0x5E,0x76, + 0x17,0xFF,0xD7,0xF6,0x20,0x0A,0x0B,0x42,0x17,0xFF,0xB6,0xEE,0xE0,0x7C,0xDF,0x75, + 0x18,0xFF,0xB6,0xEE,0x7D,0xF7,0xFD,0x2B,0xF8,0xFE,0xF3,0xDD,0xEA,0x7A,0x7A,0xC0, + 0xF8,0xFE,0xD3,0xD5,0x0B,0x09,0x0B,0x02,0xF7,0xFE,0x76,0xEE,0x7E,0x70,0x60,0xC0, + 0x76,0xEE,0xF4,0xDD,0x70,0x48,0x88,0x88,0x76,0xEE,0xD3,0xD5,0x2D,0x2D,0x2F,0xBE, + 0xF7,0xFE,0x96,0xEE,0xAA,0x8B,0x29,0x29,0xF7,0xF6,0xD7,0xF6,0xEB,0xEC,0xFA,0xA0, + 0xF7,0xF6,0xD7,0xF6,0xF5,0xF3,0xB9,0xD1,0xF7,0xF6,0xD7,0xF6,0xB5,0x2B,0xEF,0x75, + 0xF7,0xF6,0xD7,0xF6,0xD6,0xF6,0xF7,0xFF,0xF7,0xF6,0xD7,0xF6,0xAA,0xBE,0xBF,0xF9, + 0xF7,0xF6,0xD7,0xF6,0xA6,0xAF,0xBA,0xCA,0xF7,0xF6,0xD7,0xF6,0x80,0xA2,0x0A,0xAA, + 0xF7,0xF6,0xD7,0xF6,0x8E,0x82,0x88,0xB5,0xF7,0xF6,0xD7,0xF6,0x08,0x00,0xC8,0x72, + 0xF8,0xF6,0xB7,0xEE,0xFA,0x78,0xFE,0x5F,0xF8,0xF6,0xB7,0xEE,0x8B,0x8B,0xAB,0xB5, + 0xB6,0xEE,0x76,0xE6,0x76,0xF6,0xBE,0xAC,0x96,0xEE,0x76,0xEE,0x35,0x88,0xD8,0xD6, + 0x96,0xF6,0x51,0xCD,0xD8,0xD8,0xF8,0xD8,0x96,0xEE,0x14,0xDE,0x89,0x8B,0x8B,0xAB, + 0x55,0xEE,0x72,0xCD,0x60,0x60,0x40,0x60,0x51,0xCD,0xAF,0xB4,0xA0,0xE8,0xF8,0x7E, + 0x34,0xE6,0xF0,0xBC,0xA9,0x2D,0x29,0x09,0x54,0xE6,0x14,0xE6,0xD7,0xDF,0xBA,0x9A, + 0x96,0xEE,0x55,0xE6,0xA9,0x2B,0x03,0x0F,0xB6,0xEE,0x55,0xE6,0xF7,0xFF,0xF7,0x27, + 0xD7,0xF6,0xB6,0xEE,0xAA,0xA8,0x0A,0x02,0xD7,0xF6,0xB6,0xEE,0xAA,0xAA,0xAA,0xA8, + 0xD6,0xF6,0xB7,0xEE,0xA2,0x22,0x22,0x02,0xF7,0xF6,0xB6,0xEE,0xAA,0xBA,0xEB,0xBB, + 0xD7,0xF6,0xF7,0xEE,0xA0,0x80,0x28,0x8A,0xF7,0xF6,0xD7,0xF6,0xEB,0x6D,0x56,0x5E, + 0xF7,0xF6,0xB6,0xEE,0xEA,0xAA,0xAF,0xFF,0xD7,0xF6,0xF6,0xEE,0x88,0x80,0xA2,0x80, + 0xF7,0xF6,0xB6,0xEE,0xF6,0xFA,0xFA,0xAA,0xF7,0xF6,0xD7,0xF6,0xE9,0xFD,0xE0,0x8A, + 0xF7,0xF6,0xD7,0xF6,0xAA,0xAA,0xBE,0xAE,0xF7,0xF6,0xD7,0xF6,0xA9,0xAF,0xEB,0xAA, + 0xF7,0xF6,0x97,0xF6,0x22,0xA8,0xC8,0x6A,0x75,0xEE,0xA4,0x59,0x78,0x78,0x7C,0xFE, + 0xA7,0x7A,0x83,0x51,0xF5,0xBF,0x2A,0x08,0x09,0x8B,0x06,0x6A,0x55,0xFF,0xEB,0x02, + 0xE9,0x82,0x26,0x6A,0x55,0x7F,0xFA,0x88,0x87,0x72,0xC4,0x59,0x7F,0x57,0x7E,0x70, + 0xC8,0x7A,0xA4,0x59,0xAF,0x2B,0x25,0xAD,0x88,0x72,0xE5,0x61,0x58,0x58,0x78,0x5C, + 0x05,0x62,0xA4,0x59,0xBF,0x2F,0x27,0xFF,0x27,0x6A,0xE5,0x61,0x55,0xD5,0x70,0x55, + 0x06,0x62,0x84,0x59,0x62,0x78,0xAA,0x08,0xC8,0x82,0xA4,0x59,0x95,0x25,0x2F,0x0A, + 0xAC,0xA3,0x87,0x7A,0xF5,0xAB,0x2A,0x02,0x6B,0xA3,0xE6,0x71,0x7A,0xEA,0xAC,0x28, + 0x2A,0x9B,0xC5,0x69,0x55,0x7B,0xE0,0x00,0x8B,0xA3,0xE5,0x71,0xB5,0xB5,0xBF,0xF0, + 0xC9,0x92,0xC5,0x69,0xA0,0xE8,0xFA,0x7E,0x76,0xF6,0x46,0x72,0x95,0xB5,0x25,0x0D, + 0xF7,0xFE,0x35,0xEE,0x01,0x02,0x00,0x00,0xF8,0xFE,0x17,0xF7,0xF9,0xFB,0xCE,0xBE, + 0x17,0xFF,0xF7,0xF6,0xCA,0xEA,0xEA,0xDA,0x17,0xFF,0xD7,0xF6,0xEA,0xAE,0x8A,0x6A, + 0x18,0xFF,0x96,0xE6,0xE2,0xB8,0xFE,0x7F,0xD7,0xF6,0x14,0xDE,0x00,0x20,0xEA,0x7E, + 0x38,0xFF,0x34,0xDE,0x02,0x0A,0x29,0x09,0x38,0xFF,0x55,0xE6,0x70,0xE8,0xA8,0xA0, + 0x18,0xFF,0xB7,0xEE,0x2D,0x29,0xAA,0x0F,0x18,0xFF,0xD7,0xF6,0x6A,0xEA,0xAA,0x88, + 0xD7,0xF6,0x55,0xE6,0xD7,0x5E,0x7C,0x78,0x76,0xEE,0x14,0xE6,0xDE,0x5A,0xEA,0xEA, + 0xF8,0xFE,0x55,0xE6,0x89,0x2D,0x2D,0xA5,0x18,0xFF,0xD7,0xF6,0xA9,0xBD,0xBF,0xFF, + 0x18,0xFF,0xD7,0xF6,0x5F,0x7E,0xFA,0xAB,0xF7,0xF6,0xD7,0xF6,0x75,0x55,0x57,0xF8, + 0xF7,0xF6,0xD7,0xF6,0xA7,0x6D,0x6D,0xAB,0x17,0xF7,0xD7,0xF6,0x7D,0xD5,0xFD,0xAA, + 0xF8,0xFE,0xD7,0xEE,0x7F,0xBF,0xAA,0x28,0x18,0xFF,0xD7,0xF6,0xFD,0xFA,0xAB,0xFA, + 0xD8,0xFE,0xF7,0xF6,0x55,0x55,0xF5,0xDD,0xF7,0xF6,0xB7,0xEE,0xE8,0xE8,0xFA,0x7A, + 0xB6,0xEE,0x56,0xE6,0xA0,0xA8,0x28,0x2C,0xD7,0xF6,0x96,0xEE,0x07,0x03,0x02,0x00, + 0xB6,0xF6,0x56,0xEE,0xBA,0x7E,0xEA,0xEE,0x96,0xEE,0x35,0xE6,0x88,0x2B,0x2A,0x2A, + 0x76,0xEE,0x72,0xCD,0xD8,0xD0,0xD8,0xF8,0x96,0xEE,0x15,0xE6,0x8B,0x89,0xAF,0xE9, + 0x56,0xEE,0xB3,0xD5,0x60,0x60,0x6A,0x6A,0xF1,0xC4,0x6E,0xAC,0xE8,0xF8,0x7E,0xDC, + 0x34,0xE6,0xEF,0xC4,0x29,0x09,0x0B,0x0B,0x55,0xE6,0x14,0xDE,0xBE,0x97,0xFE,0x3E, + 0x96,0xEE,0x35,0xE6,0x0B,0x3B,0x57,0x5F,0xD7,0xF6,0x35,0xE6,0x2F,0x2F,0x8D,0x2B, + 0xD6,0xF6,0xB6,0xEE,0x02,0x00,0xE2,0x02,0xD6,0xF6,0xB6,0xEE,0x22,0xCA,0x88,0xA8, + 0xD6,0xF6,0xB6,0xEE,0x02,0x2B,0xAA,0x88,0xD7,0xF6,0xD6,0xEE,0xAA,0xA2,0xAA,0x2A, + 0xD7,0xF6,0xF6,0xEE,0x82,0x0A,0x80,0x0A,0xD6,0xF6,0xF7,0xEE,0x08,0x82,0x82,0x08, + 0xD6,0xF6,0xB6,0xEE,0xBA,0xBE,0xFE,0xFC,0xD6,0xF6,0xB6,0xEE,0x02,0x23,0xAB,0xAA, + 0xD6,0xF6,0xF7,0xEE,0xA8,0xA2,0xA0,0x08,0xF7,0xF6,0xD6,0xF6,0x08,0x02,0x8F,0xFD, + 0xF7,0xF6,0xD6,0xF6,0xB8,0x02,0x00,0xAB,0xD7,0xFE,0xF7,0xF6,0xBD,0xF7,0xD5,0xF5, + 0xD7,0xF6,0x13,0xE6,0xC0,0xC0,0x40,0x40,0x8D,0xB4,0x86,0x72,0x5C,0x5C,0x56,0x56, + 0xA8,0x7A,0x06,0x6A,0x2A,0xEF,0xFF,0x5C,0xE8,0x8A,0xE5,0x61,0x02,0xAA,0x5F,0x75, + 0xC8,0x82,0x05,0x62,0xA8,0xFE,0xF5,0xDD,0x87,0x72,0x84,0x51,0xE8,0x7A,0x7E,0x7E, + 0xE5,0x61,0x43,0x49,0x02,0xAB,0xD7,0xDF,0xE6,0x61,0x84,0x51,0xAA,0xAB,0xE5,0x29, + 0x26,0x6A,0xA5,0x59,0x5F,0xBF,0xAF,0x3F,0x67,0x72,0xC5,0x59,0xF5,0xFD,0xA7,0x2B, + 0x29,0x93,0xE5,0x61,0xD5,0xFF,0x2B,0x0B,0x4A,0x9B,0x66,0x7A,0xAD,0x2B,0x8A,0x02, + 0x2E,0xBC,0x4A,0x9B,0x2D,0x2D,0x2D,0x3D,0x8F,0xC4,0x2A,0x9B,0x5F,0xE8,0x80,0x00, + 0xEC,0xAB,0xC9,0x8A,0x9D,0xD7,0xFE,0xF8,0xAC,0xAB,0x05,0x6A,0xE0,0xE8,0xFA,0x5F, + 0x30,0xCD,0x26,0x72,0x55,0xD5,0xB5,0x2D,0xD7,0xFE,0x2A,0x93,0x09,0x0B,0x02,0x00, + 0x18,0xFF,0xF7,0xF6,0xEE,0xEB,0x83,0xAB,0x17,0xFF,0xF7,0xF6,0xAB,0xBF,0xAE,0xEA, + 0x17,0xFF,0xD7,0xF6,0xBA,0xBE,0xAE,0xFA,0x18,0xF7,0x95,0xEE,0x60,0x7C,0x5E,0xB5, + 0x17,0xFF,0x75,0xE6,0x77,0xF7,0xAB,0x00,0x17,0xFF,0xB3,0xD5,0x7E,0xFA,0xA8,0xA0, + 0x18,0xFF,0x75,0xE6,0x01,0x02,0x00,0x00,0x39,0xFF,0xD7,0xF6,0x70,0xF0,0xE8,0xE0, + 0x18,0xFF,0xD7,0xF6,0xAD,0x2F,0xAF,0xEF,0x18,0xFF,0xF8,0xF6,0xEE,0xDD,0xAB,0xBB, + 0xF8,0xFE,0x55,0xE6,0x78,0x60,0xC0,0x80,0x75,0xEE,0x34,0xE6,0x6A,0xEA,0xEA,0xF8, + 0xD7,0xF6,0x34,0xE6,0x2F,0x35,0xBD,0xBF,0xF7,0xF6,0xB7,0xF6,0x20,0xAA,0xAB,0xAB, + 0x18,0xFF,0xF8,0xF6,0xF5,0xD5,0xBF,0x55,0xF8,0xF6,0xD7,0xF6,0x3A,0xBC,0xE0,0x00, + 0x18,0xFF,0xF8,0xF6,0x57,0x6B,0xD5,0x55,0xF8,0xFE,0xF7,0xF6,0xD5,0xD5,0x5F,0x5F, + 0x18,0xFF,0xF7,0xF6,0x75,0xF7,0xFD,0xD5,0xF7,0xF6,0xD8,0xF6,0x00,0x00,0xA8,0xE8, + 0xF7,0xF6,0xD7,0xF6,0xE8,0x7A,0xFA,0x7A,0xD7,0xF6,0x96,0xEE,0xB0,0xE8,0xF2,0x7A, + 0xD7,0xEE,0x75,0xEE,0x2F,0xBF,0x37,0xB7,0xD7,0xF6,0xB6,0xEE,0x00,0x00,0xBE,0xEA, + 0x96,0xEE,0x35,0xE6,0x2A,0xAC,0xA6,0x96,0x76,0xEE,0x55,0xE6,0x08,0x2E,0x38,0x0A, + 0x76,0xEE,0x92,0xCD,0xD8,0xD8,0xD8,0xD8,0x76,0xEE,0x14,0xDE,0xC9,0xC1,0xA9,0xEB, + 0x35,0xE6,0xB3,0xD5,0x68,0x6A,0x6E,0x7E,0x51,0xCD,0xEC,0xA3,0xBE,0x96,0x97,0x36, + 0x95,0xEE,0x72,0xD5,0xAD,0xA9,0x8F,0x0B,0xB7,0xF6,0x14,0xDE,0xB7,0x37,0x2F,0xA8, + 0xB7,0xF6,0x35,0xE6,0xFF,0xF8,0xBE,0x57,0xB6,0xEE,0x55,0xEE,0x03,0x8A,0xAA,0x7B, + 0xF7,0xF6,0xB6,0xEE,0x8F,0xEF,0xEF,0xAB,0xD7,0xF6,0xD6,0xEE,0xAA,0xAA,0xAA,0xAA, + 0xD6,0xF6,0xF6,0xEE,0x00,0xA0,0xA0,0x82,0xD7,0xF6,0xD6,0xEE,0xAA,0xAA,0x2A,0x2A, + 0xD6,0xF6,0xD7,0xEE,0x2A,0xA2,0xAA,0x8A,0xD6,0xF6,0xD6,0xEE,0x8A,0xAA,0x2A,0xA2, + 0xD6,0xF6,0xB6,0xEE,0xAE,0xDC,0xFB,0xBA,0xD6,0xF6,0xB6,0xEE,0xEF,0xBA,0xEE,0xBB, + 0xD6,0xF6,0xB6,0xEE,0x0A,0x83,0xBA,0xAE,0xD6,0xF6,0xB6,0xEE,0x00,0x82,0x80,0xAA, + 0xD6,0xF6,0xF7,0xEE,0xA8,0xAA,0x80,0x00,0xD7,0xFE,0xF6,0xEE,0xAB,0xAB,0x3E,0x2A, + 0xB6,0xF6,0x49,0x8B,0x80,0xE0,0x60,0x60,0x49,0x8B,0x43,0x49,0xA8,0xFE,0x5F,0x5F, + 0x87,0x72,0xE2,0x38,0xA8,0xAE,0xDF,0x55,0x06,0x62,0x23,0x41,0x00,0x2A,0xFF,0x55, + 0x05,0x62,0xE2,0x38,0xA0,0xEE,0xDF,0x55,0xA4,0x59,0x02,0x39,0x80,0xAA,0xBD,0xB5, + 0xA8,0x7A,0x44,0x51,0xF5,0xAD,0x0B,0x0B,0x87,0x7A,0xE5,0x61,0x55,0x7E,0xF8,0x78, + 0x27,0x6A,0xE5,0x61,0xDC,0x70,0xD7,0xB7,0xCC,0xA3,0x26,0x6A,0xF5,0xAD,0x2D,0xAD, + 0x2D,0xB4,0x29,0x93,0x55,0xFF,0x82,0x0A,0x4D,0xBC,0x29,0x9B,0xD5,0xD5,0x7E,0xF8, + 0x0D,0xB4,0x29,0x93,0x2B,0x3F,0xF5,0x5F,0xAF,0xCC,0x8B,0xA3,0x82,0xAB,0xDD,0x55, + 0xEC,0xAB,0x67,0x7A,0xF8,0x78,0x58,0x5E,0xEC,0xAB,0x06,0x72,0x57,0x55,0xD5,0x3F, + 0xD7,0xFE,0xE8,0x82,0x2D,0x29,0x0B,0x02,0x18,0xFF,0xF7,0xFE,0xBD,0xAF,0x09,0x01, + 0x17,0xFF,0xF8,0xF6,0xA2,0x08,0xA2,0xA8,0x17,0xFF,0xF7,0xF6,0x7A,0xFA,0xAE,0x6A, + 0x18,0xFF,0xB7,0xEE,0x78,0xDA,0xBE,0xAF,0x39,0xFF,0xD6,0xF6,0xF5,0xAF,0xAB,0x0A, + 0x59,0xFF,0xD7,0xFE,0xAA,0xAA,0x8A,0x60,0xF8,0xFE,0xF4,0xDD,0xB8,0x1C,0x36,0x2F, + 0x38,0xFF,0x18,0xFF,0xBD,0xBD,0xBD,0xFD,0x39,0xFF,0xF8,0xF6,0xE8,0x78,0x7A,0x5A, + 0x18,0xFF,0xF8,0xF6,0xA5,0xA5,0xED,0xED,0x18,0xFF,0xF8,0xF6,0xFF,0xAB,0x0B,0xAD, + 0x18,0xFF,0xD7,0xF6,0xE2,0xA2,0xA2,0xA0,0xF7,0xF6,0x55,0xE6,0x57,0x7E,0xF8,0xE8, + 0xB6,0xF6,0x55,0xE6,0x35,0xB7,0xBB,0xAE,0xF7,0xF6,0xB7,0xF6,0x8B,0x89,0x0D,0x2B, + 0xF7,0xF6,0xD7,0xF6,0x00,0x0B,0x2B,0x0A,0xD7,0xFE,0xF8,0xF6,0x7D,0xDF,0x5D,0x55, + 0xF7,0xF6,0xD7,0xF6,0x88,0x02,0x00,0x82,0xF7,0xF6,0xD7,0xF6,0x08,0x2B,0x5F,0x78, + 0xF7,0xF6,0xD7,0xF6,0x38,0xAA,0xFA,0xEA,0xF7,0xF6,0xD7,0xF6,0xF8,0x7A,0x7B,0x7F, + 0xF7,0xF6,0xB6,0xEE,0xB2,0xFA,0xFB,0x7F,0xD7,0xF6,0x55,0xE6,0xE8,0x7A,0x7A,0x5F, + 0xD7,0xF6,0x55,0xEE,0x2D,0x2D,0x2D,0x2B,0xD7,0xF6,0x96,0xF6,0xAA,0xE8,0xA8,0x6A, + 0x75,0xEE,0xD3,0xD5,0x2C,0xBC,0xB6,0xF6,0x96,0xEE,0x55,0xE6,0xAB,0xBF,0xAB,0xAD, + 0x55,0xE6,0x92,0xD5,0xD8,0xF8,0xD8,0xD8,0x76,0xEE,0xF3,0xDD,0x8B,0xAB,0xAB,0xA9, + 0x34,0xEE,0xB3,0xDD,0xFE,0x6A,0x7E,0x7C,0x72,0xD5,0x6E,0xAC,0x37,0x3F,0x2E,0x2A, + 0x96,0xF6,0x31,0xCD,0x0B,0xAF,0xFF,0x77,0x55,0xEE,0x31,0xCD,0xA0,0xFA,0xFF,0x55, + 0xF3,0xDD,0x51,0xCD,0xA8,0x2F,0xAD,0x2B,0x75,0xEE,0xF4,0xDD,0x81,0xBB,0xF9,0xAF, + 0xD6,0xF6,0xF2,0xDD,0x00,0x00,0x08,0xAD,0xF7,0xF6,0xB6,0xEE,0xAB,0xAB,0xAF,0xFF, + 0xD6,0xF6,0xB7,0xEE,0x08,0x02,0x0A,0x08,0xD6,0xF6,0xF7,0xEE,0xA0,0x02,0x82,0x2C, + 0xD6,0xF6,0xF6,0xEE,0x00,0x0A,0x88,0x00,0xD6,0xF6,0xF7,0xEE,0x28,0x00,0x88,0x28, + 0xF6,0xF6,0xB6,0xEE,0x7F,0xBB,0xAA,0xBA,0xD6,0xF6,0xB6,0xEE,0xEF,0x88,0x00,0x00, + 0xD6,0xF6,0xB6,0xEE,0xFF,0x3B,0x20,0x80,0xD6,0xF6,0xB6,0xEE,0xAB,0xFB,0xA2,0xA0, + 0xD6,0xF6,0xB6,0xEE,0x02,0x02,0x00,0x2A,0xD6,0xF6,0xB6,0xF6,0xA0,0xE0,0xC8,0xE8, + 0x75,0xEE,0x86,0x72,0xE0,0x60,0x60,0x70,0x05,0x62,0xC2,0x30,0xE8,0xEC,0xFA,0x7E, + 0x02,0x39,0xA1,0x28,0x7C,0xFF,0x7E,0x56,0x03,0x39,0xA1,0x28,0xAB,0xFF,0x3F,0xF5, + 0x23,0x41,0xC2,0x30,0xEF,0x29,0x29,0xAF,0xE5,0x69,0x23,0x41,0xF5,0xB5,0x35,0x3D, + 0x09,0x93,0x06,0x6A,0xAD,0xAB,0x82,0x02,0x87,0x7A,0x23,0x41,0xE8,0xFA,0x5E,0x5C, + 0xC5,0x61,0x03,0x41,0x00,0x0F,0xB5,0xD5,0x29,0x93,0x84,0x51,0x2B,0xAB,0xBF,0xFD, + 0xCC,0xAB,0x47,0x72,0x0A,0xAB,0xB7,0xF5,0x0D,0xB4,0x2A,0x93,0x80,0x82,0xAB,0xAD, + 0xAB,0xAB,0x09,0x8B,0x78,0xE0,0xE2,0x60,0x29,0x93,0x67,0x7A,0x80,0xEE,0x5E,0x57, + 0xEC,0xAB,0x67,0x7A,0x57,0xFF,0xAD,0x2D,0x8E,0xBC,0xA8,0x82,0x35,0x3D,0xBF,0xBF, + 0xD7,0xFE,0xEF,0xC4,0x02,0x03,0x03,0x2D,0x18,0xFF,0xF7,0xFE,0x2E,0xA6,0xAE,0xBD, + 0x18,0xFF,0xF7,0xF6,0xA2,0x82,0x02,0xCA,0x18,0xFF,0xB6,0xEE,0xE0,0xB8,0xFE,0x7E, + 0x38,0xFF,0xB6,0xEE,0xBF,0xEF,0xBF,0x35,0x59,0xFF,0x18,0xFF,0xA5,0xA9,0xAA,0x8A, + 0x39,0xFF,0x96,0xEE,0xE0,0x60,0x78,0x58,0x18,0xFF,0x55,0xE6,0x37,0xA7,0x27,0x2D, + 0x39,0xFF,0x18,0xFF,0xF5,0xBD,0xD5,0xD5,0x39,0xFF,0xF8,0xF6,0xFA,0xFA,0xFC,0xFA, + 0x18,0xFF,0xF8,0xF6,0x7E,0x7F,0x57,0x96,0x18,0xFF,0xF8,0xF6,0x2B,0xEB,0xEE,0xAB, + 0x18,0xFF,0xF8,0xF6,0x62,0xEA,0xCA,0xEA,0xF7,0xF6,0x96,0xEE,0x5A,0xFA,0xF8,0xB8, + 0xD7,0xF6,0x75,0xEE,0xDF,0xFE,0xB8,0xA0,0xF8,0xF6,0xB6,0xF6,0x09,0x0D,0x25,0x37, + 0x18,0xFF,0xD7,0xF6,0xAF,0xBF,0x3E,0xBF,0x18,0xFF,0xF7,0xF6,0x57,0x7E,0x80,0xAA, + 0x18,0xFF,0xD7,0xF6,0xDF,0xAB,0xBA,0xAA,0xF8,0xFE,0xF7,0xF6,0x7F,0xFF,0xFD,0xFF, + 0xF7,0xF6,0xB6,0xF6,0xA2,0x68,0x7A,0x5A,0xD7,0xF6,0x76,0xEE,0x80,0xEB,0x7E,0x7A, + 0xB6,0xF6,0x55,0xE6,0x88,0x7E,0x7F,0xFB,0x96,0xEE,0x55,0xE6,0xD6,0xA5,0x2D,0x02, + 0xD7,0xF6,0x76,0xEE,0x8D,0x8F,0x2F,0xAF,0xB6,0xF6,0x96,0xEE,0x5E,0xEF,0x2B,0xE5, + 0x55,0xE6,0xB3,0xD5,0xB4,0xBE,0xF4,0xBE,0x75,0xEE,0x35,0xE6,0x83,0x8D,0xF9,0xAD, + 0x55,0xEE,0x92,0xD5,0xFC,0xDC,0xDC,0xDE,0x55,0xEE,0x51,0xCD,0x02,0xA2,0xFA,0x5A, + 0x14,0xE6,0x72,0xCD,0xA0,0x80,0x82,0xA9,0x51,0xCD,0x6E,0xB4,0x28,0x2E,0x2E,0x36, + 0x72,0xCD,0x31,0xC5,0x80,0xE0,0x5C,0x5C,0x92,0xD5,0x30,0xC5,0x37,0x2D,0x0F,0x2D, + 0xF4,0xDD,0x92,0xD5,0xBD,0xA5,0xA5,0x2D,0x55,0xE6,0xD3,0xDD,0x2B,0xA7,0xB7,0x75, + 0x92,0xD5,0xE8,0x82,0x2F,0xD5,0x55,0x55,0x95,0xEE,0x08,0x83,0x00,0xAD,0xD5,0x55, + 0xB5,0xF6,0x28,0x83,0x00,0x00,0x2F,0xD5,0xB6,0xF6,0x6D,0xB4,0x00,0x00,0x00,0x2D, + 0xF7,0xF6,0x95,0xF6,0xAA,0x2B,0xAA,0xBD,0xF7,0xF6,0xD6,0xF6,0xDD,0x9F,0x5D,0x75, + 0xF7,0xF6,0xB6,0xF6,0xAA,0x38,0xBB,0x7F,0xF6,0xF6,0xD6,0xF6,0xF5,0x7E,0xF7,0x5D, + 0xF6,0xF6,0xD6,0xF6,0x7B,0x57,0x56,0x57,0xF7,0xFE,0xD6,0xF6,0x5F,0xFB,0x55,0x57, + 0xD6,0xF6,0xB6,0xF6,0x3A,0xA2,0x00,0x00,0xF7,0xF6,0xB6,0xF6,0xFF,0xFF,0xEA,0xAA, + 0x75,0xEE,0x26,0x62,0x70,0x70,0x70,0x60,0x84,0x49,0xE2,0x30,0xF8,0x7C,0x7E,0xFE, + 0x03,0x39,0x61,0x20,0xFE,0x5E,0xDA,0x80,0x02,0x39,0x81,0x20,0xAD,0xBD,0x2B,0x2A, + 0x02,0x39,0xC2,0x30,0xBE,0x2F,0xBB,0xF0,0x46,0x7A,0x03,0x41,0xBD,0x35,0x3D,0x2D, + 0x09,0x93,0x67,0x7A,0x83,0x83,0xCB,0x7F,0x47,0x72,0xE2,0x38,0x78,0x5C,0x7C,0x5E, + 0x44,0x49,0xC2,0x30,0x3F,0x35,0xBD,0xBD,0xE5,0x61,0xA1,0x30,0x02,0x0A,0xAA,0x55, + 0xE8,0x82,0xE3,0x40,0x2A,0x0A,0xAF,0xD5,0x8A,0xA3,0xE5,0x61,0x0A,0xAA,0xAB,0xBD, + 0xAB,0xA3,0xC8,0x82,0xE0,0xFA,0x7B,0x55,0xE9,0x8A,0x46,0x7A,0x9F,0xB7,0xAF,0x2F, + 0xEB,0xA3,0xE9,0x8A,0x2D,0x2D,0xF7,0xD7,0xEC,0xAB,0x88,0x7A,0xF8,0x70,0x6A,0xFE, + 0xEF,0xC4,0x06,0x6A,0x2F,0xF5,0x55,0x57,0xB6,0xF6,0x25,0x6A,0x00,0x2D,0x35,0xB5, + 0x18,0xFF,0x75,0xEE,0xA0,0xE2,0xFF,0xFD,0xD6,0xF6,0x96,0xEE,0xAA,0xAE,0xCF,0x38, + 0x59,0xFF,0xB7,0xEE,0xAD,0x0D,0x8B,0x22,0x59,0xFF,0x18,0xFF,0xEA,0xE8,0xFE,0x7A, + 0xF7,0xFE,0x55,0xE6,0xF0,0x7C,0x5C,0x5F,0xF8,0xFE,0x55,0xE6,0x0D,0x2D,0x0D,0x0D, + 0x39,0xFF,0xF8,0xF6,0xAB,0xAB,0x29,0xAF,0x39,0xFF,0xF8,0xF6,0xEA,0xFA,0x6A,0xEA, + 0x18,0xFF,0xF8,0xF6,0x7D,0xB7,0x5E,0xDB,0x18,0xFF,0xF8,0xF6,0xAF,0xFB,0xFD,0xF7, + 0x18,0xFF,0xF8,0xF6,0xFA,0x6A,0xEF,0x5F,0xF7,0xF6,0x97,0xEE,0xA8,0xA8,0xAA,0xA2, + 0xF7,0xF6,0xD7,0xF6,0x55,0x5F,0xAB,0xAA,0xF8,0xF6,0xB7,0xF6,0x37,0x3B,0x2A,0x22, + 0x18,0xFF,0xF7,0xF6,0x5F,0xDF,0x5A,0x7B,0x18,0xFF,0xF8,0xF6,0xBB,0xAA,0xBF,0xEF, + 0xF7,0xFE,0x18,0xF7,0xAF,0xBD,0xAF,0xFF,0xF7,0xF6,0xD7,0xF6,0xA0,0x00,0xE0,0x58, + 0xD7,0xF6,0x96,0xEE,0xE0,0xEC,0x7A,0x76,0xB7,0xF6,0x76,0xEE,0xF8,0xFA,0x5E,0x55, + 0x96,0xEE,0x55,0xE6,0xEA,0x7A,0xFA,0x5B,0x76,0xEE,0x55,0xE6,0x8B,0x2D,0xB9,0x2F, + 0xB6,0xF6,0x76,0xEE,0xA3,0xEB,0xEA,0xAA,0xB6,0xF6,0x76,0xEE,0xAB,0x8F,0xEB,0xCB, + 0x14,0xE6,0x72,0xCD,0xAC,0xBC,0xB4,0xD6,0x75,0xEE,0xF4,0xE5,0x2B,0x8B,0xAB,0xA9, + 0x34,0xE6,0xB3,0xD5,0xDC,0xDC,0xD4,0xDE,0x14,0xE6,0x30,0xC5,0x58,0x58,0x68,0xE0, + 0xB3,0xD5,0x10,0xC5,0x09,0x2D,0x35,0x9F,0x31,0xC5,0x4D,0xAC,0x26,0x26,0xA6,0x36, + 0x31,0xCD,0xF0,0xBC,0x3C,0x3F,0x37,0xEA,0x92,0xD5,0x31,0xC5,0x2F,0xAF,0xA7,0xA5, + 0xF3,0xDD,0x72,0xD5,0x2F,0xAF,0xAD,0xAD,0xD3,0xDD,0x51,0xCD,0x82,0xEA,0x72,0x58, + 0xE8,0x82,0xC7,0x7A,0x00,0x8E,0xFE,0x98,0x08,0x83,0xC7,0x7A,0xFE,0xA2,0xFB,0xDB, + 0x08,0x83,0xC7,0x82,0x2B,0x2E,0xFE,0xFD,0xEB,0x9B,0xE8,0x82,0x3F,0x75,0x55,0x55, + 0x55,0xEE,0xE8,0x82,0x0A,0xF5,0x55,0x55,0xB5,0xF6,0xE7,0x82,0x00,0x0A,0xBD,0x55, + 0xB6,0xF6,0x8A,0x9B,0x00,0x00,0x02,0xF5,0xD6,0xF6,0xF4,0xE5,0x00,0x08,0x02,0x2D, + 0xF6,0xFE,0xB6,0xF6,0xAE,0xAF,0xFF,0xD5,0xF8,0xFE,0xD6,0xF6,0xDF,0x5F,0xD5,0x55, + 0xD7,0xFE,0xD6,0xF6,0xD5,0x7F,0x7F,0xFF,0xF6,0xFE,0xD7,0xF6,0x7E,0x5D,0x7B,0x7A, + 0xB6,0xF6,0x86,0x72,0x60,0x60,0xC0,0xC0,0xE6,0x59,0x23,0x41,0x55,0x57,0x5E,0xE8, + 0x84,0x49,0x23,0x41,0x7F,0xFB,0x55,0x3A,0x64,0x49,0xE2,0x30,0xD7,0xEC,0xBA,0xF8, + 0x23,0x41,0xE2,0x38,0x7F,0xF6,0xBB,0x29,0x46,0x7A,0x44,0x49,0x2D,0x2D,0x0D,0x2F, + 0x66,0x7A,0x84,0x59,0xA0,0xE8,0x7A,0x5A,0x64,0x51,0xE3,0x38,0x5C,0x78,0x6E,0xE8, + 0xE2,0x38,0xA2,0x30,0x62,0xE2,0x80,0x08,0xC2,0x30,0x81,0x28,0x97,0xBE,0xEA,0xF8, + 0x23,0x41,0x82,0x28,0x2F,0x2F,0xAF,0x35,0x88,0x82,0x43,0x49,0x2D,0xB5,0x35,0x35, + 0xE9,0x8A,0x67,0x7A,0xAB,0x3D,0x3F,0x7A,0x09,0x8B,0x88,0x7A,0xFB,0xDE,0xD8,0xDF, + 0x29,0x93,0x87,0x7A,0x2B,0xB7,0xFF,0x6F,0x09,0x8B,0xA5,0x59,0xA8,0xF8,0x7A,0x5F, + 0xE8,0x82,0xC5,0x61,0xEE,0xAF,0x2D,0x09,0xCC,0xA3,0xC5,0x61,0x35,0xF7,0xFB,0xFE, + 0xB6,0xF6,0xE9,0x8A,0x02,0x0B,0x2D,0xD5,0x38,0xFF,0x75,0xEE,0xBE,0x2F,0x0A,0x01, + 0x39,0xFF,0x19,0xFF,0x00,0x80,0x20,0xE0,0x39,0xFF,0x96,0xF6,0xC0,0xC8,0x60,0x78, + 0x76,0xEE,0x35,0xE6,0xC8,0x68,0x6E,0x7A,0xF8,0xFE,0x55,0xE6,0x09,0x09,0x09,0x0B, + 0x39,0xFF,0xF8,0xFE,0xAF,0xAF,0xAD,0xAD,0x18,0xFF,0xF8,0xF6,0xE0,0xC0,0xA0,0xA0, + 0x18,0xFF,0xF8,0xF6,0xF7,0xFF,0xDD,0xFE,0x19,0xFF,0xF7,0xF6,0xDF,0xFF,0xFD,0x57, + 0xF8,0xFE,0x17,0xF7,0x2A,0xA2,0x2A,0x2A,0xF7,0xF6,0xD7,0xF6,0x9C,0xFA,0xAA,0xA2, + 0xF8,0xF6,0xD7,0xF6,0xBA,0x3F,0x27,0x2D,0x17,0xFF,0xF8,0xF6,0xDD,0xF7,0x7F,0xFD, + 0x18,0xFF,0xF7,0xF6,0x7F,0xEB,0xE9,0xEB,0x18,0xFF,0xD7,0xF6,0x2A,0xAA,0x2F,0x8F, + 0x18,0xFF,0xF8,0xF6,0xEA,0x6A,0x6F,0x7D,0xF7,0xF6,0xB7,0xEE,0x78,0x78,0x7A,0x5A, + 0xB7,0xF6,0x76,0xEE,0xF8,0x76,0x5E,0x75,0x96,0xEE,0x55,0xE6,0x5F,0x7E,0x8A,0x97, + 0x96,0xEE,0x35,0xE6,0x77,0xF7,0xFA,0x28,0x96,0xEE,0x35,0xE6,0xBF,0xAF,0xB7,0x3F, + 0xB7,0xF6,0x76,0xEE,0xCA,0xFA,0x7E,0x5E,0xB6,0xF6,0x55,0xE6,0xE2,0xEA,0xEA,0x6A, + 0xD3,0xDD,0x31,0xCD,0x3C,0xAC,0xBC,0xB6,0x35,0xE6,0xB3,0xD5,0x02,0x0B,0x0B,0x09, + 0x14,0xE6,0xB3,0xD5,0x9E,0xFC,0x9C,0xBC,0x14,0xE6,0xD3,0xDD,0x7A,0x6C,0xDC,0xF4, + 0xD3,0xDD,0x31,0xC5,0x5E,0x78,0x40,0x40,0x31,0xCD,0x4E,0xAC,0x37,0x37,0x37,0x17, + 0x31,0xCD,0xCF,0xBC,0xA8,0x28,0xBC,0x5E,0x71,0xCD,0x11,0xC5,0x2F,0xAF,0xAF,0xA7, + 0x14,0xE6,0x31,0xC5,0x2B,0x0F,0xBF,0x5F,0xD3,0xDD,0xF0,0xBC,0xF8,0x7C,0xF7,0xB5, + 0xE8,0x82,0xA7,0x7A,0xEF,0x3F,0xAB,0xEA,0xE8,0x82,0xA7,0x7A,0x2C,0xBF,0xDD,0xFF, + 0xE8,0x82,0xC7,0x82,0x2B,0xCA,0x5E,0x7B,0xE8,0x82,0xA7,0x7A,0x8A,0xAA,0xFE,0x2D, + 0xE8,0x82,0xC7,0x82,0xEF,0x2A,0xCB,0xC4,0x08,0x8B,0xC8,0x82,0xAD,0xAD,0x9F,0x56, + 0x49,0x8B,0xC7,0x82,0x3F,0xFF,0x7D,0x55,0xB3,0xDD,0x08,0x83,0x2F,0x55,0x55,0x55, + 0x75,0xEE,0x28,0x8B,0x00,0x2F,0x55,0x55,0x96,0xF6,0x08,0x83,0x00,0x00,0x2B,0xD5, + 0xB6,0xF6,0x8E,0xB4,0x00,0x00,0x00,0x2D,0x95,0xFE,0xD6,0xF6,0x55,0x75,0xFF,0xBA, + 0xB6,0xF6,0x51,0xC5,0x40,0xC0,0x00,0x00,0x13,0xE6,0x84,0x51,0x57,0x57,0x5E,0x58, + 0xC5,0x59,0x64,0x49,0xAA,0x8F,0xAA,0xF5,0x85,0x51,0x23,0x41,0x58,0x5C,0xF8,0xAA, + 0x66,0x7A,0x23,0x49,0x55,0xD5,0xBD,0x2F,0x29,0x93,0x06,0x6A,0xF5,0xED,0xAB,0x8A, + 0x88,0x82,0x84,0x59,0x78,0x68,0xF0,0xE8,0xA5,0x61,0x03,0x41,0x7F,0x7F,0xBA,0xA0, + 0xC6,0x59,0xA2,0x30,0xF5,0xD7,0xFE,0xA2,0x24,0x41,0x81,0x28,0x5E,0x5E,0xFA,0x2A, + 0x64,0x49,0xA1,0x28,0xB5,0xB5,0xAD,0x02,0x67,0x7A,0x43,0x49,0x25,0x2D,0xAD,0xFF, + 0xA8,0x7A,0xA4,0x59,0xC0,0xFA,0x5F,0xF5,0x88,0x7A,0xE5,0x61,0x0B,0xB5,0x55,0xD5, + 0xA8,0x7A,0x23,0x49,0x00,0xE0,0xEA,0x72,0x26,0x6A,0x02,0x49,0xBA,0xB7,0xB5,0x25, + 0xA7,0x7A,0xC5,0x61,0x29,0x2F,0xAE,0xFA,0x09,0x93,0x06,0x72,0xEA,0xEA,0xEB,0x89, + 0x4A,0x93,0x26,0x72,0x2F,0x3F,0xBD,0xB5,0x18,0xFF,0x6A,0x93,0x03,0x09,0x25,0x25, + 0x38,0xFF,0x18,0xFF,0xE2,0xA2,0x79,0x5D,0x18,0xFF,0x75,0xEE,0x70,0x70,0x58,0x5C, + 0x75,0xEE,0x35,0xE6,0x7E,0xEB,0xFA,0xBA,0x18,0xFF,0x96,0xEE,0xA9,0x89,0x89,0x8B, + 0x39,0xFF,0xF8,0xF6,0xAF,0xA9,0xAF,0xEF,0x18,0xFF,0xF8,0xF6,0xA8,0xAE,0xAA,0xEA, + 0x18,0xFF,0xF8,0xF6,0xFF,0xDA,0xF6,0x7F,0x17,0xFF,0xF8,0xF6,0x5F,0x56,0x57,0xD5, + 0xD8,0xFE,0xF7,0xF6,0xDF,0x5D,0x7D,0xDD,0xD7,0xFE,0xF7,0xF6,0xD7,0x7D,0x5E,0xDF, + 0xF7,0xF6,0xD7,0xF6,0x3F,0x98,0xE0,0x2A,0x18,0xFF,0xF8,0xF6,0xF7,0xDD,0xB5,0xBF, + 0x18,0xFF,0xF8,0xF6,0xE3,0xAB,0xFE,0xFE,0xD8,0xFE,0xF7,0xF6,0x55,0x6F,0x7D,0xFF, + 0xF7,0xF6,0xB7,0xF6,0x88,0xE8,0xE8,0xEA,0xD7,0xF6,0x76,0xEE,0xE0,0xF8,0x5E,0xDE, + 0x96,0xEE,0x76,0xEE,0x67,0x77,0x55,0x57,0x76,0xEE,0x35,0xE6,0xEA,0xFB,0xFE,0xEA, + 0x75,0xEE,0x34,0xE6,0xA2,0xFE,0xFA,0x82,0xB6,0xF6,0x55,0xE6,0xA5,0x2F,0xAD,0xBD, + 0xB6,0xF6,0x55,0xEE,0xBC,0xAE,0xBE,0xBF,0xB6,0xF6,0x35,0xE6,0xC2,0xF0,0x62,0xEA, + 0xD3,0xDD,0x31,0xCD,0xBC,0xF6,0xFE,0x7C,0x34,0xE6,0x72,0xCD,0x0B,0xAB,0xAD,0xA9, + 0x14,0xE6,0xB3,0xD5,0xBC,0x3E,0x3F,0xB6,0x14,0xE6,0x10,0xC5,0x88,0x88,0x68,0x56, + 0xD3,0xDD,0xF0,0xC4,0xE0,0x7E,0x55,0x55,0x31,0xC5,0x2D,0xAC,0xB7,0x96,0xDE,0x98, + 0x11,0xC5,0x6E,0xB4,0xB8,0xF8,0xD8,0x50,0x72,0xCD,0xF0,0xC4,0x2F,0xA9,0xA9,0xBB, + 0x51,0xCD,0xF0,0xBC,0x60,0x78,0xDC,0x97,0x71,0xD5,0xF0,0xBC,0x2D,0x0F,0x2B,0x2A, + 0xC8,0x82,0x45,0x72,0x0A,0xAD,0xD7,0xD7,0xE8,0x82,0x45,0x6A,0x0A,0x0A,0xAF,0x5D, + 0xE8,0x82,0x66,0x72,0xA2,0x02,0x8A,0xAD,0xE8,0x82,0xA7,0x7A,0xF2,0xAE,0xB4,0xAA, + 0xE8,0x82,0xA7,0x82,0xAE,0xC2,0x42,0xFE,0xE8,0x82,0xC8,0x82,0x5E,0x7F,0xF5,0xD5, + 0xE8,0x82,0xA7,0x82,0x0B,0x02,0x8B,0x2F,0xC8,0x8A,0xE8,0x82,0xED,0x7D,0x5D,0xEF, + 0x08,0x8B,0xC8,0x82,0xAF,0xEB,0xF6,0xBB,0x08,0x8B,0xC8,0x82,0x2F,0xBF,0x9D,0xBB, + 0x2D,0xAC,0xE8,0x8A,0x2D,0x55,0x55,0x55,0x75,0xF6,0x09,0x8B,0x0A,0xF5,0x55,0x55, + 0xB6,0xF6,0x29,0x8B,0x00,0x0A,0xFD,0x55,0x35,0xEE,0xE5,0x59,0x70,0x70,0x60,0x7F, + 0x64,0x49,0x02,0x41,0xAE,0x3F,0xB5,0xAF,0xA5,0x59,0x43,0x49,0xBA,0xBF,0xAB,0x3D, + 0xC8,0x8A,0xA5,0x59,0x2D,0x2D,0x2F,0xBD,0x29,0x9B,0xC8,0x8A,0x40,0x40,0xAA,0x29, + 0xC9,0x92,0xE5,0x69,0xFA,0x7A,0xD8,0xF8,0x67,0x7A,0xC5,0x61,0xD7,0xBF,0xFF,0xF8, + 0x67,0x7A,0xA5,0x59,0x7F,0xEA,0x80,0xA2,0x06,0x62,0xE2,0x38,0xFF,0xFA,0x7E,0xF8, + 0x85,0x51,0x03,0x41,0x02,0xEA,0xB5,0xFF,0x85,0x59,0x23,0x41,0xA8,0x2F,0x25,0x2B, + 0x47,0x72,0xA4,0x59,0xED,0x0F,0x0B,0x0F,0x88,0x72,0xC5,0x61,0xB5,0xB7,0xAA,0xA0, + 0x46,0x6A,0xE2,0x38,0x70,0x78,0x7C,0x7E,0x67,0x72,0x02,0x41,0x2D,0x2D,0x29,0xAF, + 0x67,0x7A,0xC5,0x61,0x80,0xE8,0x5F,0xDF,0x09,0x8B,0x26,0x72,0x09,0x29,0x0B,0x8B, + 0xC9,0x82,0x67,0x7A,0x2E,0xE0,0xBE,0xF9,0x93,0xDD,0xC8,0x82,0x35,0xB5,0x55,0x55, + 0xF7,0xFE,0x8B,0x9B,0x00,0x02,0x03,0x2D,0xF7,0xFE,0x55,0xEE,0x5C,0xDC,0x5E,0x56, + 0x96,0xEE,0x55,0xEE,0xD7,0xDD,0xB7,0x17,0x18,0xFF,0xB7,0xF6,0xA9,0x89,0xAF,0x89, + 0x39,0xFF,0xF8,0xF6,0xAF,0xE9,0xAF,0xAB,0x18,0xFF,0xF8,0xF6,0xFA,0xFE,0xEA,0x68, + 0x18,0xFF,0xF8,0xF6,0x77,0xDB,0x57,0x5F,0xD7,0xFE,0xF8,0xF6,0x57,0x5D,0xFF,0xFF, + 0xF7,0xF6,0xD6,0xF6,0x2E,0xAE,0x22,0x0A,0x18,0xFF,0xF7,0xF6,0x57,0xFB,0xDA,0xFB, + 0x18,0xFF,0xF7,0xF6,0xEF,0xFF,0x5F,0x55,0x18,0xFF,0xF8,0xF6,0xE7,0xE5,0xDF,0xFF, + 0x18,0xFF,0xF8,0xF6,0x5F,0x7F,0x5E,0xDF,0xF7,0xF6,0xD7,0xF6,0xAA,0xEA,0xE2,0xF8, + 0xF8,0xF6,0x96,0xEE,0xE8,0xFA,0x5E,0x7E,0x96,0xEE,0x76,0xEE,0xD8,0x5C,0x5C,0x57, + 0x76,0xEE,0x56,0xEE,0x72,0x4D,0xF0,0xFA,0x76,0xEE,0x14,0xE6,0xAA,0xA8,0xFA,0x6C, + 0x76,0xEE,0x14,0xE6,0x0E,0xAB,0x0B,0xA9,0x96,0xEE,0x76,0xEE,0x65,0xF5,0xBF,0xBD, + 0x96,0xEE,0x76,0xEE,0x5D,0xF7,0xEF,0xFE,0x96,0xEE,0x35,0xE6,0xCA,0xEA,0x60,0xE0, + 0x14,0xE6,0x72,0xCD,0x76,0xFA,0x88,0x00,0xF4,0xDD,0x72,0xD5,0x09,0x2B,0x0A,0x20, + 0xF4,0xE5,0x31,0xC5,0xA8,0xA8,0xE8,0x60,0x50,0xCD,0xAF,0xB4,0xF8,0xEE,0x7F,0xD7, + 0xF0,0xC4,0x6D,0xAC,0x02,0xA8,0xEA,0x5E,0x71,0xCD,0x8E,0xB4,0x7A,0x62,0xE3,0x8B, + 0x10,0xC5,0x2D,0xA4,0xF0,0x72,0x72,0x62,0x51,0xCD,0xD0,0xBC,0x0B,0x01,0xA9,0x89, + 0x72,0xCD,0xF0,0xBC,0xB7,0xAF,0x2B,0x0B,0x71,0xCD,0x51,0xCD,0xF7,0xEE,0xBF,0xF8, + 0xA7,0x7A,0x66,0x72,0xFD,0xF7,0xEE,0xBA,0xA6,0x7A,0x66,0x72,0x75,0x76,0x79,0xEA, + 0x86,0x72,0x46,0x72,0xA5,0xAE,0x80,0x20,0xC8,0x82,0x25,0x6A,0x0A,0xD7,0xFF,0xFF, + 0xC8,0x82,0x46,0x72,0x00,0x0A,0x95,0x55,0xE8,0x8A,0x46,0x72,0x0A,0x88,0x8A,0xB5, + 0xE8,0x82,0xA7,0x7A,0xEA,0x8A,0xEB,0x2D,0xE8,0x82,0xC8,0x82,0xBF,0xFD,0x51,0x55, + 0xE8,0x82,0xC8,0x82,0xAB,0x62,0x9C,0xCF,0x09,0x8B,0xA7,0x82,0xEA,0xB8,0xFE,0xF6, + 0xE8,0x8A,0xC8,0x82,0xC0,0xC8,0xEE,0xFB,0x08,0x8B,0xC8,0x82,0xF2,0x0B,0xFF,0x6E, + 0xC8,0x8A,0x09,0x83,0xDF,0xBB,0xA2,0xA8,0x08,0x8B,0xC5,0x59,0x60,0x68,0x72,0x78, + 0x84,0x51,0x43,0x49,0xB5,0xF7,0x94,0x55,0xA5,0x59,0x44,0x49,0x3D,0x2F,0x08,0x02, + 0xA8,0x8A,0xC5,0x61,0xB5,0x35,0x2D,0x2F,0xE9,0x92,0x67,0x82,0x0A,0xA2,0x62,0x78, + 0xA8,0x8A,0x26,0x72,0xF0,0x78,0x56,0x57,0x67,0x7A,0xE5,0x69,0xF0,0xEA,0xFF,0x77, + 0x67,0x72,0xA4,0x59,0xEA,0xE0,0xFF,0x57,0x05,0x62,0x44,0x51,0x78,0x7A,0x57,0x57, + 0x64,0x51,0x03,0x41,0xF7,0xB7,0xEB,0xE8,0xA5,0x59,0x23,0x49,0xFD,0xAF,0x35,0x37, + 0x67,0x72,0xC5,0x59,0x3D,0xB5,0xA5,0xED,0x88,0x72,0xE5,0x61,0x68,0x70,0x7E,0xF7, + 0xA4,0x59,0x02,0x41,0x78,0xFA,0xFC,0x3C,0x47,0x72,0x43,0x49,0xF5,0x3D,0x2F,0xAF, + 0xE9,0x8A,0xE6,0x69,0xD5,0xBD,0x3F,0x2B,0x29,0x93,0x47,0x7A,0x6F,0x7A,0xF8,0x78, + 0xE9,0x8A,0x47,0x7A,0x2D,0x35,0xF9,0xC1,0x4A,0x93,0x26,0x6A,0xF8,0xFA,0xFF,0x57, + 0xD3,0xDD,0xC8,0x82,0x2D,0xD5,0xD5,0x55,0x55,0xEE,0x6B,0x9B,0x00,0x02,0x0B,0x0D, + 0xB6,0xF6,0x55,0xEE,0xB7,0x37,0x15,0xB5,0x18,0xFF,0xD7,0xF6,0xE9,0xEB,0xF9,0xE9, + 0x38,0xFF,0xF8,0xF6,0xAB,0xAB,0xEB,0xB9,0x18,0xFF,0xF8,0xF6,0xEA,0xF8,0xF8,0xFA, + 0x18,0xFF,0xD8,0xF6,0xEA,0xFA,0xBE,0xFA,0xF7,0xF6,0xD8,0xF6,0xAA,0xBA,0x2A,0xA2, + 0xD8,0xFE,0xF7,0xF6,0x5F,0xF7,0x57,0x5F,0x18,0xFF,0xF7,0xF6,0x6D,0xBD,0xAD,0xEB, + 0x18,0xFF,0xF8,0xF6,0x75,0xFF,0xFB,0xEA,0x17,0xFF,0xF8,0xF6,0xFA,0xAF,0xFF,0x7F, + 0x18,0xFF,0xB7,0xF6,0xA8,0xEA,0xEE,0x7B,0xD7,0xF6,0x96,0xEE,0x20,0xFE,0x5E,0x5E, + 0xB7,0xF6,0x55,0xE6,0xE0,0xE8,0xFF,0xFF,0x96,0xEE,0x55,0xE6,0xAF,0xBB,0xEA,0xFA, + 0x76,0xEE,0x56,0xEE,0xDE,0xBE,0xBA,0x8C,0x76,0xEE,0x35,0xE6,0x7E,0xE8,0xA0,0x82, + 0x76,0xEE,0x14,0xE6,0x2F,0x3F,0xFE,0xFA,0x96,0xEE,0x35,0xE6,0x02,0x08,0x0A,0x7F, + 0x96,0xEE,0x55,0xEE,0xBE,0x2A,0x82,0xD5,0x96,0xEE,0x34,0xE6,0xC8,0x48,0x62,0x42, + 0x34,0xE6,0xF4,0xDD,0xBC,0x5D,0x55,0x5D,0x14,0xE6,0xD3,0xDD,0xBA,0x7F,0xA5,0xAB, + 0xF4,0xE5,0xAF,0xBC,0xE0,0x60,0x78,0x58,0xCF,0xBC,0x6E,0xB4,0xE8,0x7B,0x7A,0x80, + 0xAF,0xBC,0x0D,0xA4,0xBA,0xDF,0xDF,0xE8,0x51,0xCD,0xAF,0xBC,0x09,0x2D,0x95,0x55, + 0x51,0xCD,0x0D,0xAC,0x68,0x60,0xE0,0xDE,0x31,0xCD,0xAF,0xBC,0x81,0x09,0x0B,0xA3, + 0x92,0xD5,0x31,0xCD,0xA9,0xA9,0xAB,0xA9,0x91,0xD5,0x52,0xCD,0xFA,0xFE,0xEB,0xEA, + 0xA7,0x7A,0x45,0x6A,0x02,0x8A,0x0A,0x8D,0xA7,0x7A,0x86,0x72,0xD4,0x56,0xFE,0xAD, + 0x86,0x7A,0xA7,0x72,0xEA,0xEF,0xEB,0xA7,0xC8,0x82,0x66,0x7A,0xFF,0xDF,0x9E,0xAB, + 0xA7,0x7A,0x66,0x72,0x55,0xFB,0x8B,0xA8,0x87,0x7A,0x66,0x72,0xBD,0xF0,0xC2,0x2C, + 0xA6,0x7A,0x46,0x72,0x2F,0xF7,0xFE,0xEE,0xE8,0x82,0x45,0x72,0x08,0xAF,0x5D,0xD5, + 0xE9,0x8A,0x46,0x72,0x02,0x88,0x2B,0xFD,0xE8,0x8A,0x87,0x7A,0xA8,0x82,0xA8,0xAD, + 0xE8,0x82,0xA7,0x82,0x02,0x8A,0x9D,0xAA,0xE8,0x8A,0xC8,0x82,0xF6,0x2C,0x2F,0x9E, + 0xE8,0x8A,0xA7,0x7A,0xA2,0x82,0x6A,0xAE,0xE8,0x82,0xA4,0x59,0x78,0x78,0x72,0x68, + 0x23,0x49,0xE2,0x38,0x08,0xF8,0xFC,0x5C,0x84,0x59,0xC2,0x30,0x02,0x3F,0xB5,0xD5, + 0xC7,0x8A,0x63,0x51,0x2B,0xAB,0xBF,0xF5,0x09,0x93,0x47,0x7A,0xE2,0x82,0xEA,0x75, + 0x68,0x7A,0x06,0x72,0xA8,0xBC,0xFF,0x68,0x47,0x72,0x64,0x59,0xFE,0x78,0xFA,0xAB, + 0xC5,0x61,0x24,0x51,0xF0,0x7B,0xEB,0xE8,0x64,0x51,0x23,0x49,0x2A,0xD5,0xD7,0xF5, + 0x84,0x51,0x23,0x49,0x5E,0xDE,0x2F,0x7B,0xC5,0x59,0x03,0x41,0x2F,0x0A,0xFA,0xDF, + 0xE6,0x61,0x43,0x41,0x00,0xBA,0xF5,0x55,0xC5,0x59,0x23,0x41,0x00,0x00,0xCA,0x55, + 0x47,0x72,0x64,0x51,0xD5,0xF5,0x2D,0x0D,0x88,0x82,0xC5,0x61,0x75,0xB5,0x2E,0x0A, + 0xC9,0x8A,0x06,0x72,0x0B,0xBE,0xFC,0x78,0xC9,0x8A,0x06,0x6A,0xE0,0xE8,0xBA,0xD5, + 0x87,0x7A,0x64,0x51,0x02,0x8A,0xE8,0x7E,0xC5,0x61,0x03,0x49,0x20,0x9E,0xB7,0xB7, + 0x87,0x7A,0x64,0x51,0x0A,0x3F,0xAD,0xAF,0x15,0xEE,0x67,0x72,0x2F,0xBD,0xD5,0x55, + 0x76,0xEE,0x09,0x8B,0x00,0x02,0xAF,0x55,0xD8,0xFE,0x0D,0xAC,0x00,0x00,0x22,0xF5, + 0x18,0xFF,0x34,0xE6,0x00,0x02,0x02,0x29,0x18,0xFF,0xF8,0xF6,0xFA,0xFA,0xFA,0xAF, + 0xF7,0xFE,0xF8,0xF6,0xFF,0xFF,0xEF,0xFF,0xF7,0xF6,0xD8,0xF6,0x2A,0xA8,0xAE,0x2A, + 0x18,0xFF,0xF7,0xF6,0x57,0xFD,0xF5,0xBF,0xF8,0xFE,0x17,0xF7,0xAA,0xEA,0xBB,0x8E, + 0x18,0xFF,0xF8,0xF6,0xFE,0xFF,0xEE,0xFE,0x18,0xFF,0xD7,0xF6,0xEA,0xEE,0xFB,0x7A, + 0x17,0xF7,0xB7,0xF6,0x7F,0xFE,0x5F,0x5D,0xB7,0xF6,0x76,0xEE,0xF8,0x58,0xF8,0xFE, + 0x75,0xEE,0x35,0xE6,0xAE,0xFE,0xFA,0xF0,0x76,0xEE,0x55,0xEE,0xFE,0xDD,0x1E,0x02, + 0x76,0xEE,0x55,0xEE,0xF9,0xDC,0x58,0xF8,0x76,0xEE,0x55,0xEE,0xE9,0xAE,0xEE,0xAB, + 0x75,0xEE,0x35,0xE6,0x6E,0x68,0xE8,0xAA,0x56,0xEE,0x14,0xE6,0x7F,0xFF,0xBE,0xAE, + 0x96,0xF6,0x35,0xE6,0xB5,0x05,0x3D,0xBF,0x96,0xF6,0xD3,0xDD,0xE0,0x60,0x68,0x7A, + 0x14,0xE6,0xD3,0xDD,0x0B,0x0D,0x09,0x25,0x14,0xE6,0xD3,0xDD,0x80,0x20,0x5C,0xD8, + 0xD4,0xDD,0xF0,0xC4,0x58,0x78,0x78,0x7C,0xF0,0xC4,0xAF,0xBC,0xB0,0xFA,0xDA,0xAA, + 0xF0,0xC4,0x4D,0xAC,0x6A,0x62,0xE0,0x00,0xD0,0xBC,0x6A,0x93,0xA2,0xAA,0xFB,0x5C, + 0x8E,0xB4,0x4B,0x93,0x28,0x2A,0x3F,0x35,0x31,0xC5,0xF0,0xC4,0xA9,0x8B,0xF9,0x75, + 0x72,0xD5,0x10,0xC5,0x23,0xAF,0xAD,0xFD,0x72,0xD5,0x31,0xCD,0x00,0xBA,0xAA,0x57, + 0x45,0x6A,0x05,0x62,0x3A,0xEA,0x7D,0xE6,0x86,0x72,0xE5,0x61,0x02,0xAF,0x6F,0xFE, + 0xA7,0x7A,0x05,0x62,0x80,0x0A,0xAF,0xD5,0xA7,0x7A,0x46,0x72,0x80,0xA8,0x0A,0x95, + 0xA7,0x7A,0x86,0x7A,0xF9,0xB9,0xBB,0xAB,0xA7,0x7A,0x66,0x7A,0xBD,0xB8,0xAA,0xB8, + 0xA7,0x7A,0x46,0x72,0xE8,0xA2,0xA2,0x02,0xA7,0x7A,0x66,0x7A,0x7E,0x3B,0x2A,0x22, + 0xA7,0x7A,0x66,0x7A,0x77,0x5E,0xB8,0x20,0xA7,0x7A,0x66,0x7A,0xE5,0x5D,0xFF,0xE8, + 0xE8,0x82,0x45,0x72,0x02,0xBD,0xD7,0xFE,0xE8,0x82,0x66,0x72,0xA2,0x2A,0xB5,0x55, + 0x08,0x8B,0x87,0x7A,0x2A,0xC8,0xA2,0xBD,0xC7,0x82,0x05,0x62,0x60,0x80,0x00,0x00, + 0xC7,0x82,0xE2,0x40,0x57,0x57,0x5E,0x78,0xE2,0x38,0xA1,0x38,0xFC,0x5E,0x7A,0xE8, + 0x64,0x59,0xA2,0x38,0x0B,0xFD,0xBD,0x3D,0x26,0x72,0x23,0x51,0x2F,0x3D,0x2D,0x2F, + 0x88,0x82,0xE6,0x69,0x6A,0x02,0x00,0x2A,0x88,0x82,0x05,0x6A,0x55,0xFB,0x02,0x96, + 0xE9,0x8A,0x84,0x51,0x7F,0xEA,0xF0,0xEA,0x27,0x6A,0x02,0x41,0xFF,0x7F,0x58,0x5F, + 0x44,0x49,0xC2,0x38,0xE0,0x68,0xFE,0xD7,0x44,0x41,0xE2,0x38,0x2B,0xA9,0xED,0x7F, + 0x44,0x41,0xA2,0x30,0xE0,0x7A,0x5F,0x5F,0xA5,0x59,0x81,0x30,0xFF,0xBD,0xAD,0x2B, + 0x47,0x72,0x43,0x51,0x0D,0x0D,0xAF,0xBF,0x88,0x7A,0x06,0x6A,0xCA,0xEF,0x8B,0xAD, + 0x27,0x72,0x84,0x59,0xE0,0xF8,0x68,0x5A,0xE6,0x61,0x84,0x59,0x09,0x6F,0xAD,0xEB, + 0xC6,0x61,0x23,0x41,0x70,0x72,0x7A,0x7E,0xA5,0x59,0x03,0x41,0xB5,0xB5,0x35,0x35, + 0x47,0x72,0xC5,0x61,0xE9,0x63,0xFB,0x3A,0xE9,0x8A,0x06,0x72,0x29,0x0D,0xAB,0xEA, + 0xC8,0x82,0x26,0x72,0xBC,0x5C,0xFE,0x2F,0x8B,0x9B,0x67,0x7A,0x2B,0xBD,0xBD,0xEF, + 0xF8,0xFE,0xC8,0x82,0x02,0xAB,0xFD,0x55,0xD7,0xFE,0x6A,0x93,0x00,0x02,0xAF,0xD5, + 0xF7,0xFE,0x72,0xD5,0x00,0x00,0x22,0xFD,0xF8,0xFE,0x56,0xEE,0x08,0x08,0x22,0xBD, + 0xF8,0xFE,0xD7,0xF6,0x00,0xAA,0xA8,0xFE,0x18,0xFF,0xD7,0xF6,0xAA,0xAA,0xAB,0xFF, + 0x18,0xFF,0xD8,0xF6,0xAA,0xAF,0xFF,0xEF,0xF8,0xFE,0xB7,0xF6,0x60,0xF2,0xF8,0x5E, + 0xD7,0xF6,0x76,0xEE,0xA0,0xEC,0xFA,0x7E,0xB6,0xF6,0x55,0xEE,0xAA,0xFA,0xFA,0xF5, + 0x96,0xF6,0x55,0xEE,0x7A,0x8A,0xAB,0xEF,0x76,0xEE,0x55,0xEE,0xFB,0x7C,0x98,0x0B, + 0x97,0xF6,0x56,0xEE,0xDE,0x9F,0xE6,0xFA,0x97,0xF6,0x56,0xEE,0x7D,0xFF,0xFA,0xEA, + 0x76,0xEE,0x55,0xEE,0x36,0xEA,0xBA,0xAE,0x75,0xEE,0x35,0xEE,0xB7,0xAE,0x88,0x0A, + 0x76,0xEE,0x34,0xE6,0x5A,0x70,0x7A,0x5F,0x55,0xEE,0xB3,0xD5,0xF0,0x68,0x70,0x78, + 0x14,0xE6,0xB3,0xD5,0x2D,0x2F,0x2B,0xAD,0x75,0xEE,0x14,0xE6,0x7D,0xFF,0xBF,0x2D, + 0x55,0xEE,0x31,0xCD,0x56,0x7C,0xE0,0x80,0xD3,0xDD,0xD0,0xBC,0x55,0xF7,0xDE,0xE8, + 0x72,0xCD,0xF0,0xC4,0xFD,0xAF,0x2B,0xAA,0x31,0xCD,0x09,0x83,0x70,0x70,0xC0,0x80, + 0xAF,0xB4,0xA8,0x7A,0x2D,0x2D,0x35,0xF7,0xF0,0xC4,0x0C,0xA4,0x00,0x0A,0xAA,0xB5, + 0x31,0xCD,0xAF,0xBC,0x0A,0xAB,0x37,0xF5,0x31,0xCD,0xCF,0xBC,0x00,0xEA,0xEB,0xDF, + 0x46,0x72,0x26,0x6A,0xED,0xDE,0x18,0x88,0x46,0x72,0x26,0x6A,0xE5,0x6B,0x08,0x22, + 0x46,0x72,0x05,0x6A,0xBF,0xAA,0xFE,0xDA,0x46,0x72,0x05,0x6A,0xFF,0x6E,0xD7,0xBA, + 0xA7,0x7A,0x05,0x6A,0x2F,0x7D,0xDF,0xFF,0xA7,0x7A,0x26,0x6A,0x00,0x2B,0xD7,0x55, + 0xA7,0x82,0x25,0x6A,0x08,0xA0,0x2A,0x95,0xA7,0x7A,0x87,0x7A,0xAF,0xFA,0xFF,0xA5, + 0xA7,0x7A,0x87,0x7A,0x8B,0x0F,0x2D,0xFC,0xC7,0x82,0x66,0x72,0x7F,0xFF,0x3A,0xF8, + 0xA7,0x82,0x87,0x7A,0xFF,0xBD,0xFF,0x0C,0xA7,0x82,0x66,0x7A,0xE6,0xFA,0xAA,0x08, + 0xC7,0x82,0x66,0x72,0xD5,0xBB,0xFE,0x8B,0xC8,0x82,0x66,0x72,0x0B,0xF7,0xFF,0xAA, + 0xC7,0x82,0x84,0x59,0x70,0xC2,0xA2,0x28,0x46,0x72,0xE3,0x40,0x55,0x57,0xFC,0xE8, + 0x64,0x59,0xE2,0x40,0xAD,0x2D,0x8E,0x88,0xA5,0x61,0x03,0x49,0x2F,0x57,0x5F,0x5F, + 0x27,0x72,0xE3,0x48,0x0A,0xAF,0xF5,0xF5,0x67,0x7A,0x44,0x51,0x00,0xAA,0xFD,0x5D, + 0x47,0x7A,0xE3,0x40,0xA0,0xFA,0xFF,0x7F,0x44,0x51,0xA2,0x30,0xE0,0xBA,0xFE,0xD7, + 0x44,0x41,0xC2,0x38,0xF7,0xEF,0xBB,0x2A,0x44,0x41,0xE3,0x38,0x7F,0xEF,0xEA,0x83, + 0x23,0x41,0xA2,0x30,0xDE,0xDE,0xBE,0x2A,0xA5,0x59,0x03,0x41,0x2D,0x0D,0x2D,0x03, + 0x06,0x72,0x84,0x59,0x35,0xFD,0xCA,0xA2,0x06,0x6A,0xA4,0x61,0x2A,0xFD,0xD5,0xDE, + 0xE5,0x69,0x24,0x49,0xB8,0xFA,0xFE,0x5E,0xE5,0x61,0x23,0x49,0x8B,0x2A,0xAF,0xB5, + 0x84,0x51,0x03,0x41,0xF8,0xF8,0xD6,0xF6,0xC6,0x59,0x02,0x41,0x2D,0x2D,0xAA,0xE3, + 0x88,0x7A,0x44,0x51,0x2A,0x0B,0x2F,0xB5,0x88,0x82,0xE5,0x69,0x4A,0xF8,0x58,0xA0, + 0xC9,0x8A,0x05,0x6A,0x2D,0x2F,0xBF,0xEF,0x0A,0x93,0x67,0x7A,0xA0,0xE2,0x7F,0x5D, + 0x88,0x7A,0x26,0x72,0x26,0x3D,0xBD,0x01,0x2A,0x93,0x26,0x72,0x3E,0xB7,0xD7,0xFF, + 0xEC,0xA3,0x88,0x7A,0xF8,0x57,0x55,0x55,0xD3,0xDD,0x68,0x7A,0x0B,0xFD,0xD5,0x55, + 0x34,0xE6,0x88,0x7A,0x00,0xBF,0xD5,0x55,0x96,0xF6,0xA8,0x7A,0x00,0x02,0xFF,0x55, + 0xB7,0xF6,0x6A,0x93,0x00,0x00,0x03,0xBD,0xD7,0xF6,0x35,0xE6,0x88,0xA8,0xAA,0xFD, + 0x96,0xEE,0x55,0xEE,0xC0,0xE8,0xAE,0xFF,0x96,0xF6,0x35,0xE6,0xAE,0x8A,0x7E,0xD7, + 0x76,0xEE,0x34,0xE6,0x28,0xAE,0xBF,0x55,0x76,0xEE,0x35,0xEE,0x00,0x00,0xA0,0xFB, + 0x97,0xF6,0x35,0xE6,0xAA,0xA2,0xAA,0xD5,0x96,0xF6,0x35,0xE6,0x22,0x02,0xF8,0xDF, + 0x76,0xEE,0x55,0xEE,0xD4,0x57,0xE5,0x25,0x96,0xF6,0x55,0xEE,0xD5,0xFD,0xEB,0x2A, + 0x76,0xEE,0x35,0xE6,0xFB,0xF8,0x70,0x70,0x35,0xEE,0x92,0xD5,0x70,0x78,0x78,0x70, + 0x15,0xE6,0x92,0xD5,0x25,0x3D,0xAD,0xA9,0x35,0xE6,0xF4,0xE5,0x0A,0xDF,0x85,0x0D, + 0x96,0xEE,0x35,0xE6,0xED,0x89,0x29,0x2B,0x76,0xEE,0x92,0xD5,0x6A,0x00,0x00,0x00, + 0x75,0xEE,0x51,0xCD,0x55,0x57,0xFC,0xF0,0xB2,0xD5,0x10,0xC5,0x7B,0xEF,0xAE,0xA8, + 0x72,0xCD,0x47,0x6A,0x57,0x5C,0x78,0xF0,0x0D,0xA4,0x06,0x62,0x0B,0xB5,0xD5,0x5F, + 0xAF,0xBC,0x88,0x72,0x00,0x22,0xAD,0x55,0xCF,0xBC,0x2B,0x8B,0x00,0x02,0x0B,0x0D, + 0x66,0x72,0x26,0x6A,0xBA,0x7E,0x8C,0x0C,0x46,0x72,0x25,0x6A,0x20,0x08,0x00,0x30, + 0x66,0x72,0x26,0x6A,0x7F,0xB1,0xBB,0x2A,0x66,0x72,0x25,0x6A,0xFD,0xEE,0xFE,0x3C, + 0x66,0x72,0x25,0x6A,0x6F,0xAE,0xAF,0x1F,0x46,0x72,0x26,0x6A,0xB9,0x29,0x3B,0x00, + 0x46,0x72,0x26,0x6A,0x95,0xCC,0xAB,0x80,0x87,0x7A,0x25,0x6A,0x29,0xDF,0x7D,0x7D, + 0xA7,0x7A,0x25,0x6A,0x20,0x2D,0xD5,0x57,0xC7,0x82,0x25,0x6A,0xAA,0xA8,0x2F,0xFD, + 0xA7,0x82,0x67,0x7A,0xA8,0x80,0xA8,0xBD,0xA7,0x82,0x87,0x7A,0x28,0xE0,0x8A,0xC8, + 0xC7,0x8A,0xA7,0x7A,0x55,0x7D,0xFD,0xEF,0xC7,0x82,0x86,0x7A,0xAE,0xA9,0x82,0xA2, + 0xC8,0x82,0x86,0x7A,0x7F,0xBB,0xBB,0x3E,0xC8,0x82,0x64,0x59,0x7A,0x68,0xA8,0x20, + 0xC8,0x8A,0x64,0x59,0x55,0xDD,0xFA,0xA0,0x67,0x72,0x44,0x59,0x55,0xFF,0xFA,0xE0, + 0xA5,0x59,0x24,0x49,0xBF,0xE8,0xF8,0x5E,0x85,0x51,0xE2,0x38,0xA0,0xAA,0xFE,0x5E, + 0x64,0x51,0xC2,0x30,0x68,0x5A,0x5F,0x7D,0x03,0x39,0xA2,0x30,0xB5,0xEF,0xAF,0x03, + 0x44,0x41,0xC2,0x30,0x83,0xAA,0x7E,0x7A,0x44,0x49,0xC2,0x38,0xAE,0xBF,0xBD,0x3D, + 0x64,0x51,0x03,0x41,0x35,0x8F,0xC8,0xA0,0xA5,0x59,0x23,0x49,0x0F,0x3D,0xBD,0xAF, + 0x47,0x7A,0xA5,0x59,0xB2,0x2B,0x29,0xA5,0x67,0x7A,0x44,0x51,0xFA,0x68,0x70,0x7A, + 0xA5,0x59,0xC2,0x38,0xB8,0xFA,0xF7,0xD7,0xA5,0x59,0x23,0x41,0xFB,0x6B,0xE9,0x09, + 0xA5,0x51,0x03,0x41,0xDE,0xFF,0xB5,0xFC,0xA5,0x51,0x23,0x49,0xEB,0xBB,0xE8,0x5F, + 0x68,0x7A,0x03,0x41,0x2F,0xAD,0x2D,0x25,0x4B,0x93,0xA7,0x82,0xA9,0x8D,0xAE,0x5D, + 0xE9,0x8A,0xA5,0x59,0xFA,0xF8,0x7E,0x5E,0x67,0x7A,0xE6,0x61,0x2B,0x2B,0xAF,0xBD, + 0xC9,0x8A,0x27,0x72,0x2F,0xAA,0xBF,0x35,0x09,0x93,0xA8,0x82,0x5F,0x7A,0x2E,0xBF, + 0xE9,0x8A,0x47,0x7A,0x55,0x5F,0xF8,0xE8,0x67,0x7A,0xE5,0x69,0x7F,0xAA,0x8A,0xF8, + 0x87,0x7A,0xE5,0x69,0xAD,0xAB,0x02,0xAB,0x87,0x72,0x26,0x6A,0x78,0xEA,0xDF,0x5A, + 0x4E,0xAC,0x47,0x6A,0x25,0xD5,0x55,0x55,0x55,0xEE,0x88,0x72,0x02,0x03,0xF5,0x55, + 0x35,0xE6,0x6A,0x93,0x00,0x00,0x0A,0xB5,0x55,0xEE,0xD3,0xDD,0xA8,0xA2,0xAA,0xA9, + 0x34,0xE6,0xF4,0xE5,0xA0,0xA8,0xFA,0xDE,0x35,0xE6,0xF4,0xE5,0x02,0x8E,0x2F,0xDD, + 0x34,0xE6,0xF4,0xDD,0xFE,0x57,0xFC,0xEF,0x35,0xE6,0xD3,0xDD,0x2F,0x29,0xBB,0xAF, + 0x96,0xF6,0x34,0xE6,0xAD,0xAF,0x37,0xB5,0x96,0xF6,0x35,0xE6,0x82,0xA8,0x72,0x5F, + 0x55,0xEE,0x35,0xE6,0xC0,0x2A,0xAD,0xF5,0x35,0xE6,0x72,0xD5,0x78,0xA0,0x00,0x00, + 0x35,0xEE,0x92,0xD5,0xB5,0xBD,0xA8,0x80,0x34,0xE6,0xF4,0xDD,0x0B,0xBA,0xDF,0xDB, + 0x96,0xEE,0x14,0xE6,0x8B,0x0B,0x0F,0x2D,0x96,0xEE,0x76,0xEE,0xE8,0xF8,0x8A,0xA8, + 0x76,0xEE,0xD3,0xDD,0x70,0xC0,0x00,0x00,0x55,0xEE,0x72,0xD5,0x7F,0x7F,0x7A,0xE0, + 0xF3,0xDD,0xF1,0xC4,0x62,0x0A,0x0A,0x0A,0xB3,0xDD,0xE9,0x82,0x57,0xE0,0x00,0x00, + 0x72,0xD5,0x67,0x72,0x55,0xFF,0xA8,0x80,0xCF,0xBC,0xE9,0x82,0x09,0x03,0x02,0x28, + 0x66,0x72,0x46,0x72,0x25,0xD6,0x9C,0xBE,0x66,0x72,0x25,0x72,0xAE,0x89,0xA8,0xA0, + 0x67,0x72,0x46,0x72,0xD9,0xA3,0x66,0xB6,0x66,0x7A,0x46,0x72,0xAF,0xCF,0x7C,0xB2, + 0x66,0x72,0x46,0x72,0xFE,0xF4,0xBD,0x5D,0x66,0x72,0x46,0x72,0x5E,0x16,0xF8,0xF3, + 0x67,0x7A,0x26,0x72,0x7F,0x8F,0x2D,0xA8,0x66,0x7A,0x26,0x6A,0xDF,0xEF,0xA8,0xC3, + 0x66,0x72,0x25,0x72,0xE2,0xAB,0xEA,0xEE,0x66,0x72,0x25,0x6A,0x6F,0xDF,0x9A,0xBA, + 0x66,0x72,0x25,0x6A,0x2F,0x7F,0x67,0xA8,0xC7,0x82,0x26,0x6A,0x8A,0xAD,0x7D,0xFF, + 0xC8,0x8A,0x46,0x72,0xAA,0x8A,0x9D,0xD5,0xC7,0x82,0x66,0x7A,0x22,0x0A,0xAA,0xB5, + 0xC7,0x82,0xA7,0x82,0x09,0x02,0x0A,0x07,0xE8,0x8A,0x87,0x7A,0x7A,0xEA,0x00,0x0A, + 0x09,0x93,0x46,0x72,0x7A,0xEB,0xE8,0x68,0x87,0x7A,0x23,0x49,0xE0,0xF8,0xFA,0x7E, + 0x65,0x51,0xC2,0x30,0x88,0xFA,0x5E,0x57,0x23,0x41,0x81,0x28,0xF8,0xDF,0xDF,0xD5, + 0xE3,0x30,0xA2,0x28,0x02,0xAA,0xAF,0xBF,0x03,0x39,0xA2,0x28,0xA2,0xA2,0xEA,0xDE, + 0xE3,0x30,0xA2,0x30,0x00,0xAA,0xFA,0xFF,0x84,0x51,0xC2,0x30,0xB7,0xBF,0x25,0x0D, + 0x84,0x51,0xE3,0x40,0xE0,0xAE,0xB6,0xD7,0xA5,0x59,0x44,0x51,0xF5,0x2F,0x2F,0xFB, + 0x27,0x72,0x85,0x59,0x35,0x35,0xA7,0xA5,0xE6,0x61,0x03,0x41,0xF8,0xF8,0x7A,0x7C, + 0x44,0x49,0xC3,0x38,0xEE,0x7A,0x7C,0xBA,0xC6,0x59,0xE3,0x38,0x2D,0x0D,0x0B,0xAB, + 0xC6,0x59,0x44,0x49,0xF0,0x5C,0x70,0x7A,0x44,0x49,0xE3,0x38,0xE8,0xFE,0x76,0xAE, + 0xA5,0x59,0xE3,0x38,0x25,0xB5,0xFD,0xFB,0x67,0x72,0x44,0x49,0x82,0xFA,0x7F,0x75, + 0xE5,0x61,0x44,0x49,0xE0,0xBF,0xF5,0x55,0xE6,0x61,0x43,0x51,0x2B,0xBF,0xBF,0xB5, + 0x67,0x7A,0x84,0x59,0x0B,0x2D,0x2F,0x3F,0xE9,0x8A,0x06,0x72,0x2A,0xBE,0xDA,0x5F, + 0xE9,0x92,0x67,0x7A,0x78,0xEF,0xAD,0xE9,0xC9,0x8A,0x27,0x72,0x5E,0xF0,0xC0,0x88, + 0x87,0x7A,0xC4,0x61,0xAB,0x7F,0xFA,0xA8,0x47,0x72,0x84,0x59,0x00,0x0B,0xFF,0x5E, + 0x26,0x6A,0x84,0x51,0x80,0xA0,0xFB,0x55,0x67,0x72,0xA5,0x59,0x2A,0xFD,0xF5,0xD5, + 0x0C,0xA4,0x26,0x6A,0x2F,0xBD,0xD5,0x55,0x34,0xEE,0x0A,0x8B,0x02,0x0A,0x2D,0xD5, + 0x35,0xEE,0x31,0xCD,0xA0,0xA8,0x22,0xAD,0x14,0xE6,0xB3,0xDD,0xEA,0x6B,0xA2,0x88, + 0x14,0xE6,0xB3,0xDD,0xCA,0xAF,0xFA,0x6A,0xF4,0xE5,0xD3,0xDD,0x2E,0x9F,0x97,0xD5, + 0x55,0xE6,0xF4,0xDD,0x0B,0xAB,0xAF,0xEF,0x34,0xE6,0xF4,0xDD,0x80,0x2A,0xAF,0xD5, + 0x55,0xEE,0x14,0xE6,0xAA,0xAF,0xAF,0xCD,0x34,0xE6,0xF4,0xDD,0xD6,0x5E,0x7A,0x67, + 0x34,0xE6,0xF4,0xDD,0xBF,0xAF,0xB5,0xFD,0x14,0xE6,0xF4,0xDD,0x20,0x28,0x82,0x02, + 0x96,0xEE,0x14,0xE6,0x2F,0x0D,0x2D,0x25,0x76,0xFE,0x96,0xEE,0x77,0xDD,0x75,0x5D, + 0x96,0xEE,0x76,0xEE,0xF8,0xC2,0x8A,0xA0,0x96,0xEE,0x35,0xE6,0x7A,0x88,0xA2,0xE2, + 0x76,0xEE,0x93,0xD5,0xD7,0xF8,0xE0,0xFA,0x15,0xE6,0xB3,0xD5,0xAA,0x8B,0xAF,0xD7, + 0xF4,0xDD,0x92,0xD5,0x7A,0x80,0x0A,0xAA,0xD3,0xDD,0xCC,0x9B,0x5A,0xE0,0x80,0x00, + 0x66,0x72,0x45,0x72,0xC3,0x2B,0x02,0x83,0x66,0x7A,0x46,0x72,0xBA,0xB4,0xFD,0x42, + 0x87,0x7A,0x46,0x72,0xEA,0xBA,0xDB,0x7F,0x87,0x7A,0x46,0x72,0xFD,0xED,0xBA,0xBB, + 0x66,0x72,0x25,0x72,0x1A,0xAA,0x88,0x82,0x87,0x7A,0x46,0x72,0xF5,0xFE,0xB3,0xEA, + 0x86,0x7A,0x46,0x72,0x7D,0xFD,0xEE,0xFC,0x87,0x7A,0x25,0x6A,0xEF,0xAF,0xAA,0x88, + 0x66,0x7A,0x46,0x72,0x79,0xB8,0x76,0xC2,0x66,0x7A,0x46,0x72,0xEC,0x4C,0x6C,0xC4, + 0x66,0x7A,0x46,0x72,0x17,0x72,0x8F,0xC6,0x87,0x7A,0x46,0x72,0x77,0x7D,0xBE,0xEA, + 0x87,0x7A,0x46,0x72,0x5F,0x7D,0xB5,0x8A,0x87,0x7A,0x25,0x72,0xFD,0xAF,0xEB,0x8A, + 0xA7,0x82,0x46,0x72,0x0A,0xBF,0x7D,0x6F,0xE8,0x8A,0x46,0x72,0x0A,0x0F,0xB7,0x1F, + 0x09,0x8B,0xE5,0x69,0x70,0x70,0x78,0x78,0xA4,0x59,0xC2,0x38,0xF8,0x5E,0x7C,0x78, + 0xC2,0x30,0x82,0x28,0x60,0xF0,0xC8,0xC0,0xE2,0x30,0x82,0x20,0xD5,0x7F,0xBF,0xAE, + 0xC2,0x28,0xA2,0x28,0xFF,0xFF,0x52,0x3A,0xC2,0x30,0xA2,0x28,0x0A,0xA3,0x7B,0x5C, + 0x03,0x39,0xA2,0x28,0x97,0xBD,0x25,0x2D,0x65,0x49,0xE2,0x38,0xCD,0xFB,0x62,0x62, + 0x24,0x41,0xC2,0x38,0x3F,0x27,0xB7,0x2F,0x64,0x51,0x03,0x41,0xA0,0x0F,0x01,0x83, + 0xC5,0x59,0x23,0x49,0x2D,0xFF,0x7A,0x6A,0x85,0x51,0xE3,0x38,0x78,0x5A,0xFB,0xFE, + 0x24,0x41,0xE2,0x38,0x32,0xF5,0xB5,0xAA,0x65,0x49,0xE3,0x38,0xA2,0xA3,0xFF,0x55, + 0x64,0x49,0x03,0x41,0xF3,0x5F,0xDD,0x39,0x64,0x49,0xE3,0x38,0xBE,0xFF,0x7A,0x60, + 0x24,0x49,0xA2,0x30,0x00,0xAB,0xB7,0xA7,0xC5,0x59,0x44,0x49,0xED,0xAD,0xAB,0x09, + 0x84,0x51,0x02,0x41,0xEA,0xE8,0x7A,0x7C,0x85,0x51,0xE2,0x38,0x2F,0x2F,0xBF,0xAD, + 0x26,0x72,0x85,0x59,0x95,0xD5,0xAB,0x03,0x06,0x6A,0xC5,0x69,0x2B,0x8D,0xE2,0x60, + 0xA8,0x82,0xC5,0x61,0x02,0x82,0xFD,0x55,0xA8,0x82,0xC5,0x69,0x08,0x8A,0xAF,0xAD, + 0x88,0x7A,0xA5,0x61,0xE8,0xFE,0xFA,0x7E,0x06,0x6A,0x43,0x51,0xFE,0xA8,0x80,0x82, + 0xC6,0x59,0x64,0x51,0xBD,0xAA,0x80,0x68,0xE6,0x61,0x85,0x51,0xAA,0xBA,0xF0,0xFD, + 0x06,0x6A,0x84,0x51,0x2A,0x2F,0x35,0xB5,0x4B,0x93,0xE5,0x61,0x2B,0xAF,0xBD,0xD5, + 0x72,0xD5,0xA8,0x82,0x2F,0xB5,0xD5,0x55,0xF4,0xE5,0xCC,0xA3,0x00,0x02,0x0B,0x29, + 0xF4,0xE5,0xB3,0xDD,0xF0,0xD0,0x78,0xBB,0xD3,0xDD,0x72,0xD5,0x20,0x28,0xA0,0x78, + 0x14,0xE6,0x93,0xD5,0x82,0x2A,0xAF,0xB5,0x35,0xE6,0xD3,0xDD,0xDF,0xB7,0x37,0x2F, + 0x55,0xEE,0xB3,0xDD,0x82,0x80,0xA8,0x7A,0x35,0xE6,0xD3,0xDD,0xF7,0xBE,0x00,0x03, + 0x35,0xE6,0xF4,0xDD,0xB5,0xFE,0xBE,0xC0,0x35,0xE6,0xD3,0xDD,0x7A,0xFA,0x8A,0x20, + 0x96,0xEE,0xF4,0xDD,0x2D,0x25,0x2F,0x2F,0xB7,0xF6,0x96,0xEE,0xF7,0xFF,0x5F,0xDF, + 0x96,0xEE,0x76,0xEE,0xF0,0xF0,0xE8,0xA0,0x75,0xEE,0xB3,0xD5,0xE8,0x7C,0x78,0x60, + 0xD3,0xDD,0x92,0xD5,0xA8,0x7E,0xEF,0x6A,0xB3,0xD5,0x52,0xD5,0x02,0xA2,0xEA,0xAA, + 0xB3,0xD5,0x72,0xD5,0x00,0x8A,0xFF,0x5F,0x92,0xD5,0x51,0xCD,0x00,0xAC,0x7E,0xB7, + 0x67,0x7A,0xE5,0x69,0x80,0x22,0x22,0x3D,0x67,0x7A,0x47,0x72,0xE8,0x22,0x3F,0x4D, + 0x87,0x7A,0x46,0x72,0xEF,0xA7,0xBF,0xDF,0x47,0x7A,0x66,0x72,0x7D,0xF7,0x56,0x77, + 0x87,0x82,0x66,0x72,0x5D,0x5D,0xD7,0xDA,0x87,0x7A,0x46,0x72,0xEA,0xAF,0x3E,0xFE, + 0x86,0x7A,0x66,0x72,0x7E,0xED,0xCB,0xA1,0x86,0x7A,0x46,0x72,0xBD,0xAA,0xAA,0x2A, + 0x86,0x7A,0x66,0x72,0x7D,0x79,0xF0,0xB4,0x87,0x7A,0x46,0x72,0xEA,0xF0,0xEA,0xF8, + 0x87,0x7A,0x46,0x72,0xFB,0xFE,0xB2,0x2B,0x87,0x7A,0x46,0x72,0xAE,0xCE,0xBE,0xBE, + 0xA7,0x82,0x46,0x72,0xFE,0xBF,0x9F,0x2A,0xA7,0x82,0x66,0x7A,0x75,0x57,0xBF,0xFF, + 0x87,0x7A,0x45,0x7A,0xAF,0x2B,0x20,0xA0,0xEC,0xAB,0x87,0x7A,0x95,0xB5,0x2D,0x0D, + 0xCB,0xA3,0xE5,0x69,0x7E,0x7C,0x78,0x78,0xA5,0x59,0xE2,0x38,0x5C,0x58,0x58,0xF8, + 0xE3,0x38,0xA2,0x28,0x7D,0x5B,0xFE,0xF8,0xE3,0x30,0xA2,0x28,0xBF,0x8B,0xAA,0xFD, + 0xE3,0x30,0xA2,0x28,0xBE,0xF8,0xF8,0xFE,0xE2,0x30,0x81,0x28,0xFA,0xFF,0x3E,0x2D, + 0x44,0x41,0xA2,0x28,0xBD,0x2F,0x2B,0x02,0x85,0x49,0xE3,0x38,0x63,0x7E,0x5F,0x57, + 0x85,0x51,0xE3,0x38,0x25,0x2D,0x0F,0xAD,0x85,0x51,0xE2,0x38,0xAA,0xB8,0xF8,0x7A, + 0x85,0x51,0xE2,0x38,0x80,0xFA,0x55,0x55,0x24,0x39,0xC2,0x38,0xBE,0xD4,0xBB,0x5F, + 0x44,0x41,0xE3,0x38,0x0B,0xCF,0xD5,0x5F,0x44,0x49,0xE2,0x38,0x5C,0xDA,0xE9,0x97, + 0x85,0x49,0x03,0x41,0x3D,0xB5,0xDF,0x5F,0x85,0x51,0xE3,0x38,0x58,0xFE,0xAA,0xAA, + 0x45,0x49,0xC3,0x38,0xF5,0xFF,0xEE,0x08,0xA5,0x51,0x03,0x39,0x29,0xBD,0xFD,0xBE, + 0x85,0x51,0x03,0x41,0x78,0xFA,0xFA,0xAA,0xE5,0x61,0x03,0x41,0xBD,0xAD,0x2F,0x2B, + 0x47,0x72,0xA4,0x59,0x0D,0xBF,0xFB,0x7F,0x26,0x6A,0x64,0x51,0xF8,0x7C,0x7F,0xF5, + 0xC6,0x61,0x43,0x51,0x8A,0xAD,0x85,0x2E,0x06,0x6A,0x85,0x59,0xAF,0xCD,0x8F,0x02, + 0xE6,0x69,0x64,0x51,0xC0,0xE2,0xF7,0xDD,0xA5,0x59,0x44,0x49,0x0B,0x77,0xDF,0xFB, + 0xA5,0x59,0x44,0x49,0xF2,0x7F,0xFD,0x55,0xC6,0x59,0x44,0x49,0xBD,0x35,0x35,0xBB, + 0xE6,0x59,0x85,0x59,0xF6,0xC0,0x80,0xB2,0xE6,0x61,0xA5,0x59,0xE2,0xF5,0xDF,0xF9, + 0xC9,0x82,0xA5,0x59,0x2B,0xAD,0xB7,0xAF,0x10,0xCD,0xA8,0x82,0x0B,0x2D,0xBD,0xF5, + 0xD3,0xDD,0x4E,0xB4,0x00,0x00,0x03,0x2D,0xB3,0xDD,0x72,0xD5,0xDC,0x57,0x96,0xFE, + 0xF4,0xDD,0x72,0xD5,0x2D,0xAB,0x2B,0x2B,0x35,0xE6,0xD3,0xDD,0x8B,0x7A,0x55,0xBF, + 0xF4,0xDD,0x10,0xC5,0xA0,0xE0,0xE0,0x70,0x14,0xE6,0x10,0xC5,0x02,0x02,0x0B,0x2D, + 0x76,0xEE,0x14,0xE6,0xE9,0x2A,0xAA,0xFA,0x55,0xEE,0x14,0xE6,0xEA,0xF8,0xFE,0x7F, + 0xB7,0xF6,0x14,0xE6,0xBD,0x25,0x25,0x2D,0xB7,0xF6,0x76,0xEE,0xF8,0xBA,0xFA,0x5E, + 0x96,0xEE,0x55,0xEE,0x20,0xCA,0xBA,0xFD,0x76,0xEE,0xF4,0xDD,0x60,0x80,0xA0,0xA2, + 0x55,0xEE,0xB3,0xD5,0x57,0x5F,0x78,0x78,0xB2,0xD5,0x73,0xCD,0xBA,0xFE,0xEA,0x32, + 0x92,0xD5,0x72,0xCD,0xF8,0xEC,0x68,0xFA,0x92,0xD5,0x31,0xC5,0xFF,0xFE,0x7A,0x72, + 0xC4,0x61,0x42,0x59,0x3F,0xFF,0xBF,0xFF,0x66,0x72,0x64,0x59,0x0A,0xBD,0xD5,0x55, + 0x86,0x7A,0x44,0x59,0x82,0x22,0xAF,0xF5,0x87,0x7A,0xC4,0x61,0x0A,0x80,0xAA,0xAD, + 0x86,0x7A,0x26,0x72,0x28,0xAA,0xAA,0xA9,0x87,0x7A,0x25,0x72,0xAA,0xA2,0xAA,0x8B, + 0x87,0x7A,0x66,0x72,0xA1,0x0D,0xBB,0x63,0x86,0x7A,0x66,0x72,0x27,0xC0,0xB8,0x2C, + 0x87,0x7A,0x66,0x72,0xBB,0x28,0x02,0xAC,0x86,0x7A,0x46,0x72,0xB8,0xC0,0x08,0xB8, + 0x87,0x7A,0x25,0x7A,0xA2,0xA2,0xC2,0x22,0xA7,0x7A,0x46,0x7A,0x7A,0xBF,0xBB,0x2E, + 0x87,0x7A,0x66,0x7A,0x32,0x08,0xB0,0xD3,0xA7,0x82,0x66,0x7A,0x67,0xBE,0xBF,0xAE, + 0x6A,0x9B,0x87,0x7A,0x55,0xD5,0xD5,0x15,0x2E,0xB4,0x08,0x8B,0x2D,0x89,0x83,0x22, + 0x8A,0x9B,0x05,0x6A,0x78,0x58,0x5C,0x7C,0xE6,0x61,0x02,0x41,0xFA,0x78,0x78,0x78, + 0x23,0x41,0xA2,0x28,0x78,0x7A,0xFA,0x6A,0xC2,0x30,0xA2,0x28,0x9B,0x3E,0x57,0x7D, + 0xC2,0x28,0x81,0x28,0xF8,0xEA,0xB6,0xBB,0xE3,0x38,0x82,0x28,0x37,0xAF,0xAF,0xAF, + 0x24,0x41,0xA2,0x30,0x80,0xAA,0xFF,0xD7,0x44,0x41,0xC2,0x30,0xF7,0xFD,0x8B,0xC9, + 0x24,0x41,0xC2,0x38,0x2B,0xA9,0xEF,0x2B,0x44,0x49,0xC2,0x38,0x68,0xFE,0xF7,0xBE, + 0x24,0x41,0xC2,0x30,0xE5,0xB7,0xA7,0x0C,0x04,0x41,0xA2,0x30,0xF8,0xC0,0x00,0xA8, + 0xE3,0x30,0x82,0x30,0xA3,0xEF,0xDF,0xBE,0x23,0x41,0xC2,0x38,0x2B,0x29,0xAB,0x2A, + 0x44,0x41,0x03,0x41,0xEB,0x72,0x82,0x0A,0x44,0x49,0xE3,0x38,0x0A,0x83,0xAE,0x7F, + 0x86,0x49,0x03,0x41,0xAF,0x27,0x2D,0xFD,0x85,0x51,0x03,0x41,0xE0,0xF8,0xDC,0x5F, + 0x85,0x51,0x24,0x41,0x8D,0xEF,0xEB,0x7F,0x06,0x62,0x04,0x41,0x2F,0x3F,0xB5,0xF5, + 0xE5,0x61,0x44,0x49,0xE8,0xEE,0xDF,0x57,0xA5,0x59,0x23,0x49,0x0A,0x28,0xBF,0x95, + 0xE6,0x61,0x85,0x59,0x3F,0xBA,0xAA,0x7F,0x27,0x72,0xA5,0x59,0xE0,0x8B,0xAF,0xDD, + 0xE6,0x61,0x03,0x41,0xFE,0x5E,0xF8,0xA2,0x85,0x51,0x23,0x49,0x88,0x83,0x35,0xFE, + 0x64,0x49,0x44,0x49,0xA8,0x81,0x83,0x3D,0xC6,0x59,0x64,0x49,0xF9,0xE2,0x01,0x5F, + 0xA5,0x59,0x44,0x49,0x88,0xFA,0x9A,0x5E,0xE5,0x61,0x43,0x49,0x83,0xAD,0xFF,0xED, + 0x67,0x72,0xC5,0x59,0x09,0x0B,0x2D,0x25,0x29,0x8B,0x87,0x7A,0x2B,0xAF,0xFD,0xFD, + 0x11,0xCD,0xC8,0x82,0x0B,0x25,0xBD,0xD5,0x14,0xE6,0xD0,0xC4,0xAA,0xA2,0x0A,0x09, + 0x56,0xEE,0xB3,0xD5,0xAD,0xAF,0xAA,0x0A,0x55,0xEE,0xF3,0xDD,0xDF,0xBF,0xCA,0xA0, + 0x14,0xE6,0xF0,0xC4,0x58,0x58,0xDC,0xFE,0x14,0xE6,0xF0,0xC4,0x2D,0x2F,0x3F,0x3F, + 0x76,0xEE,0x14,0xE6,0xF8,0x6A,0xFA,0xEA,0x96,0xEE,0x14,0xE6,0xD7,0xD5,0xBD,0x2F, + 0x96,0xEE,0x35,0xE6,0x09,0x0A,0x02,0xA0,0x96,0xEE,0x55,0xE6,0xF8,0x5E,0xDE,0x5F, + 0x75,0xEE,0x55,0xE6,0xEF,0xBF,0xBE,0x5E,0x75,0xEE,0x55,0xE6,0xCB,0xEB,0xFA,0xBD, + 0x76,0xEE,0xD3,0xDD,0x7A,0xAA,0xA0,0xA0,0x55,0xEE,0x92,0xD5,0x57,0x5E,0xE8,0x80, + 0x14,0xE6,0x92,0xD5,0x75,0x55,0x5F,0x7C,0xB2,0xD5,0x51,0xCD,0xDE,0xDE,0xF8,0xEA, + 0x84,0x61,0x43,0x59,0xBB,0xFA,0xBE,0x7A,0x84,0x61,0x43,0x59,0xCA,0x66,0x8F,0xED, + 0x43,0x61,0x84,0x59,0xDE,0xDD,0xFF,0xFA,0xC4,0x61,0x63,0x59,0x35,0xBD,0xF5,0x7D, + 0x46,0x72,0x43,0x51,0x02,0xFF,0xD5,0x55,0x66,0x72,0x43,0x51,0x00,0x0A,0xBF,0x55, + 0xC7,0x7A,0xA5,0x61,0xA8,0xAA,0xAA,0xF5,0x87,0x7A,0x46,0x72,0xA0,0xC2,0x80,0x89, + 0x87,0x7A,0x66,0x7A,0xBE,0xAE,0xA6,0xAD,0x87,0x7A,0x66,0x7A,0x9E,0xBE,0xAF,0x47, + 0x87,0x7A,0x66,0x7A,0xAE,0x68,0x8F,0xA0,0xA8,0x82,0x67,0x7A,0xFB,0xAF,0xAF,0xBB, + 0xA7,0x82,0x67,0x7A,0xFD,0xFB,0xEA,0xBF,0xA7,0x82,0x67,0x7A,0xAE,0xEF,0xEF,0xEE, + 0xCB,0xA3,0x87,0x82,0x35,0x2D,0x09,0x03,0x0D,0xAC,0xCC,0xAB,0xFA,0x5D,0xF6,0x55, + 0xAA,0xA3,0xA4,0x59,0x7C,0x78,0x78,0x70,0xA5,0x59,0x02,0x41,0x78,0xFA,0xFA,0x6A, + 0x02,0x41,0xC2,0x30,0x7A,0x5A,0x5A,0x78,0xC2,0x30,0x82,0x28,0xAB,0xAF,0x02,0x08, + 0xE2,0x30,0xA2,0x28,0xD5,0xB5,0xAA,0xA8,0x44,0x41,0xA2,0x28,0xDD,0xFD,0xAF,0x03, + 0x23,0x41,0xA1,0x30,0xD7,0xEF,0x2A,0x00,0x24,0x41,0xE3,0x38,0xAF,0x0A,0x00,0x22, + 0x24,0x41,0xE3,0x38,0x0B,0x0A,0x02,0x80,0x44,0x41,0xE3,0x38,0xBA,0x60,0x5F,0xD7, + 0x64,0x49,0x24,0x41,0x66,0xCB,0x41,0x4D,0x44,0x41,0xC3,0x38,0x77,0x77,0xBF,0xA0, + 0x23,0x41,0xA2,0x30,0xB5,0xBF,0xAA,0x00,0x65,0x49,0xE3,0x38,0xAF,0x0A,0x2D,0xB5, + 0x23,0x41,0xE3,0x38,0xA8,0xA8,0xCC,0x72,0x24,0x41,0xE3,0x38,0xFF,0x2F,0x2F,0x3D, + 0x24,0x41,0xE3,0x38,0x8B,0xF7,0xBA,0xE0,0x64,0x49,0x03,0x41,0x5D,0xFD,0xBD,0x03, + 0x65,0x51,0x03,0x41,0xDF,0xE9,0xEF,0xE8,0x44,0x49,0xE3,0x40,0x27,0xEF,0xAB,0x2E, + 0x23,0x49,0xE3,0x40,0x80,0xE2,0x50,0xF8,0x85,0x51,0xE2,0x40,0xA7,0xB7,0xBD,0xB5, + 0xA5,0x59,0x44,0x49,0x02,0xAA,0xEA,0x7A,0xA5,0x59,0x03,0x41,0xA2,0xEA,0x77,0xD5, + 0xA5,0x59,0x03,0x39,0x82,0xAE,0xFF,0xD5,0x64,0x49,0x03,0x41,0x2A,0x2C,0x36,0x9D, + 0x64,0x49,0x24,0x41,0x2E,0xB7,0xDB,0xE8,0x85,0x49,0x23,0x41,0x02,0xAE,0xBF,0x77, + 0x64,0x49,0x03,0x41,0xE8,0xE8,0xDF,0x7F,0x84,0x51,0x23,0x41,0x25,0x25,0xBD,0x29, + 0x47,0x72,0xA4,0x51,0xAD,0xA5,0xAF,0x2D,0x87,0x7A,0xC6,0x61,0x0B,0xB5,0xBF,0xBA, + 0xE8,0x82,0x67,0x7A,0x22,0x8A,0xA9,0xA9,0xD3,0xDD,0x09,0x8B,0x09,0x0D,0x2D,0x35, + 0x55,0xEE,0xF4,0xE5,0x2D,0x0D,0xA2,0xFF,0x35,0xEE,0x92,0xD5,0x00,0xE0,0x78,0x7F, + 0x92,0xD5,0xF0,0xC4,0xDC,0xFE,0xF7,0xFF,0xD3,0xDD,0x10,0xC5,0x35,0xBD,0xBF,0xBD, + 0x76,0xEE,0xD4,0xDD,0x22,0x23,0x0B,0x09,0xB7,0xF6,0x76,0xEE,0xB5,0xAF,0xBF,0xAB, + 0x96,0xEE,0x76,0xEE,0x7C,0x58,0x5C,0x7E,0x75,0xEE,0x55,0xE6,0xBE,0xF0,0xFB,0xFE, + 0x75,0xEE,0x55,0xE6,0xFC,0x5F,0xFD,0x57,0x75,0xEE,0x34,0xE6,0x0F,0xAE,0xAE,0xFA, + 0x76,0xEE,0x55,0xE6,0x7E,0x5A,0xFF,0xEB,0x76,0xEE,0x55,0xE6,0x77,0x7F,0x5D,0x08, + 0x76,0xEE,0x14,0xE6,0x57,0xBE,0xAE,0x00,0x56,0xEE,0xB3,0xD5,0x57,0xBA,0x80,0x00, + 0x63,0x59,0x23,0x51,0xE2,0x3B,0x3A,0x3C,0x84,0x61,0x43,0x59,0xBE,0xDB,0xE8,0x6A, + 0x84,0x59,0x43,0x59,0xFA,0xEA,0x0A,0x83,0x84,0x61,0x22,0x51,0xE0,0x7A,0xDE,0xBB, + 0x43,0x51,0x22,0x51,0x4B,0x8C,0x6C,0x1A,0x64,0x59,0x02,0x49,0xFF,0x97,0xAF,0xA2, + 0x84,0x61,0x23,0x51,0xAD,0xB7,0x27,0x2B,0x26,0x72,0x84,0x59,0x0A,0xD5,0x55,0x55, + 0x66,0x7A,0x84,0x61,0x00,0x0B,0xD5,0x55,0x67,0x7A,0x84,0x61,0x00,0x00,0x02,0xB5, + 0xA7,0x82,0x47,0x7A,0xAA,0x2A,0xBB,0xBD,0xA7,0x82,0x67,0x7A,0xEB,0xAF,0xB7,0xBB, + 0xA7,0x82,0x87,0x7A,0xFA,0xF3,0x1F,0xF5,0xAB,0xA3,0x87,0x82,0xD5,0x95,0x3D,0x2D, + 0xEC,0xAB,0x8A,0x9B,0xA9,0xE3,0xFA,0xFA,0xCB,0xA3,0xAB,0xA3,0x0D,0xFA,0xFD,0xFD, + 0xAB,0xA3,0x05,0x6A,0x70,0x78,0x70,0xE0,0xC5,0x59,0xE2,0x40,0xFE,0xDE,0x78,0x78, + 0x44,0x41,0xC2,0x38,0x5A,0x72,0xFB,0x5F,0xE3,0x38,0xA2,0x30,0xEF,0xCD,0xFD,0xAA, + 0x03,0x39,0xA2,0x30,0xAF,0xAF,0x25,0x0E,0x64,0x49,0x03,0x41,0xA7,0xAF,0x8B,0x0B, + 0x65,0x49,0x03,0x41,0xFE,0x7A,0xAA,0x2A,0x65,0x49,0x03,0x41,0xFF,0xFB,0xF8,0xDC, + 0x24,0x41,0xE3,0x38,0x40,0xF7,0x9C,0xA0,0x85,0x51,0xE3,0x38,0xDD,0xAD,0xC2,0x02, + 0x85,0x51,0x03,0x41,0xE7,0xB7,0xFF,0x2F,0x85,0x51,0x24,0x49,0xFB,0x7B,0xC2,0x00, + 0x84,0x51,0x24,0x49,0x7E,0xA9,0x2D,0x2E,0x65,0x49,0xE3,0x38,0xB5,0xB7,0xFE,0x5C, + 0x23,0x41,0xE3,0x38,0xE0,0xE0,0xFB,0xDD,0x24,0x41,0xE3,0x38,0x2F,0x26,0xEF,0xFE, + 0x24,0x41,0xE3,0x38,0xF8,0x9E,0xFA,0xFA,0xA5,0x51,0x03,0x41,0x29,0x09,0x0D,0x2D, + 0x85,0x51,0xE2,0x38,0x78,0xFA,0xF8,0xFA,0x65,0x51,0xE3,0x38,0xAF,0x0F,0xBF,0xFD, + 0x85,0x59,0x03,0x41,0x7E,0xFE,0xBF,0x2B,0x64,0x49,0x03,0x41,0x2D,0x2E,0x30,0x2C, + 0x85,0x51,0x23,0x41,0x58,0x7A,0xE2,0xF3,0x44,0x49,0x03,0x41,0xE2,0x00,0x37,0x1B, + 0x43,0x41,0xE3,0x38,0xFA,0xFB,0xEA,0xEE,0x23,0x41,0xC2,0x38,0x2A,0xBF,0x29,0x2B, + 0x64,0x49,0x23,0x41,0xA2,0xEB,0xD5,0x5D,0x44,0x49,0xE2,0x38,0x28,0xFA,0xDF,0xDF, + 0x44,0x41,0x03,0x41,0xAE,0x1F,0x2B,0xAF,0xA5,0x51,0x44,0x49,0x3D,0x0B,0x2F,0xED, + 0x47,0x6A,0xA5,0x59,0x2B,0x2D,0x95,0xFD,0xC8,0x82,0x06,0x62,0xFF,0xAA,0x03,0xA5, + 0xC8,0x82,0x67,0x7A,0x27,0x3F,0x96,0x5F,0x4D,0xAC,0xE8,0x82,0x35,0xB5,0xD5,0x55, + 0xF4,0xE5,0x8B,0x9B,0x00,0x03,0x0B,0x09,0x15,0xE6,0x10,0xC5,0xE8,0x60,0x70,0x78, + 0x31,0xCD,0xF0,0xC4,0xAA,0xBF,0x95,0x95,0x51,0xCD,0x10,0xC5,0x0A,0x2A,0x3F,0x3F, + 0x96,0xF6,0x72,0xCD,0x2B,0x0D,0x2D,0x25,0xB6,0xF6,0x76,0xEE,0xAB,0xEF,0x02,0xFA, + 0xB7,0xF6,0x55,0xE6,0xEB,0xBA,0x80,0x7F,0xB7,0xF6,0x35,0xE6,0xFB,0x8A,0xAA,0x55, + 0xB6,0xF6,0x14,0xDE,0xAE,0x08,0xAA,0x55,0x96,0xEE,0x92,0xCD,0x00,0x00,0xA0,0x5F, + 0x76,0xEE,0xF0,0xBC,0x00,0x00,0xAA,0x5F,0x96,0xF6,0xD0,0xBC,0x00,0x88,0xFE,0x55, + 0x76,0xEE,0x8F,0xAC,0x00,0xAA,0xFF,0xF5,0x36,0xE6,0x32,0xC5,0xE8,0xFF,0xFF,0x7F, + 0x84,0x59,0x23,0x59,0xB7,0xBF,0x2B,0x8B,0x84,0x59,0x44,0x59,0xF6,0xAA,0xA8,0xC2, + 0x84,0x59,0x23,0x51,0x6A,0xF8,0xAB,0xFF,0x84,0x59,0x23,0x51,0xF1,0xFD,0x7F,0xAF, + 0x63,0x59,0x23,0x51,0x6A,0x72,0xDF,0x77,0x84,0x61,0x23,0x51,0x7D,0xF5,0x2D,0xAF, + 0x84,0x61,0x43,0x59,0xA9,0x8A,0x88,0x08,0xA4,0x61,0x63,0x59,0xFE,0xBA,0x2F,0xAF, + 0xA4,0x61,0x43,0x59,0xEA,0x7C,0xFE,0xFF,0x64,0x59,0x43,0x59,0x1E,0x58,0x7E,0x57, + 0x47,0x7A,0x23,0x51,0x2B,0xF5,0xDD,0x55,0x67,0x7A,0x23,0x51,0x00,0x0A,0xF5,0x55, + 0x87,0x7A,0x23,0x51,0x00,0x00,0x0A,0x35,0xEB,0xAB,0xC8,0x82,0x2D,0x09,0x83,0xA2, + 0xCB,0xA3,0x6A,0x9B,0xA8,0xDF,0x5F,0xDD,0xAB,0xA3,0x6A,0x9B,0x2A,0xEB,0xED,0xA9, + 0xAB,0xA3,0x46,0x72,0x60,0x7A,0x6A,0xF0,0x66,0x7A,0x23,0x49,0x7E,0x7A,0x7A,0xF8, + 0x23,0x49,0xC2,0x38,0x57,0x57,0x7C,0xD8,0x04,0x41,0xC2,0x38,0xAD,0x2D,0xBD,0x9F, + 0x64,0x49,0xE3,0x38,0xF5,0xFF,0xEE,0xCA,0x84,0x49,0xE2,0x38,0x2D,0xAF,0xBF,0xF7, + 0x64,0x49,0x03,0x41,0xB0,0x58,0xDE,0x5E,0x44,0x49,0x03,0x39,0xD6,0x7F,0x7A,0xA2, + 0x44,0x41,0xE2,0x40,0xDE,0xBE,0x8A,0xF2,0xA6,0x51,0x43,0x49,0xAB,0xEA,0xE3,0x79, + 0xC6,0x59,0x44,0x49,0xF5,0xAD,0xED,0x8D,0xA5,0x59,0x44,0x51,0x3E,0x1F,0x15,0xF7, + 0x06,0x6A,0x85,0x51,0x57,0x7A,0xC0,0x83,0xA5,0x51,0xE2,0x38,0x5C,0x5A,0x7A,0x68, + 0x03,0x39,0xA2,0x30,0xBF,0xAD,0x2B,0x2B,0x23,0x41,0xE3,0x38,0xDE,0x7D,0xAA,0x82, + 0x23,0x41,0xE2,0x38,0xE7,0x3B,0xBB,0xA8,0x64,0x51,0x03,0x41,0x29,0x8F,0xD7,0xDD, + 0x64,0x51,0x03,0x41,0x70,0xBA,0xEA,0xAB,0x64,0x49,0x03,0x49,0xDD,0x2E,0x3E,0x32, + 0xA6,0x59,0x43,0x49,0xAF,0x8F,0xFB,0x57,0x84,0x49,0x23,0x41,0x97,0xFE,0xFB,0xAA, + 0x64,0x49,0xE3,0x38,0xEE,0xEC,0x7A,0x5A,0x23,0x41,0xC2,0x30,0x80,0x8A,0x26,0x2A, + 0x64,0x49,0xE2,0x38,0x77,0xFD,0x0E,0x2A,0x64,0x49,0xE3,0x38,0x25,0xBD,0xAE,0xE0, + 0x64,0x41,0x03,0x41,0xAA,0xA8,0xFE,0x67,0x64,0x49,0x03,0x39,0xD5,0xB7,0x2B,0x2E, + 0x64,0x49,0x23,0x41,0xFD,0x7F,0x57,0x58,0x64,0x49,0x03,0x41,0xBE,0xEA,0xC0,0x81, + 0xE6,0x61,0x44,0x49,0x2B,0xAD,0x25,0xF5,0x66,0x72,0xC5,0x59,0x0F,0xAD,0xAF,0xAB, + 0x67,0x72,0xE5,0x69,0xE8,0xEA,0xFA,0xE2,0xC8,0x82,0x26,0x6A,0x03,0x0D,0xED,0xB5, + 0x72,0xD5,0xC8,0x82,0x0D,0x2D,0x35,0xB5,0xD3,0xDD,0xF0,0xC4,0x70,0x58,0x78,0x5E, + 0x10,0xC5,0xD0,0xBC,0x2E,0x2F,0xBF,0x15,0x51,0xCD,0x10,0xC5,0xBB,0xBF,0xED,0xFD, + 0x14,0xE6,0x31,0xCD,0x3D,0x35,0xB5,0xD5,0xF4,0xDD,0xAF,0xBC,0x00,0xFE,0x5E,0x56, + 0xB3,0xD5,0x8F,0xB4,0x00,0xFF,0x75,0x55,0x72,0xCD,0x2D,0xAC,0x00,0xEA,0x77,0x57, + 0x52,0xCD,0x2D,0xA4,0x00,0xFF,0x5F,0x55,0x11,0xC5,0x2E,0xA4,0xA0,0xFE,0x55,0x3D, + 0x32,0xC5,0x4E,0xAC,0x7E,0x55,0xB5,0x00,0xB3,0xD5,0x8F,0xAC,0xB5,0x0D,0x0A,0x22, + 0xB4,0xD5,0x11,0xBD,0xBD,0xE8,0xF8,0x5A,0x72,0xC5,0x6F,0xAC,0xA8,0xEA,0x5A,0x7E, + 0x84,0x59,0x43,0x51,0x2E,0xCE,0x77,0x6F,0x64,0x59,0x23,0x51,0xA0,0x7A,0x77,0x5F, + 0x63,0x59,0x23,0x51,0xBE,0x8F,0xEF,0xF5,0x22,0x59,0x63,0x51,0xFF,0xEF,0xBB,0xAB, + 0x63,0x59,0x23,0x51,0xFB,0xAF,0x07,0x0F,0x84,0x61,0x43,0x59,0x39,0xDF,0xBE,0xFF, + 0x84,0x61,0x63,0x59,0x0A,0xAA,0x9F,0xC7,0xA4,0x61,0x43,0x59,0x6A,0x6C,0x5F,0xD7, + 0x63,0x59,0x23,0x51,0x08,0xAB,0xF8,0xFA,0x43,0x59,0x23,0x51,0x0A,0x8A,0x80,0x5C, + 0x23,0x59,0x02,0x49,0xD8,0xFA,0xBE,0xE7,0x23,0x51,0x03,0x49,0xC0,0xC8,0x88,0x8A, + 0xAB,0xA3,0x43,0x59,0x95,0x35,0x25,0x09,0xCB,0xA3,0x4A,0x9B,0xC2,0xF0,0x58,0x7E, + 0x8B,0x9B,0x49,0x93,0x28,0x02,0x0B,0xEF,0xAC,0xA3,0x6A,0x9B,0x0E,0xAF,0xFF,0xD5, + 0xCC,0xAB,0xC7,0x82,0x78,0x52,0x5A,0x5E,0xA7,0x7A,0x64,0x51,0x7E,0x58,0x78,0x60, + 0x44,0x49,0x03,0x41,0x58,0xA0,0x28,0xBE,0x23,0x41,0xE3,0x38,0x57,0xDC,0x9E,0xF8, + 0x84,0x51,0x23,0x41,0x89,0xAB,0x8B,0x8B,0x44,0x49,0xE2,0x38,0xFE,0x58,0xF8,0xBA, + 0x44,0x49,0x03,0x41,0x72,0xE3,0x7B,0x58,0x65,0x49,0xE3,0x38,0xE2,0xDA,0xFF,0x7A, + 0x23,0x41,0x02,0x41,0xE0,0xA0,0xDE,0x09,0xE3,0x40,0x23,0x39,0xB7,0x0B,0xAA,0xAD, + 0xC6,0x61,0x03,0x41,0x0D,0x8D,0x2D,0x09,0xA5,0x59,0x03,0x49,0xE8,0xFE,0xF6,0x56, + 0xC6,0x61,0x23,0x49,0x0B,0x3F,0xDF,0xDD,0x85,0x51,0xC2,0x38,0x78,0x70,0x60,0x60, + 0x03,0x39,0xA2,0x30,0x2F,0x2D,0xBF,0x97,0x23,0x41,0xE3,0x38,0x22,0x2B,0xFF,0x57, + 0x64,0x49,0x04,0x41,0xFA,0xAA,0x89,0xAB,0x85,0x51,0x23,0x49,0x57,0xE7,0x2B,0x0A, + 0xA5,0x59,0x44,0x49,0xED,0x82,0x88,0x8B,0x85,0x51,0x03,0x41,0xFA,0x58,0xFE,0xDC, + 0x43,0x49,0xE2,0x38,0xE0,0xEA,0xEA,0xF8,0x64,0x49,0x02,0x39,0x0B,0xAD,0xFD,0xF5, + 0x23,0x41,0x03,0x39,0x60,0xC0,0xF0,0xAA,0x24,0x41,0xE3,0x38,0x2B,0xF8,0x76,0x76, + 0x65,0x49,0xE2,0x38,0x0A,0x2B,0xAF,0xBD,0xA5,0x51,0x23,0x41,0x7A,0xE2,0xEF,0x7F, + 0x44,0x41,0x03,0x39,0xDF,0x57,0xA8,0xEA,0x85,0x49,0x03,0x39,0x2B,0x29,0xAD,0xF7, + 0x64,0x49,0x24,0x41,0x00,0x20,0x94,0xAF,0xA6,0x59,0x23,0x41,0xDD,0x7A,0xEA,0x2F, + 0x84,0x51,0x44,0x49,0xEF,0xF5,0xA7,0xF8,0x67,0x72,0x84,0x51,0x2D,0xB5,0x55,0x55, + 0xA8,0x7A,0xA5,0x59,0xA0,0xAA,0xAD,0xB5,0xC9,0x82,0x26,0x6A,0xAD,0xAB,0x0F,0xB5, + 0xEC,0xA3,0xC8,0x82,0x15,0xB5,0x95,0xD5,0xB3,0xDD,0x8F,0xB4,0xFA,0xF3,0xE2,0xE9, + 0xF0,0xC4,0xAF,0xBC,0x2E,0x2F,0xAF,0x95,0x31,0xCD,0xF0,0xC4,0xA9,0x0B,0x29,0xF5, + 0x51,0xCD,0xF0,0xBC,0x3A,0xAB,0x6A,0x7F,0x71,0xD5,0x2D,0xAC,0xF8,0x5E,0x5F,0x57, + 0xCF,0xBC,0x2D,0xA4,0xFF,0x5F,0xF5,0x25,0x93,0xCD,0x2D,0xA4,0x55,0x55,0xBF,0x02, + 0xB3,0xD5,0x0D,0xA4,0xD5,0x2F,0x02,0x00,0xB4,0xD5,0x11,0xBD,0xA9,0xEC,0xFC,0x5C, + 0x73,0xCD,0xF0,0xB4,0xA0,0x3E,0x3F,0x35,0x93,0xCD,0xF1,0xBC,0x60,0x60,0xE0,0x78, + 0x32,0xBD,0xB0,0xB4,0xB0,0xA5,0xA7,0x67,0xF1,0xBC,0x8F,0xAC,0x5A,0x5C,0xD7,0xF5, + 0x64,0x51,0x23,0x51,0xF0,0x96,0xFF,0xF5,0x43,0x51,0x23,0x51,0x3C,0x84,0x77,0xBB, + 0x64,0x59,0x23,0x51,0xB7,0xED,0xCE,0xAB,0x63,0x59,0x23,0x51,0xFF,0xAE,0x2E,0x8E, + 0x84,0x61,0x43,0x59,0xCB,0xEA,0x8E,0xFF,0x84,0x61,0x43,0x59,0x2B,0xAD,0xF6,0x7F, + 0x84,0x59,0x23,0x51,0xB8,0xFA,0xEE,0x7F,0x63,0x59,0x23,0x51,0xA8,0xBA,0xEA,0xE9, + 0x63,0x59,0x23,0x51,0xCF,0xE5,0xFF,0x77,0x23,0x51,0x03,0x49,0x6C,0xD8,0xCE,0x0F, + 0x23,0x51,0x03,0x49,0x4D,0x72,0xFF,0xEB,0xE8,0x8A,0x02,0x51,0x55,0xD5,0xB5,0x35, + 0xAB,0xA3,0x26,0x72,0x09,0x03,0x02,0x00,0x8B,0xA3,0x29,0x93,0xA0,0xE0,0xEA,0xDE, + 0x8A,0x9B,0x09,0x93,0xF8,0xFE,0xDB,0x7F,0x8B,0x9B,0x29,0x93,0xAB,0xAF,0xAD,0x2D, + 0x6A,0x9B,0x87,0x7A,0x78,0xD8,0x78,0x5C,0xE8,0x82,0x06,0x6A,0x62,0xE2,0xEA,0xAA, + 0x88,0x7A,0x23,0x49,0x55,0x57,0x5E,0x78,0x64,0x49,0xE3,0x40,0xFB,0x8B,0x2D,0xBF, + 0x64,0x49,0x03,0x41,0xAF,0x9E,0xD6,0x5C,0x23,0x41,0xE3,0x38,0xBC,0xDC,0x5F,0x57, + 0x44,0x49,0x03,0x41,0x82,0x09,0x0D,0x27,0x44,0x49,0xE3,0x38,0x7A,0x78,0x7B,0x7A, + 0x23,0x41,0xE3,0x38,0xA9,0xBD,0xFD,0xF5,0x24,0x41,0xE2,0x38,0x9A,0x2F,0x0E,0xAA, + 0xE7,0x61,0x44,0x49,0x2D,0xAD,0xF5,0x55,0xC6,0x61,0x24,0x49,0x5C,0xF8,0x2F,0xB7, + 0xA6,0x59,0x44,0x49,0xD5,0xB7,0x96,0xB0,0x85,0x51,0xE3,0x38,0x7A,0x78,0x58,0x58, + 0x04,0x39,0xA2,0x30,0xDF,0xD5,0xFD,0x35,0x24,0x41,0xC2,0x30,0xD7,0x9D,0xAA,0xB2, + 0x85,0x51,0x23,0x41,0xED,0xF9,0xEB,0x82,0x85,0x59,0x44,0x51,0x09,0xED,0xCB,0x0A, + 0x85,0x59,0x03,0x49,0xA2,0x8A,0x57,0xD6,0x64,0x51,0xE3,0x38,0xF8,0xEE,0x7E,0x7E, + 0x23,0x41,0xC3,0x38,0x88,0xBE,0xBF,0xED,0x65,0x49,0xE2,0x38,0xFD,0xFD,0xEF,0x8A, + 0x85,0x49,0x02,0x39,0xD5,0x7F,0xCB,0xEF,0x23,0x41,0xE2,0x38,0xEA,0x80,0xBE,0xFB, + 0x43,0x41,0x03,0x39,0x35,0x95,0xD5,0xDF,0x43,0x41,0xE2,0x38,0xC8,0xE0,0xF2,0x6E, + 0x23,0x39,0xE2,0x38,0xBF,0x6D,0xAF,0xAD,0x23,0x41,0xE2,0x30,0x08,0x0A,0xA3,0xAD, + 0x64,0x49,0x03,0x39,0x2F,0xD7,0xD5,0xFE,0x85,0x51,0x23,0x49,0xBE,0xEA,0x8F,0x2F, + 0x85,0x51,0x44,0x49,0x02,0x2E,0x1F,0x5E,0x47,0x6A,0x84,0x51,0x55,0xBF,0x3D,0xF5, + 0x67,0x72,0xC5,0x61,0x75,0x97,0x58,0xA3,0xA8,0x82,0x06,0x62,0x95,0xD5,0x37,0x3D, + 0xC9,0x82,0x46,0x72,0x22,0xBF,0xDE,0xE0,0x31,0xCD,0xC9,0x82,0x03,0x09,0x0D,0x25, + 0xF0,0xC4,0x6E,0xB4,0xAE,0xFC,0x58,0x70,0xF0,0xC4,0x8F,0xB4,0x2A,0xAB,0xED,0x55, + 0x10,0xC5,0x6E,0xB4,0xE8,0x7A,0xB7,0x25,0x31,0xCD,0x2E,0xAC,0x55,0xFD,0x2A,0x00, + 0xB3,0xD5,0x4E,0xAC,0xB5,0xAF,0x0A,0x0A,0xD4,0xD5,0x11,0xBD,0x2B,0xBF,0xDF,0x7E, + 0xD5,0xD5,0x32,0xC5,0xB0,0xEA,0x2F,0xF5,0x73,0xCD,0xD0,0xB4,0x58,0x5C,0x5C,0x40, + 0x73,0xC5,0x8F,0xAC,0x25,0x35,0xA5,0xE5,0x73,0xC5,0x0D,0x9C,0xE0,0xFA,0xFF,0x95, + 0xD0,0xB4,0xB0,0xAC,0xC3,0x43,0xE2,0x7B,0xF1,0xB4,0x8F,0xAC,0x95,0x2D,0x3F,0xA7, + 0x43,0x51,0x02,0x49,0xEF,0xF6,0x88,0xE0,0x64,0x59,0x23,0x51,0xED,0xAB,0xAB,0xFF, + 0x84,0x59,0x23,0x51,0x97,0xAF,0x8E,0xEF,0x64,0x59,0x43,0x59,0xC2,0x72,0x5D,0x30, + 0xA4,0x61,0x43,0x59,0xBF,0xF9,0xEB,0xCB,0x64,0x61,0x43,0x51,0xE0,0x5E,0xE7,0xF6, + 0x43,0x59,0x64,0x51,0x00,0x20,0xA8,0xC0,0x64,0x59,0x23,0x51,0xE9,0xE7,0xFC,0xFC, + 0x44,0x59,0x03,0x49,0xC2,0xFA,0x6E,0x7F,0x23,0x51,0x03,0x49,0xBF,0x5E,0x68,0xA8, + 0x44,0x59,0x03,0x49,0xFD,0xBF,0x3D,0x3F,0x8B,0xA3,0x43,0x59,0x25,0x2D,0x0B,0x03, + 0xCC,0xA3,0x4A,0x9B,0xF0,0x7C,0x7A,0x82,0x8A,0x9B,0x29,0x93,0x7F,0x5E,0xFF,0x70, + 0x4A,0x93,0x09,0x93,0x0F,0x0B,0xFE,0xA0,0x6B,0x9B,0x29,0x93,0x09,0x2F,0xD7,0xDD, + 0x4A,0x93,0x87,0x7A,0x7C,0x7C,0x58,0x58,0xA8,0x7A,0x27,0x72,0x88,0xAA,0xF8,0x6F, + 0x67,0x72,0x85,0x59,0x78,0xE0,0xA0,0xA0,0xE6,0x61,0x03,0x49,0xD5,0x77,0x78,0xE0, + 0x64,0x51,0xE2,0x38,0x70,0x7A,0xEF,0xD7,0x03,0x39,0xC2,0x38,0x8B,0xBA,0xFF,0x5E, + 0x85,0x51,0xE2,0x38,0xBF,0x2D,0x3D,0x95,0x85,0x51,0xE2,0x38,0x7A,0x78,0x78,0x5A, + 0x24,0x41,0xE3,0x38,0xA5,0xF6,0x76,0xF0,0x24,0x41,0xE3,0x38,0xAA,0xAE,0xED,0x27, + 0x65,0x51,0x03,0x41,0xBF,0xAD,0xCD,0x8F,0xA6,0x59,0x23,0x49,0xAF,0xAB,0x0B,0xA5, + 0xC6,0x59,0x65,0x51,0xB8,0xAE,0x6F,0xBF,0x65,0x51,0xC2,0x38,0x70,0x70,0x5A,0x56, + 0x03,0x39,0xA2,0x30,0x27,0xBF,0xD7,0xF5,0x03,0x39,0xA2,0x30,0x00,0x00,0xBF,0xF7, + 0xC6,0x61,0x23,0x41,0x89,0x09,0x0D,0xA5,0xE6,0x61,0x85,0x59,0xD7,0x78,0x70,0x49, + 0x85,0x51,0x03,0x41,0xDC,0x5C,0x5E,0xFE,0x24,0x41,0xE3,0x38,0x78,0x78,0x7B,0x76, + 0x24,0x41,0xE3,0x38,0xA9,0x3B,0xDD,0x57,0x64,0x49,0x23,0x41,0xBB,0x29,0xC3,0x81, + 0x64,0x49,0x03,0x41,0xEF,0xFA,0xF2,0xF7,0x23,0x41,0xE2,0x38,0x5F,0x5B,0x58,0xEC, + 0x44,0x41,0xE2,0x38,0xF3,0xF5,0xF5,0x95,0x24,0x41,0x03,0x39,0x76,0x8D,0xBE,0xB9, + 0x44,0x39,0xE2,0x38,0xFD,0xFF,0xD6,0x7E,0x23,0x39,0xE2,0x38,0xF7,0x9F,0x93,0xBB, + 0x64,0x49,0x03,0x39,0xE3,0xA9,0x2D,0xBF,0x64,0x49,0x23,0x41,0xAE,0x0B,0x0F,0xAB, + 0x64,0x49,0x23,0x49,0xBE,0xDF,0xDF,0xF8,0xC5,0x61,0x44,0x49,0x2D,0xBD,0xF5,0xAD, + 0x26,0x6A,0x64,0x51,0x0A,0x2D,0xB7,0x77,0x88,0x7A,0xC5,0x61,0x3F,0xAB,0xBF,0xD5, + 0x09,0x8B,0x68,0x7A,0xE0,0x8A,0x03,0x0D,0x11,0xC5,0xE9,0x82,0x35,0x35,0x15,0x95, + 0x35,0xEE,0x6F,0xB4,0x7F,0xFE,0xAA,0x02,0x35,0xE6,0x6E,0xB4,0x55,0xFF,0x02,0x00, + 0xF4,0xDD,0x6E,0xB4,0xB5,0xB7,0x00,0x00,0x14,0xE6,0x52,0xCD,0xF5,0xEB,0x5A,0x60, + 0xB3,0xD5,0x52,0xC5,0x27,0xCF,0xA9,0x2B,0xB4,0xCD,0x32,0xC5,0x78,0x7A,0x7B,0x6E, + 0x52,0xC5,0xF1,0xBC,0xAB,0xBA,0x7C,0x7A,0x93,0xCD,0xF1,0xBC,0x02,0x2A,0xAD,0xF5, + 0x73,0xCD,0x0E,0x9C,0xE8,0x60,0x78,0x7A,0xB0,0xB4,0xCC,0x93,0x25,0x0D,0x0B,0x03, + 0xD0,0xB4,0x90,0xAC,0xEC,0x7E,0x7E,0xDE,0xD0,0xB4,0x90,0xAC,0xA9,0x29,0xF7,0xD7, + 0x84,0x59,0x43,0x51,0x77,0xB5,0xEB,0xFA,0x64,0x59,0x23,0x51,0xF6,0xBC,0xFA,0xB8, + 0x64,0x59,0x43,0x59,0x55,0xDF,0x0A,0x11,0x84,0x61,0x43,0x59,0x2F,0x83,0xE8,0xF0, + 0x84,0x61,0x43,0x59,0xE2,0xF2,0xDC,0xD5,0x64,0x59,0x23,0x51,0xEA,0xFA,0xAB,0xAA, + 0x64,0x59,0x23,0x51,0xFA,0x7F,0x7F,0x6F,0x44,0x59,0xE2,0x48,0x88,0xE2,0xEE,0x8A, + 0x23,0x51,0xE2,0x48,0xEA,0xEA,0x7E,0xFC,0x23,0x51,0xE2,0x48,0xCE,0x2E,0xA8,0x9A, + 0xE9,0x8A,0x23,0x51,0xD5,0x95,0x35,0x25,0xCC,0xA3,0xC9,0x8A,0xA9,0x2A,0x2A,0x02, + 0xEC,0xAB,0x8B,0xA3,0xA3,0x0A,0xAA,0xFC,0xAB,0xA3,0x4A,0x93,0x78,0x68,0xE0,0xAA, + 0x8B,0x9B,0x29,0x93,0x5D,0x7F,0xFE,0x2A,0x6A,0x9B,0x2A,0x93,0x9F,0x2A,0xAA,0xF0, + 0x2A,0x93,0x47,0x72,0x78,0x78,0x78,0x78,0x67,0x72,0x26,0x72,0x60,0xF2,0xA2,0xFE, + 0x47,0x72,0x06,0x6A,0xBC,0xFE,0x8E,0x4C,0x26,0x6A,0xA5,0x59,0x70,0x88,0x20,0x20, + 0xE6,0x61,0xE3,0x40,0x57,0xDE,0x78,0xE0,0x23,0x41,0xC2,0x38,0x7F,0x5E,0x58,0xFA, + 0x24,0x41,0xE2,0x38,0xB5,0xB5,0x3D,0x2D,0x44,0x41,0xE3,0x38,0x7A,0xDE,0xF6,0x78, + 0x24,0x41,0xC2,0x38,0x8A,0xAB,0xBE,0xDF,0x24,0x41,0xE2,0x38,0xFF,0xAF,0xAB,0x09, + 0x44,0x49,0xE3,0x38,0xAE,0xBD,0xEA,0xAA,0xA6,0x59,0x03,0x41,0xB7,0xBD,0xA7,0x2D, + 0xA6,0x59,0x44,0x49,0xFA,0x72,0x7A,0x58,0x44,0x49,0xA2,0x30,0x5C,0xF8,0xFA,0xFB, + 0x03,0x39,0xA2,0x30,0xBF,0x0D,0x07,0x37,0x03,0x39,0xC3,0x30,0xD5,0xBE,0x2F,0x3A, + 0x85,0x51,0xE3,0x38,0x2D,0xB5,0xBF,0xAF,0xE6,0x61,0x44,0x49,0x0B,0x2F,0xD7,0x5D, + 0xA6,0x59,0x04,0x41,0x7A,0xF8,0x7E,0x5F,0x04,0x41,0xE3,0x38,0xE8,0x60,0x6B,0x49, + 0x23,0x39,0xC3,0x38,0xFF,0xBF,0xED,0xD3,0x64,0x49,0xE3,0x38,0xE2,0xAB,0xE9,0xAD, + 0x44,0x41,0x03,0x41,0x25,0x2E,0x2B,0x7E,0x64,0x49,0xC2,0x30,0xA8,0xF8,0xFA,0x7A, + 0x03,0x39,0xE2,0x30,0x96,0xE2,0x58,0x7D,0x23,0x39,0xE3,0x38,0xCB,0xED,0x75,0xD5, + 0x03,0x39,0xE3,0x30,0xC0,0xB7,0x75,0x3E,0x23,0x41,0xE3,0x38,0x89,0x09,0xAD,0xBE, + 0xA6,0x51,0x24,0x41,0xFD,0xAD,0x0F,0xA9,0xA5,0x51,0x44,0x49,0x75,0xEF,0xB0,0xE8, + 0xE6,0x61,0x44,0x49,0x5D,0xFF,0x2F,0xB5,0xE6,0x61,0x64,0x51,0xBD,0xBF,0xA8,0x00, + 0x07,0x6A,0xA5,0x59,0x7D,0x5D,0xA7,0xAC,0x88,0x7A,0x84,0x59,0xD5,0xFF,0xAB,0x2D, + 0xE8,0x82,0x26,0x6A,0x2D,0xBD,0x35,0xB5,0xAC,0x9B,0xE8,0x82,0x35,0x15,0x95,0x95, + 0x55,0xEE,0x6E,0xB4,0x02,0x03,0x01,0x09,0x76,0xEE,0x35,0xE6,0xEF,0xCA,0xEA,0x7B, + 0x55,0xEE,0xF4,0xDD,0xA8,0xA8,0xE2,0xFF,0x35,0xE6,0x32,0xC5,0x60,0x68,0x78,0xDA, + 0xB3,0xD5,0x52,0xC5,0xAB,0xE9,0xFB,0x68,0x93,0xCD,0x52,0xC5,0xE8,0xB8,0xAB,0x2D, + 0x73,0xCD,0x11,0xBD,0x7E,0xDE,0xFA,0xD8,0x11,0xBD,0x4F,0xA4,0x08,0x80,0xC0,0x60, + 0xB0,0xB4,0xEA,0x7A,0xA0,0xB7,0x37,0xAF,0xB0,0xB4,0x6F,0xAC,0x01,0x8B,0x21,0x29, + 0xD1,0xB4,0x6F,0xAC,0xAB,0x8A,0xCA,0x78,0xD1,0xB4,0x6F,0xAC,0x8A,0xEA,0xFA,0x55, + 0x63,0x59,0x23,0x51,0xBA,0x26,0x17,0x89,0x84,0x59,0x43,0x51,0xFF,0xED,0xFB,0xAE, + 0xA4,0x61,0x64,0x59,0xD7,0xDD,0x19,0xDF,0x84,0x61,0x43,0x59,0xEA,0xF8,0x7C,0x7E, + 0x63,0x59,0x22,0x51,0xAA,0x68,0xEA,0xB6,0x63,0x59,0x22,0x51,0x82,0xAB,0xFB,0xEE, + 0x43,0x59,0x23,0x49,0xA8,0xF8,0xDE,0xD7,0x44,0x59,0x03,0x49,0xE6,0xFE,0xFC,0xB6, + 0x23,0x51,0xE3,0x48,0xAB,0xAF,0xEA,0xAA,0x44,0x59,0xE2,0x48,0xFF,0x57,0x27,0x0E, + 0x6A,0x9B,0x23,0x51,0x25,0x0D,0x0D,0x09,0xCC,0xAB,0x8B,0x9B,0xFF,0x7B,0xAE,0x0B, + 0xCB,0xA3,0x49,0x93,0x5E,0x77,0xF6,0xE0,0x8A,0x9B,0x29,0x93,0x0A,0xAA,0x6A,0x6E, + 0x8B,0xA3,0x09,0x8B,0xA8,0xFE,0x55,0x57,0x6A,0x9B,0xC8,0x8A,0xA0,0xEA,0xFF,0x7F, + 0xE9,0x8A,0x46,0x72,0x78,0x58,0x7C,0x78,0x86,0x72,0x26,0x72,0x57,0xFF,0x7F,0x6F, + 0x26,0x72,0x06,0x6A,0xC0,0xE0,0x1C,0x90,0x47,0x72,0x06,0x6A,0xBD,0x25,0x1F,0x0E, + 0x87,0x7A,0x85,0x51,0x7A,0xC8,0xA2,0x08,0xE6,0x61,0xC3,0x38,0x77,0x7F,0x5E,0x78, + 0x23,0x41,0xC2,0x38,0x2A,0xBF,0xFD,0xA5,0x44,0x49,0xE3,0x38,0x70,0xFB,0xDF,0x7F, + 0x03,0x41,0xC2,0x38,0x9A,0xFA,0x7F,0xAF,0x64,0x49,0xE2,0x38,0xBD,0x3D,0xED,0xBD, + 0x44,0x49,0x03,0x41,0xB8,0xBC,0x5C,0x5C,0xA6,0x59,0x04,0x41,0x2F,0xBF,0xBD,0xF5, + 0xA6,0x59,0x44,0x49,0x70,0xF8,0xE8,0xFD,0x44,0x41,0xA2,0x38,0xFF,0xEE,0xBE,0xF8, + 0xE3,0x38,0xA2,0x30,0x37,0x2A,0x2A,0xAA,0x24,0x41,0xC2,0x30,0xB8,0xB0,0xAA,0xB5, + 0x44,0x49,0xE3,0x38,0x27,0x2F,0x2F,0x3A,0x65,0x51,0x24,0x41,0xFA,0x7A,0xFB,0x7B, + 0x24,0x41,0xE3,0x38,0xC2,0xE3,0xFA,0xD6,0x24,0x41,0xE3,0x38,0xF5,0x7F,0xA7,0x2F, + 0x24,0x41,0xE3,0x38,0xE2,0xEE,0xBE,0xDC,0x44,0x41,0xE3,0x38,0x8D,0x0F,0xAE,0x8D, + 0x44,0x41,0xE2,0x38,0x7A,0xC2,0x60,0xFE,0x03,0x39,0xC2,0x30,0x78,0xF4,0xB7,0xBE, + 0x23,0x39,0xC2,0x30,0xD9,0xBB,0xAB,0xA2,0x24,0x41,0xE3,0x30,0xF5,0xFB,0xEA,0x2B, + 0x23,0x39,0xC2,0x30,0x2F,0xBA,0xFE,0x7E,0x44,0x41,0xC2,0x30,0xFE,0xAA,0xAB,0x25, + 0x64,0x49,0xE3,0x38,0x09,0xA7,0xD5,0xFF,0x84,0x51,0x03,0x41,0x82,0xBD,0x55,0x5D, + 0x85,0x51,0x23,0x41,0x36,0x3F,0x37,0x95,0x47,0x72,0xA5,0x59,0xEF,0xBF,0xA9,0x0D, + 0x47,0x72,0xA5,0x59,0xAB,0x0F,0x37,0xFE,0x67,0x7A,0xE5,0x61,0x3D,0xB5,0x5E,0xD7, + 0x67,0x72,0xE5,0x61,0x2C,0x9E,0xF3,0xAB,0x29,0x8B,0x67,0x72,0x23,0xA9,0xBD,0xBD, + 0x35,0xE6,0x29,0x8B,0x0B,0x09,0x2D,0x2D,0x55,0xEE,0x14,0xE6,0xAA,0xEA,0x7F,0x55, + 0x35,0xE6,0xB3,0xD5,0xE8,0xF8,0x6A,0x7A,0xB3,0xD5,0xF1,0xBC,0xB0,0x3C,0xBE,0xB6, + 0xB4,0xD5,0x52,0xC5,0xE8,0xEA,0xEA,0x5A,0x73,0xCD,0x32,0xC5,0x2F,0xE7,0xEE,0xFF, + 0x52,0xC5,0xD1,0xB4,0xE0,0xA8,0xF8,0x78,0x11,0xBD,0xEE,0x9B,0xE8,0xEA,0x68,0x7A, + 0x6F,0xAC,0xCD,0x93,0x2D,0xAF,0x2F,0x25,0xB0,0xB4,0x4F,0xA4,0x2B,0x8B,0xEA,0x7E, + 0xB0,0xB4,0x2E,0xA4,0xFC,0xFE,0x97,0xBF,0xB0,0xB4,0x4F,0xA4,0x9F,0x3F,0xAA,0x4E, + 0x63,0x59,0x22,0x51,0x0B,0x8A,0xA0,0xC9,0x84,0x59,0x43,0x59,0x9E,0x17,0x6D,0xFD, + 0x83,0x61,0x23,0x51,0xEA,0x7A,0xFF,0x7D,0x63,0x59,0x23,0x51,0x8A,0x2B,0xAE,0xF6, + 0x63,0x59,0x23,0x51,0x3E,0x78,0xEE,0x77,0x43,0x51,0x02,0x49,0xAA,0xBC,0x9A,0x2E, + 0x43,0x51,0x02,0x49,0xAE,0x23,0xA0,0x5E,0x44,0x51,0x03,0x49,0xFA,0xDC,0xD7,0xFB, + 0x44,0x59,0x02,0x49,0xE7,0xB7,0x3F,0x0A,0x64,0x59,0x23,0x51,0xA9,0xAF,0xBE,0xDC, + 0x8B,0x9B,0xE6,0x69,0x0D,0x09,0x09,0x0B,0xEC,0xAB,0x8B,0x9B,0x0B,0x2F,0x89,0x2F, + 0x0D,0xAC,0x8B,0xA3,0x7A,0x7E,0xBA,0x82,0xCC,0xAB,0x49,0x93,0xDF,0x7B,0x58,0x78, + 0x6A,0x93,0xC8,0x82,0xA0,0xFA,0xFE,0x7F,0x29,0x93,0xC8,0x8A,0x78,0x56,0xDD,0xB7, + 0xE9,0x8A,0x66,0x72,0x5C,0x5C,0x58,0x58,0x66,0x72,0x26,0x72,0xEA,0xBA,0xBA,0xFA, + 0x46,0x72,0x06,0x6A,0xFC,0xB8,0x28,0xE2,0x67,0x7A,0x26,0x72,0xD5,0xBD,0xFD,0x2D, + 0xC8,0x82,0x46,0x72,0xA9,0x2B,0x2B,0x8A,0xA7,0x7A,0x03,0x49,0x5E,0x78,0x70,0xE0, + 0xE3,0x38,0xA2,0x30,0x38,0x3A,0xFE,0x60,0x03,0x41,0xA2,0x30,0x82,0xEA,0xFB,0x7D, + 0x24,0x41,0xC2,0x30,0xA5,0x25,0xBD,0xF5,0x24,0x41,0xC3,0x38,0x2E,0xEE,0xFE,0xFE, + 0x44,0x41,0xE3,0x38,0x7C,0xFB,0xAD,0xF5,0x44,0x49,0xE3,0x40,0xDF,0x57,0x7F,0x0A, + 0x65,0x49,0xE3,0x40,0x2F,0xBD,0xFF,0xFA,0x64,0x49,0xC2,0x30,0x78,0x6A,0xFA,0xF2, + 0x03,0x39,0xA2,0x30,0x7D,0x57,0x5C,0xDA,0xE3,0x38,0xA2,0x28,0x2D,0x2D,0x8D,0x0A, + 0xA5,0x51,0x03,0x39,0xF5,0xB5,0xB5,0x35,0x85,0x51,0x23,0x41,0xDF,0x5F,0x7E,0x70, + 0x44,0x49,0xE3,0x38,0x5E,0x7A,0x7A,0x5A,0x24,0x39,0xC2,0x30,0x8E,0xBB,0xFE,0xDF, + 0x03,0x39,0xC2,0x30,0xBA,0x56,0xD5,0xF5,0x23,0x39,0xC2,0x30,0x02,0xEA,0x77,0x77, + 0x03,0x39,0xC2,0x30,0xBC,0xAA,0x7E,0xAB,0x03,0x41,0xE2,0x30,0xFE,0xF5,0x7D,0x5F, + 0x24,0x39,0xC3,0x30,0x0B,0xBA,0xEB,0x7E,0x24,0x39,0xC2,0x30,0x2A,0xAA,0xE2,0xA9, + 0x03,0x39,0xE3,0x30,0xC0,0x08,0x88,0xEE,0x23,0x41,0xC2,0x30,0xB5,0xBF,0x3E,0xBE, + 0x23,0x41,0x03,0x39,0x50,0xB0,0xE3,0x2F,0x23,0x41,0xE3,0x38,0x76,0xE5,0xE7,0xA8, + 0x64,0x49,0x03,0x39,0x2B,0x2B,0x0D,0xB5,0x47,0x72,0x64,0x51,0x27,0xF5,0xF5,0x55, + 0x87,0x7A,0xA5,0x59,0xE8,0x82,0x09,0xB5,0x47,0x72,0xA5,0x59,0xBF,0x2F,0xD4,0x58, + 0x87,0x7A,0x05,0x62,0xAF,0x0A,0x2A,0xA9,0xA8,0x7A,0x67,0x72,0x3F,0xBA,0xE8,0x80, + 0x93,0xD5,0xC9,0x82,0x09,0x0D,0x2D,0x2D,0x14,0xE6,0x72,0xCD,0x88,0xAA,0xFF,0x5D, + 0xF4,0xDD,0x32,0xC5,0xA0,0xE8,0xEA,0x7A,0x93,0xCD,0xF1,0xBC,0x07,0x0F,0x09,0xA9, + 0x73,0xCD,0x11,0xBD,0xA0,0x60,0x40,0xA0,0x73,0xCD,0xD0,0xB4,0x0B,0x2F,0xB5,0xFF, + 0x52,0xC5,0xB0,0xB4,0xE8,0x78,0xDE,0x77,0x90,0xAC,0x2B,0x7B,0xE0,0xF0,0x78,0x58, + 0x70,0xAC,0x8C,0x8B,0x2F,0x2D,0x09,0xAB,0x90,0xAC,0x0E,0x9C,0xF8,0xDF,0xFF,0xA7, + 0x8F,0xAC,0x4F,0xA4,0x0D,0x6D,0xFD,0xD8,0xD0,0xB4,0x0E,0x9C,0xFF,0xBD,0xBD,0x2A, + 0x84,0x59,0x43,0x51,0xD5,0xED,0x2E,0x3A,0x63,0x59,0x22,0x51,0x83,0x42,0x62,0xFE, + 0x43,0x51,0x02,0x49,0xA8,0x2A,0x3A,0xB7,0x43,0x51,0x22,0x51,0x04,0x02,0xC2,0x4C, + 0x43,0x51,0x02,0x49,0xFE,0x7A,0xBA,0xB4,0x44,0x51,0x02,0x49,0xAB,0xEB,0xBA,0xBA, + 0x43,0x51,0x03,0x49,0xDC,0xBF,0x8B,0xA7,0x44,0x59,0x03,0x49,0x5E,0xFF,0xBF,0x27, + 0x64,0x59,0x03,0x51,0xAD,0xAF,0xA2,0xEA,0xA4,0x61,0x24,0x51,0x97,0x9F,0xBF,0x17, + 0xAB,0xA3,0x47,0x7A,0x09,0x0B,0x0B,0x0B,0x0D,0xAC,0xAB,0xA3,0xAD,0x3D,0xF5,0xFD, + 0x2D,0xB4,0xEC,0xAB,0x7A,0xF2,0x65,0x55,0xEC,0xAB,0x4A,0x93,0x7A,0x7C,0xA8,0x80, + 0x8B,0xA3,0xC8,0x82,0x7E,0x7E,0xE2,0xA0,0x29,0x8B,0xC8,0x82,0xBF,0x7D,0xDF,0x78, + 0xC8,0x82,0x26,0x6A,0xF8,0x68,0x78,0x78,0x46,0x72,0x26,0x6A,0x60,0xF0,0x8B,0xAE, + 0x46,0x72,0x25,0x6A,0xEB,0xAB,0xFB,0x3E,0xC8,0x82,0x26,0x72,0xBD,0xAF,0xAF,0x0B, + 0xC9,0x82,0x88,0x82,0xBB,0x6A,0x8A,0x0A,0xA8,0x82,0x26,0x6A,0x68,0x68,0xE8,0xE0, + 0xE5,0x61,0xC2,0x38,0x56,0x7E,0x7C,0x78,0xA2,0x30,0x61,0x28,0x08,0x2A,0x3C,0xAE, + 0xE3,0x38,0xA2,0x30,0x2E,0xED,0xD5,0x5D,0x03,0x39,0xA2,0x30,0xE2,0xEB,0x7D,0x5D, + 0x03,0x41,0xA1,0x30,0x0E,0xAA,0xE9,0xBD,0x44,0x49,0xE3,0x38,0x0E,0x25,0xBD,0xFD, + 0x65,0x49,0x03,0x41,0x70,0xE2,0xBF,0xDD,0x24,0x41,0xE3,0x38,0xE0,0xBE,0x76,0xDC, + 0x03,0x39,0x82,0x28,0xEA,0xFA,0xFC,0x58,0xE3,0x38,0xA2,0x30,0x22,0x03,0x0B,0xCD, + 0x65,0x49,0xC2,0x30,0x2B,0x09,0x29,0xED,0xA5,0x51,0x03,0x41,0xE8,0xEA,0x6F,0x55, + 0x24,0x41,0xC2,0x30,0xE0,0xE8,0xEA,0x7E,0xE3,0x38,0xC2,0x30,0x72,0xFC,0x37,0x29, + 0xE3,0x38,0xC3,0x28,0xAA,0x0B,0x08,0xA8,0x03,0x39,0xC2,0x30,0x7E,0x7A,0x2A,0xEA, + 0xE3,0x38,0xC2,0x30,0xAB,0x42,0xDB,0x95,0x03,0x39,0xC2,0x30,0xFA,0xF7,0xF7,0xD4, + 0x03,0x39,0xE3,0x30,0x7D,0xD7,0xD6,0x2D,0x03,0x39,0xC2,0x30,0x8F,0xEE,0xB6,0x8A, + 0x03,0x39,0xC2,0x30,0xFD,0x57,0x5E,0xA8,0x03,0x39,0xC2,0x30,0xBB,0xBF,0x2D,0x2A, + 0x44,0x41,0x03,0x39,0xBF,0xED,0x0D,0x09,0x44,0x41,0x03,0x39,0xFA,0x6B,0x78,0xFC, + 0x23,0x41,0xE2,0x38,0x70,0x60,0xEA,0xB2,0x64,0x49,0x03,0x41,0x23,0x29,0xD5,0x55, + 0xA5,0x59,0x44,0x49,0xAA,0xE9,0xFF,0xF9,0xE6,0x61,0x43,0x49,0xA0,0xA3,0xBF,0xB5, + 0x88,0x7A,0xA5,0x59,0x2D,0x2D,0x2D,0x27,0xE8,0x82,0x67,0x7A,0xEE,0xE7,0xB6,0xD8, + 0x31,0xC5,0xC8,0x82,0x2D,0xA5,0x35,0xB5,0x92,0xD5,0xD0,0xBC,0xA2,0x8B,0x2B,0xAD, + 0x72,0xCD,0xF1,0xBC,0x40,0x72,0xFA,0xF2,0x94,0xCD,0x11,0xBD,0xE9,0xE3,0xC2,0xC2, + 0x52,0xC5,0xD0,0xB4,0x0A,0xBF,0xFE,0x7E,0x32,0xC5,0x8F,0xAC,0xE0,0x70,0x7A,0x7F, + 0xB0,0xB4,0x4F,0xA4,0x0C,0x8F,0xEF,0xAB,0xB0,0xAC,0xEA,0x7A,0xDE,0x96,0x26,0x00, + 0xF1,0xBC,0x4E,0xA4,0x55,0x39,0x00,0x08,0x32,0xBD,0x8F,0xAC,0xD5,0xFA,0xE0,0x80, + 0xF1,0xBC,0x6F,0xAC,0xFB,0x7F,0xFE,0xA8,0xB0,0xAC,0x6F,0xAC,0xFE,0xDE,0xDF,0x78, + 0x63,0x59,0x23,0x51,0x42,0xFE,0xFE,0x75,0x44,0x59,0x23,0x49,0xFA,0xA2,0xBB,0xF7, + 0x43,0x51,0x23,0x51,0xB5,0x6F,0x8B,0x76,0x43,0x51,0x03,0x49,0xA2,0x7A,0x7A,0x76, + 0x44,0x51,0x02,0x49,0x35,0xD5,0xBF,0xAB,0x43,0x51,0x03,0x49,0x9A,0xF7,0xA7,0xAB, + 0x63,0x59,0x03,0x51,0xDF,0x5F,0xD7,0xFF,0x64,0x59,0x03,0x51,0x8D,0xAF,0xAA,0x2C, + 0x64,0x59,0x23,0x51,0x5C,0xF6,0xBE,0xAF,0x67,0x7A,0x43,0x59,0xD5,0x95,0x15,0x15, + 0xAB,0xA3,0x29,0x93,0x29,0x29,0x09,0x0B,0xEC,0xAB,0x8B,0x9B,0x2B,0xBE,0xFE,0x7F, + 0x0D,0xAC,0x6B,0x9B,0x02,0x0A,0xDF,0x55,0xEC,0xAB,0x2A,0x93,0x00,0x00,0xAA,0xDF, + 0xEC,0xAB,0xE8,0x8A,0xA8,0xA0,0xFA,0x5F,0x8B,0x9B,0x87,0x7A,0xF8,0x78,0x56,0x57, + 0xA8,0x7A,0x46,0x72,0x5C,0x5F,0x57,0x57,0x46,0x72,0x26,0x6A,0x98,0x88,0xF8,0xDF, + 0xC8,0x82,0x26,0x6A,0xF5,0xFD,0xB5,0x0D,0xC8,0x82,0x87,0x7A,0x89,0xE3,0xAA,0x7C, + 0xA8,0x82,0x05,0x6A,0x00,0xE8,0x7C,0x57,0x87,0x7A,0xC4,0x61,0xA8,0xEE,0xD5,0x55, + 0x26,0x6A,0x03,0x41,0x58,0x78,0x72,0xE2,0xE3,0x40,0x61,0x28,0xFF,0xFE,0xB6,0x9C, + 0xE3,0x38,0xA2,0x30,0x57,0x7F,0xFE,0x8B,0xE3,0x38,0xA2,0x30,0xD5,0xB7,0xBA,0xE2, + 0x03,0x41,0xA2,0x30,0x3D,0xAA,0x0B,0x02,0x24,0x41,0xC2,0x38,0xBF,0xD7,0x9E,0x0F, + 0x44,0x49,0xE3,0x38,0xA9,0x03,0x03,0x82,0x44,0x49,0xE3,0x38,0x57,0xEA,0xAA,0xAA, + 0x24,0x41,0xA2,0x28,0x7B,0x6F,0xE8,0xA0,0xC3,0x30,0x81,0x28,0x8F,0xEF,0x2F,0x2C, + 0x24,0x41,0xA2,0x30,0xBF,0xB5,0x3F,0x2F,0x45,0x41,0xC3,0x38,0xFE,0xE8,0xE2,0x72, + 0xE3,0x30,0xA2,0x30,0xFE,0x55,0x5F,0xEB,0xE3,0x30,0xA2,0x30,0xBF,0xFF,0xFF,0x2A, + 0xE3,0x38,0xA2,0x28,0x0A,0xBB,0xFE,0xBF,0x24,0x39,0xC2,0x30,0xFF,0xF5,0xFD,0x2F, + 0x03,0x39,0xC2,0x30,0xD7,0xBF,0xBE,0xE2,0xE3,0x38,0xC2,0x30,0x98,0xD8,0x72,0xFD, + 0x04,0x41,0xE2,0x30,0xFD,0xFF,0x2B,0x0B,0x44,0x41,0xE3,0x38,0x77,0xFF,0x7F,0xF2, + 0x24,0x41,0xE2,0x38,0xDF,0x7A,0x20,0x20,0x24,0x41,0xE2,0x38,0xDD,0xBB,0xAB,0x08, + 0x84,0x49,0x03,0x41,0xFF,0x69,0xE3,0xFF,0x23,0x41,0xE3,0x38,0xA2,0xF0,0xF8,0xB8, + 0x44,0x41,0x03,0x39,0xFF,0x5D,0xAF,0xA0,0x23,0x41,0xE2,0x38,0x02,0x89,0xAE,0x2A, + 0xA5,0x51,0x23,0x41,0xA9,0xAD,0xBD,0xF5,0xC5,0x59,0x64,0x51,0x9F,0xB0,0xBF,0xAD, + 0x67,0x72,0xE6,0x61,0x2D,0x27,0x2B,0xA9,0xC8,0x82,0x26,0x6A,0xE8,0x82,0x8A,0x9D, + 0x6E,0xAC,0x67,0x72,0x25,0xB5,0x35,0x95,0x93,0xCD,0xAF,0xBC,0xBD,0x2D,0x0B,0x0B, + 0x93,0xCD,0x6F,0xAC,0xB0,0xF8,0x9C,0xBE,0x94,0xCD,0xF1,0xBC,0xA2,0xA2,0xE2,0x58, + 0x53,0xC5,0xB0,0xB4,0x7A,0x78,0x62,0x7F,0x90,0xAC,0xEE,0x9B,0x28,0x0A,0xA0,0x7C, + 0xD0,0xB4,0xCD,0x93,0x02,0x80,0xEA,0xF5,0xB0,0xB4,0x0E,0x9C,0xA0,0xFF,0xD7,0x75, + 0x6F,0xAC,0xCC,0x93,0x00,0xAA,0x5F,0x77,0x11,0xBD,0xCD,0x9B,0x02,0xAF,0xFD,0xD5, + 0x11,0xBD,0x4F,0xA4,0x00,0x8A,0x2F,0xD5,0x32,0xC5,0xB0,0xB4,0x7F,0x2A,0x80,0x09, + 0x43,0x51,0x23,0x51,0xAE,0xB0,0x3C,0x94,0x43,0x51,0x03,0x49,0x2F,0x36,0xBC,0x5A, + 0x43,0x51,0xE2,0x40,0x00,0xA2,0xF0,0xFE,0x44,0x51,0x03,0x49,0x57,0xD5,0xA5,0xBD, + 0x43,0x51,0x23,0x49,0x65,0xBF,0x3A,0xE8,0x43,0x51,0x23,0x51,0xB5,0x7E,0x9B,0x9D, + 0x44,0x59,0x23,0x51,0x0F,0xA3,0x40,0x02,0x64,0x59,0x23,0x51,0xB4,0xE7,0x6F,0xF7, + 0x43,0x59,0x03,0x51,0xA2,0xA3,0xA2,0x68,0x29,0x93,0x43,0x51,0xB5,0x35,0x35,0x25, + 0xAB,0xA3,0x4A,0x93,0x09,0xAB,0x82,0xEB,0xCB,0xA3,0xA8,0x82,0xA0,0xA8,0xFA,0x7E, + 0x4B,0x9B,0x87,0x7A,0x00,0xAA,0x7E,0x55,0x09,0x8B,0x67,0x72,0x00,0xEE,0x77,0x55, + 0xE9,0x8A,0x67,0x72,0xF0,0x7E,0xD5,0x55,0x87,0x7A,0x46,0x72,0xE8,0x7F,0x5A,0x5F, + 0x86,0x72,0x26,0x72,0xDD,0x7B,0xF7,0xDF,0x87,0x72,0x25,0x6A,0xF7,0xBB,0xBB,0x2A, + 0xC8,0x82,0x46,0x72,0x8F,0x0B,0xA2,0x72,0x87,0x7A,0x05,0x6A,0xC0,0x68,0x7E,0x77, + 0x26,0x6A,0xC4,0x61,0x58,0xF6,0xAA,0xEA,0x06,0x6A,0xC4,0x61,0x55,0xBF,0xBA,0x20, + 0x06,0x6A,0xA5,0x59,0x6B,0xEF,0xC8,0x80,0xA5,0x59,0xC2,0x38,0x57,0x5E,0x58,0x78, + 0x04,0x41,0x81,0x28,0x0B,0xF5,0x75,0xFF,0x24,0x41,0xA2,0x30,0xEA,0x0B,0xAD,0xBD, + 0x03,0x39,0xA2,0x30,0xBA,0xFF,0x5C,0x5A,0x44,0x49,0xC2,0x30,0xAB,0x2B,0x29,0x89, + 0x65,0x49,0x24,0x41,0x6E,0x70,0x78,0xB7,0x44,0x49,0x03,0x41,0xDD,0xAE,0x7C,0xF8, + 0x44,0x41,0xE3,0x38,0x76,0xBF,0xAF,0x2F,0x04,0x39,0xA2,0x28,0xDE,0xF8,0x7C,0x5C, + 0x24,0x41,0x82,0x28,0x0B,0x2B,0xE7,0xD5,0x04,0x41,0xA2,0x28,0xE0,0xB8,0xBF,0xBD, + 0x04,0x39,0xC3,0x30,0xBF,0xEA,0x5A,0x57,0x03,0x39,0xA2,0x28,0xB3,0xFA,0xF7,0xFF, + 0x03,0x39,0xA2,0x28,0xBD,0xB7,0x3F,0xAF,0x24,0x41,0xC3,0x30,0x22,0x02,0xCA,0xFF, + 0x03,0x39,0xC2,0x30,0x70,0x50,0xEE,0xB7,0x03,0x39,0xC3,0x30,0xB5,0x3E,0xFE,0x9D, + 0x65,0x49,0x03,0x39,0xFD,0xAF,0x2D,0x29,0x64,0x49,0x03,0x39,0x5F,0xEE,0xE8,0x70, + 0x65,0x49,0x02,0x41,0xAA,0xAA,0x82,0xA9,0x64,0x49,0xE3,0x38,0xAC,0xEA,0xEE,0x5E, + 0x44,0x49,0xC2,0x30,0xA2,0xAE,0xD6,0x5F,0x23,0x41,0xC1,0x30,0x28,0xA0,0x7A,0xFD, + 0x44,0x41,0xC2,0x30,0xA0,0xEB,0xBF,0xB5,0x44,0x41,0x03,0x39,0x9B,0xD9,0x6B,0xED, + 0x64,0x49,0x03,0x41,0xA0,0xAB,0xB9,0xFB,0xA5,0x59,0x03,0x41,0x0B,0xAE,0x2B,0x05, + 0x26,0x6A,0xA5,0x59,0x2D,0x25,0x39,0x3B,0x67,0x72,0xE5,0x61,0x97,0x96,0xFC,0xF0, + 0x6B,0x93,0x26,0x6A,0x35,0x3D,0x15,0x1D,0x72,0xCD,0xD0,0xBC,0x03,0x01,0x01,0x81, + 0x53,0xC5,0x6F,0xAC,0x2E,0x2E,0x27,0xFD,0x93,0xCD,0x4E,0xA4,0xE0,0xE8,0x7E,0x57, + 0xD0,0xB4,0xAD,0x93,0xA0,0xEA,0x7F,0x5F,0x2E,0xA4,0x8C,0x8B,0xF8,0x5F,0x77,0x75, + 0xEE,0x9B,0x8C,0x8B,0x0B,0xAD,0xA5,0x9D,0x0E,0x9C,0xAD,0x93,0x2A,0xF5,0x2D,0xFF, + 0x2E,0x9C,0x8C,0x8B,0x8A,0xA2,0xFA,0x7A,0x2E,0xA4,0x6C,0x83,0x2F,0x37,0x37,0x95, + 0x8F,0xAC,0x2F,0xA4,0xBF,0x2B,0x27,0x2B,0x32,0xC5,0x8F,0xAC,0xDD,0xAB,0x2B,0x0B, + 0x43,0x51,0x23,0x51,0xF6,0x39,0x96,0xD5,0x23,0x51,0x02,0x49,0xC8,0x6A,0x78,0x54, + 0x23,0x49,0xE2,0x48,0xE7,0x2F,0x82,0x2A,0x64,0x51,0x02,0x49,0xED,0xED,0xAF,0xCF, + 0x44,0x51,0x02,0x49,0x80,0xB0,0xFF,0xA6,0x44,0x59,0x22,0x49,0x3F,0x29,0x81,0xB8, + 0x44,0x59,0x23,0x51,0x00,0x20,0xDB,0xF1,0x64,0x59,0x03,0x51,0xA2,0xB2,0x7A,0xFB, + 0x43,0x59,0x03,0x51,0xDE,0xFE,0xF6,0x75,0x6A,0x9B,0x43,0x59,0x25,0x25,0x25,0x2D, + 0x6A,0x9B,0xC8,0x82,0x00,0x80,0xE8,0x7A,0x29,0x93,0x67,0x72,0xE8,0x5E,0x57,0x5F, + 0x87,0x7A,0x46,0x72,0xFC,0x72,0xEE,0x9E,0x87,0x7A,0x46,0x72,0xAB,0xBE,0x3A,0xBE, + 0x87,0x7A,0x46,0x72,0xBA,0xBC,0xEF,0xBF,0x87,0x7A,0x46,0x72,0x7A,0xDA,0x9E,0x7E, + 0x67,0x7A,0x46,0x72,0x57,0x7A,0xB5,0xAD,0xA8,0x7A,0x46,0x72,0x35,0x2F,0xAF,0xFB, + 0xA8,0x7A,0x05,0x6A,0x60,0x5F,0x57,0x57,0x05,0x6A,0xC5,0x61,0xC0,0x98,0xEA,0x5F, + 0x05,0x6A,0xC5,0x61,0xE2,0xBE,0xB8,0xFF,0x26,0x6A,0xE5,0x69,0xAF,0x0A,0x0D,0x0F, + 0x47,0x72,0x06,0x6A,0x7B,0xAB,0x8F,0x2A,0x26,0x6A,0xE3,0x38,0x5A,0x7C,0x78,0xE0, + 0xC2,0x38,0x81,0x28,0xF0,0xFC,0xFC,0xFC,0x03,0x39,0x81,0x28,0x2D,0xAD,0xA9,0xAB, + 0x03,0x39,0xA2,0x38,0x7A,0xE8,0xFA,0xAA,0x65,0x49,0xC2,0x38,0xE9,0xCB,0xCB,0xE3, + 0x44,0x41,0xC2,0x38,0x0F,0xBF,0xF7,0xD7,0x24,0x41,0xC2,0x30,0x00,0xFA,0x7A,0x55, + 0x23,0x41,0xC3,0x30,0x2B,0xAB,0x63,0x7B,0xE3,0x38,0x82,0x20,0xFC,0xFE,0x5E,0x5E, + 0xC3,0x28,0x61,0x20,0xFE,0xBE,0x3F,0x2F,0x03,0x31,0x81,0x28,0xAF,0xEB,0xF8,0xFC, + 0xC2,0x28,0x61,0x20,0x2A,0x22,0x2B,0xAA,0xE3,0x38,0xC2,0x28,0x5F,0xDD,0x95,0xFD, + 0xE3,0x30,0xC2,0x30,0x02,0xA9,0x93,0x5E,0x03,0x39,0xC3,0x30,0x7E,0x37,0xAF,0xAD, + 0x04,0x39,0xC3,0x30,0xF5,0x7F,0xAF,0xDF,0xE3,0x38,0xC2,0x30,0x1F,0x8B,0x0B,0xB9, + 0x85,0x51,0x03,0x39,0x29,0x89,0xFD,0x55,0x85,0x49,0x03,0x41,0xF8,0x7A,0x5F,0x57, + 0x44,0x41,0xE3,0x38,0x8B,0xAD,0xB5,0xF7,0x24,0x41,0xE2,0x38,0x57,0x7F,0xBF,0x2F, + 0x03,0x39,0xC2,0x30,0xF9,0xEF,0xC6,0xDC,0x03,0x39,0xC2,0x30,0xAB,0x03,0x8E,0x2D, + 0x23,0x39,0xC2,0x30,0x3F,0x3E,0x36,0xBE,0x44,0x41,0x03,0x39,0x7F,0x77,0x7A,0xE2, + 0x44,0x49,0xC2,0x30,0xAA,0xAB,0x0B,0x2F,0xA5,0x51,0x03,0x41,0xAD,0xBF,0xAB,0x0A, + 0x47,0x6A,0xA5,0x51,0x2D,0x2D,0xAD,0x75,0x67,0x72,0xA5,0x59,0x80,0x80,0xFB,0xF5, + 0xC8,0x7A,0x84,0x59,0x2E,0x3F,0xBF,0xBD,0x72,0xCD,0x8C,0x93,0x83,0x82,0xA3,0x89, + 0x90,0xB4,0xAD,0x93,0x82,0xE8,0xF8,0x70,0x2F,0xA4,0x8C,0x8B,0xA0,0xEA,0x5F,0xD5, + 0xEE,0x93,0x8C,0x8B,0x7A,0x7E,0xFF,0xBD,0xCD,0x93,0x8D,0x8B,0xF7,0x79,0xFD,0x3B, + 0xCD,0x93,0x6C,0x83,0x3F,0xAA,0xFA,0x70,0xEE,0x9B,0x0A,0x7B,0xA0,0xFA,0x7E,0x7F, + 0xAD,0x93,0xEA,0x72,0xE0,0xFE,0xFD,0x5D,0x8C,0x8B,0xEB,0x72,0x3B,0xEF,0xFF,0x77, + 0x2E,0xA4,0x2B,0x7B,0x02,0x2B,0xFD,0xFD,0x32,0xBD,0xAD,0x93,0x0A,0x2B,0xBD,0xFD, + 0x43,0x51,0x03,0x49,0xBB,0xAF,0xBC,0xD6,0x23,0x49,0x02,0x49,0x3D,0x77,0x58,0x58, + 0x43,0x51,0x02,0x49,0x33,0xBD,0xFD,0xDD,0x43,0x49,0xE2,0x48,0xA2,0xEE,0xEA,0x6A, + 0x64,0x59,0x02,0x49,0xBF,0xAD,0x29,0xAA,0x43,0x51,0x03,0x51,0x80,0x28,0xA8,0xB2, + 0x44,0x51,0x23,0x51,0x73,0x63,0x08,0x7A,0x43,0x51,0x02,0x49,0xAE,0xEE,0x5C,0xDA, + 0x23,0x51,0x03,0x49,0xD5,0x65,0x5E,0x13,0x0A,0x93,0x23,0x51,0x0D,0x0D,0x09,0x09, + 0x2A,0x93,0x87,0x7A,0xF8,0x78,0xFE,0x7E,0xA7,0x7A,0x67,0x7A,0xFC,0xEE,0xBF,0x5E, + 0x87,0x7A,0x67,0x7A,0x56,0x5F,0xDA,0x83,0x87,0x7A,0x47,0x72,0x8E,0xB8,0xBA,0x08, + 0x87,0x7A,0x46,0x72,0xAE,0xBB,0x5B,0xA2,0x66,0x72,0x46,0x72,0x64,0xD6,0x5C,0xF7, + 0x87,0x7A,0x46,0x72,0xD5,0xF7,0x35,0xB9,0x87,0x7A,0x46,0x72,0xE9,0x60,0x70,0x7A, + 0x26,0x72,0xC5,0x61,0xF0,0xF8,0x6E,0x5A,0xE5,0x61,0xA4,0x61,0x9F,0x17,0x35,0xAD, + 0xE5,0x69,0xC5,0x61,0xBB,0xF8,0x5C,0x94,0x26,0x6A,0xC4,0x61,0x23,0x2B,0x25,0x2F, + 0x67,0x7A,0x26,0x72,0xFF,0xDD,0xFD,0x87,0x46,0x6A,0xE2,0x38,0xE0,0xE8,0x78,0x70, + 0xE2,0x38,0x61,0x28,0xFC,0xFE,0xD7,0xF7,0x23,0x41,0xA1,0x28,0xFD,0xBF,0xAF,0xA3, + 0x64,0x49,0xE3,0x38,0x5D,0xB9,0x2F,0x35,0x64,0x49,0xC2,0x30,0xEB,0x6A,0x78,0x78, + 0xE3,0x38,0x81,0x28,0xA8,0xFE,0x5F,0x7E,0xC3,0x30,0x82,0x20,0x20,0x2B,0xBE,0xF5, + 0xE3,0x30,0x62,0x20,0x80,0xE2,0xE2,0x7A,0xC2,0x28,0x61,0x20,0x7E,0xDF,0x75,0x77, + 0xC3,0x28,0x61,0x20,0x2F,0x2F,0xBF,0xF5,0xC3,0x30,0x82,0x20,0x58,0xF8,0xB7,0xAF, + 0xE3,0x30,0xA2,0x28,0x55,0x69,0xCB,0xAF,0xE3,0x30,0xA2,0x28,0xEB,0xEA,0xA8,0xFE, + 0xE3,0x30,0xA2,0x28,0x7E,0xF5,0xDF,0xAA,0x03,0x39,0xA2,0x30,0xAB,0xAB,0xFB,0x5E, + 0xE3,0x30,0xA2,0x30,0x3C,0xCE,0xE9,0xAF,0x03,0x39,0xA2,0x30,0xFB,0xAD,0x09,0xAA, + 0x03,0x39,0xE3,0x30,0x3E,0x8A,0xAC,0x57,0x03,0x39,0xE2,0x38,0xFB,0x57,0x58,0xB0, + 0x03,0x39,0xE2,0x38,0x00,0x30,0xBF,0xC3,0x23,0x41,0xE2,0x38,0xAE,0xF5,0x7E,0x78, + 0x23,0x41,0xC2,0x30,0xF8,0xFF,0xB7,0x29,0x44,0x41,0xE2,0x38,0xBD,0xDD,0xFF,0xA8, + 0x23,0x39,0xE2,0x30,0xF8,0xB2,0xBA,0xFB,0x23,0x39,0xE2,0x30,0x03,0x2D,0xB5,0x9D, + 0x23,0x41,0xC1,0x30,0x2A,0xF6,0xEE,0xFA,0xC5,0x51,0x02,0x39,0x8E,0xFD,0xB5,0xB5, + 0xC5,0x51,0x43,0x49,0x2D,0xAD,0xFF,0xA0,0x46,0x6A,0xA5,0x51,0xA5,0xAD,0x0D,0xF5, + 0x47,0x6A,0xA4,0x51,0x3B,0xA2,0x2F,0xB7,0x90,0xB4,0x88,0x72,0x03,0x2D,0x2D,0x0D, + 0x90,0xB4,0xAD,0x8B,0x60,0xE0,0xE0,0xC0,0x8C,0x8B,0x2B,0x83,0x0A,0x3E,0x2E,0x34, + 0xCD,0x93,0x6C,0x83,0x29,0x3A,0xAA,0xBA,0xCD,0x93,0x0A,0x73,0x80,0xC0,0xF8,0x5E, + 0x8C,0x8B,0xA9,0x6A,0xA0,0xEF,0xF7,0x57,0x2B,0x7B,0xCA,0x6A,0x80,0x82,0xFB,0xDF, + 0x2A,0x73,0xCA,0x72,0xFF,0xD6,0xF7,0xDE,0x4C,0x83,0xEA,0x72,0xB7,0xAB,0xAB,0x2A, + 0xCD,0x93,0x2B,0x7B,0xA5,0xA5,0x37,0x2F,0x0E,0x9C,0x6C,0x83,0x09,0x37,0x97,0xD4, + 0x43,0x51,0xE2,0x40,0x6E,0xD2,0xF2,0xBA,0x43,0x51,0xE2,0x40,0xB5,0xAB,0xAE,0xEA, + 0x23,0x51,0x02,0x41,0xBF,0x38,0xE0,0xDB,0x43,0x51,0x02,0x49,0xD6,0xD6,0xED,0xEB, + 0x43,0x51,0x03,0x51,0xA8,0xBB,0xAA,0xFB,0x43,0x51,0x23,0x51,0x30,0xBC,0xA9,0x41, + 0x43,0x51,0x03,0x49,0xF8,0xAA,0xAB,0x6B,0x23,0x51,0xE2,0x48,0xA8,0xB8,0x9C,0xBE, + 0x23,0x51,0xE2,0x48,0xBA,0xBF,0xBF,0x3F,0x09,0x8B,0x84,0x59,0x09,0x09,0x01,0x0B, + 0xC8,0x82,0x87,0x7A,0x78,0xF8,0x78,0x5E,0xA7,0x7A,0x67,0x7A,0x5E,0xFF,0xEF,0xEE, + 0xA8,0x82,0x67,0x72,0xFF,0xAE,0xE6,0xBC,0xA8,0x7A,0x67,0x7A,0xFF,0xB8,0xBA,0xDE, + 0x87,0x7A,0x67,0x72,0x9A,0x62,0x78,0x6A,0x66,0x72,0x46,0x72,0xE6,0x56,0xFD,0xD5, + 0x87,0x7A,0x46,0x72,0xB6,0x37,0xA9,0xBD,0x87,0x7A,0x05,0x6A,0xE0,0xFA,0x7A,0x7E, + 0x06,0x6A,0xA4,0x61,0x78,0x7A,0x76,0x9E,0x87,0x7A,0xC4,0x61,0x55,0xBD,0xB5,0x2B, + 0x67,0x7A,0x05,0x6A,0xB5,0x0B,0x00,0xBE,0xA8,0x7A,0x46,0x72,0x5F,0x8A,0xFB,0x55, + 0x87,0x7A,0x26,0x6A,0x0B,0x80,0x7F,0xD7,0x46,0x6A,0x03,0x41,0x60,0x60,0x60,0xE0, + 0xE2,0x38,0x81,0x30,0xB5,0xBF,0x3E,0x08,0x44,0x41,0xE2,0x38,0x82,0xA2,0x2B,0x3D, + 0x44,0x49,0xC2,0x30,0x2F,0xBE,0x7E,0x5C,0x44,0x49,0xC2,0x30,0xF0,0x62,0x6B,0x7F, + 0xC2,0x30,0x82,0x20,0xAA,0xA2,0xFA,0x76,0xA2,0x28,0x62,0x20,0xC8,0xCA,0xEA,0x7F, + 0xA2,0x20,0x61,0x20,0x78,0xF7,0xF5,0xEF,0xC3,0x28,0x62,0x20,0xFF,0xBD,0xB7,0xAB, + 0xA2,0x28,0x61,0x20,0xD7,0xAE,0xA8,0xA0,0xC2,0x28,0x82,0x20,0xFD,0xBF,0xAB,0xAD, + 0xC2,0x28,0xA2,0x28,0x4B,0xF6,0xE0,0xEB,0xE3,0x30,0xA2,0x28,0x5F,0xAD,0xA7,0x2D, + 0xE3,0x30,0xA2,0x28,0x02,0xE3,0xE2,0x7A,0xE3,0x38,0xA2,0x28,0xBA,0xE2,0xB7,0xF5, + 0xC2,0x30,0xA2,0x28,0x82,0xB0,0x00,0x2B,0x04,0x39,0xC3,0x30,0xE3,0x7D,0xE5,0xFD, + 0x03,0x39,0xC3,0x30,0x22,0xAF,0xEF,0x57,0x23,0x39,0xC2,0x30,0x2A,0xEA,0xEF,0xBF, + 0x03,0x39,0xE2,0x30,0x8B,0x7F,0x57,0x3A,0x23,0x39,0xE2,0x38,0x4A,0x45,0xFF,0xAE, + 0x23,0x41,0xE3,0x38,0x25,0xB5,0x35,0x2A,0x84,0x49,0x24,0x41,0x6F,0xEF,0x3B,0xAF, + 0x64,0x49,0x03,0x39,0x55,0xF7,0xBF,0x88,0x43,0x49,0xC1,0x30,0xF7,0xDF,0xFA,0xA2, + 0x43,0x41,0xE2,0x38,0xFE,0x8D,0xBB,0xBF,0x84,0x49,0xE2,0x38,0x25,0xB7,0xFF,0x9F, + 0xA4,0x51,0x43,0x49,0xE0,0x57,0xF5,0x05,0x06,0x62,0x63,0x49,0xB5,0xFD,0xAD,0x2B, + 0x27,0x62,0x84,0x51,0x97,0xBF,0xBA,0x88,0xF1,0xBC,0x27,0x62,0x0D,0x2D,0x2D,0x2D, + 0x73,0xC5,0xED,0x9B,0x7F,0x7F,0xEA,0x80,0x70,0xAC,0x48,0x62,0xFE,0xD6,0x5A,0xE0, + 0x4C,0x83,0xC7,0x51,0x00,0xEA,0xFE,0x5E,0x0B,0x73,0xA6,0x51,0xA0,0xAA,0xFF,0xF5, + 0xA9,0x6A,0x27,0x5A,0x08,0xAE,0xAB,0xF5,0xEA,0x72,0x68,0x62,0x32,0xAA,0xAF,0xBD, + 0x6C,0x8B,0xA9,0x6A,0xFF,0xBF,0x3D,0x2F,0x2E,0x9C,0x0B,0x7B,0xFD,0xAF,0x8A,0x00, + 0x0E,0x9C,0x6C,0x83,0x95,0xD7,0xE8,0xE0,0x4F,0xA4,0x6B,0x8B,0x5A,0x72,0x62,0x8A, + 0x23,0x49,0x02,0x49,0xE4,0xB9,0x0D,0x09,0x23,0x49,0x03,0x49,0x0D,0x25,0x2F,0xA0, + 0x43,0x51,0x02,0x49,0x5E,0x16,0xAE,0xBB,0x43,0x51,0x23,0x51,0x56,0x74,0xD2,0x01, + 0x43,0x51,0x03,0x49,0x0A,0xB2,0x9E,0x92,0x43,0x51,0x02,0x49,0xE2,0xEC,0x72,0xDD, + 0x23,0x51,0x03,0x49,0xD3,0x63,0x02,0xDE,0x23,0x51,0xE2,0x48,0x7B,0x60,0xEE,0xFE, + 0xE9,0x82,0xE2,0x48,0xD5,0xD5,0xB5,0x2D,0xE8,0x8A,0x26,0x6A,0x81,0x82,0x80,0xA0, + 0xC8,0x7A,0x66,0x72,0xB8,0xFE,0xFE,0xE3,0xA7,0x7A,0x66,0x72,0xFA,0xFE,0xBE,0x8B, + 0xA7,0x7A,0x66,0x7A,0xAF,0xFF,0xFB,0xA2,0x87,0x7A,0x66,0x72,0x00,0x0A,0x0A,0xA0, + 0xA7,0x7A,0x46,0x72,0xFE,0x5C,0x5F,0x7F,0x49,0x8B,0x46,0x72,0x55,0x55,0x95,0x0D, + 0x8A,0x9B,0x67,0x7A,0x55,0xD5,0xAA,0x20,0x29,0x8B,0x06,0x6A,0xFF,0x82,0xE0,0x5E, + 0x67,0x7A,0x06,0x6A,0xAE,0x70,0x57,0x55,0x26,0x6A,0xC5,0x59,0xA0,0xA2,0x02,0x7E, + 0x46,0x72,0xC4,0x59,0xFF,0xAA,0x00,0xD5,0x67,0x72,0xC5,0x61,0x2E,0xA2,0x00,0x55, + 0xA8,0x7A,0x84,0x51,0xAA,0xA2,0xA2,0x57,0x66,0x72,0x44,0x49,0x78,0x68,0x7A,0x7F, + 0x44,0x41,0xC2,0x38,0xD7,0x77,0xBE,0xE0,0x03,0x39,0xC2,0x38,0xBB,0xBF,0xAF,0x60, + 0x24,0x41,0x81,0x28,0xA0,0xA8,0xEF,0xDF,0x03,0x31,0x61,0x18,0xEA,0xF8,0xFE,0x7F, + 0xA2,0x20,0x61,0x18,0x7C,0xEC,0xEF,0xFF,0xA2,0x20,0x61,0x18,0xF5,0xAD,0xAB,0x0F, + 0xE3,0x30,0x82,0x20,0xF5,0xF5,0xBD,0xB2,0xE3,0x30,0xA2,0x28,0x5B,0xEF,0xAA,0x0A, + 0xE2,0x30,0x81,0x20,0x77,0x7F,0xFE,0xA8,0xA2,0x28,0x81,0x20,0xAB,0x67,0xEE,0x00, + 0xE2,0x30,0x82,0x20,0xBF,0xFD,0xFD,0xA2,0xC2,0x28,0x81,0x28,0x08,0xA7,0xA5,0x0B, + 0xC2,0x30,0xA2,0x28,0x62,0x6A,0xFB,0xD7,0x03,0x31,0xA2,0x28,0xB5,0xED,0x2B,0x2D, + 0x03,0x39,0xC2,0x30,0xD5,0xBF,0x8A,0x2B,0x24,0x39,0xC2,0x38,0x6B,0xCA,0x0B,0xAB, + 0x03,0x39,0xC2,0x30,0xF7,0xFD,0x22,0x32,0x23,0x39,0xE3,0x30,0xAD,0x3D,0x79,0xEF, + 0x23,0x39,0xC2,0x30,0x2A,0xAA,0xFA,0x5A,0x23,0x39,0xE2,0x30,0xFC,0xD5,0xD7,0x55, + 0x23,0x41,0xE3,0x38,0xA2,0xA9,0xBD,0x95,0x64,0x49,0x03,0x39,0x2B,0xFF,0xF5,0xB7, + 0x85,0x51,0x44,0x49,0xAE,0x73,0x63,0xEF,0x44,0x49,0x23,0x41,0x40,0x5E,0xE6,0x0F, + 0x43,0x41,0x03,0x39,0xD7,0x55,0xFF,0xAE,0x43,0x41,0x03,0x39,0x35,0xAF,0x7E,0xE2, + 0x84,0x51,0x03,0x39,0x02,0xFF,0xFD,0xEF,0xC5,0x59,0x43,0x41,0x0A,0x99,0x7D,0xDD, + 0x06,0x62,0x64,0x49,0x02,0xBF,0xF5,0xBF,0xD1,0xB4,0x06,0x62,0x2D,0x25,0x25,0xB5, + 0x93,0xCD,0xD1,0xBC,0xAA,0xAA,0xAB,0xBD,0x53,0xC5,0x2F,0xA4,0x7E,0xFE,0xF8,0xE0, + 0xB0,0xAC,0xEB,0x7A,0x7E,0xAA,0x20,0x00,0x8F,0xAC,0xE6,0x51,0x57,0xFA,0x00,0x00, + 0x6F,0xA4,0x07,0x5A,0x55,0xFF,0x00,0x00,0x4F,0xA4,0xA9,0x6A,0x55,0xFD,0x00,0x00, + 0x2E,0x9C,0xCA,0x72,0xAD,0xAB,0x00,0x00,0x6F,0xAC,0xED,0x93,0x2D,0xA9,0x8B,0xAB, + 0x4F,0xA4,0xAC,0x8B,0x70,0xF8,0xE0,0xA2,0x6F,0xAC,0xCC,0x93,0xAD,0x8D,0x0D,0x0D, + 0x23,0x51,0x02,0x41,0xA0,0x43,0xFF,0xFF,0x23,0x51,0xE2,0x40,0xA2,0x1A,0x2F,0x0F, + 0x43,0x51,0x23,0x51,0xFD,0x8B,0xA0,0x03,0x43,0x51,0x23,0x51,0x58,0x74,0x65,0x54, + 0x43,0x51,0x03,0x49,0xF3,0xBA,0xFE,0xDE,0x23,0x51,0x02,0x41,0xFC,0xA7,0x5F,0x7B, + 0x23,0x49,0x03,0x49,0x54,0x28,0x7E,0xF9,0xC4,0x61,0xA1,0x40,0xFF,0xFF,0xBF,0x3D, + 0x09,0x8B,0x43,0x51,0x0D,0x09,0x02,0x00,0x09,0x8B,0xA7,0x82,0x78,0xEC,0xFA,0x7A, + 0xE8,0x82,0x86,0x7A,0x57,0xDF,0xFF,0xF8,0xA7,0x7A,0x87,0x7A,0xDE,0x5E,0x5E,0x08, + 0xA7,0x7A,0x66,0x72,0xB2,0xEA,0x60,0x78,0x29,0x93,0x66,0x72,0x57,0x55,0x55,0x15, + 0xAB,0xA3,0x87,0x7A,0x55,0xB5,0x0B,0x00,0x8A,0x9B,0x25,0x6A,0x02,0x00,0xC0,0x78, + 0x8A,0x9B,0xC5,0x61,0xE0,0x5A,0x57,0x55,0x26,0x6A,0xA4,0x61,0xB8,0xFB,0xD7,0xAF, + 0x06,0x6A,0x44,0x49,0x00,0x68,0x5E,0x5E,0xA4,0x59,0x03,0x41,0xEC,0x77,0xF5,0xEF, + 0x43,0x49,0x23,0x41,0x0B,0xA2,0xE2,0xD8,0x43,0x49,0x03,0x41,0xE2,0xA8,0xEA,0xF7, + 0x43,0x49,0x03,0x41,0x67,0x9E,0xDE,0xD7,0x85,0x51,0x23,0x41,0xC9,0xEB,0xEF,0xD9, + 0x44,0x49,0xC2,0x30,0xA0,0xBA,0xFE,0x5E,0x03,0x39,0x82,0x20,0xE0,0xF0,0x5E,0x7E, + 0xA2,0x28,0x81,0x20,0x62,0xE2,0xAA,0xDD,0xA2,0x20,0x61,0x18,0x6A,0xE8,0xF8,0xFE, + 0xA2,0x28,0x61,0x18,0xD5,0xD5,0xA7,0xA9,0xE3,0x30,0x82,0x20,0xA5,0xF5,0xBD,0x2F, + 0x24,0x39,0xA1,0x28,0xAF,0x3D,0x37,0x3E,0x24,0x39,0xC2,0x30,0xF6,0xF7,0xA4,0xFC, + 0xE2,0x30,0x81,0x28,0xBA,0x78,0xFC,0xF8,0xE3,0x30,0xA1,0x28,0xBB,0x02,0x29,0xF5, + 0xE2,0x30,0xA2,0x28,0xE2,0xF0,0xE8,0xFE,0xE3,0x28,0x81,0x28,0xFB,0xDE,0x7E,0xFE, + 0xC2,0x28,0x81,0x20,0xEA,0xEF,0xBF,0x27,0xC2,0x28,0xA2,0x28,0x09,0x05,0x59,0x5B, + 0xE3,0x30,0xA2,0x28,0x0A,0xFF,0xF7,0xF7,0x03,0x39,0xA2,0x28,0x2B,0x2D,0xFF,0xDF, + 0x03,0x39,0xC2,0x30,0xE0,0xF0,0xFF,0x57,0x24,0x39,0xC2,0x30,0xA3,0xAF,0xED,0x95, + 0x23,0x39,0xE2,0x30,0x68,0x7E,0xEB,0xFA,0x23,0x39,0xE2,0x38,0xB5,0xB7,0x35,0xB5, + 0x23,0x41,0xC2,0x30,0xF4,0x7A,0xF8,0xFB,0x64,0x49,0xC2,0x38,0xBF,0x3F,0x2F,0x2D, + 0x85,0x49,0x23,0x41,0xAB,0xD6,0x7C,0xF0,0x44,0x49,0xE2,0x38,0x0A,0x2A,0xBF,0xF6, + 0x23,0x41,0xC2,0x38,0x00,0x02,0xFC,0xFF,0x64,0x49,0xE3,0x38,0x8B,0xAF,0xDF,0xDD, + 0x85,0x49,0xE2,0x38,0x82,0xAB,0xD5,0xF5,0xC5,0x51,0x23,0x41,0xAB,0x2B,0xA7,0x75, + 0x06,0x62,0x63,0x49,0x2B,0x2A,0xAF,0xD5,0xAC,0x93,0x64,0x51,0x2F,0x2F,0x25,0x35, + 0x11,0xBD,0x2E,0xA4,0x2B,0xAF,0xBD,0xFD,0x52,0xC5,0xB0,0xB4,0x20,0x2B,0xBF,0x7D, + 0x73,0xCD,0xF0,0xBC,0x7B,0xA8,0xA2,0xA9,0x32,0xC5,0x6F,0xAC,0xFE,0xFE,0xDC,0x68, + 0xAF,0xB4,0x4F,0xA4,0xC0,0xF8,0x5B,0xFF,0x6F,0xAC,0x2E,0xA4,0xE8,0xBA,0x55,0x7F, + 0x8F,0xAC,0x0E,0x9C,0x5E,0xE2,0xAA,0x23,0x6F,0xAC,0x0E,0x9C,0xEF,0xF7,0xFA,0xE0, + 0x6F,0xA4,0x2E,0xA4,0x4F,0xD5,0x55,0x5F,0x90,0xAC,0xED,0x9B,0x2D,0x37,0xBF,0xBF, + 0x43,0x51,0xE2,0x40,0xFF,0x9F,0x25,0x3D,0x64,0x59,0x02,0x49,0xAD,0x2B,0xA2,0xAA, + 0x83,0x51,0x23,0x51,0xF7,0xDE,0x77,0x7F,0x63,0x51,0x02,0x49,0xE8,0xFA,0xEE,0x7F, + 0x23,0x49,0x03,0x49,0xDA,0x23,0x03,0x79,0x23,0x49,0xE2,0x40,0xF8,0x2A,0x9E,0xA2, + 0x23,0x49,0x02,0x41,0x56,0x24,0xCF,0x67,0xCB,0xA3,0x03,0x49,0xB5,0x25,0x0D,0x0D, + 0x8B,0x9B,0xC8,0x82,0x7E,0xFF,0xFC,0xC8,0x08,0x8B,0xA7,0x82,0xFB,0xDE,0xFA,0xE8, + 0xA7,0x82,0xE7,0x7A,0x2A,0xAA,0x22,0xBE,0xC7,0x82,0x86,0x7A,0xFB,0x76,0x7E,0x54, + 0xAB,0xA3,0x46,0x72,0x57,0xF5,0xB7,0x2B,0xCB,0xA3,0x67,0x7A,0x2D,0x0A,0x00,0x80, + 0xAB,0xA3,0x26,0x6A,0x00,0xC0,0x78,0x56,0xE9,0x8A,0xA4,0x59,0xF8,0x5E,0x5F,0x5F, + 0xE6,0x61,0x84,0x59,0xAE,0x3D,0x2B,0x2F,0x06,0x6A,0x64,0x51,0x22,0xE8,0xE8,0x7A, + 0x84,0x51,0x23,0x49,0xA8,0xE8,0xDC,0xF7,0x64,0x49,0x23,0x41,0xFE,0x7B,0x6F,0xB2, + 0x64,0x49,0x03,0x41,0xBB,0xFF,0xE7,0x2E,0xE5,0x61,0x03,0x41,0x55,0x5D,0xD7,0x2A, + 0xC5,0x59,0x03,0x41,0x55,0x55,0xFF,0x80,0x64,0x49,0xE2,0x38,0xE8,0x5A,0x7E,0x7A, + 0xE3,0x38,0xA1,0x28,0xF8,0xBE,0xAE,0xF6,0xE3,0x30,0x81,0x20,0x72,0x70,0x78,0x7A, + 0x81,0x20,0x61,0x18,0x00,0xAA,0x08,0x80,0x82,0x20,0x61,0x18,0xB8,0xBF,0x55,0xB5, + 0xC3,0x28,0x61,0x18,0xAF,0xAF,0xAA,0x8A,0xC3,0x30,0x82,0x20,0x0F,0xBF,0xF7,0xED, + 0x04,0x39,0xA2,0x28,0x3A,0xBB,0xDF,0xD5,0x03,0x39,0xA2,0x28,0xEC,0xE6,0xFF,0x79, + 0x03,0x39,0xA2,0x30,0xFE,0xA9,0x0F,0x2F,0xE2,0x30,0xA1,0x28,0x57,0xF8,0xF8,0xC0, + 0xE3,0x30,0x81,0x28,0xFF,0xD6,0xFA,0x80,0xC2,0x30,0xA2,0x28,0xD6,0x95,0xAB,0x8E, + 0xC2,0x30,0xA2,0x28,0x55,0xBF,0x2A,0x8B,0xC2,0x30,0xA2,0x28,0x5F,0xF4,0xAD,0x5B, + 0xC2,0x28,0x82,0x28,0x00,0x0A,0xAA,0xEF,0xE2,0x30,0xA2,0x28,0xAF,0x0B,0xAF,0x3D, + 0xE2,0x30,0xA2,0x28,0xEF,0x8E,0x28,0x0A,0x24,0x39,0xC2,0x30,0xBF,0x37,0xD5,0xFF, + 0x44,0x41,0xE3,0x38,0xFA,0xC2,0xAD,0xAD,0x23,0x39,0xE2,0x30,0xAD,0x85,0xAD,0xD5, + 0x03,0x39,0xC2,0x30,0xEC,0xAA,0x8E,0xEE,0x64,0x49,0xC2,0x30,0xB5,0x35,0x37,0x2F, + 0xA5,0x51,0x24,0x41,0x68,0x60,0xE0,0xF6,0x24,0x41,0xC2,0x30,0xE8,0x9C,0xBA,0xFC, + 0x44,0x41,0xE2,0x38,0xBD,0x35,0xB7,0xF5,0x23,0x41,0xC2,0x30,0xBA,0xA8,0xBA,0x7E, + 0x65,0x41,0xE3,0x38,0xF5,0xAD,0xAF,0x2B,0xC6,0x59,0x23,0x49,0xFD,0xBF,0xAB,0x2A, + 0xE6,0x59,0x43,0x41,0xF5,0xB7,0x0F,0x88,0x0A,0x7B,0x64,0x49,0x35,0x3F,0x27,0x3F, + 0x6F,0xAC,0xCD,0x93,0x0A,0xAB,0xBD,0xB5,0xF1,0xBC,0x0E,0xA4,0x0B,0x3F,0xFF,0xF5, + 0x32,0xBD,0x4E,0xAC,0x02,0x80,0xAB,0xB5,0x32,0xC5,0x8F,0xAC,0x78,0x7A,0xEA,0xAB, + 0xD0,0xB4,0x6F,0xAC,0x57,0x6F,0xFA,0xF8,0x8F,0xAC,0x4F,0xA4,0xDE,0xFF,0xF7,0xCC, + 0x8F,0xAC,0x4F,0xA4,0xBF,0xBA,0xAB,0xDC,0x90,0xAC,0x4E,0xA4,0x6F,0xBA,0xB2,0xA9, + 0x8F,0xAC,0x4F,0xA4,0x5F,0x7E,0xDA,0x6F,0x6F,0xAC,0x2E,0xA4,0xFD,0x88,0xB2,0x5A, + 0x64,0x59,0x03,0x49,0xBD,0xAA,0x2A,0x8A,0x64,0x59,0x43,0x51,0x6E,0x08,0x82,0xAF, + 0x63,0x51,0x22,0x49,0x77,0x78,0x7F,0x5A,0x43,0x49,0x02,0x49,0x5A,0x5C,0xAA,0x9F, + 0x23,0x49,0x02,0x49,0xC0,0xC0,0x80,0xD5,0x23,0x49,0x02,0x41,0xB3,0xD5,0xED,0x66, + 0x63,0x51,0x02,0x49,0x5D,0xD5,0xD7,0x95,0xAB,0x9B,0x84,0x59,0x09,0x09,0x03,0x03, + 0x8A,0x9B,0x08,0x8B,0xE8,0xEA,0xE0,0x7A,0x08,0x8B,0xC8,0x82,0x58,0xFA,0xE8,0xEC, + 0x08,0x8B,0xA7,0x82,0x5F,0xDF,0x7F,0x2A,0xCB,0xA3,0xA7,0x82,0x55,0xB5,0x2D,0x02, + 0xCB,0xA3,0xC8,0x82,0x03,0x00,0x80,0x60,0xAB,0xA3,0x26,0x72,0xC0,0x58,0x56,0x55, + 0x67,0x72,0x05,0x6A,0x9E,0xB7,0x2E,0xF3,0x26,0x6A,0x63,0x51,0x78,0xDC,0xFE,0xBE, + 0xE6,0x61,0x63,0x49,0x0B,0x08,0xC8,0x52,0xC5,0x59,0x23,0x41,0xE8,0xFE,0x7F,0xFF, + 0x64,0x49,0x03,0x41,0x0E,0x2A,0x29,0xA2,0x85,0x51,0x23,0x49,0x7F,0xFE,0x3E,0x37, + 0x06,0x6A,0x64,0x49,0xAD,0x02,0xA0,0xE2,0xC5,0x61,0xE2,0x40,0x00,0xA8,0xFE,0x5F, + 0xC5,0x59,0x02,0x41,0xC0,0xFA,0xFF,0x55,0x23,0x41,0xC2,0x30,0xE0,0xFE,0x5E,0x5E, + 0xC2,0x30,0x81,0x20,0xEC,0x68,0x68,0xD8,0xA2,0x28,0x61,0x20,0xE0,0x7A,0x7A,0xE8, + 0x81,0x20,0x41,0x18,0x20,0xEA,0xFF,0xEE,0xC2,0x28,0x40,0x18,0xB7,0xAF,0x0B,0x0A, + 0xC3,0x30,0xA1,0x20,0x7E,0xFA,0xCA,0xAA,0xC2,0x30,0x81,0x20,0xFF,0xAF,0xEB,0xB8, + 0x03,0x39,0xA2,0x28,0xD5,0xBD,0xAF,0x8B,0x03,0x31,0xC2,0x30,0xD7,0xA8,0xF0,0x7D, + 0xE2,0x30,0x82,0x28,0xAE,0xB6,0xDE,0x8E,0x03,0x39,0xA2,0x30,0xAE,0xA5,0xA5,0xBF, + 0x02,0x39,0xC3,0x30,0xEE,0x7A,0x7B,0xDE,0xE3,0x30,0xA2,0x28,0xBF,0xBE,0xB7,0xB4, + 0xE3,0x30,0x81,0x28,0x7E,0xFA,0xF8,0xFE,0xC2,0x30,0xA2,0x28,0xA5,0x35,0xFB,0xAA, + 0xA2,0x30,0xC2,0x28,0x97,0xF5,0xFF,0x97,0xC2,0x30,0xA2,0x28,0x2F,0xAD,0xAA,0xE9, + 0xE3,0x30,0xA2,0x28,0xEA,0x2A,0xA3,0x5B,0x03,0x39,0xC3,0x30,0xBF,0xF2,0xE3,0xA9, + 0x03,0x39,0xC2,0x30,0x2F,0x2D,0xE5,0xB5,0x03,0x39,0xA2,0x30,0x2A,0x83,0xA7,0xEF, + 0x03,0x39,0xE2,0x30,0x7F,0xFE,0xDB,0x95,0x23,0x39,0xE3,0x30,0x0A,0x02,0xEA,0xE9, + 0x64,0x41,0xC3,0x30,0xA8,0x7F,0xFD,0xFF,0x03,0x39,0xC2,0x30,0xF8,0xEE,0xAB,0xAB, + 0x03,0x39,0xC2,0x30,0x23,0xAB,0xAA,0x23,0x24,0x39,0xC2,0x30,0x7A,0xDE,0xAF,0x2F, + 0x44,0x41,0xE3,0x30,0x9D,0xB5,0xBF,0x09,0xA5,0x51,0x23,0x41,0x22,0x3D,0xFD,0xF5, + 0xC5,0x59,0x44,0x49,0xA0,0xBB,0xAD,0x2D,0x2A,0x83,0xC5,0x51,0xB5,0xB5,0x35,0x35, + 0xED,0x9B,0x8C,0x8B,0x09,0xBF,0xFA,0x62,0x2E,0xA4,0x8C,0x8B,0x0A,0xAF,0xFF,0xD5, + 0x6F,0xAC,0xCD,0x93,0x0A,0xEF,0xFD,0xDD,0xF0,0xB4,0x0D,0x9C,0x0A,0x0B,0xBD,0xD5, + 0xF1,0xBC,0x8F,0xAC,0xFC,0xE2,0xE2,0xB5,0xD1,0xB4,0x70,0xAC,0x7E,0xEF,0xAE,0xB8, + 0xB0,0xB4,0x4F,0xA4,0xDF,0xFA,0x8A,0x8A,0x8F,0xAC,0x2D,0xA4,0xF6,0xFE,0xE8,0x28, + 0x6F,0xAC,0x2E,0xA4,0xAA,0xCF,0xEA,0xFE,0x4F,0xA4,0x0E,0x9C,0x7E,0xBE,0xFB,0x5A, + 0x64,0x59,0x23,0x51,0x27,0xA7,0xE7,0xAE,0x64,0x59,0x43,0x51,0x2F,0x80,0x60,0x72, + 0x64,0x51,0x02,0x49,0xFA,0x78,0xFE,0x5E,0x22,0x49,0xE1,0x40,0xA8,0xA0,0x82,0xFB, + 0x23,0x49,0xE2,0x40,0xAB,0xEC,0x7A,0xAE,0x23,0x49,0xE2,0x40,0xFA,0x9B,0x29,0x2F, + 0x25,0x6A,0xE2,0x40,0xF5,0xBD,0x35,0x37,0x8A,0x9B,0xE8,0x82,0x81,0x81,0x03,0x82, + 0x69,0x9B,0x09,0x8B,0xEA,0xEA,0x6A,0xEA,0x49,0x93,0xE8,0x8A,0x6F,0x7E,0xBF,0x2A, + 0xCB,0xA3,0xE8,0x8A,0xBD,0x0F,0x02,0x0A,0xEB,0xA3,0x86,0x7A,0x00,0x80,0xE0,0x78, + 0xAA,0x9B,0x46,0x72,0x78,0x5E,0x55,0x55,0x67,0x7A,0x26,0x6A,0xED,0x3B,0x8B,0x8B, + 0x46,0x72,0xA4,0x59,0xE0,0xE0,0x70,0x5C,0xC5,0x61,0x22,0x41,0x82,0xA2,0xFA,0x77, + 0xA5,0x51,0x23,0x41,0xF8,0x3F,0xAD,0x8B,0x84,0x51,0x44,0x49,0xF4,0xB6,0xAF,0xEF, + 0x64,0x49,0x23,0x41,0xA2,0xB6,0xAE,0xBF,0x84,0x51,0xE3,0x38,0x3F,0x2E,0xBE,0xDF, + 0x06,0x62,0x84,0x59,0xEA,0x88,0xEA,0xE9,0xA5,0x59,0x02,0x41,0x5E,0x5E,0x5C,0x78, + 0x03,0x41,0xC2,0x38,0x80,0xE0,0x60,0xE0,0x02,0x39,0xC3,0x30,0xE8,0xFF,0xDF,0x75, + 0xE3,0x30,0x81,0x20,0xDA,0xBA,0xF0,0xC0,0xC2,0x28,0x61,0x18,0xF8,0x7A,0x56,0x57, + 0xC2,0x28,0x61,0x18,0xD7,0xB5,0x0D,0xAB,0x03,0x31,0xC2,0x28,0x75,0xDD,0xDD,0x29, + 0x44,0x39,0xA2,0x28,0xDD,0xF7,0xBF,0x02,0x23,0x39,0xC2,0x30,0x75,0x6A,0x58,0xE8, + 0xE3,0x30,0x81,0x30,0xA2,0x78,0xEE,0xE8,0xE3,0x38,0xA2,0x28,0xEF,0xF5,0xED,0xA2, + 0x03,0x39,0xC2,0x30,0xED,0xBD,0xAB,0x8D,0x03,0x39,0xC2,0x30,0xB7,0xEB,0x02,0xAB, + 0x23,0x39,0xC2,0x30,0xFB,0xFB,0x68,0x7A,0x04,0x39,0xA2,0x28,0xE8,0xA0,0xFA,0xED, + 0xE3,0x30,0xA2,0x28,0x5E,0xFC,0xFE,0xB3,0xC2,0x30,0x81,0x28,0x2F,0xFF,0x7A,0x20, + 0xC2,0x28,0x82,0x28,0x00,0x80,0xAD,0xFA,0xA2,0x28,0x81,0x20,0x08,0x28,0x3E,0xF5, + 0xE2,0x30,0xA2,0x28,0x5F,0xE5,0xBD,0xAD,0xE3,0x30,0xA2,0x28,0x83,0xFB,0x8E,0x83, + 0xE3,0x30,0xA2,0x28,0xAE,0xAF,0x8F,0x0E,0x02,0x39,0xA2,0x28,0xB8,0xEE,0xFF,0xFD, + 0x03,0x31,0xA1,0x28,0x2F,0xAF,0xBD,0x2F,0x24,0x31,0xC2,0x30,0xF6,0xFF,0xAB,0x2F, + 0x03,0x31,0xA2,0x30,0xAB,0xAA,0x28,0xA0,0xE3,0x30,0xC2,0x28,0xC8,0x88,0x8A,0x83, + 0x04,0x31,0xC2,0x30,0xBB,0x5D,0x5F,0xFF,0x24,0x39,0xC3,0x28,0x27,0xB7,0xBF,0xEB, + 0x23,0x39,0xE3,0x30,0x27,0xB5,0x37,0xBF,0x85,0x49,0x23,0x41,0xBF,0xA7,0x2B,0xF5, + 0x06,0x5A,0x64,0x49,0x0D,0xA5,0xF7,0xF5,0x8C,0x8B,0x06,0x5A,0x95,0x35,0x35,0x25, + 0xED,0x9B,0xAD,0x93,0x73,0xFB,0xD7,0x62,0xAC,0x93,0x6B,0x8B,0x2B,0x58,0xF0,0x68, + 0xED,0x9B,0x6B,0x8B,0xA2,0x8B,0xA5,0xD5,0x0E,0x9C,0xAC,0x93,0x02,0x2D,0xA7,0xA7, + 0x8F,0xAC,0xED,0x9B,0x2B,0xBF,0x55,0x55,0x90,0xAC,0xED,0x9B,0x28,0xAA,0xDF,0x77, + 0x90,0xAC,0xED,0x9B,0xA0,0xBB,0x7F,0x5D,0x6E,0xAC,0xCC,0x93,0xA0,0xFA,0x5F,0x57, + 0x2E,0xA4,0xCC,0x93,0x88,0xFF,0xF5,0xD5,0x2E,0xA4,0xED,0x9B,0xEC,0x2D,0x2F,0xFD, + 0x63,0x51,0x23,0x49,0xED,0xFF,0xD7,0xD5,0x43,0x51,0x23,0x49,0x00,0xAA,0xF8,0x77, + 0x22,0x49,0x02,0x41,0x78,0xDC,0xF2,0xAA,0x23,0x49,0xE2,0x40,0xBF,0x7F,0x7E,0xB6, + 0x23,0x49,0xE2,0x40,0xAA,0xFF,0xDF,0xDF,0x23,0x49,0xE3,0x40,0xAF,0x3F,0xCB,0xEB, + 0x49,0x93,0x23,0x49,0x15,0x35,0x35,0x25,0x8A,0x9B,0x69,0x93,0x62,0x58,0x7C,0x5E, + 0x8A,0x9B,0x28,0x93,0xFF,0x9F,0x3F,0x2F,0x8A,0x9B,0x29,0x93,0xF7,0xFC,0xA0,0xAA, + 0xAB,0x9B,0x67,0x7A,0x02,0xA2,0xEA,0x58,0x49,0x8B,0x46,0x72,0x78,0x76,0xD7,0x75, + 0x87,0x72,0x46,0x72,0xB7,0xEB,0xEA,0x2F,0xA7,0x7A,0xA5,0x59,0x8A,0xA8,0xE2,0x78, + 0x05,0x62,0x02,0x41,0xF8,0xDE,0x77,0xD7,0x84,0x51,0x23,0x41,0xF5,0xBD,0x29,0x0F, + 0xA4,0x51,0x64,0x49,0x7B,0x5A,0xDA,0xD7,0x84,0x49,0x44,0x49,0xB7,0xED,0xB4,0xB8, + 0x64,0x49,0x24,0x41,0xFE,0xDE,0x7A,0x58,0x23,0x41,0xE3,0x38,0xBA,0xF0,0xF0,0xA0, + 0xA5,0x51,0xA2,0x38,0x03,0x2B,0xBF,0xD7,0x84,0x51,0x23,0x41,0x78,0xF8,0xF8,0x79, + 0x03,0x41,0xC2,0x38,0xBC,0xD6,0xF7,0xB8,0xE3,0x30,0xA2,0x30,0x02,0x0E,0xE8,0x70, + 0xE3,0x30,0x61,0x18,0xA2,0xFA,0x7F,0x5F,0x81,0x20,0x41,0x18,0xB8,0xBC,0x3F,0x3D, + 0xE3,0x30,0x81,0x20,0x2D,0x29,0x2B,0xFF,0x24,0x39,0x61,0x20,0x02,0x80,0xFB,0xFF, + 0x44,0x41,0xA2,0x28,0x80,0xFE,0x55,0x55,0x43,0x41,0xA2,0x28,0xAA,0xAB,0xEF,0xB5, + 0x03,0x39,0xC2,0x30,0xDE,0xA8,0xF8,0xEA,0x03,0x39,0xC2,0x30,0xFA,0xEF,0xD5,0x77, + 0x03,0x39,0xA2,0x28,0xAB,0x8F,0xFF,0xB5,0xE3,0x38,0xC2,0x28,0xE2,0xEC,0xFE,0xE2, + 0xE3,0x30,0x81,0x28,0xA2,0x62,0x5E,0x7E,0xE3,0x30,0x81,0x20,0x2B,0xBF,0xB5,0xA5, + 0xE3,0x30,0xC3,0x28,0xA2,0x82,0x0F,0x0D,0x03,0x31,0xA2,0x30,0x7A,0xB2,0xEA,0x6A, + 0xE3,0x30,0xA2,0x28,0x6D,0xFE,0xBA,0xAF,0x03,0x39,0x81,0x20,0x55,0xEE,0xA8,0x80, + 0x03,0x39,0xA1,0x28,0xAD,0x2F,0xA2,0x82,0xE3,0x30,0xC2,0x28,0x1C,0x2E,0x9F,0xDF, + 0xE3,0x30,0xA2,0x28,0x2A,0xEE,0xBE,0xE7,0xE3,0x30,0xA2,0x28,0xAF,0xAF,0xF5,0xDD, + 0x03,0x31,0xC2,0x30,0xBE,0x8E,0x09,0xED,0x03,0x31,0xC2,0x28,0x08,0x78,0x72,0xE0, + 0x03,0x39,0xC2,0x28,0x6C,0x5F,0x57,0xEF,0xE3,0x30,0xA2,0x28,0x21,0x3F,0xB8,0xA8, + 0x23,0x31,0xC2,0x30,0xDD,0x5D,0xFF,0xF6,0x23,0x39,0xE2,0x30,0xFF,0xFD,0x7D,0x8D, + 0x03,0x39,0xA1,0x28,0x22,0x3E,0xB8,0x9E,0x84,0x51,0x03,0x39,0xBF,0xFD,0xBF,0x09, + 0xE5,0x59,0x44,0x41,0xB5,0xB7,0x2F,0x2B,0xAC,0x93,0x25,0x62,0x25,0x2D,0x0D,0x29, + 0xEE,0x9B,0xAC,0x93,0x82,0x80,0x80,0xF7,0xCD,0x93,0x6B,0x8B,0x7C,0x50,0x78,0x5E, + 0x6B,0x8B,0x0A,0x7B,0x20,0xB8,0xE8,0x62,0xED,0x9B,0x4B,0x83,0x0A,0x2B,0x29,0xAD, + 0x0D,0x9C,0xAC,0x93,0xA0,0x8B,0xAA,0x7F,0xED,0x9B,0xCD,0x93,0x88,0x02,0xA8,0xFD, + 0xED,0x9B,0xAC,0x93,0xF8,0xAB,0x7B,0x5F,0xCD,0x93,0x8C,0x8B,0x28,0x80,0x08,0x2F, + 0xCD,0x93,0x8C,0x8B,0x28,0xBA,0xEF,0xEB,0x0E,0x9C,0xAC,0x93,0x0B,0xBF,0xB5,0xF5, + 0x43,0x49,0x02,0x49,0xAA,0xFE,0x57,0xD7,0x23,0x49,0x02,0x41,0x81,0x7A,0xFB,0xE9, + 0x23,0x49,0xE2,0x40,0xE3,0xCB,0x98,0x56,0x02,0x41,0xE2,0x38,0x08,0xCC,0x72,0x72, + 0x02,0x41,0xC2,0x38,0x2A,0x0A,0x23,0x3B,0x23,0x49,0xE2,0x40,0xEF,0xFB,0xAB,0x2B, + 0x6A,0x93,0x03,0x49,0x25,0x25,0x25,0xB5,0x8A,0x9B,0xE8,0x82,0x20,0x20,0xA2,0x55, + 0x8A,0x9B,0xE8,0x82,0xE2,0x7A,0x7E,0x55,0x6A,0x93,0x87,0x7A,0x0A,0xAF,0xFF,0x7F, + 0x29,0x93,0xE5,0x61,0x70,0xDC,0x5E,0x57,0x46,0x6A,0xE5,0x61,0x00,0x2B,0xAA,0xFD, + 0xC8,0x7A,0x84,0x59,0x2A,0xAA,0xFA,0x5F,0x67,0x72,0x43,0x49,0x70,0x5E,0x77,0xD5, + 0x63,0x49,0x02,0x41,0xFE,0x6A,0xDC,0x3E,0xA5,0x51,0x02,0x41,0x8B,0xAD,0xAD,0xB8, + 0x84,0x51,0x64,0x49,0xA7,0x09,0x79,0x6B,0x84,0x51,0x24,0x41,0xF0,0x7A,0xFE,0xEE, + 0x64,0x49,0x03,0x41,0xA8,0xEA,0xEE,0x5E,0x64,0x41,0x03,0x41,0x7B,0xFF,0x7F,0x5D, + 0x23,0x41,0xC2,0x38,0x5A,0x6A,0xEA,0xA8,0x44,0x49,0xC2,0x38,0x0D,0x2D,0x0B,0xAA, + 0x43,0x49,0xC2,0x30,0xFE,0xF8,0xDE,0xDE,0x03,0x39,0x81,0x28,0x68,0x78,0x78,0xFA, + 0xA2,0x28,0x61,0x20,0x57,0x5E,0xF6,0xB6,0xC2,0x28,0x41,0x18,0xBD,0xAF,0x8B,0x2A, + 0xA2,0x28,0x81,0x20,0x9D,0xCD,0xA1,0xBA,0xC2,0x28,0x81,0x20,0xAF,0xBF,0xFE,0xDF, + 0xA2,0x28,0x81,0x20,0xA2,0xFF,0xFB,0x5B,0xE3,0x30,0x81,0x28,0x25,0xB5,0xF5,0xD5, + 0x03,0x39,0xC2,0x30,0xBA,0xFB,0xF5,0xB9,0xE2,0x30,0xA2,0x28,0x78,0x7C,0xF8,0xCA, + 0xE3,0x30,0xA2,0x30,0x35,0xB5,0xE7,0xAF,0xE3,0x30,0xA1,0x28,0x88,0xAA,0xFB,0x59, + 0xE3,0x30,0x81,0x28,0xFE,0xE0,0xFB,0x7F,0xC2,0x28,0x61,0x20,0x8B,0xAA,0x02,0x0A, + 0xE3,0x30,0xA2,0x28,0xBF,0xAB,0xAD,0x27,0x03,0x39,0xA2,0x30,0xF2,0xEB,0xEF,0xAF, + 0x03,0x39,0xA2,0x28,0xEF,0xAD,0xBF,0x23,0x03,0x39,0xA2,0x28,0xEB,0xB2,0xA8,0xD8, + 0x23,0x39,0xC2,0x30,0xB9,0xEF,0x1F,0xBF,0x23,0x39,0xC2,0x30,0xDF,0x57,0x76,0xF2, + 0x03,0x31,0xA1,0x28,0xB7,0x3F,0x2E,0xAF,0x03,0x31,0xA2,0x28,0x7F,0xDE,0x58,0xEA, + 0x04,0x31,0xA2,0x28,0xAA,0xB7,0xD7,0x57,0x04,0x31,0xC2,0x30,0xFA,0x7A,0xF6,0xDD, + 0x03,0x31,0xA2,0x28,0x8A,0xE6,0xFB,0xAB,0x03,0x31,0xC2,0x28,0xDF,0xDD,0xFF,0x2B, + 0x03,0x31,0xE2,0x30,0x85,0x8B,0xE2,0x58,0x23,0x39,0xE2,0x30,0x87,0x2F,0xF5,0xD5, + 0x23,0x39,0xE2,0x30,0x5E,0xFB,0xFF,0x3B,0xA5,0x51,0x02,0x39,0xAD,0xAD,0xAF,0x0F, + 0x88,0x72,0x63,0x49,0x95,0xF5,0xB5,0x2F,0x8C,0x93,0xA9,0x7A,0x09,0x01,0xF9,0x7E, + 0x8C,0x8B,0x68,0x6A,0x00,0x80,0xDF,0x57,0x8C,0x8B,0x06,0x62,0x80,0xA8,0x5F,0xF7, + 0x2A,0x7B,0x06,0x5A,0x00,0xFA,0x55,0xFF,0x8B,0x8B,0x27,0x62,0x0A,0xAF,0xD5,0xFF, + 0x8C,0x93,0x27,0x62,0xA0,0x7E,0x5F,0x7F,0xCD,0x93,0x47,0x62,0x2B,0xD5,0x55,0x55, + 0xAD,0x93,0x47,0x62,0x00,0x02,0xAD,0x95,0xAC,0x93,0x4B,0x83,0x02,0xAB,0x23,0xBD, + 0xAC,0x93,0x6C,0x8B,0x00,0x00,0x8B,0xE9,0xCD,0x93,0x6B,0x8B,0x2E,0xAB,0xB7,0xFF, + 0x03,0x49,0x22,0x41,0x80,0xAA,0xAA,0x82,0x23,0x49,0xE2,0x40,0xB0,0xAB,0xCE,0xBF, + 0x23,0x41,0xE2,0x40,0x95,0xFA,0x12,0xE2,0x23,0x41,0xE2,0x40,0xDB,0xBB,0xAA,0xA2, + 0x23,0x49,0xE2,0x40,0xD7,0xBF,0xEA,0xBA,0x43,0x49,0x02,0x41,0xEF,0xFE,0x7F,0x5B, + 0x63,0x51,0xE2,0x40,0x2F,0xFD,0x57,0x5F,0x66,0x72,0x22,0x49,0x0B,0x25,0xB5,0xB5, + 0xA7,0x7A,0xE4,0x61,0x00,0xAE,0xFD,0x5D,0xC7,0x82,0x64,0x51,0xA0,0xE2,0x7B,0x7F, + 0xC5,0x61,0xC2,0x40,0x00,0xAA,0x7E,0x5F,0xC4,0x61,0x03,0x49,0x00,0x82,0x09,0x2D, + 0xA4,0x59,0x43,0x49,0x58,0x7C,0xE8,0x80,0x84,0x51,0x23,0x49,0xAD,0xBD,0x0B,0x82, + 0xA5,0x51,0x43,0x49,0x95,0x3F,0x8D,0xCA,0xA5,0x51,0x44,0x49,0xA0,0xAE,0xBE,0x77, + 0x84,0x49,0x23,0x41,0xE8,0xAA,0xFA,0xDE,0x64,0x51,0x44,0x49,0xEB,0x55,0x79,0x8D, + 0xE6,0x61,0x23,0x49,0x55,0x95,0x2D,0x02,0x06,0x6A,0x23,0x41,0x75,0x2A,0xA0,0xAA, + 0xA5,0x59,0x23,0x41,0x55,0x58,0xE0,0x60,0x64,0x49,0xE2,0x38,0xFE,0x78,0xFA,0x7F, + 0x23,0x41,0xC2,0x30,0xDE,0xF8,0xE2,0xFA,0x03,0x39,0xA2,0x28,0x78,0x60,0x42,0x4B, + 0x03,0x31,0x61,0x20,0xF7,0xAF,0x0D,0x2D,0xE3,0x30,0x81,0x20,0xF7,0xA0,0xE0,0xE8, + 0xC2,0x28,0x82,0x20,0xF8,0xE0,0xE8,0xBA,0xC2,0x28,0x81,0x20,0xDD,0xDD,0x9F,0x3F, + 0x24,0x39,0x81,0x28,0x75,0x5D,0xED,0x80,0xC2,0x30,0x61,0x28,0xBF,0xBD,0xBF,0xE0, + 0x24,0x41,0xA2,0x30,0xE9,0x89,0x0B,0x09,0x43,0x41,0xA1,0x30,0x7F,0xFA,0xFA,0xE8, + 0xE2,0x38,0xA2,0x30,0xF7,0x57,0x57,0x5A,0x03,0x31,0xA1,0x28,0x75,0xF5,0xAD,0x0F, + 0x24,0x39,0x81,0x28,0xD5,0x7F,0xAA,0x00,0x03,0x39,0x81,0x28,0xFD,0x5D,0xFF,0xA8, + 0x04,0x31,0x82,0x28,0x2F,0x35,0x3F,0xAB,0x03,0x31,0xC2,0x30,0xFA,0x92,0xB0,0x62, + 0xE3,0x30,0xA2,0x30,0x00,0x00,0xBB,0xDA,0x03,0x39,0xA2,0x30,0x6A,0xB8,0xFA,0xFA, + 0x03,0x31,0xA2,0x30,0xBF,0x3D,0xBF,0xBB,0x24,0x39,0xE3,0x30,0xDE,0xFA,0xFE,0xFA, + 0x02,0x31,0xA1,0x28,0xEE,0xFA,0xF2,0xF8,0xE2,0x30,0xC2,0x28,0xF8,0xDC,0xD5,0x7D, + 0xC2,0x28,0xA2,0x28,0x38,0x00,0x02,0xE9,0xE3,0x30,0xA1,0x28,0xA2,0x03,0x2E,0xE7, + 0x03,0x31,0xE3,0x30,0x55,0xDF,0x97,0x95,0x03,0x31,0xC2,0x28,0x2B,0xAF,0xAE,0xFE, + 0x03,0x31,0xE2,0x30,0x6A,0x4A,0xB7,0x75,0x03,0x39,0xC2,0x30,0xAE,0x3F,0x1E,0x1C, + 0x64,0x49,0x03,0x39,0xE7,0xAF,0x27,0x25,0xA5,0x51,0x03,0x41,0x09,0xAF,0xBE,0x22, + 0x4E,0xA4,0xC5,0x59,0xB5,0xB5,0x25,0x2D,0xAF,0xB4,0xCC,0x9B,0xFD,0xAB,0xA2,0x80, + 0xAF,0xB4,0x8B,0x93,0x57,0xEA,0x88,0x02,0x8F,0xB4,0x2A,0x83,0x55,0xEA,0x00,0x00, + 0x2E,0xAC,0xE9,0x7A,0x55,0x7F,0x7E,0x78,0x0A,0x7B,0xA8,0x72,0xDA,0xF8,0xE8,0x78, + 0xE9,0x7A,0x67,0x62,0xFA,0xA0,0xBB,0xD7,0xE9,0x72,0x67,0x6A,0xF7,0xF6,0xFE,0xB2, + 0xC9,0x72,0x46,0x62,0x5D,0x7F,0xFE,0xE8,0x6B,0x83,0x27,0x62,0x03,0x2F,0xD5,0x57, + 0x6B,0x8B,0x47,0x62,0x00,0x00,0x00,0x09,0x8C,0x8B,0x4B,0x83,0x0D,0x8B,0xEC,0xE8, + 0x03,0x49,0xE2,0x40,0x10,0x82,0x52,0x7F,0x03,0x41,0xE2,0x40,0x26,0x26,0x86,0x3C, + 0x23,0x49,0xE2,0x40,0x7F,0xAE,0xAA,0xAE,0x23,0x49,0x02,0x41,0xD5,0x3F,0x7C,0xE7, + 0x43,0x49,0x02,0x41,0xD7,0xD4,0x7A,0xE8,0x23,0x49,0x03,0x41,0x29,0x02,0x77,0x5F, + 0x23,0x49,0xC2,0x38,0xF8,0xE2,0xCA,0x8F,0x84,0x59,0xC2,0x40,0x2F,0x3D,0xFF,0xFF, + 0x26,0x6A,0x43,0x49,0x8A,0xA2,0xFD,0x55,0xC5,0x59,0xC2,0x40,0xA8,0xFE,0x7F,0x5F, + 0x03,0x41,0xC2,0x40,0x8A,0xCE,0xBF,0xEF,0x05,0x62,0x03,0x49,0xAD,0x2D,0x8D,0x2D, + 0xE5,0x61,0x84,0x59,0x7E,0x7A,0x6A,0xEC,0xE6,0x59,0x64,0x51,0xF5,0xDD,0xFF,0xEB, + 0xA5,0x51,0x64,0x49,0xE2,0x60,0x78,0x5A,0x85,0x51,0x22,0x39,0xEA,0xAA,0xAA,0xA0, + 0x64,0x49,0x23,0x41,0xFA,0xE8,0xA8,0x22,0x66,0x72,0x43,0x49,0xAD,0x2B,0x8A,0xA2, + 0x46,0x6A,0x22,0x49,0xA0,0xEC,0xFA,0x7A,0xA4,0x59,0xE2,0x38,0xA8,0xF8,0xDE,0x55, + 0xA4,0x51,0x03,0x41,0x70,0x7A,0xFA,0x6F,0x23,0x41,0xC2,0x30,0xEE,0x96,0xFF,0x2A, + 0x03,0x39,0xA2,0x30,0x6A,0xFE,0xF8,0xFE,0xC2,0x30,0x82,0x28,0xBB,0xD7,0xEC,0xEA, + 0xE3,0x30,0x82,0x20,0x25,0xA7,0xAD,0xAD,0xC3,0x30,0xA2,0x28,0x7C,0xA8,0x8B,0xFB, + 0x44,0x41,0xA2,0x28,0xD5,0xB5,0x25,0x0D,0x64,0x49,0xC3,0x30,0xAD,0xAA,0x28,0x82, + 0x45,0x41,0xE3,0x38,0xB8,0x54,0x56,0x5E,0x23,0x41,0xC2,0x38,0xDE,0xA8,0xA2,0xFA, + 0x23,0x41,0xE2,0x38,0x3D,0x97,0xBB,0x7F,0x64,0x49,0x03,0x41,0xFA,0x82,0x0B,0x95, + 0x44,0x49,0xA1,0x28,0x7E,0x58,0x70,0xE8,0xE3,0x30,0x81,0x28,0x0B,0xBA,0xD7,0xAE, + 0x44,0x39,0xA2,0x30,0x2A,0xBF,0xAD,0xF7,0x24,0x39,0xC2,0x28,0xE8,0xBE,0xFF,0x7B, + 0xE3,0x30,0x81,0x28,0x08,0x08,0xBE,0xFD,0xE3,0x30,0xA2,0x28,0x40,0xF8,0xEA,0xFF, + 0xC2,0x30,0xA2,0x28,0x92,0xF6,0xAF,0x58,0x03,0x39,0xC2,0x28,0xAB,0x8E,0xED,0x5D, + 0xE2,0x30,0xA2,0x28,0xB8,0xBE,0xFA,0xAF,0x03,0x31,0xC2,0x28,0x8F,0x2F,0x97,0xD7, + 0xE3,0x30,0xC2,0x28,0xEC,0x62,0xAC,0xEF,0xE2,0x30,0xA1,0x28,0xBE,0x3F,0xBA,0xEA, + 0xE2,0x30,0xA2,0x28,0x62,0x8E,0xAA,0x8B,0x03,0x31,0xA1,0x28,0xFD,0xAF,0x8B,0x2B, + 0x03,0x31,0xC2,0x30,0x8E,0x2E,0x37,0x57,0x03,0x39,0xC2,0x30,0xFA,0x80,0x0A,0xAF, + 0x03,0x39,0xC2,0x30,0xD7,0xBE,0xB8,0xAA,0x03,0x39,0xC2,0x30,0xBF,0xDB,0x72,0x62, + 0x64,0x49,0xA2,0x30,0x2F,0x2F,0x3F,0xBF,0xE9,0x7A,0x23,0x41,0xFF,0xFF,0xBD,0x35, + 0x11,0xC5,0xA9,0x72,0x25,0x2D,0x03,0x02,0x30,0xCD,0x8E,0xB4,0x7F,0xFF,0x7E,0xE8, + 0xAF,0xBC,0x6E,0xAC,0x2B,0x28,0xEF,0x94,0xD0,0xBC,0x6E,0xB4,0xAA,0x88,0xEB,0x77, + 0x8F,0xB4,0x2B,0x83,0x78,0xE0,0xA0,0x88,0x2D,0xA4,0xA9,0x72,0x77,0x7F,0xFE,0x60, + 0xC9,0x72,0x46,0x62,0xDF,0x7C,0x6A,0xA8,0xE9,0x72,0x67,0x6A,0xAF,0xA9,0xAD,0x2F, + 0x0A,0x7B,0xA8,0x6A,0x7F,0xE2,0x8A,0x0A,0xE9,0x7A,0x06,0x5A,0x7A,0xFA,0xC8,0xA8, + 0xEA,0x7A,0xE6,0x59,0x35,0xD5,0x5F,0x7E,0x6B,0x83,0xA5,0x49,0x00,0x03,0xBD,0x55, + 0x23,0x49,0xE2,0x40,0xFB,0xE8,0xAA,0x79,0x23,0x49,0xE2,0x40,0xCB,0x5B,0x56,0xB7, + 0x23,0x49,0xE2,0x40,0x8A,0xAA,0x7B,0xDC,0x23,0x49,0xE2,0x40,0xAF,0x00,0xAA,0xEB, + 0x23,0x41,0xE2,0x40,0x80,0x00,0xA2,0x68,0x23,0x49,0xC2,0x38,0xE0,0xFE,0xBF,0xAE, + 0x03,0x41,0xE2,0x40,0x09,0x43,0x5E,0xBD,0x23,0x49,0xE2,0x40,0xAA,0xBB,0xFF,0xE5, + 0x02,0x41,0xE2,0x40,0x23,0xAF,0x09,0x9D,0x23,0x49,0xC2,0x38,0x7A,0xDC,0xEE,0xFF, + 0x03,0x49,0xE2,0x40,0x05,0xBF,0x97,0x7D,0x26,0x6A,0x03,0x49,0x2D,0x29,0x0D,0x0D, + 0x06,0x62,0xA4,0x59,0x7C,0xD8,0xE8,0xAA,0xE5,0x61,0x84,0x51,0x5D,0xF8,0x6A,0x7C, + 0x84,0x51,0x03,0x41,0xA0,0xBA,0xDE,0xFE,0x64,0x49,0x23,0x41,0x80,0x80,0x9A,0xD5, + 0x64,0x49,0x03,0x41,0xAA,0xE2,0x6A,0xC7,0x26,0x6A,0x03,0x49,0x03,0x0B,0xAD,0xA5, + 0xE5,0x61,0x61,0x28,0xE0,0x78,0x7E,0x7A,0xC2,0x38,0x61,0x28,0x8A,0xA5,0xD5,0xAC, + 0x23,0x41,0xC2,0x30,0xC3,0xF9,0x7D,0xD5,0x23,0x39,0xC2,0x30,0x22,0xA2,0xF2,0x52, + 0x03,0x39,0x82,0x20,0xA0,0x8A,0xEA,0x7F,0xC2,0x28,0x61,0x20,0xA2,0xA8,0xBF,0xF5, + 0xC2,0x28,0x82,0x20,0x2A,0x0F,0x0D,0x2F,0xE2,0x28,0x81,0x28,0xEE,0x9A,0xBC,0xFA, + 0x44,0x41,0xC2,0x30,0x25,0x25,0x2D,0xAD,0x44,0x49,0x81,0x28,0x00,0xA0,0x5A,0x5E, + 0x44,0x49,0x61,0x20,0xA8,0xAA,0xF7,0xFD,0x03,0x41,0x81,0x28,0xA8,0xAA,0xAA,0x7D, + 0x03,0x41,0xC2,0x38,0xF0,0xC0,0x02,0x89,0x23,0x41,0xC2,0x38,0x37,0xBF,0x3F,0xEB, + 0x23,0x41,0xE2,0x38,0xE0,0xFF,0xBE,0xFE,0x03,0x41,0xA2,0x28,0x5F,0x7E,0xF8,0xF8, + 0xE3,0x30,0x61,0x28,0xAA,0xBC,0x7B,0xEA,0xE3,0x30,0x81,0x28,0xE8,0xF7,0xD5,0xF5, + 0xC2,0x28,0x82,0x28,0xDA,0x82,0x03,0xB5,0xE3,0x30,0xA2,0x28,0x75,0xEA,0x82,0x3F, + 0x03,0x31,0x82,0x28,0x7F,0x7E,0xE8,0xA2,0xC2,0x28,0x81,0x28,0xE3,0xAD,0xFF,0xA0, + 0xE3,0x30,0xA2,0x28,0x9D,0x77,0xAF,0xAF,0x03,0x31,0xC2,0x30,0x67,0xEF,0xCA,0xFB, + 0x03,0x31,0xC2,0x28,0xD5,0xD5,0x8F,0x0E,0x02,0x31,0xC2,0x28,0xA5,0x95,0xFF,0xDB, + 0x03,0x31,0xC2,0x28,0xEE,0xB8,0x6E,0xEE,0x24,0x39,0xC2,0x30,0x3B,0x2B,0x2B,0xED, + 0x23,0x39,0xC2,0x30,0x56,0xDE,0xDE,0x3F,0x23,0x39,0xE2,0x30,0x55,0x5D,0xD5,0xBC, + 0x24,0x39,0xC2,0x30,0xFD,0xB7,0xFF,0xFC,0x03,0x41,0xE3,0x30,0x77,0xEA,0xAA,0x2F, + 0x64,0x49,0xC2,0x38,0xFD,0xA5,0xAB,0x2F,0x0C,0xA4,0x85,0x51,0xB5,0x35,0x3D,0x2D, + 0x31,0xCD,0xAF,0xB4,0x03,0x89,0x29,0xA9,0x31,0xC5,0xD0,0xBC,0x80,0x00,0xAA,0xF9, + 0x10,0xC5,0x8E,0xB4,0x7E,0xE0,0x00,0x08,0x10,0xC5,0x4D,0xAC,0xD7,0x5E,0xF8,0x80, + 0xD0,0xBC,0x4E,0xAC,0x57,0xF5,0xF5,0xFC,0x6E,0xAC,0x6B,0x8B,0x78,0xE8,0xE0,0x80, + 0xCC,0x9B,0x88,0x6A,0x5F,0x7E,0xF8,0x88,0x0A,0x7B,0x87,0x6A,0xBD,0xBF,0xBF,0xA8, + 0x2A,0x83,0xC8,0x72,0x29,0x2F,0x2E,0x2F,0x4B,0x83,0xA9,0x6A,0x7A,0xAA,0xA0,0x82, + 0x2A,0x83,0x27,0x5A,0x7F,0xFA,0xE8,0xA0,0x88,0x6A,0x64,0x41,0x5F,0x7A,0xE8,0xE0, + 0x23,0x49,0xE2,0x40,0xDD,0xFB,0xAF,0xBB,0x23,0x49,0xE2,0x40,0xAF,0xFF,0xFA,0xA8, + 0x23,0x49,0xE2,0x40,0xFF,0xEF,0xCB,0xCB,0x23,0x49,0x02,0x41,0x6F,0xF5,0x91,0x87, + 0x03,0x41,0xC2,0x38,0xA8,0xA0,0xE0,0xBC,0x03,0x41,0xE2,0x40,0x2C,0x33,0x87,0xFF, + 0x03,0x41,0xE2,0x38,0x0A,0x0E,0xB5,0xDE,0x03,0x41,0xE2,0x40,0x6B,0xB3,0x20,0xBB, + 0x03,0x41,0xC1,0x38,0xAE,0x00,0x88,0xCF,0x23,0x41,0xE2,0x40,0xF5,0xEF,0xBF,0xFD, + 0x02,0x41,0xC2,0x40,0xA0,0x80,0xB8,0xF8,0x46,0x6A,0x02,0x41,0x8D,0x2D,0x0D,0x2D, + 0x26,0x6A,0xC5,0x59,0xDE,0xD8,0xD8,0xFA,0x05,0x62,0x03,0x41,0xE8,0xF8,0x7A,0x7C, + 0x44,0x49,0xE2,0x38,0x0A,0xA8,0xFD,0x7F,0x44,0x41,0x03,0x39,0x2E,0x2A,0x0D,0x89, + 0x44,0x41,0x03,0x41,0xEA,0xEA,0x62,0xAA,0x64,0x49,0xC2,0x30,0x2F,0xFA,0x5E,0x5E, + 0xE5,0x59,0xE3,0x38,0x82,0x8A,0xFD,0x75,0x03,0x39,0x81,0x20,0x78,0xE8,0xFC,0x7A, + 0xC2,0x30,0xA1,0x20,0xA7,0xAF,0x8B,0xAD,0xE3,0x30,0x81,0x20,0xF0,0xFA,0x6F,0x7A, + 0xC2,0x28,0x61,0x20,0x72,0x57,0x55,0xD5,0xA2,0x28,0x61,0x20,0xA5,0x2F,0x3B,0x2A, + 0xE3,0x30,0x81,0x28,0xBB,0xAB,0xAD,0x2F,0xC2,0x28,0xA2,0x28,0x00,0x33,0x1A,0xC0, + 0x24,0x39,0xA2,0x28,0x0D,0xF7,0x7F,0x57,0xE3,0x30,0x81,0x20,0x78,0xB8,0xFF,0xF5, + 0xC2,0x28,0x61,0x20,0xA9,0x88,0x00,0xA0,0xA1,0x28,0x61,0x20,0xFE,0xAE,0xEE,0xAA, + 0xE3,0x38,0x81,0x28,0x03,0x29,0xB5,0xBD,0x03,0x41,0xC2,0x30,0x0B,0xA2,0x22,0xB5, + 0x23,0x41,0xE2,0x38,0x5A,0xAA,0x88,0x08,0x23,0x41,0xA2,0x30,0xFE,0x5A,0x58,0xF8, + 0xC2,0x30,0x82,0x28,0xA8,0xA8,0xAA,0x2D,0xE3,0x30,0x81,0x28,0x6A,0xCA,0x0B,0xAF, + 0xE3,0x30,0x81,0x28,0x55,0x55,0xFE,0x62,0xC2,0x28,0x82,0x28,0x2F,0xED,0x95,0xBD, + 0x03,0x39,0xA2,0x28,0xCB,0xED,0xEF,0xEB,0xC2,0x28,0x81,0x28,0xAA,0xFE,0x7E,0xEE, + 0xE3,0x30,0x81,0x20,0xAB,0xBF,0x95,0xAF,0xE3,0x30,0xA2,0x28,0xBE,0x9F,0xD7,0xB7, + 0x03,0x39,0xA2,0x28,0x2A,0x8B,0xAD,0xAF,0x03,0x31,0xA2,0x28,0xEA,0xAE,0x8D,0x79, + 0x03,0x31,0xC2,0x28,0xAB,0x5B,0x7E,0x7D,0xC2,0x30,0xE3,0x28,0xBA,0xE8,0x0A,0xA2, + 0x23,0x41,0xC2,0x30,0xF9,0xAF,0x09,0xAF,0x23,0x41,0x03,0x39,0x5E,0x67,0x96,0x16, + 0x23,0x41,0xE3,0x38,0x72,0x22,0x0B,0x3E,0x44,0x49,0xE2,0x38,0xF5,0x2B,0x23,0xA2, + 0xC6,0x59,0x23,0x41,0xB5,0x2F,0x3B,0x0B,0xEE,0xA3,0xE6,0x59,0x2D,0xA5,0xBF,0xEF, + 0xF0,0xBC,0x2B,0x8B,0x00,0x0B,0xBD,0x55,0xF0,0xBC,0xAB,0x93,0x00,0x00,0x02,0xA5, + 0x10,0xC5,0xF0,0xBC,0x8D,0xA7,0xAF,0xBD,0x10,0xC5,0xCF,0xBC,0xA8,0xA0,0xBE,0x7E, + 0xF0,0xBC,0x8F,0xB4,0x78,0x08,0x22,0x0A,0xF0,0xBC,0x4E,0xAC,0x77,0x78,0x60,0x80, + 0x4E,0xAC,0xAC,0x93,0x5F,0xFA,0xEA,0xA8,0x2D,0xA4,0x09,0x7B,0x5F,0xE8,0x02,0x80, + 0x2D,0x9C,0x0A,0x7B,0x55,0x5F,0xE2,0x00,0xCC,0x93,0x2A,0x7B,0xF5,0x7D,0xFF,0xA0, + 0xCB,0x93,0xEA,0x7A,0x7F,0xFE,0xFB,0x80,0x8B,0x8B,0x27,0x5A,0x7F,0x7A,0xFA,0xA8, + 0x23,0x49,0xE2,0x38,0xBF,0x8B,0xAB,0x6C,0x23,0x49,0xE3,0x40,0x8A,0xAA,0xA6,0xED, + 0x23,0x49,0xE3,0x40,0xA2,0xEE,0xBE,0xFE,0x23,0x49,0xE2,0x40,0xF0,0x60,0xA8,0xDA, + 0x03,0x41,0xC2,0x38,0x7A,0x9C,0x6C,0xFA,0x03,0x41,0xC2,0x38,0xAB,0x0E,0xA3,0x77, + 0x03,0x41,0xC2,0x38,0x3E,0xAB,0xEB,0xEF,0x03,0x41,0xC2,0x38,0xB2,0xFE,0xFC,0xEC, + 0xE2,0x40,0x03,0x31,0x28,0x08,0x80,0x2A,0x03,0x41,0xE2,0x40,0xED,0x59,0xED,0xC3, + 0x03,0x41,0xC2,0x40,0x3A,0x28,0xEF,0x2A,0x67,0x72,0x02,0x41,0x2D,0x25,0x25,0x25, + 0x46,0x6A,0xE5,0x61,0xDC,0x78,0x5A,0xF8,0xE5,0x59,0x03,0x41,0x78,0x78,0x5C,0x58, + 0x44,0x41,0xE3,0x38,0xAF,0x8F,0xED,0xF9,0x23,0x39,0xE3,0x38,0xF2,0x78,0x8F,0xAE, + 0x43,0x41,0xE3,0x30,0x82,0xBF,0xDF,0x7F,0x44,0x41,0xE2,0x30,0x7A,0xF8,0xAA,0xED, + 0x23,0x39,0xC2,0x30,0x7F,0x7F,0x78,0xA2,0xE2,0x30,0xA1,0x28,0xEE,0xFF,0x57,0xF8, + 0xE3,0x28,0xA2,0x28,0xAF,0x7F,0x55,0xA6,0xE2,0x28,0x81,0x20,0x5E,0x5F,0xFB,0x20, + 0xE3,0x30,0x81,0x20,0xD5,0xAD,0x2A,0xAA,0xE3,0x30,0xA2,0x28,0xD5,0xE5,0xBB,0xAE, + 0xE3,0x30,0xA2,0x28,0x2F,0xBF,0xEA,0xA3,0xE3,0x30,0xA2,0x28,0x6A,0xE8,0x20,0x28, + 0xE3,0x30,0xA2,0x28,0xDF,0xEE,0xB8,0xEC,0xE2,0x28,0xA2,0x28,0x55,0x57,0xF6,0xF2, + 0xC2,0x28,0x81,0x20,0x63,0x6B,0xAF,0xD7,0xC2,0x28,0x82,0x20,0xEF,0xEE,0xC8,0xCE, + 0xC2,0x28,0x82,0x20,0x8B,0x8A,0xBB,0x57,0xC2,0x30,0x61,0x20,0x2A,0xBF,0xBF,0xF6, + 0x24,0x41,0x81,0x20,0x0A,0xAF,0xDD,0xD7,0x44,0x41,0xC2,0x30,0x60,0xE0,0xE3,0xFD, + 0xE3,0x30,0x81,0x28,0xF5,0xFF,0xEA,0x88,0xE2,0x30,0xA2,0x28,0x5D,0x55,0xD7,0xAA, + 0xE3,0x30,0xA2,0x28,0xBF,0x35,0x2B,0xA0,0x23,0x39,0xA2,0x28,0xFD,0xAA,0x8E,0x0B, + 0x44,0x41,0xA2,0x30,0x5D,0x7F,0xA2,0x02,0x24,0x39,0x81,0x28,0xD7,0x5F,0xFE,0x88, + 0x03,0x31,0xA2,0x28,0x89,0x0D,0xEB,0xAF,0xE3,0x30,0xA2,0x28,0xBE,0x78,0x78,0xFE, + 0xC2,0x28,0x82,0x28,0x00,0xEA,0xEB,0xFA,0xC2,0x28,0x81,0x28,0xA2,0x83,0x0D,0xC5, + 0xC2,0x30,0xA2,0x28,0xB5,0x57,0x7F,0xE9,0xC2,0x28,0x82,0x28,0x00,0x0B,0x0D,0x2E, + 0x03,0x39,0xC2,0x28,0xBB,0xDD,0x6F,0x8A,0x02,0x39,0xC2,0x30,0x2A,0xBD,0xFD,0xA7, + 0x64,0x49,0xE2,0x38,0xB7,0x8F,0x8D,0xBD,0xA5,0x51,0x03,0x41,0xFD,0x3D,0x27,0xAF, + 0x47,0x6A,0x64,0x51,0xBD,0xAD,0x2F,0x2F,0x0A,0x83,0x68,0x6A,0x09,0x09,0x0B,0x0B, + 0x0A,0x83,0xE9,0x7A,0x33,0x3D,0xA8,0x30,0xAC,0x9B,0xE9,0x7A,0x2B,0xB7,0xDD,0x55, + 0xD0,0xBC,0xEA,0x82,0x0A,0xBF,0xFD,0xD5,0xCF,0xBC,0x4B,0x8B,0x00,0x00,0x2F,0xD5, + 0xF0,0xBC,0x0E,0xA4,0x00,0x00,0x00,0x2D,0x10,0xC5,0xAE,0xB4,0x7A,0x6A,0xEA,0xC8, + 0x8E,0xB4,0x2D,0xA4,0x77,0xD6,0xDC,0xB8,0x6E,0xAC,0x0D,0xA4,0xF5,0xDE,0xFA,0xE8, + 0x4E,0xAC,0x0D,0xA4,0xAD,0x9E,0xFE,0x0A,0x4E,0xAC,0x2D,0x9C,0x7A,0xBB,0xAB,0x0A, + 0x6E,0xAC,0x2D,0xA4,0x55,0xF2,0xE2,0xA8,0x4E,0xA4,0x6B,0x83,0x7E,0xA0,0x80,0x00, + 0x03,0x41,0xC1,0x38,0xF0,0x98,0xF8,0xAA,0x43,0x41,0xE2,0x40,0x77,0xF5,0xFF,0x9F, + 0x23,0x49,0xE3,0x40,0xA2,0x2F,0xEB,0x7B,0x03,0x41,0xC2,0x38,0x80,0xA0,0xF2,0x60, + 0x02,0x41,0xC2,0x38,0xFB,0xDB,0xF3,0x3E,0x03,0x41,0xC2,0x38,0xEA,0x79,0xBA,0xAE, + 0x03,0x41,0xE2,0x38,0x3D,0x2D,0xEF,0x55,0x03,0x41,0xC2,0x38,0xEE,0xEB,0x8D,0x3B, + 0x03,0x41,0xE2,0x38,0x1E,0xB3,0xFF,0x6F,0x02,0x41,0xC2,0x38,0xAA,0x9F,0xBE,0xFB, + 0x03,0x41,0xC1,0x38,0xAA,0x9A,0xFA,0xEF,0x46,0x6A,0xE2,0x40,0x25,0x35,0x25,0x35, + 0x66,0x72,0xE5,0x61,0xFA,0xFC,0x78,0xE8,0x05,0x62,0xE2,0x38,0x58,0x7A,0x5C,0x78, + 0x03,0x39,0xE2,0x30,0x02,0x2B,0xBE,0x97,0x24,0x39,0xE3,0x38,0xE2,0xAF,0xF7,0x76, + 0x23,0x39,0x03,0x39,0x6D,0xF6,0xAD,0x55,0x44,0x41,0xE2,0x30,0xFE,0x82,0xAA,0xFF, + 0x43,0x39,0xE3,0x38,0xAD,0x7F,0xFA,0x8A,0x24,0x39,0xE3,0x30,0x7B,0xA2,0xBD,0xF8, + 0x24,0x39,0xC2,0x28,0x7D,0xEE,0xA8,0x8A,0x23,0x39,0xE3,0x30,0x5D,0xD7,0xAF,0xAA, + 0x23,0x39,0xE3,0x30,0x5D,0xCE,0xAE,0xBF,0x24,0x39,0xC2,0x30,0xDF,0xFA,0xE2,0xAA, + 0x03,0x39,0xC2,0x28,0xE5,0xFA,0x20,0x20,0x03,0x31,0xC2,0x28,0xB8,0xDA,0xDC,0xA0, + 0xE3,0x30,0xC2,0x28,0xF4,0xCA,0x2E,0x3A,0xE3,0x30,0xC2,0x28,0xFF,0xBB,0xC2,0x08, + 0xE3,0x28,0x82,0x20,0x7F,0xE8,0xAA,0xA0,0xC2,0x28,0x82,0x20,0x7F,0xEE,0xE8,0x88, + 0xC3,0x28,0x82,0x20,0x75,0x7F,0x6B,0xE2,0xA2,0x28,0x81,0x20,0xA7,0x55,0x16,0x80, + 0xA2,0x28,0x82,0x20,0x3B,0x07,0xAE,0xFD,0x03,0x39,0x82,0x28,0x8F,0x89,0x0F,0xFD, + 0xC2,0x30,0xE3,0x28,0xA0,0x82,0x0B,0x08,0x03,0x39,0xC2,0x30,0xEF,0x5C,0xAB,0x3D, + 0x03,0x39,0xC2,0x30,0xEA,0x83,0xEA,0x70,0x23,0x41,0xA2,0x28,0x02,0xAB,0xBD,0xF5, + 0x64,0x49,0xE3,0x38,0xA2,0x03,0x8B,0xD5,0x64,0x41,0xC2,0x30,0xFE,0x7C,0x78,0x6A, + 0xE3,0x30,0xA2,0x28,0xFB,0xB5,0xB5,0xFE,0xE3,0x38,0xC2,0x28,0xD1,0xEA,0xB3,0x4F, + 0xC2,0x30,0x81,0x28,0xFE,0xDA,0xBE,0x8A,0xE2,0x30,0xA2,0x28,0x55,0xF5,0xDB,0xA3, + 0xE2,0x30,0xA2,0x28,0x69,0x6B,0xEF,0xAA,0xE3,0x30,0x81,0x20,0xAF,0x39,0x2B,0xAF, + 0x23,0x39,0xE2,0x30,0x09,0x29,0x9D,0x5F,0x64,0x49,0xE2,0x30,0xE7,0xBF,0x2F,0xBF, + 0x43,0x41,0x03,0x39,0x35,0xAE,0x9B,0xF8,0x26,0x62,0x23,0x41,0xFD,0xFF,0xBF,0x2D, + 0xA8,0x72,0x84,0x51,0x2D,0x2D,0x2B,0x0A,0x0A,0x83,0xA8,0x7A,0x29,0xEB,0xCD,0xFB, + 0x0A,0x83,0xC9,0x7A,0xAA,0xF9,0xDD,0xA5,0x2B,0x83,0xCA,0x7A,0xFB,0x8B,0xA9,0xB7, + 0x2A,0x83,0xC9,0x7A,0xFB,0xB6,0xB0,0x28,0x4B,0x8B,0xEA,0x7A,0x39,0x2E,0xBB,0xDF, + 0x2E,0xA4,0x2A,0x83,0x2F,0xF5,0x55,0x55,0xF0,0xBC,0x4A,0x8B,0x02,0xAF,0xD5,0x55, + 0xD0,0xB4,0x8B,0x93,0xA8,0xAA,0xAB,0xD5,0xB0,0xB4,0x2E,0xA4,0xFE,0xAA,0xAA,0xA9, + 0x8F,0xB4,0x4E,0xAC,0x5F,0xFA,0x7A,0xCA,0x8F,0xB4,0x4E,0xAC,0xD7,0xEB,0x3A,0xB2, + 0x8F,0xB4,0x4E,0xAC,0xFD,0xBE,0x3A,0x00,0xAF,0xB4,0x4E,0xAC,0x5F,0xF7,0xAF,0x80, + 0x43,0x41,0xE2,0x40,0x7D,0xEF,0x7F,0xD5,0x03,0x41,0xE2,0x38,0x7A,0xB6,0x4E,0xCA, + 0x03,0x41,0xC2,0x38,0x0A,0xBA,0xBB,0x69,0x02,0x41,0xC2,0x38,0x6E,0xF8,0x5A,0xAD, + 0x03,0x39,0xA1,0x38,0x9B,0x2A,0xAA,0x23,0xE2,0x40,0x03,0x39,0x8B,0xAB,0x3B,0x2B, + 0x03,0x41,0xC2,0x38,0x9A,0xAA,0x78,0xE3,0x02,0x41,0xC2,0x38,0xEB,0x77,0xAF,0xED, + 0x03,0x41,0xC2,0x38,0xFA,0xDF,0xAE,0x8D,0x03,0x41,0xE2,0x38,0xCF,0x96,0x55,0xFA, + 0x03,0x41,0xC2,0x38,0x73,0x7E,0xFC,0xBE,0x46,0x6A,0xE2,0x40,0x25,0x35,0x35,0x35, + 0x87,0x72,0x05,0x62,0x78,0x7A,0x58,0x7E,0x05,0x62,0xE2,0x38,0x58,0x78,0x58,0x78, + 0x03,0x39,0xC2,0x30,0xFF,0x9F,0x8A,0x23,0x23,0x39,0xE3,0x30,0xF7,0xBA,0x87,0xE7, + 0x23,0x39,0xE2,0x30,0xEB,0xBB,0x7A,0xFD,0x23,0x39,0x03,0x39,0xB2,0x98,0x36,0x55, + 0x44,0x41,0x03,0x39,0x8B,0x2A,0xEF,0xFF,0x44,0x41,0x03,0x39,0x6E,0x8E,0x8B,0xDA, + 0x44,0x39,0x03,0x39,0x5F,0x60,0x5A,0x6E,0x24,0x39,0xE2,0x30,0x0A,0xEF,0xFF,0xDF, + 0x24,0x39,0xE3,0x38,0xE0,0xCA,0x2D,0x99,0x44,0x41,0xE3,0x30,0x57,0xF5,0xAB,0xED, + 0x24,0x41,0xE3,0x30,0xBF,0xDE,0xBE,0xCA,0x03,0x39,0xE2,0x30,0x80,0x2E,0x3E,0x5E, + 0x03,0x31,0xA2,0x30,0xA8,0x2A,0x80,0xAB,0x03,0x31,0xE3,0x30,0xB5,0xC6,0x7C,0x5B, + 0x03,0x31,0xC3,0x28,0x78,0x5A,0xBE,0xB2,0x03,0x31,0xC3,0x28,0xF7,0x6A,0xEA,0xFF, + 0xE3,0x30,0xC3,0x28,0x55,0x7F,0xFF,0xB7,0x03,0x31,0xA2,0x20,0x77,0xF7,0xFF,0xFB, + 0xE3,0x28,0x81,0x20,0xD7,0xFF,0xFA,0xAA,0xA2,0x28,0x82,0x20,0xB8,0xFC,0x3A,0xA2, + 0xC2,0x30,0x81,0x20,0x2B,0xAF,0x55,0x57,0xE3,0x30,0x81,0x28,0x0A,0x2A,0x0F,0x27, + 0x03,0x39,0xA2,0x30,0x6A,0x48,0xC3,0xE2,0xE3,0x30,0xA2,0x30,0xBF,0xFB,0xEA,0xAB, + 0xE2,0x30,0xC2,0x30,0xF5,0x77,0x5D,0xA2,0x02,0x39,0xA1,0x28,0xE8,0x6F,0xEA,0x2F, + 0x03,0x39,0xA2,0x28,0xF7,0xB5,0xEF,0xA8,0xE3,0x30,0xC2,0x30,0xEF,0xB3,0x8D,0xC1, + 0xE3,0x30,0xA2,0x28,0xF7,0xFF,0xCE,0xAD,0x44,0x41,0xA1,0x28,0xFD,0xED,0x2F,0x3F, + 0x64,0x41,0xC2,0x28,0x77,0xEF,0xAE,0x2A,0x24,0x39,0xA1,0x28,0xF5,0xFE,0xAA,0x08, + 0x23,0x39,0xE3,0x30,0xB5,0xA5,0x0F,0x0A,0x43,0x41,0x03,0x39,0x2A,0xFA,0xD2,0x23, + 0xC5,0x51,0xC2,0x38,0xFF,0xAF,0x2B,0x02,0x67,0x6A,0x63,0x49,0x3D,0x8B,0x0A,0x02, + 0xC9,0x7A,0x68,0x6A,0x2D,0xB5,0xB7,0xBD,0xC9,0x7A,0x88,0x72,0xA8,0x8B,0xFD,0xEB, + 0xEA,0x7A,0x88,0x72,0x0B,0x89,0xA2,0xBF,0xE9,0x7A,0xA9,0x72,0xBC,0xAB,0xB7,0xAE, + 0x2A,0x83,0xC9,0x7A,0xA9,0x3F,0xFB,0xB5,0x0A,0x83,0xC9,0x7A,0xAC,0x28,0x7F,0xFC, + 0x2A,0x83,0xC9,0x7A,0xAA,0x8F,0xB7,0x77,0x2A,0x8B,0xC9,0x7A,0x20,0xFC,0xDE,0xAA, + 0x4B,0x8B,0xEA,0x7A,0x2A,0xBB,0x7F,0x7F,0xED,0x9B,0xC9,0x7A,0x02,0xAF,0xF7,0x5D, + 0x4E,0xAC,0xEA,0x82,0x00,0x02,0xAF,0xFD,0x6E,0xAC,0x6B,0x8B,0x00,0x00,0x02,0xAD, + 0xAF,0xB4,0x4E,0xAC,0xAA,0xA2,0xAB,0xA9,0xD0,0xB4,0x8F,0xB4,0xAF,0xEF,0xEE,0xBF, + 0x23,0x41,0xE2,0x40,0xDB,0xEF,0xAF,0x42,0x02,0x41,0xC2,0x38,0xEA,0xA0,0x48,0xCA, + 0x03,0x39,0xC2,0x38,0xDE,0xFF,0xAB,0x2E,0x03,0x41,0xC2,0x38,0x3F,0xA6,0x8A,0x02, + 0x03,0x41,0xC2,0x38,0xCD,0xAE,0xAB,0xBE,0x03,0x41,0xC2,0x38,0xFF,0xEC,0xDE,0xFE, + 0x02,0x41,0xC2,0x38,0xBB,0xFA,0xFA,0xBA,0x03,0x41,0xC2,0x38,0x78,0xEF,0x5E,0xBF, + 0xE2,0x38,0xC2,0x38,0x82,0x00,0x30,0x00,0x03,0x39,0xC2,0x38,0xBA,0x32,0xBF,0xBF, + 0x03,0x41,0xC2,0x38,0xBF,0xF7,0x9E,0x7E,0x46,0x6A,0xE2,0x38,0x35,0x35,0x35,0x35, + 0x67,0x72,0x06,0x62,0x7C,0x7A,0xEE,0xE8,0x05,0x62,0xE2,0x38,0x78,0x78,0x78,0x58, + 0x03,0x39,0xC2,0x30,0x82,0x4C,0x8A,0xF8,0x03,0x39,0xC2,0x30,0xB6,0xE5,0xBA,0xA2, + 0x03,0x39,0xE2,0x28,0xAB,0xBB,0x2D,0xA7,0x03,0x39,0xC2,0x30,0x0E,0xB6,0xBE,0x2E, + 0x23,0x39,0xC2,0x30,0x2A,0xAD,0xFF,0xEE,0x23,0x41,0xE3,0x30,0xA0,0x88,0xB3,0xED, + 0x44,0x41,0x03,0x39,0x78,0xBD,0x55,0x55,0x23,0x39,0xE3,0x38,0x9D,0x7A,0x6A,0xE6, + 0x23,0x39,0xE3,0x30,0xA9,0x99,0xBD,0xBD,0x44,0x41,0xE3,0x30,0xF5,0xDF,0xFE,0x8B, + 0x44,0x41,0xE3,0x30,0x8B,0xA7,0xDE,0xBE,0x24,0x41,0xE3,0x38,0x76,0xB8,0xBB,0x6F, + 0x23,0x39,0xE3,0x30,0x7B,0xB7,0x8A,0xAA,0x24,0x39,0xE3,0x30,0xB5,0xFF,0xF4,0xEF, + 0x23,0x31,0xE3,0x30,0xBE,0xA2,0x6F,0xD5,0x03,0x31,0xC3,0x28,0xEA,0xAA,0xAA,0x00, + 0x03,0x31,0xC2,0x28,0xB5,0xFF,0xFF,0xAA,0xE3,0x30,0xC2,0x28,0xCE,0xA8,0x00,0xF0, + 0xC3,0x30,0xE2,0x28,0x0E,0xBE,0xAE,0xB8,0xE2,0x30,0xA2,0x20,0x5F,0x5A,0xAA,0xFE, + 0xC2,0x28,0x82,0x20,0xEB,0xEE,0xBA,0xAA,0xC2,0x28,0x81,0x20,0xBF,0xFE,0xE0,0xB0, + 0x03,0x39,0x81,0x20,0x02,0x29,0xBD,0x75,0x03,0x31,0xA2,0x28,0x7F,0xF0,0xAA,0xED, + 0x03,0x31,0xC2,0x30,0xAF,0xAB,0xC0,0x80,0x23,0x31,0xC2,0x30,0xF5,0xF7,0xDF,0x7B, + 0x03,0x31,0xC2,0x30,0x5E,0x5B,0xEE,0x6F,0x03,0x31,0xC2,0x30,0x6F,0x6F,0x83,0x82, + 0x03,0x39,0xA2,0x28,0x2D,0x2B,0x2E,0x27,0x03,0x39,0xE2,0x30,0x16,0x29,0x0F,0xAC, + 0x44,0x41,0xE2,0x30,0x0A,0xEE,0xFB,0x60,0x23,0x39,0xC2,0x28,0x20,0x2A,0xFE,0xF7, + 0x23,0x39,0xC2,0x30,0xE0,0x2E,0xBA,0xDF,0x84,0x51,0xE2,0x30,0xBF,0xBF,0xBD,0x2D, + 0x27,0x62,0x84,0x49,0xAD,0xA9,0xAF,0x2B,0x68,0x6A,0xE6,0x59,0x2F,0xBD,0x2D,0x09, + 0xA8,0x72,0x68,0x6A,0x85,0x8D,0xBD,0xFB,0xC9,0x7A,0x88,0x6A,0xEF,0x1B,0xDD,0xF7, + 0xC9,0x7A,0x88,0x72,0x3F,0xB8,0xFA,0x5D,0xEA,0x7A,0xA9,0x72,0xC0,0xFB,0xE5,0x55, + 0x0A,0x83,0xA9,0x72,0xA7,0xBD,0xCD,0x7D,0x0A,0x83,0xA9,0x72,0x2E,0x3D,0xBF,0x97, + 0x0A,0x83,0xA9,0x72,0xE8,0x88,0x2A,0xB7,0x2A,0x83,0xC9,0x7A,0x8F,0xE5,0xFD,0xFF, + 0x2B,0x83,0xC9,0x7A,0xAB,0x2F,0xFB,0xDF,0x2B,0x8B,0xEA,0x7A,0x77,0x76,0x62,0xFF, + 0x2A,0x83,0xE9,0x7A,0xAD,0xF7,0xFF,0x05,0xAC,0x93,0xE9,0x7A,0x2B,0xDD,0x55,0x57, + 0x6E,0xAC,0x0A,0x83,0x0A,0xBF,0xF5,0x55,0xAF,0xB4,0x4A,0x8B,0x00,0x0A,0xAF,0x55, + 0x03,0x41,0xC2,0x38,0xC0,0xC0,0x72,0x7C,0xE2,0x40,0xC2,0x30,0xF2,0x38,0xAA,0xA9, + 0x03,0x41,0xC2,0x38,0xAB,0x0A,0xAB,0x0F,0x03,0x39,0xC2,0x38,0x2A,0xEB,0xCA,0x68, + 0x22,0x39,0xC2,0x38,0xF6,0x7F,0x7F,0xBF,0x03,0x39,0xC2,0x38,0x6E,0xC2,0xBB,0xB2, + 0x03,0x41,0xC2,0x38,0x2F,0xBF,0xEC,0xEC,0x03,0x41,0xC2,0x38,0x7F,0xE2,0x8F,0xEB, + 0x22,0x39,0xC2,0x38,0xFE,0x7F,0x5F,0xDF,0xE2,0x38,0xC2,0x38,0x33,0x00,0xB3,0xB1, + 0xE2,0x38,0xC2,0x38,0xE0,0xF8,0xDA,0x28,0x47,0x6A,0xE2,0x38,0x35,0x25,0x35,0x35, + 0x67,0x72,0xC5,0x59,0xE0,0xE0,0x60,0x78,0xA5,0x59,0x02,0x39,0x78,0x5C,0x7E,0x56, + 0x03,0x39,0xC2,0x30,0x7C,0x8A,0xB8,0x9C,0x03,0x39,0xE3,0x30,0xBE,0xD7,0xD7,0xF1, + 0x03,0x31,0xC2,0x28,0xBE,0xDC,0xA2,0x7E,0x03,0x31,0xE2,0x30,0x7F,0x65,0x75,0x72, + 0x03,0x31,0xC2,0x30,0x8A,0xAA,0x8B,0xFA,0x03,0x31,0xE3,0x30,0x8E,0x24,0x2D,0x59, + 0x23,0x39,0xE3,0x30,0xAF,0xDD,0xDF,0xE7,0x03,0x39,0xC2,0x30,0x08,0xE8,0xFA,0xDA, + 0x24,0x39,0xE3,0x30,0xAF,0xBF,0xFE,0x38,0x44,0x41,0xE3,0x30,0xBA,0xA3,0xAB,0xF7, + 0x44,0x41,0x03,0x39,0xFF,0xEE,0x78,0x5F,0x24,0x39,0xE3,0x38,0xFB,0x88,0xBE,0xAF, + 0x24,0x39,0xC2,0x30,0xBF,0xF6,0xE8,0xAA,0x23,0x39,0xE2,0x30,0xC3,0xFF,0xEA,0xAA, + 0x23,0x39,0xE3,0x30,0xDF,0xFF,0xFD,0x9F,0x23,0x39,0xE3,0x30,0x37,0xFD,0xEB,0xFA, + 0x23,0x39,0xE3,0x30,0x7E,0xFE,0xF5,0xA3,0x03,0x31,0xC2,0x30,0xFB,0xC0,0x20,0x00, + 0x03,0x31,0xC2,0x28,0x79,0x73,0xC2,0xBA,0x03,0x31,0xC2,0x28,0x55,0xFF,0xFF,0x83, + 0xE3,0x28,0xC2,0x28,0x65,0xC5,0xF7,0xBD,0xE2,0x28,0xA2,0x20,0x7F,0x7B,0x88,0xA2, + 0xC2,0x28,0x81,0x20,0xBF,0xAF,0x2E,0x80,0xA2,0x28,0x81,0x20,0x2B,0xD8,0xBB,0xE8, + 0xE3,0x30,0x61,0x20,0x02,0xAF,0xFF,0xF7,0x03,0x39,0x82,0x20,0x82,0x22,0xAF,0xFD, + 0x03,0x39,0xC2,0x28,0xA9,0x88,0x8B,0x95,0x03,0x39,0xE3,0x30,0x42,0x62,0x5B,0x53, + 0x03,0x31,0xA2,0x28,0x2D,0xFB,0xBA,0x0B,0x23,0x39,0xE3,0x30,0xBE,0xBB,0xBA,0x83, + 0x23,0x39,0xA1,0x28,0xE0,0xA0,0xA8,0xDC,0xE3,0x30,0xA2,0x28,0x27,0x2A,0x20,0x83, + 0x44,0x41,0xC2,0x28,0xD5,0xFF,0xBF,0xAD,0xC5,0x51,0x02,0x31,0xAD,0xAD,0x0B,0x0B, + 0x27,0x62,0xA5,0x51,0x2D,0x0F,0xAF,0xAA,0x68,0x6A,0x07,0x5A,0x29,0x9F,0xB7,0xF5, + 0x88,0x6A,0x48,0x6A,0x0C,0xA2,0x6D,0xD5,0xC9,0x7A,0x68,0x6A,0xEE,0x3E,0x09,0xAD, + 0xC9,0x72,0x89,0x72,0xD9,0xF5,0x36,0x0A,0xC9,0x7A,0x88,0x72,0xFE,0x0E,0xEA,0x2B, + 0xE9,0x7A,0xA9,0x72,0xEB,0xE7,0x97,0xD6,0xC9,0x7A,0xA9,0x72,0xCC,0xC2,0x88,0x24, + 0x0A,0x83,0xA8,0x72,0xAD,0xB9,0x0B,0x2A,0x0A,0x83,0xC9,0x7A,0x3B,0x6A,0xFE,0xAE, + 0x0A,0x83,0xA9,0x7A,0xDA,0xFB,0xAA,0x08,0xEA,0x7A,0xA9,0x7A,0x21,0x00,0x8A,0x44, + 0x2B,0x83,0xC9,0x7A,0x27,0xD7,0xFF,0x7D,0x2A,0x83,0xA9,0x72,0xE8,0x8A,0x3A,0xFF, + 0x2A,0x83,0xE9,0x7A,0x09,0x3D,0x2E,0x27,0x2A,0x83,0xE9,0x7A,0x00,0xE0,0x7E,0x5A, + 0x03,0x41,0xC2,0x38,0x54,0x7F,0xDE,0x35,0x03,0x39,0xC2,0x38,0xB7,0xBA,0xA9,0xBB, + 0x23,0x41,0xC2,0x38,0xF9,0x8B,0xFA,0xFF,0x03,0x41,0xC2,0x38,0xFE,0xEC,0x68,0xBE, + 0x02,0x39,0xA1,0x30,0xBE,0xFA,0x37,0xEF,0x02,0x39,0xC2,0x38,0xBE,0xF6,0xEF,0x3D, + 0xE2,0x38,0xC2,0x38,0x23,0xEB,0xC4,0xC8,0xE2,0x38,0xC2,0x38,0x2A,0xD8,0x7B,0x7C, + 0x03,0x39,0xC2,0x38,0xEB,0xFF,0xBF,0xBA,0x03,0x39,0xC2,0x38,0xEE,0x7E,0x7F,0xFF, + 0xE2,0x38,0xC2,0x30,0x6C,0xFC,0x7B,0xFF,0x25,0x62,0xC2,0x38,0x3D,0x35,0x95,0x95, + 0x66,0x6A,0xA4,0x51,0xF8,0x78,0x78,0x5E,0x84,0x51,0xE2,0x30,0x7A,0x7A,0x70,0x78, + 0x23,0x39,0xC2,0x30,0xDF,0xFF,0x9B,0xFA,0x03,0x31,0xC2,0x28,0xFA,0xEA,0xAB,0x7F, + 0xE3,0x30,0xC2,0x28,0xBA,0x34,0x24,0xF7,0x03,0x39,0xC2,0x28,0xA2,0x5A,0xFF,0xAF, + 0x03,0x31,0xC2,0x30,0x4B,0xEA,0xEB,0xA2,0x03,0x39,0xC2,0x28,0xEF,0x8F,0x8B,0xAA, + 0x03,0x31,0xC2,0x30,0x83,0xA2,0xAA,0xBF,0x03,0x39,0xE3,0x30,0xEB,0x5C,0xFF,0x39, + 0x24,0x39,0xC2,0x30,0xAC,0xBF,0xFF,0xDA,0x23,0x39,0xC2,0x30,0xA2,0xAA,0xAE,0xE7, + 0x23,0x39,0xE3,0x30,0x88,0x2A,0xAE,0x6D,0x24,0x39,0x03,0x39,0x42,0x03,0x63,0x7D, + 0x23,0x39,0x03,0x39,0x76,0x5E,0x77,0x57,0x23,0x39,0xE3,0x38,0xBF,0x37,0x26,0xBE, + 0x23,0x39,0xE3,0x30,0xD7,0xE6,0x76,0xE8,0x44,0x39,0xE3,0x30,0x7F,0x5D,0xEF,0x29, + 0x24,0x39,0xE2,0x30,0x8A,0xE2,0xF7,0xDE,0x24,0x39,0xE2,0x30,0xFF,0x7E,0xE3,0x88, + 0x23,0x39,0xC2,0x30,0xAA,0x9A,0xB8,0x00,0x24,0x39,0xE3,0x30,0x5F,0x7C,0xF3,0xEA, + 0x24,0x39,0xC2,0x28,0x55,0xFF,0xFA,0xE8,0x03,0x31,0xC2,0x28,0x6D,0xEA,0x8B,0xCA, + 0xA2,0x30,0xE2,0x28,0xBF,0xFB,0xDD,0x77,0xE3,0x28,0xA2,0x20,0xF7,0x7B,0xAB,0x00, + 0xE3,0x28,0x82,0x20,0x57,0xFE,0xAF,0xA0,0xC3,0x28,0x81,0x20,0x95,0x7F,0xEA,0x02, + 0xC2,0x28,0x82,0x20,0x2F,0xB5,0xD5,0xBA,0x03,0x31,0x82,0x20,0x8A,0x3F,0x7D,0xF7, + 0xE3,0x30,0x81,0x20,0x20,0xEE,0xF7,0x9D,0x44,0x39,0xA2,0x28,0x0B,0xAB,0xBD,0xF5, + 0x03,0x39,0xC2,0x28,0x78,0xD6,0xD6,0xDF,0x23,0x39,0xE2,0x30,0x5D,0xF5,0xB5,0x2D, + 0xE6,0x51,0x03,0x31,0x95,0xB5,0xAD,0x2F,0x06,0x5A,0xA5,0x51,0x39,0xAF,0xAA,0x8A, + 0x27,0x62,0xC5,0x51,0xBF,0xAF,0xAD,0x27,0x68,0x6A,0x07,0x62,0x75,0xAF,0x29,0x2B, + 0xA9,0x72,0x68,0x6A,0x7D,0xFD,0xBA,0x8E,0xC9,0x72,0x48,0x6A,0x2F,0xA7,0x3F,0x2A, + 0xC9,0x7A,0x68,0x6A,0x88,0x2B,0xBA,0x7E,0xC9,0x7A,0x67,0x6A,0x8A,0xE8,0xA3,0x9F, + 0xEA,0x7A,0x88,0x72,0xFE,0x22,0x2F,0xB7,0xE9,0x7A,0xA9,0x72,0x2A,0xF7,0x5C,0x8B, + 0xE9,0x7A,0xA9,0x72,0xEE,0x8A,0xED,0xD7,0xC9,0x7A,0x88,0x72,0x3E,0xBF,0xDC,0xC3, + 0x0B,0x83,0x88,0x72,0x8A,0xFE,0x7B,0x7B,0xEA,0x7A,0xA9,0x72,0x6E,0xAA,0x8D,0x69, + 0xEA,0x7A,0xA9,0x72,0x02,0x02,0x6B,0xFD,0x0A,0x83,0xA9,0x72,0xAA,0x02,0x0D,0xFE, + 0x2A,0x83,0xA8,0x72,0xAB,0xAB,0xAE,0x3D,0x0A,0x83,0xE9,0x7A,0x28,0xCB,0xAA,0x9C, + 0x03,0x39,0xC2,0x38,0xAF,0x2F,0x37,0xAB,0x03,0x41,0xC2,0x38,0xFF,0xE3,0xEF,0xFA, + 0x22,0x39,0xC2,0x38,0xD7,0xDB,0xFF,0x77,0x03,0x41,0xC2,0x38,0xDE,0xAE,0xB7,0xAF, + 0x03,0x41,0xC2,0x38,0xDC,0xF8,0x7E,0xDE,0x02,0x39,0xC2,0x38,0xFA,0x9D,0xA9,0xEF, + 0xE2,0x38,0xC2,0x38,0xC0,0x0F,0xCA,0x43,0x03,0x41,0xC2,0x38,0x6E,0x3F,0xDF,0xEB, + 0x02,0x39,0xA1,0x30,0xAE,0xB4,0xBA,0xBB,0x02,0x41,0xA2,0x30,0xDF,0xAF,0x3B,0x2B, + 0x03,0x41,0xA1,0x30,0xFE,0xFE,0xF8,0x7E,0x23,0x49,0xA1,0x30,0x37,0xB5,0x95,0x3D, + 0x47,0x6A,0xA4,0x51,0xFE,0x7F,0x7D,0xF8,0xA4,0x51,0xE2,0x30,0xD8,0x78,0x70,0x70, + 0x03,0x39,0xC2,0x30,0xA8,0x08,0x2F,0xAA,0x03,0x31,0xA3,0x30,0xAE,0x88,0x88,0x0A, + 0x23,0x31,0xC2,0x30,0x75,0xB7,0x7F,0xF7,0x03,0x31,0xC2,0x28,0xFF,0x8B,0xFB,0xDA, + 0x03,0x31,0xC2,0x28,0x8A,0x87,0xED,0xCA,0x03,0x31,0xA2,0x30,0x2A,0x2A,0xA2,0xAE, + 0x03,0x31,0xA2,0x30,0x2A,0x88,0x28,0x3A,0x03,0x31,0xC2,0x28,0xAE,0xEB,0xF2,0xF2, + 0x03,0x39,0xE3,0x30,0x3D,0x7D,0x5A,0xD7,0x23,0x39,0xE3,0x30,0xE7,0xAF,0xAF,0xD5, + 0x23,0x39,0xE3,0x30,0x83,0xAD,0x7E,0x5F,0x23,0x39,0xE3,0x30,0x3A,0xBF,0xAB,0xFD, + 0x23,0x39,0xE3,0x38,0xD7,0x87,0xDF,0xF7,0x24,0x41,0xE3,0x38,0xCD,0x27,0xE9,0xE5, + 0x44,0x41,0xE3,0x38,0x7A,0xF4,0xDB,0x77,0x23,0x39,0x03,0x39,0x29,0xDF,0x57,0x55, + 0x24,0x41,0xE3,0x30,0xFA,0xDA,0x3A,0xB2,0x23,0x39,0xE3,0x30,0x5E,0xD7,0xFA,0xFA, + 0x44,0x41,0xC3,0x30,0xA2,0xF7,0xFF,0xFE,0x24,0x39,0xE3,0x30,0xAE,0xEA,0x2D,0xEE, + 0x23,0x39,0xE3,0x30,0x6E,0xFE,0xBA,0x2B,0x24,0x39,0xE2,0x30,0x7A,0xDB,0xFE,0xB8, + 0x23,0x31,0xE3,0x30,0x5B,0xDC,0xDE,0x7A,0x03,0x39,0xE3,0x28,0x7F,0xFF,0xF8,0x08, + 0x24,0x39,0xC3,0x28,0x57,0x5F,0x5A,0xE8,0x03,0x31,0xC3,0x28,0x77,0x7D,0x2A,0x08, + 0x03,0x31,0xA2,0x28,0x7D,0xFD,0xFA,0x88,0x03,0x31,0xC3,0x28,0x57,0x9F,0xAA,0x02, + 0x23,0x31,0xA2,0x28,0xDD,0xEF,0xAA,0xAA,0x24,0x39,0xA2,0x28,0xBD,0xBB,0xA2,0x08, + 0x23,0x39,0xE3,0x30,0xF7,0xDF,0xBA,0x0A,0xA5,0x49,0x03,0x31,0xBD,0xB5,0xB9,0x0F, + 0x27,0x62,0xA5,0x49,0xF5,0xAD,0x8D,0x2F,0x26,0x62,0xE6,0x59,0xD5,0xBD,0x8A,0x36, + 0x47,0x62,0xE6,0x59,0x85,0xBF,0xBF,0x1E,0x89,0x72,0x27,0x62,0x8D,0x29,0x2F,0xAF, + 0xA9,0x72,0x48,0x6A,0x8B,0x8E,0x77,0x77,0xC9,0x72,0x68,0x6A,0x20,0xAA,0xBD,0xD5, + 0xC9,0x7A,0x67,0x6A,0xFE,0x22,0xAB,0xF6,0xC9,0x7A,0x88,0x72,0x5E,0x2F,0x58,0x77, + 0xC9,0x7A,0x88,0x72,0x21,0xEE,0xEA,0x2B,0xE9,0x7A,0x88,0x72,0xBA,0xB2,0xBA,0x7E, + 0xE9,0x7A,0xA9,0x72,0xEA,0x8E,0xBE,0xB7,0xE9,0x7A,0xA8,0x72,0x89,0xAF,0xB8,0xBA, + 0x0A,0x7B,0xA9,0x72,0xD7,0xF5,0xDF,0xE3,0x0A,0x7B,0xA9,0x72,0xA9,0xA2,0xFF,0xF7, + 0xEA,0x7A,0x89,0x72,0x9F,0xF2,0xE8,0x3A,0xEA,0x7A,0xA9,0x72,0x38,0xEF,0x7E,0x8B, + 0xEA,0x7A,0xA9,0x72,0x3D,0xBA,0x00,0x0B,0x0A,0x7B,0xC9,0x7A,0xA0,0xE9,0x25,0x8B, + 0x03,0x41,0xC2,0x38,0xAA,0xDB,0xBA,0xAF,0x03,0x41,0xE2,0x38,0xD6,0x5B,0x7D,0x6B, + 0x03,0x41,0xC2,0x38,0xDE,0x8F,0x8E,0xEB,0x03,0x41,0xC2,0x38,0xED,0xDF,0xDA,0xAA, + 0x03,0x41,0xA2,0x30,0xAE,0x2A,0xEF,0xDA,0x23,0x39,0xC2,0x38,0x7F,0xFF,0x9D,0xFF, + 0x23,0x39,0xC2,0x38,0x57,0xFF,0xF5,0xFB,0xE2,0x38,0xC2,0x38,0x00,0xE8,0xD8,0xE0, + 0xE2,0x38,0xC2,0x38,0xAE,0xC8,0xBF,0xB7,0xE2,0x38,0xC2,0x38,0xEA,0x0F,0x8A,0x4C, + 0xE2,0x38,0x81,0x30,0xE8,0xF8,0x9E,0xAB,0x67,0x6A,0xC2,0x30,0xF5,0xB5,0x35,0x35, + 0xE8,0x7A,0xA5,0x59,0xFA,0xF8,0xE8,0x70,0xC5,0x59,0xE2,0x30,0x58,0x78,0xFA,0x7F, + 0x03,0x39,0xE2,0x30,0x5C,0x7C,0x5A,0x5F,0x03,0x31,0xE3,0x30,0x2C,0x5D,0x65,0xFD, + 0x03,0x31,0xE3,0x30,0x4D,0x47,0x69,0xCD,0x03,0x31,0xE3,0x30,0x59,0x7D,0x1D,0x6D, + 0xE3,0x30,0xC2,0x30,0x22,0x82,0x3A,0xA3,0x03,0x31,0xC2,0x30,0x2F,0x3F,0xBF,0xFF, + 0x03,0x31,0xC2,0x28,0xEE,0xFF,0xEA,0xEE,0x03,0x31,0xC2,0x30,0x9F,0xEA,0xFE,0x2B, + 0x03,0x31,0xA2,0x30,0x2A,0xAA,0xE6,0xBE,0x03,0x31,0xC2,0x30,0xAA,0xEA,0xFB,0xFF, + 0x03,0x31,0xC2,0x30,0xBE,0xFA,0x0B,0xF5,0x03,0x39,0xE3,0x30,0x8D,0xAB,0xDA,0xED, + 0x03,0x39,0xE2,0x30,0xAA,0xDF,0xA2,0xB7,0x03,0x39,0xC2,0x30,0x87,0xB5,0x3E,0xF2, + 0x24,0x39,0xE3,0x30,0xFF,0x57,0xEA,0xCF,0xE3,0x38,0x03,0x31,0xFE,0xAE,0xA7,0xF7, + 0x23,0x39,0xE3,0x30,0xEB,0xB9,0xB3,0xF9,0x24,0x39,0xE3,0x38,0xFD,0xBD,0xF2,0xA6, + 0x24,0x39,0xE3,0x38,0xFA,0xBC,0xAF,0xBE,0x24,0x39,0xE3,0x38,0x6B,0xAF,0xAF,0xA8, + 0x24,0x39,0xC2,0x30,0x2B,0x8A,0xFA,0xEA,0x23,0x39,0xE2,0x30,0x00,0x1B,0xDF,0xFE, + 0x44,0x39,0x03,0x31,0xF3,0xAB,0xA5,0x97,0x65,0x41,0x03,0x31,0x55,0xFE,0xFE,0xEA, + 0x44,0x39,0x03,0x39,0x5F,0xF2,0xEA,0xEA,0x24,0x39,0xE3,0x30,0xE5,0xEA,0x2A,0x02, + 0x24,0x39,0xE3,0x30,0xFF,0xBB,0x80,0x20,0x24,0x41,0x03,0x31,0xFD,0x7D,0xFE,0xAC, + 0x44,0x41,0xE3,0x30,0xF5,0xEE,0xAF,0x2A,0x64,0x41,0x04,0x39,0xF5,0x55,0xDF,0x2A, + 0xC5,0x51,0x24,0x39,0x55,0xF5,0xD5,0x2F,0x06,0x5A,0x65,0x41,0x95,0xA5,0xAB,0x00, + 0x07,0x5A,0xC6,0x59,0x7F,0xCB,0x2B,0xA0,0x47,0x6A,0xC6,0x59,0xBE,0xAD,0xAB,0x00, + 0x68,0x6A,0x06,0x5A,0xB7,0xA8,0xA8,0xBE,0x88,0x6A,0x47,0x62,0xA9,0xED,0x3A,0x8A, + 0x88,0x6A,0x48,0x6A,0xBC,0x74,0xAE,0x38,0xA9,0x72,0x68,0x6A,0x55,0xA5,0x37,0xCE, + 0xA9,0x72,0x68,0x6A,0x6E,0xDF,0xFB,0x0F,0xA8,0x72,0x68,0x6A,0x2A,0x00,0x01,0x03, + 0xC9,0x7A,0x88,0x6A,0xBE,0xAC,0x3E,0xA9,0xCA,0x72,0x68,0x6A,0xAB,0xE7,0xAE,0xAB, + 0xEA,0x7A,0x88,0x6A,0x7E,0x7B,0xDB,0xFA,0xE9,0x7A,0x88,0x6A,0xEA,0x0B,0xF7,0xFD, + 0xE9,0x72,0x88,0x6A,0x0F,0xAC,0xEB,0xEF,0xEA,0x7A,0x88,0x72,0x8A,0x3E,0x0D,0xBA, + 0xEA,0x7A,0xA8,0x72,0x09,0x59,0xAA,0x02,0x0A,0x7B,0xA9,0x72,0xBF,0xAF,0xFD,0xDC, + 0x0A,0x7B,0xA9,0x72,0x3A,0x02,0xAB,0xB7,0x0A,0x7B,0xA9,0x72,0x9E,0xAF,0xAE,0x22, + 0x02,0x39,0xC2,0x38,0xB6,0xA4,0xEF,0xCE,0x03,0x41,0xC2,0x38,0xAA,0xEB,0xFF,0x57, + 0x03,0x39,0xC2,0x38,0x0E,0xAE,0xEF,0xE9,0x03,0x39,0xA1,0x30,0xAE,0xA8,0xAE,0xF5, + 0xE2,0x38,0xC2,0x38,0xD3,0x0D,0x0B,0x28,0xE2,0x38,0xC2,0x30,0xF8,0x2E,0x04,0x27, + 0x02,0x41,0xC2,0x38,0xEB,0x6A,0xFE,0xEF,0xE2,0x38,0xC2,0x38,0xAB,0xEE,0x35,0xCE, + 0xE2,0x38,0xA1,0x30,0x08,0x82,0x60,0x6A,0xE2,0x38,0xA2,0x30,0x7A,0x7E,0xFE,0x9F, + 0xE2,0x38,0xA2,0x30,0x09,0xA2,0x80,0x88,0x46,0x6A,0xC2,0x30,0x35,0x95,0x55,0x55, + 0xA7,0x72,0xC3,0x38,0xE8,0xFF,0x5D,0x55,0x24,0x41,0xC2,0x30,0xEA,0xE8,0xAE,0xA5, + 0x03,0x39,0xC2,0x30,0xA2,0xE8,0xBC,0xFF,0x03,0x31,0xA2,0x30,0x2A,0x88,0xCA,0x2A, + 0x03,0x31,0xC2,0x28,0xBE,0xBA,0xFA,0xFF,0x03,0x31,0xC2,0x30,0xE3,0xBE,0x8A,0xFA, + 0xE3,0x30,0xC2,0x28,0xE9,0x00,0xAA,0xAB,0xE3,0x30,0xC2,0x28,0x2D,0xA8,0x02,0x8C, + 0x03,0x31,0xC2,0x28,0xBA,0x27,0x07,0xEE,0x23,0x39,0xC3,0x30,0xEF,0xBF,0xAF,0xD8, + 0x03,0x39,0xC2,0x28,0xDE,0xBC,0xAA,0xEE,0xA2,0x38,0x03,0x31,0xDF,0x76,0x7F,0xFF, + 0x02,0x39,0xC3,0x30,0xB7,0x7F,0xEA,0xFB,0x24,0x39,0xC2,0x28,0xBF,0xBD,0x3F,0xBD, + 0x03,0x39,0xC2,0x28,0xA7,0xFC,0xE3,0x8A,0x03,0x31,0xE3,0x30,0xFB,0xDF,0x77,0x95, + 0xC3,0x38,0x03,0x31,0xDF,0x57,0x5F,0xE9,0x24,0x39,0xE3,0x30,0xAF,0x2E,0xBF,0xD7, + 0x24,0x39,0xE3,0x30,0xF5,0xEE,0xAF,0x2E,0x24,0x39,0xE3,0x38,0xBF,0xEA,0xBC,0xBA, + 0x24,0x39,0xE3,0x38,0xAF,0xAE,0x9F,0xBA,0x24,0x39,0xE3,0x38,0xEF,0x2B,0xCE,0xA7, + 0x24,0x41,0x03,0x31,0x9A,0x7A,0xFE,0xA3,0x45,0x39,0x03,0x39,0xF7,0x5D,0xB6,0x97, + 0x23,0x39,0x03,0x39,0x23,0xB2,0xA8,0x0D,0x64,0x41,0x03,0x39,0xFD,0x55,0x55,0x73, + 0x44,0x41,0xE3,0x30,0x22,0xA5,0xB7,0xAA,0x85,0x41,0xE3,0x38,0xEA,0xAA,0x0B,0xAD, + 0x85,0x49,0x24,0x39,0xD5,0x2F,0x8A,0x20,0xA6,0x51,0x24,0x39,0xD5,0xAE,0x0B,0xAE, + 0xA5,0x51,0x24,0x39,0xB7,0xAE,0x00,0x0A,0xC6,0x51,0x44,0x41,0xDD,0xBF,0x2B,0x0A, + 0x27,0x62,0x85,0x49,0xAD,0xBF,0x89,0x0A,0x27,0x62,0xE6,0x59,0xB8,0x29,0x03,0xAA, + 0x48,0x6A,0x06,0x62,0x5F,0x99,0x3E,0x22,0x67,0x6A,0x06,0x5A,0x8E,0xA3,0xBB,0x9E, + 0x68,0x6A,0x06,0x62,0xAA,0x26,0x2A,0xAA,0xA8,0x6A,0x47,0x62,0x2F,0xB2,0xBA,0xDB, + 0xA9,0x72,0x27,0x62,0xF8,0xAA,0xF6,0x7F,0xA8,0x72,0x68,0x6A,0x05,0x0D,0x0E,0xF9, + 0xEA,0x7A,0x88,0x6A,0xF5,0x7D,0xFB,0x8D,0xC9,0x72,0x88,0x72,0x98,0xFF,0xD6,0xBE, + 0xA8,0x72,0x68,0x6A,0xE0,0xF8,0xEA,0xE0,0xA9,0x72,0x68,0x6A,0xAA,0xEA,0x75,0x7D, + 0xC9,0x72,0x68,0x6A,0xAA,0xBB,0xAB,0x7D,0xE9,0x7A,0x89,0x6A,0xAD,0xFF,0xFB,0x2F, + 0xC9,0x72,0x88,0x72,0xBC,0x24,0x2B,0x0B,0xC9,0x7A,0x67,0x6A,0xAB,0xF2,0xFC,0xD8, + 0xC9,0x72,0x88,0x6A,0x80,0x29,0x9D,0xEF,0xEA,0x72,0x88,0x6A,0xD2,0xBE,0xBE,0xBE, + 0xEA,0x7A,0x88,0x72,0x29,0xAF,0x9E,0xF0,0xE9,0x7A,0xA9,0x72,0x80,0xE2,0x20,0xBD, +}; + +static const size_t pixel_2_width = 128; +static const size_t pixel_2_height = 128; +static const size_t pixel_2_size = 8192; +static const unsigned char pixel_2_data[8192] = +{ + 0x87,0x62,0x23,0x41,0x7F,0xE3,0xAD,0xFF,0xE5,0x51,0xE2,0x30,0xEE,0x3A,0x68,0xBA, + 0xE6,0x51,0x02,0x31,0xA6,0xBE,0xE3,0xDB,0x06,0x52,0x23,0x39,0xB7,0xDF,0x73,0xDE, + 0xE6,0x51,0x23,0x39,0x37,0x7F,0x73,0xD8,0xE6,0x51,0x02,0x39,0x37,0x5B,0xFB,0xF8, + 0xE6,0x59,0x43,0x41,0x0D,0xF9,0xBD,0xAC,0xE5,0x59,0x23,0x39,0xBE,0x72,0xDE,0x5C, + 0xC6,0x51,0x23,0x39,0xFF,0x72,0x1C,0xFC,0x27,0x5A,0x24,0x39,0xD7,0x7A,0x9C,0xFF, + 0xE6,0x51,0x03,0x39,0x9E,0xFE,0x3C,0xFA,0x26,0x52,0x44,0x41,0x17,0xF7,0x9F,0x73, + 0x26,0x5A,0x64,0x41,0x17,0xB5,0x97,0xEB,0x27,0x5A,0x44,0x41,0xF8,0xBF,0xB6,0xD7, + 0x47,0x62,0x43,0x39,0x2B,0x0B,0x2E,0x57,0x66,0x62,0x43,0x41,0x82,0xF0,0x6A,0x55, + 0x46,0x62,0x43,0x41,0x00,0x0A,0xEB,0xD5,0x67,0x62,0x44,0x41,0xF7,0xDC,0x7F,0x57, + 0xE6,0x51,0x43,0x39,0xCD,0xF7,0xF8,0xFD,0xC5,0x51,0x23,0x39,0xC1,0xBF,0x57,0x0A, + 0x4E,0xA4,0x02,0x39,0x3F,0xF5,0x55,0xFF,0x96,0xEE,0xE6,0x59,0x00,0x03,0x0D,0x0D, + 0xD7,0xF6,0x75,0xEE,0x2B,0xCA,0xD2,0x7C,0xF7,0xF6,0x34,0xE6,0xAA,0xAA,0x7A,0x5F, + 0xD7,0xF6,0x14,0xDE,0x00,0x00,0x0A,0x95,0x18,0xFF,0x75,0xE6,0x0A,0xA2,0xB7,0x7A, + 0x18,0xFF,0x96,0xE6,0xA0,0x0A,0xAA,0xAD,0x18,0xF7,0xD7,0xF6,0x7E,0xEA,0xAB,0x7A, + 0xD7,0xF6,0xB7,0xEE,0x0A,0xBE,0x70,0xE8,0xD7,0xF6,0xB2,0xD5,0x68,0xE0,0xC8,0xA8, + 0x14,0xE6,0x71,0xCD,0x82,0x81,0x29,0x0D,0x34,0xDE,0xF3,0xDD,0x5F,0x5D,0xDE,0x5A, + 0xA8,0x72,0x63,0x41,0xB7,0xDF,0x5E,0x5C,0x27,0x5A,0x43,0x39,0xFF,0xFC,0x57,0x0B, + 0xE6,0x51,0x23,0x39,0xFF,0xFE,0x75,0x00,0x67,0x62,0x03,0x31,0x7E,0x72,0x55,0xAA, + 0xC6,0x51,0x23,0x39,0x62,0xF9,0x55,0x00,0xC6,0x51,0x23,0x39,0xFF,0x55,0xF6,0x00, + 0xE6,0x69,0x43,0x41,0x2D,0x25,0x09,0x0A,0x68,0x7A,0x03,0x39,0xFE,0x5A,0xAA,0x0A, + 0x0D,0x9C,0x24,0x39,0x75,0x55,0x77,0x02,0xAF,0xAC,0x23,0x39,0x55,0x55,0xFF,0x00, + 0xD3,0xD5,0x85,0x49,0x55,0x55,0x55,0x00,0x35,0xE6,0x64,0x41,0x55,0x55,0xFF,0x00, + 0x96,0xEE,0x84,0x49,0x55,0x55,0xBF,0x00,0x75,0xEE,0x84,0x49,0x55,0x55,0xAA,0x00, + 0xD7,0xFE,0xA5,0x51,0x55,0x55,0xAA,0xE0,0x55,0xEE,0xE6,0x59,0x55,0xD5,0x0F,0x25, + 0xB7,0xF6,0xE6,0x59,0x55,0xFF,0x00,0x00,0xB6,0xEE,0x06,0x5A,0x55,0xAB,0x00,0x00, + 0xB7,0xF6,0x26,0x62,0x55,0x2A,0x00,0x00,0x96,0xEE,0x87,0x6A,0x55,0x00,0x00,0x00, + 0xB6,0xEE,0x2A,0x83,0xD5,0x00,0x00,0x00,0xB6,0xF6,0x8E,0xAC,0x09,0x00,0x00,0x00, + 0xB6,0xF6,0x14,0xDE,0xE8,0x68,0xFA,0xB6,0xD7,0xF6,0x14,0xDE,0xFD,0x0D,0x02,0x08, + 0xD7,0xF6,0xF3,0xD5,0x7A,0xAA,0xA0,0x00,0xD7,0xF6,0xD3,0xD5,0x0D,0xBE,0xA2,0x08, + 0x18,0xF7,0x35,0xDE,0x9E,0xFA,0x8B,0x2A,0x18,0xF7,0x96,0xEE,0x88,0x29,0xAA,0xE8, + 0x18,0xF7,0x96,0xE6,0xFE,0xF8,0x7A,0x7A,0x75,0xEE,0xD3,0xD5,0x00,0xA0,0xAC,0xE6, + 0x34,0xE6,0x92,0xCD,0xA5,0xA7,0x36,0x26,0x34,0xE6,0xF3,0xDD,0xDA,0xFE,0xD6,0x56, + 0x96,0xEE,0xE5,0x51,0x56,0xA8,0x00,0x00,0xB6,0xEE,0x06,0x5A,0x55,0xAA,0x00,0x00, + 0x96,0xEE,0x47,0x62,0x55,0x02,0x00,0x00,0x75,0xEE,0xC9,0x72,0xD5,0x00,0x00,0x00, + 0x96,0xEE,0x8B,0x93,0xF5,0x00,0x00,0x00,0xB6,0xEE,0x10,0xBD,0xD5,0x02,0x00,0x00, + 0xD7,0xF6,0xE5,0x69,0x5A,0x58,0x58,0x58,0x0A,0x8B,0xC5,0x69,0x3D,0xDD,0xF5,0xD5, + 0x96,0xEE,0x46,0x72,0x02,0x03,0x09,0x25,0xB6,0xF6,0x96,0xEE,0xF5,0xAA,0x82,0x02, + 0xB6,0xF6,0x96,0xEE,0xAB,0xAB,0x02,0x20,0xB6,0xF6,0xD6,0xEE,0x20,0xC0,0x60,0xFC, + 0xF7,0xF6,0xD7,0xF6,0xF5,0x82,0x02,0x00,0xF7,0xF6,0x71,0xCD,0x00,0x00,0x80,0x60, + 0x55,0xEE,0x87,0x7A,0x70,0x58,0x56,0x55,0xB7,0xF6,0x46,0x72,0x25,0x25,0x25,0x0D, + 0xF8,0xFE,0x17,0xF7,0xFA,0xFE,0xFF,0xF7,0xF7,0xF6,0xD7,0xF6,0x7E,0xFC,0xF8,0x62, + 0xD7,0xF6,0xF7,0xEE,0x00,0x00,0x28,0x80,0xD7,0xF6,0xF7,0xEE,0x00,0xA0,0x08,0xA8, + 0xF7,0xF6,0x96,0xEE,0x2A,0x8A,0xE2,0x78,0x96,0xEE,0xF3,0xDD,0x80,0xE0,0x70,0x5C, + 0xB7,0xF6,0xD2,0xD5,0xB7,0x25,0x0B,0x02,0xD7,0xF6,0x34,0xE6,0xBD,0x57,0xAA,0x28, + 0xF8,0xF6,0x55,0xE6,0x0A,0x2D,0xFB,0xAA,0xF7,0xF6,0xB7,0xEE,0xD7,0x7E,0x6A,0x89, + 0x18,0xF7,0xD7,0xF6,0x3F,0xA9,0x29,0xFF,0x39,0xFF,0xB6,0xEE,0xE8,0xF2,0x62,0xEE, + 0xD7,0xF6,0x34,0xE6,0xC0,0x8A,0x6B,0x6F,0x34,0xE6,0x10,0xC5,0x8C,0x04,0xA6,0x26, + 0x76,0xEE,0xCF,0xBC,0xAE,0x2A,0x3E,0x9A,0x96,0xEE,0xD3,0xD5,0x7F,0x7A,0xA8,0x2A, + 0xD6,0xF6,0xB6,0xEE,0xFD,0xF7,0xFF,0xAD,0xD6,0xF6,0xB6,0xEE,0xFB,0xFA,0xBA,0xE9, + 0xD6,0xF6,0xB6,0xEE,0xDF,0xEE,0xBB,0xFA,0xB5,0xF6,0x96,0xEE,0xD7,0xDD,0xBE,0xFE, + 0xD7,0xF6,0x96,0xEE,0x2F,0x27,0x2F,0x2F,0xD7,0xF6,0xB6,0xEE,0xCA,0x08,0x08,0x82, + 0x95,0xF6,0xA5,0x61,0x58,0x7C,0x5C,0x54,0x06,0x72,0x44,0x59,0x2C,0xB8,0x7A,0x79, + 0x92,0xD5,0x84,0x59,0x2D,0xB5,0xF5,0xD5,0xD6,0xF6,0xEC,0xA3,0x00,0x00,0x02,0x09, + 0xD7,0xF6,0xB6,0xF6,0x77,0xDE,0xDE,0xB8,0xD6,0xF6,0xB6,0xF6,0x0B,0x2D,0x2E,0x08, + 0xF7,0xF6,0x55,0xEE,0x00,0x00,0x80,0x40,0x17,0xFF,0x46,0x7A,0xE0,0x78,0x5E,0x57, + 0x87,0x8A,0x26,0x7A,0x0F,0x27,0xA9,0xFB,0xF7,0xFE,0x87,0x82,0x0D,0x0D,0x09,0x09, + 0x18,0xFF,0x17,0xF7,0xEE,0xBB,0xEE,0xEA,0xF7,0xF6,0xD7,0xF6,0xE8,0xE8,0xEA,0xEA, + 0xF7,0xF6,0xD7,0xF6,0xF5,0xD7,0x7F,0xEB,0x17,0xFF,0xB7,0xEE,0xAF,0xCB,0x6A,0x5A, + 0xD6,0xF6,0xD3,0xD5,0xA0,0xA8,0xE8,0x7A,0xD7,0xF6,0x92,0xD5,0x9E,0x27,0x09,0x02, + 0xF7,0xF6,0xB6,0xEE,0xBF,0xAA,0xEE,0xEA,0xD7,0xF6,0xB6,0xEE,0xD8,0xAE,0x8A,0xE8, + 0xF7,0xF6,0xB6,0xEE,0x15,0x57,0x77,0xEF,0x38,0xFF,0xD7,0xEE,0xEF,0xAB,0x2D,0xB5, + 0x39,0xFF,0xD7,0xF6,0xDF,0x7F,0xDE,0x78,0xF8,0xF6,0xB6,0xEE,0xF8,0xF8,0xFE,0xD7, + 0xB6,0xEE,0xF3,0xD5,0xCE,0x8E,0x8C,0x26,0xF3,0xDD,0x30,0xC5,0x24,0x3C,0x2A,0x3A, + 0x96,0xF6,0x30,0xC5,0x1F,0x3D,0x35,0x35,0xB6,0xF6,0x34,0xE6,0xDE,0xDC,0xDC,0xFC, + 0xB6,0xF6,0xD6,0xEE,0xEB,0xFF,0xFB,0xFF,0xD6,0xF6,0xB7,0xEE,0xAA,0x82,0x0A,0x22, + 0xD6,0xF6,0xB6,0xEE,0xEA,0xAE,0xC0,0x80,0xD6,0xF6,0x96,0xEE,0xFF,0xFF,0xBB,0xBE, + 0xF7,0xF6,0xB6,0xEE,0xB5,0xB5,0xBD,0xA7,0xD6,0xF6,0xF7,0xEE,0x00,0x08,0xA2,0xA8, + 0x95,0xEE,0x43,0x51,0x5C,0x5C,0x58,0x50,0x85,0x59,0xE2,0x40,0xC2,0xFE,0x7B,0x76, + 0x67,0x72,0x03,0x41,0x3D,0xAD,0x25,0x25,0x34,0xE6,0x09,0x83,0x0D,0xF5,0x55,0x55, + 0x95,0xEE,0xC8,0x7A,0x00,0xBF,0xD5,0x55,0xB6,0xF6,0x09,0x8B,0x00,0x22,0x7D,0x55, + 0x76,0xF6,0x46,0x72,0x80,0x60,0x5F,0x55,0x67,0x82,0xE5,0x71,0x2C,0x0B,0xE7,0xD7, + 0x29,0x9B,0x26,0x82,0xD7,0xF5,0xBD,0x2D,0xF7,0xFE,0x4B,0xA3,0x01,0x03,0x02,0x02, + 0x38,0xFF,0x18,0xF7,0x7E,0x6B,0x7F,0xFF,0x17,0xF7,0xD7,0xF6,0xFF,0xEE,0xEE,0xA0, + 0x18,0xFF,0x75,0xEE,0x2A,0x82,0xE2,0x58,0xF7,0xFE,0x55,0xEE,0xF8,0xEE,0x6E,0x7F, + 0xD7,0xF6,0xF4,0xDD,0xBE,0x27,0x09,0x02,0xF7,0xF6,0xD7,0xF6,0x7D,0x7B,0x5A,0xEE, + 0xD7,0xF6,0xB6,0xEE,0x00,0xA0,0x80,0x80,0xD7,0xF6,0xB6,0xEE,0xAA,0xA0,0xE8,0xAA, + 0xD7,0xF6,0xB7,0xEE,0x80,0x0B,0xAF,0x0A,0xF8,0xF6,0xD7,0xF6,0x2D,0x3D,0x25,0xAB, + 0x39,0xFF,0x97,0xEE,0xE0,0x6A,0x4A,0xEA,0xB6,0xEE,0x76,0xEE,0x38,0xBF,0x9F,0xFF, + 0xB7,0xF6,0x71,0xCD,0x24,0x06,0x24,0x26,0x35,0xE6,0x92,0xCD,0xD6,0x9E,0xDC,0x54, + 0xF3,0xDD,0x8E,0xB4,0x27,0x37,0x07,0x09,0x96,0xEE,0x34,0xE6,0xD8,0xFB,0xDB,0xFB, + 0xD6,0xF6,0xB7,0xEE,0xAA,0x8A,0x00,0x2A,0xD7,0xF6,0xD6,0xEE,0xAA,0xAA,0xAA,0x0A, + 0xF7,0xF6,0xD7,0xF6,0x75,0x77,0xF5,0xAD,0xD6,0xF6,0xB6,0xEE,0xDF,0xD6,0xEA,0xA8, + 0xF7,0xF6,0xB6,0xEE,0xAD,0xA7,0xAF,0xAF,0xF7,0xF6,0xD7,0xF6,0xF5,0x7E,0xA7,0xAB, + 0xD7,0xF6,0x02,0x41,0x70,0x70,0x60,0x60,0xE5,0x61,0xE2,0x40,0x7F,0xFF,0xBD,0x09, + 0x67,0x72,0x44,0x49,0x2D,0xAF,0xFB,0xEA,0xA8,0x7A,0xE5,0x61,0x80,0xA2,0xFD,0x5F, + 0x88,0x72,0xE5,0x61,0x22,0xBA,0xFE,0xD5,0x2A,0x8B,0xE5,0x61,0x02,0xAA,0x7B,0x55, + 0x67,0x7A,0xC5,0x61,0x34,0xB7,0xED,0xC3,0x26,0x7A,0x43,0x59,0x2C,0x26,0xB5,0x15, + 0xE9,0x92,0x47,0x82,0x35,0x25,0xB5,0x3F,0xF7,0xFE,0x10,0xCD,0x01,0x01,0x03,0x03, + 0x38,0xFF,0xF7,0xF6,0xAA,0xAF,0xFF,0x5B,0x38,0xFF,0xD6,0xF6,0xA8,0xE0,0x6B,0x5B, + 0xD7,0xF6,0x54,0xE6,0xA8,0x80,0x60,0x40,0xF8,0xFE,0xD3,0xDD,0x5E,0xD6,0x83,0x82, + 0xD7,0xF6,0xB2,0xD5,0x25,0x37,0xBE,0xFA,0xF7,0xF6,0xB6,0xF6,0x02,0x02,0xAB,0x09, + 0xF7,0xF6,0xD7,0xF6,0x7F,0x5A,0xBF,0xDF,0xF7,0xF6,0x97,0xEE,0xAA,0x0E,0x22,0x8A, + 0xF7,0xF6,0xD7,0xF6,0x85,0xC2,0x8B,0xAA,0xF8,0xF6,0xD7,0xF6,0x02,0xEA,0x0A,0xCA, + 0xF8,0xF6,0xB7,0xEE,0x8A,0x2A,0xBE,0xB7,0x96,0xEE,0x76,0xEE,0xAE,0x9C,0xBE,0xE0, + 0x96,0xEE,0x51,0xCD,0x24,0x24,0x2E,0x2C,0x55,0xEE,0xF0,0xBC,0xFC,0xF8,0x78,0x58, + 0x34,0xE6,0x10,0xC5,0x2D,0x2B,0x01,0x0B,0x96,0xEE,0x55,0xE6,0x5B,0xFA,0xF3,0x33, + 0xD6,0xF6,0xB6,0xE6,0x28,0x82,0x20,0x88,0xD7,0xF6,0xD6,0xEE,0x8A,0xAA,0x2B,0xAA, + 0xF6,0xF6,0xD7,0xF6,0xFD,0x7F,0x77,0x7D,0xD6,0xF6,0xB7,0xEE,0x00,0x08,0x2A,0xAE, + 0xF7,0xF6,0xD7,0xF6,0xD5,0xA7,0x2D,0xA5,0xF7,0xF6,0xD6,0xF6,0xBA,0xAA,0xCA,0x02, + 0xB6,0xF6,0x66,0x72,0x60,0x60,0x70,0x70,0xC8,0x82,0xC5,0x59,0xE5,0x0A,0x2A,0xFE, + 0xA8,0x7A,0xA4,0x59,0x7A,0xE0,0x68,0x7B,0x67,0x72,0x64,0x51,0x82,0xC3,0xFF,0xF5, + 0x46,0x72,0xC5,0x59,0xFD,0xE5,0xD5,0x39,0x2A,0x93,0xC5,0x61,0xD5,0xB5,0x2F,0x0A, + 0x8E,0xC4,0x88,0x82,0x7D,0xDB,0xEB,0x0A,0x8B,0xA3,0xC5,0x69,0x97,0xEA,0x8A,0xE8, + 0xD7,0xFE,0x67,0x7A,0xD5,0x15,0x25,0x0D,0x17,0xFF,0xB8,0xF6,0x21,0x22,0x22,0x20, + 0x18,0xFF,0xB6,0xEE,0x28,0x88,0x6A,0x5A,0x17,0xFF,0x34,0xE6,0xA8,0x7A,0x7F,0xA2, + 0x39,0xFF,0x96,0xEE,0xE2,0xC1,0x83,0x88,0x18,0xFF,0xD8,0xF6,0xE9,0x89,0xAB,0xAB, + 0x18,0xFF,0x14,0xE6,0x7F,0x7E,0xFC,0x78,0x18,0xFF,0x55,0xE6,0x2B,0x29,0xAD,0xAD, + 0x38,0xFF,0xD7,0xF6,0x57,0x7F,0xFF,0xFB,0xF7,0xF6,0xD7,0xF6,0xD9,0x0B,0x00,0x00, + 0x18,0xFF,0xD7,0xF6,0xFD,0xAE,0xBB,0xFA,0xF7,0xF6,0x95,0xEE,0x80,0xA0,0xE8,0xE8, + 0xD7,0xF6,0x96,0xEE,0x37,0x0D,0x09,0xAD,0x96,0xEE,0x55,0xE6,0xA8,0xA8,0xBB,0xBD, + 0x55,0xEE,0xB3,0xD5,0x04,0x24,0x04,0x24,0x55,0xEE,0x6E,0xB4,0x78,0x78,0x58,0x5A, + 0x76,0xEE,0x92,0xD5,0xA9,0xA9,0x29,0x03,0xB6,0xF6,0x34,0xE6,0x3B,0x25,0x2E,0xAF, + 0xD6,0xF6,0x55,0xEE,0x00,0x00,0x00,0x09,0xD6,0xF6,0xF7,0xEE,0x20,0x88,0x88,0x20, + 0xD6,0xF6,0xD7,0xEE,0x8A,0xAA,0x88,0x22,0xD6,0xF6,0xB6,0xEE,0xEE,0xBE,0xAA,0x00, + 0xD6,0xF6,0xB6,0xEE,0x02,0x8A,0xBB,0x80,0xF7,0xF6,0xB6,0xEE,0xAA,0xAB,0xEB,0xFE, + 0x75,0xEE,0x63,0x49,0x78,0x58,0x58,0x5C,0xE5,0x61,0xA1,0x28,0x00,0xEF,0xD7,0xD5, + 0xC5,0x59,0xE2,0x38,0xA8,0xB7,0xBD,0x35,0x09,0x93,0x84,0x51,0xFD,0xEB,0x7A,0x72, + 0x2A,0x8B,0x23,0x49,0x2F,0x2B,0x3F,0xB5,0xEC,0xAB,0x87,0x82,0xBA,0x80,0x0B,0x2D, + 0x4E,0xBC,0x47,0x7A,0x0A,0xAE,0xFE,0x7A,0xEC,0xAB,0x26,0x72,0x5C,0xD6,0x3F,0x2B, + 0xF8,0xFE,0xCB,0xA3,0x09,0x02,0x02,0x02,0x18,0xFF,0xD6,0xF6,0xA0,0xA2,0xE0,0x70, + 0x59,0xFF,0xD6,0xF6,0xD7,0xA5,0xAD,0x0D,0x38,0xFF,0x75,0xE6,0x70,0xD0,0xDC,0x9C, + 0x38,0xFF,0xF9,0xF6,0xCA,0x6A,0xEA,0xEE,0x18,0xFF,0xF8,0xF6,0xB9,0xBF,0xAF,0xA7, + 0x18,0xFF,0x55,0xEE,0x78,0xE0,0xE0,0xA8,0xF7,0xF6,0x55,0xEE,0x2D,0x2F,0x0F,0x2A, + 0x18,0xFF,0xF7,0xF6,0x55,0x55,0xFD,0xA5,0xF7,0xF6,0xD7,0xF6,0x28,0x62,0x00,0x00, + 0xF7,0xF6,0x96,0xEE,0x80,0x28,0xF8,0x7A,0xD7,0xF6,0x55,0xE6,0xE0,0xF0,0xDE,0xF7, + 0xD7,0xF6,0x76,0xEE,0x89,0x89,0xF3,0xBB,0x75,0xEE,0xF4,0xDD,0x0A,0x07,0x25,0xA7, + 0x56,0xEE,0x92,0xCD,0x2C,0x2E,0x2E,0x66,0x14,0xE6,0xAF,0xBC,0xD8,0xF8,0xF0,0xD2, + 0x34,0xE6,0x31,0xCD,0x82,0x7F,0xD7,0xD7,0x35,0xE6,0x92,0xD5,0x0F,0x0D,0x2D,0xBD, + 0x34,0xE6,0xE8,0x82,0x2D,0x55,0x55,0x55,0xB6,0xF6,0x08,0x83,0x00,0x2F,0x55,0x55, + 0xB6,0xF6,0xE8,0x82,0x00,0x00,0x0B,0xD5,0xD6,0xF6,0xF0,0xC4,0x00,0x00,0x00,0x2D, + 0xB7,0xFE,0xF6,0xF6,0xFF,0xFF,0xBF,0xEA,0xF7,0xFE,0xB6,0xF6,0xFF,0xAE,0xEE,0xAA, + 0x95,0xEE,0x43,0x41,0x5C,0x5C,0x5C,0x58,0x44,0x41,0xA1,0x28,0xD5,0xF7,0xA0,0x80, + 0x06,0x72,0xE2,0x38,0xB5,0x35,0x35,0x2D,0xC8,0x82,0xE3,0x40,0x60,0x70,0x7A,0x5E, + 0xE6,0x61,0x81,0x28,0x2F,0xFF,0x77,0x5F,0x09,0x93,0xC2,0x30,0x0A,0x2F,0xB5,0xB5, + 0x6B,0x9B,0x67,0x7A,0xD8,0xDE,0xFF,0xFF,0xCB,0xA3,0x06,0x6A,0xC2,0xAA,0xFB,0x7F, + 0x34,0xE6,0x67,0x72,0x2D,0x95,0x55,0x55,0xD7,0xF6,0x4B,0x93,0x00,0x00,0x02,0x0D, + 0x79,0xFF,0xD7,0xF6,0xA9,0xEB,0xEA,0x6E,0xF7,0xFE,0x35,0xE6,0x3C,0x3F,0x37,0x27, + 0x38,0xFF,0xF7,0xF6,0xE3,0xEB,0xEB,0xEB,0xF8,0xFE,0x18,0xF7,0xEA,0xAB,0xAA,0xAA, + 0x18,0xFF,0xD7,0xF6,0x7A,0x5A,0xFE,0xFA,0xF8,0xF6,0xD7,0xF6,0xD5,0xBA,0x0A,0x0B, + 0x18,0xFF,0xF7,0xF6,0xA7,0xF6,0xBF,0x9B,0x18,0xFF,0xB7,0xF6,0xA8,0xE2,0x68,0x7A, + 0xD7,0xF6,0x55,0xE6,0xE8,0xFA,0x7E,0xFF,0x75,0xEE,0x35,0xE6,0x20,0xA8,0xAF,0x38, + 0xB7,0xF6,0x76,0xEE,0x3E,0xAA,0xEE,0x7F,0x75,0xEE,0x92,0xD5,0x2F,0x25,0xA5,0xB5, + 0xF4,0xDD,0x51,0xCD,0x48,0xC8,0x00,0x00,0xD3,0xDD,0x6E,0xB4,0xFA,0xDA,0xDA,0xD8, + 0x72,0xD5,0xF0,0xC4,0x2F,0x2D,0xAF,0xB7,0xD3,0xDD,0x30,0xC5,0x22,0xE2,0x62,0x5F, + 0xE8,0x82,0x65,0x72,0x2A,0xA8,0x2B,0x55,0xE8,0x82,0xA7,0x7A,0xA2,0xBA,0xEA,0xAD, + 0xE8,0x82,0xC8,0x82,0x23,0xAA,0xFF,0x57,0x4D,0xAC,0xE8,0x82,0x35,0x55,0x55,0x55, + 0x75,0xEE,0xE8,0x82,0x02,0xB5,0x55,0x55,0xB6,0xF6,0x09,0x8B,0x00,0x02,0xB5,0x55, + 0x75,0xEE,0x63,0x51,0x70,0x60,0xC0,0xEF,0xA5,0x51,0x23,0x41,0x60,0xE2,0xAD,0xA5, + 0x09,0x93,0x64,0x51,0xB5,0x2D,0x0B,0x0B,0x87,0x82,0x24,0x49,0x5C,0xF8,0xB8,0x88, + 0x47,0x7A,0xC2,0x30,0x55,0x5F,0xE8,0x60,0x06,0x72,0xA2,0x30,0x3D,0x2F,0xEE,0xBF, + 0x88,0x7A,0xC5,0x61,0xBC,0xD5,0x99,0xAB,0xA8,0x7A,0x22,0x41,0xF8,0xDE,0x96,0xB7, + 0x09,0x8B,0xC5,0x61,0xAF,0xAF,0x2F,0x27,0xB6,0xF6,0xA8,0x82,0x25,0x35,0xD5,0x55, + 0x18,0xFF,0xF0,0xCC,0x80,0x80,0xA0,0x89,0xF8,0xFE,0x55,0xEE,0x25,0x25,0x25,0x0D, + 0x18,0xFF,0xF8,0xF6,0x82,0xE2,0xE2,0xC2,0x18,0xFF,0xF8,0xF6,0x7E,0x5F,0xF7,0x57, + 0x18,0xFF,0xD7,0xF6,0xFF,0xBB,0xEF,0xAB,0x18,0xFF,0xD7,0xF6,0xAF,0xBF,0xAA,0xAE, + 0x18,0xFF,0xD7,0xF6,0xBA,0xFA,0xFA,0xFE,0xF8,0xF6,0x76,0xEE,0xE8,0x78,0x7A,0x5E, + 0x76,0xEE,0x35,0xE6,0xE0,0xE0,0xE8,0x68,0x96,0xEE,0x35,0xE6,0x3F,0x2E,0xAB,0x2D, + 0x96,0xEE,0x55,0xEE,0x88,0xC2,0xEE,0x4A,0x14,0xE6,0x71,0xCD,0x27,0xB5,0xBE,0xA8, + 0xD3,0xDD,0xCF,0xBC,0x00,0x80,0x70,0x58,0x92,0xD5,0x6E,0xB4,0x58,0x7B,0xEF,0xA7, + 0x51,0xCD,0x4E,0xAC,0x2E,0x0E,0x26,0x26,0x72,0xCD,0x10,0xC5,0x16,0xB5,0x0D,0xA3, + 0xA7,0x7A,0x66,0x72,0xDD,0xFA,0xAA,0xAB,0xA7,0x7A,0x46,0x72,0xBF,0xDA,0xA2,0x08, + 0xE8,0x82,0x46,0x72,0x0A,0xBD,0xF7,0xFB,0xE8,0x8A,0x66,0x72,0x22,0xAA,0x3D,0x55, + 0xE8,0x82,0x87,0x7A,0x08,0xA0,0x82,0xA5,0x08,0x8B,0xC8,0x82,0xAE,0xFF,0xFF,0xF5, + 0x08,0x8B,0xC4,0x59,0xC0,0xE2,0x68,0xE2,0xA4,0x59,0xC2,0x30,0x2A,0x0A,0xBF,0xDF, + 0xE8,0x92,0xA4,0x59,0x09,0x8B,0x0B,0xAD,0xA8,0x8A,0xA5,0x61,0xE8,0xFE,0x7A,0x7E, + 0x46,0x72,0x23,0x49,0xE8,0x7A,0x5F,0x5F,0xA5,0x51,0x23,0x41,0xB5,0xB7,0x3F,0xEF, + 0x88,0x72,0x64,0x49,0x8B,0xAB,0xFF,0x55,0x47,0x72,0x03,0x49,0xB7,0xBF,0x2F,0x03, + 0xE9,0x92,0x06,0x6A,0xAD,0x8B,0xEB,0xFE,0xE9,0x8A,0x23,0x49,0x82,0xA2,0x7A,0x5E, + 0x14,0xE6,0xE5,0x61,0x0B,0x2D,0xB5,0xD5,0xD7,0xFE,0x0D,0xAC,0x08,0x02,0x02,0xB5, + 0x18,0xFF,0xB7,0xF6,0x80,0x80,0x82,0x89,0xD7,0xFE,0xF8,0xF6,0xF5,0x7D,0xD7,0xF5, + 0x18,0xFF,0xF7,0xF6,0xDD,0xB5,0xFF,0xED,0x18,0xFF,0xD7,0xF6,0x8E,0xAA,0xAA,0x6A, + 0xF8,0xFE,0x96,0xEE,0xF0,0x7A,0x7A,0x5E,0xB6,0xF6,0x55,0xE6,0xFC,0xEF,0x75,0xF7, + 0x76,0xEE,0x35,0xEE,0xEA,0x88,0x2A,0xA8,0x76,0xEE,0x14,0xE6,0x0B,0x0E,0x7A,0xF8, + 0x96,0xF6,0xF4,0xE5,0x82,0x8A,0xC3,0x6A,0x14,0xE6,0xD3,0xDD,0xEA,0xBE,0x03,0x61, + 0xD3,0xDD,0x8E,0xB4,0x58,0x5C,0xFC,0x7E,0x51,0xCD,0xCC,0x9B,0x2F,0xAF,0xFE,0x7A, + 0x10,0xC5,0xAB,0x9B,0x08,0x08,0x0F,0x0D,0x72,0xCD,0x11,0xC5,0x02,0x00,0x03,0xAF, + 0x67,0x72,0x25,0x6A,0x25,0x55,0xDD,0xBE,0xA8,0x7A,0x25,0x6A,0x82,0xBD,0x55,0x55, + 0xA7,0x7A,0x26,0x72,0xA2,0x80,0x2D,0x55,0xA7,0x7A,0x46,0x7A,0xA8,0x0A,0xA0,0x2D, + 0xA7,0x7A,0x66,0x7A,0xD7,0xE8,0xE2,0x8A,0xC8,0x82,0x66,0x72,0x0A,0xD7,0xFB,0xAA, + 0xE8,0x82,0x86,0x7A,0x60,0x22,0xD5,0x77,0x86,0x7A,0xA2,0x38,0x57,0x5C,0xF8,0xE0, + 0xE6,0x69,0xC2,0x40,0x2D,0x2D,0xFF,0xFF,0x67,0x7A,0x03,0x49,0x20,0x00,0x8B,0xF5, + 0xA8,0x82,0xC2,0x38,0xFA,0xF8,0x7A,0x5F,0x44,0x49,0xE2,0x38,0xBC,0xF7,0xFD,0xAB, + 0xA4,0x59,0xA2,0x30,0xDF,0xB7,0x37,0x2F,0x67,0x7A,0x84,0x59,0x09,0x2D,0xFD,0xFF, + 0x06,0x6A,0x44,0x51,0xA8,0xB8,0xBE,0xD7,0xA5,0x59,0x03,0x41,0x9C,0x9C,0x3E,0xA7, + 0xE9,0x8A,0xA5,0x59,0x3F,0xAF,0xEB,0xED,0x4A,0x93,0x67,0x7A,0x37,0xB5,0xED,0x55, + 0x96,0xF6,0x67,0x7A,0x02,0xB7,0x55,0x55,0x97,0xF6,0x67,0x7A,0x00,0x00,0xB7,0x55, + 0xD7,0xFE,0x67,0x72,0x00,0x00,0x0A,0x75,0xD7,0xFE,0xB0,0xBC,0x00,0x00,0x00,0x29, + 0xD7,0xF6,0x55,0xEE,0xE8,0x7E,0xFF,0x5F,0x96,0xF6,0x35,0xE6,0xEA,0xAA,0xAB,0xE5, + 0x96,0xF6,0x55,0xEE,0x7F,0xEE,0x2A,0x7D,0x76,0xEE,0x55,0xEE,0x5A,0x3A,0xD7,0x09, + 0x75,0xEE,0xB3,0xD5,0xE8,0x62,0x68,0x68,0x75,0xEE,0xB3,0xD5,0xAD,0xAF,0xAD,0xBD, + 0x75,0xEE,0x10,0xC5,0x56,0x78,0x82,0x00,0x35,0xE6,0x8B,0x93,0x6A,0xEA,0xAA,0xA8, + 0x30,0xC5,0x68,0x72,0x0B,0xAD,0xD7,0x5C,0xF0,0xC4,0xC9,0x7A,0x00,0x00,0x02,0x35, + 0x66,0x72,0x46,0x72,0xD7,0x5B,0xDD,0xAE,0x67,0x7A,0x46,0x6A,0x55,0xFF,0xAA,0xAB, + 0x66,0x72,0x26,0x6A,0xFE,0xEB,0xAA,0x8A,0x66,0x72,0x26,0x72,0x3D,0xFF,0xFB,0xAA, + 0xA7,0x7A,0x25,0x6A,0x0A,0xBD,0x5F,0xFF,0xA7,0x82,0x46,0x72,0x08,0x0A,0xB5,0x55, + 0xC7,0x82,0x46,0x72,0x2A,0x88,0x0A,0xAD,0xE8,0x8A,0xE5,0x69,0x6A,0xEA,0x80,0x02, + 0xE8,0x8A,0x84,0x59,0x55,0xFA,0x68,0x78,0x85,0x51,0xA2,0x30,0x20,0xE8,0x7A,0x57, + 0x44,0x49,0xA2,0x28,0xDC,0xBF,0xFF,0xFD,0x64,0x49,0xC2,0x30,0xFA,0xB7,0xB7,0x15, + 0x85,0x59,0x23,0x41,0x3D,0xAF,0x2E,0x25,0x27,0x72,0x44,0x49,0xC0,0xC3,0x6B,0x7B, + 0xA5,0x59,0xE2,0x38,0xAE,0xA5,0x37,0x27,0xA5,0x59,0x03,0x41,0xAF,0xEF,0x78,0x5C, + 0xC8,0x82,0xE3,0x40,0x0B,0x09,0xAD,0xFD,0x67,0x7A,0x44,0x51,0x28,0xA8,0xFF,0xD5, + 0xE9,0x8A,0xE5,0x61,0x8A,0x0B,0xAD,0xFD,0xC9,0x8A,0x27,0x72,0x5F,0x78,0x68,0x8A, + 0x67,0x72,0xA5,0x59,0x02,0x80,0xAA,0x58,0x55,0xEE,0x06,0x62,0x2D,0xF5,0x55,0x55, + 0x34,0xEE,0x47,0x72,0x00,0x0A,0x2D,0xB5,0x35,0xE6,0x93,0xDD,0x20,0x2A,0xE8,0xA9, + 0x14,0xE6,0xD3,0xDD,0x3A,0x20,0xFF,0x56,0x96,0xF6,0xF4,0xE5,0x8A,0xAB,0xFB,0x5D, + 0x55,0xEE,0xD3,0xDD,0x60,0xAA,0xF2,0xF2,0x55,0xE6,0xB3,0xD5,0xAD,0xEA,0xAA,0xBB, + 0x96,0xEE,0x14,0xE6,0x82,0x0B,0x03,0x01,0x76,0xEE,0x92,0xD5,0x78,0xE0,0x00,0x00, + 0x35,0xE6,0x0D,0xA4,0x7A,0xA2,0x08,0x20,0xB2,0xD5,0xC9,0x7A,0xB5,0xA8,0xC0,0x00, + 0x66,0x72,0x27,0x72,0x82,0xA0,0x02,0xA9,0x47,0x7A,0x66,0x72,0xF5,0x5F,0xDF,0x7F, + 0x86,0x7A,0x46,0x72,0xF7,0xEF,0xBB,0xBA,0x86,0x7A,0x46,0x72,0xDF,0xEE,0xBA,0xA2, + 0x86,0x7A,0x46,0x72,0xFF,0xFF,0xEA,0xA8,0x66,0x7A,0x46,0x72,0xBF,0x0A,0x08,0x00, + 0x87,0x7A,0x45,0x7A,0xD7,0xFB,0xAA,0x82,0xAB,0xA3,0x66,0x7A,0xDD,0xD5,0x95,0x35, + 0x09,0x93,0xC2,0x38,0x78,0x78,0x78,0x78,0xC2,0x30,0x81,0x28,0x7C,0xA8,0x08,0x08, + 0xC2,0x30,0xA2,0x28,0xAF,0xEE,0x68,0x18,0x44,0x41,0xA2,0x28,0x2D,0x89,0x8B,0xE2, + 0x64,0x51,0xE2,0x38,0x2D,0x2D,0x81,0x43,0x85,0x51,0xE3,0x38,0x62,0xE8,0x5A,0x55, + 0x44,0x41,0xE3,0x38,0x0F,0x7F,0x63,0xB5,0x65,0x49,0x03,0x41,0xF6,0x6F,0x61,0x27, + 0x85,0x51,0xE3,0x38,0x2F,0x05,0x35,0xAF,0xA5,0x59,0x03,0x41,0xFE,0xD6,0x36,0x2E, + 0x26,0x6A,0x84,0x59,0xAD,0xA2,0x63,0xDE,0x87,0x82,0x64,0x59,0x00,0x3B,0xFD,0xFD, + 0x47,0x72,0x64,0x51,0xF8,0xA8,0x5F,0x5D,0xC5,0x59,0x44,0x49,0x0A,0x88,0x9F,0xB5, + 0xC8,0x7A,0x64,0x49,0x0F,0xBD,0xFF,0x7F,0xD3,0xE5,0x26,0x72,0x0B,0x2D,0xB5,0xF5, + 0xD4,0xDD,0x10,0xC5,0x00,0x80,0xA0,0xA9,0x14,0xE6,0x93,0xD5,0xA2,0x2F,0x09,0xAB, + 0x35,0xEE,0x51,0xCD,0xA0,0x08,0x2E,0x16,0x55,0xEE,0xF4,0xDD,0x7D,0xBE,0x82,0xE8, + 0xB6,0xF6,0x14,0xE6,0x29,0x29,0x89,0x8B,0x96,0xF6,0xF4,0xDD,0x70,0x60,0xC8,0xAA, + 0x35,0xE6,0x92,0xD5,0x5F,0x5D,0x5F,0x5C,0xB3,0xD5,0x51,0xCD,0xA0,0x7E,0x5E,0x7E, + 0x25,0x72,0x64,0x59,0x3D,0xD5,0x55,0x55,0x66,0x72,0x63,0x59,0x00,0x29,0xD5,0x55, + 0x66,0x72,0x63,0x51,0x00,0x00,0x0B,0xD5,0x87,0x7A,0xE5,0x69,0x00,0x08,0x80,0x0D, + 0x87,0x7A,0x66,0x7A,0xEA,0xA2,0xEE,0xBB,0x66,0x82,0x87,0x7A,0xBB,0xFB,0x7F,0x7F, + 0x66,0x8A,0x87,0x7A,0x75,0x5F,0xDD,0xDD,0xEC,0xAB,0x87,0x82,0x25,0x05,0x09,0x02, + 0x69,0x9B,0x43,0x49,0x7C,0x7E,0x5C,0x5C,0x02,0x39,0xA2,0x28,0x7C,0x5C,0xDE,0xF8, + 0x23,0x41,0xA2,0x28,0xD5,0xD5,0xDD,0x2F,0x24,0x41,0xC2,0x30,0xFA,0x25,0x2D,0x02, + 0x23,0x41,0xE3,0x38,0xCB,0xF9,0x82,0xE0,0x44,0x49,0xC2,0x30,0x6D,0xFB,0xF0,0xE0, + 0x64,0x49,0xA2,0x30,0xB5,0xBD,0x2D,0xBA,0x44,0x49,0xE3,0x38,0x2A,0xF0,0xFF,0x9E, + 0x65,0x51,0x03,0x39,0x83,0xEB,0xF5,0xB7,0xA5,0x59,0x03,0x41,0x2B,0x9F,0x57,0xDF, + 0xA5,0x59,0x03,0x41,0x20,0xBE,0xD7,0xD7,0x06,0x6A,0x23,0x49,0x0A,0xAA,0xFB,0x5F, + 0xC6,0x59,0x23,0x41,0xB6,0xF8,0xDB,0x55,0xA5,0x51,0x44,0x49,0x8F,0x25,0xF5,0x55, + 0xC5,0x59,0x23,0x41,0x2A,0xBE,0xD7,0xF5,0x09,0x8B,0xC5,0x59,0x0F,0xAD,0xFD,0xFD, + 0xB3,0xDD,0xC8,0x82,0x0B,0x0D,0x35,0x15,0x35,0xE6,0xB3,0xD5,0x8B,0x00,0x82,0x60, + 0xF3,0xDD,0xF0,0xC4,0x34,0xBE,0xB7,0xFF,0x96,0xEE,0x15,0xE6,0x5E,0xBE,0x2B,0x09, + 0x96,0xEE,0x55,0xEE,0x63,0x7A,0xFC,0xF8,0x75,0xEE,0x55,0xE6,0xAF,0xFE,0x9F,0xF7, + 0x55,0xEE,0x92,0xD5,0x78,0x80,0x00,0x00,0x76,0xEE,0x51,0xCD,0x5F,0x7F,0xEA,0x00, + 0x84,0x59,0x43,0x59,0xE7,0xC5,0xAD,0xAB,0x84,0x61,0x43,0x51,0x6E,0x72,0xD6,0x5F, + 0x63,0x59,0x23,0x51,0x5F,0xF7,0xFE,0x3F,0xE5,0x69,0x43,0x59,0x25,0xFD,0xFF,0xBF, + 0x87,0x7A,0x43,0x59,0x02,0xBD,0x57,0x5D,0x87,0x7A,0x43,0x59,0x00,0x00,0x2D,0x55, + 0xCB,0xA3,0xE5,0x69,0xFF,0x3F,0x2F,0x0D,0xCB,0xAB,0x6A,0x9B,0x22,0xA8,0xBE,0xF7, + 0x8A,0x9B,0x43,0x49,0x5C,0x78,0x58,0xF8,0x23,0x41,0xC2,0x30,0x5C,0x56,0xB7,0xFE, + 0x64,0x49,0xC2,0x30,0xAD,0x2D,0x3F,0xAA,0x64,0x49,0x03,0x41,0xFE,0xEA,0x7C,0xF6, + 0x85,0x51,0x03,0x39,0xD5,0x27,0x05,0xAF,0xA5,0x59,0x24,0x41,0xFD,0xAD,0xAB,0xB2, + 0x06,0x62,0xE3,0x38,0xDF,0x7B,0x7A,0xF0,0x24,0x41,0xC2,0x30,0x28,0xAE,0xED,0x29, + 0xA5,0x51,0x03,0x41,0x35,0x15,0xF5,0xD5,0x64,0x51,0x03,0x41,0x94,0xDE,0xFE,0xAA, + 0x85,0x49,0x23,0x49,0xD7,0xFB,0xE2,0xEE,0x64,0x51,0xE3,0x38,0xA8,0xB8,0xFE,0xDE, + 0x64,0x49,0xE3,0x38,0xDF,0xDF,0x9F,0xA2,0x64,0x49,0xE3,0x38,0xE8,0x7B,0xF8,0x2B, + 0x85,0x51,0x23,0x41,0x25,0x25,0xF7,0xF7,0xA8,0x7A,0x44,0x49,0x8B,0x2F,0xAF,0xBD, + 0x8A,0x9B,0x26,0x72,0x2F,0xBF,0xF5,0xD5,0xD3,0xDD,0x29,0x8B,0x00,0x83,0x81,0x8D, + 0x51,0xD5,0xD0,0xC4,0x2B,0xAF,0x2D,0xAD,0x96,0xEE,0xAF,0xBC,0x02,0x03,0xFB,0x7F, + 0x76,0xEE,0x8E,0xB4,0x00,0x00,0xFB,0x55,0x75,0xEE,0x4E,0xAC,0x00,0x80,0x7F,0x55, + 0x76,0xEE,0x8F,0xB4,0x00,0xFE,0xD5,0xBD,0x15,0xDE,0xB0,0xB4,0x80,0xED,0xFE,0x7E, + 0x64,0x59,0x23,0x51,0xC0,0x7A,0xFE,0xDF,0x63,0x59,0x23,0x51,0xAB,0xFF,0xB9,0xAA, + 0x84,0x61,0x43,0x59,0xF5,0xFD,0xBE,0xFB,0x84,0x61,0x43,0x59,0xC2,0x6A,0x5E,0x55, + 0x63,0x59,0x03,0x49,0xA2,0xEC,0x73,0xDE,0x25,0x72,0x23,0x51,0x55,0x55,0x55,0x95, + 0x8B,0x9B,0x02,0x51,0x09,0x03,0x02,0x00,0x8B,0x9B,0x29,0x93,0x00,0x0A,0xB6,0xB7, + 0x49,0x93,0xA4,0x59,0x78,0x60,0xE8,0xE8,0xE5,0x69,0xE3,0x40,0x5F,0x5F,0xF7,0xDC, + 0x85,0x51,0xE3,0x38,0xFA,0xF2,0x7B,0x5E,0x44,0x49,0xE3,0x38,0x8C,0xEA,0x62,0xE3, + 0x23,0x41,0xE3,0x38,0xE0,0xEA,0xAB,0xAD,0xC6,0x61,0x23,0x49,0xF1,0x71,0xE3,0xBD, + 0x85,0x59,0xE3,0x38,0x42,0x4A,0xEA,0x60,0x24,0x41,0xA2,0x30,0x2B,0xAD,0xFD,0xAD, + 0x85,0x59,0x23,0x41,0xFF,0xAD,0xAF,0x2A,0xA5,0x59,0xE3,0x38,0xE2,0xE8,0xFA,0x7F, + 0x44,0x49,0xE2,0x38,0x2C,0xBA,0xDF,0x2D,0x44,0x41,0xE3,0x38,0xFA,0xFE,0xEB,0xF0, + 0x85,0x51,0x03,0x39,0x8B,0xAD,0x7D,0x75,0x64,0x49,0xE3,0x38,0x2F,0xBE,0xBD,0xFD, + 0x85,0x51,0x23,0x41,0xEA,0x2F,0xE5,0x35,0xE6,0x61,0x44,0x49,0x2D,0xF7,0xAF,0x3D, + 0xA8,0x7A,0xE5,0x61,0x2A,0x3D,0xF5,0x9F,0x11,0xC5,0xA8,0x7A,0x0D,0x0D,0x25,0x15, + 0x31,0xCD,0x8E,0xB4,0x2B,0x2F,0xFF,0xD7,0x11,0xC5,0x2E,0xAC,0xC0,0x70,0x7C,0x0B, + 0x93,0xCD,0x2D,0xAC,0x55,0xAD,0x0B,0x82,0xB4,0xCD,0x6F,0xAC,0x2D,0xA0,0xE0,0xE2, + 0x94,0xCD,0x2E,0xA4,0x88,0x8A,0xEB,0xDB,0xF1,0xBC,0x8F,0xAC,0x60,0xF2,0x9E,0xBF, + 0x63,0x59,0x03,0x49,0xBF,0xAE,0xA2,0xA0,0x84,0x59,0x43,0x59,0xFD,0x7D,0x2D,0xCF, + 0x84,0x61,0x43,0x59,0x7E,0x52,0x7A,0x5F,0x64,0x59,0x23,0x51,0x9B,0xEB,0x7E,0x5F, + 0x44,0x51,0xE2,0x40,0xE8,0xAA,0xBF,0xFE,0x6B,0x9B,0x03,0x49,0x35,0x25,0x0D,0x09, + 0xED,0xAB,0x4A,0x93,0x5E,0x7E,0x72,0xE8,0x6A,0x9B,0x29,0x93,0x3D,0xF7,0xB7,0x80, + 0x09,0x8B,0x47,0x72,0xFC,0x78,0x5C,0x5C,0x67,0x72,0x24,0x49,0x58,0x68,0xA2,0xA8, + 0xC5,0x61,0xC2,0x38,0x76,0x5F,0x5F,0x78,0x64,0x49,0xE3,0x38,0xCB,0x49,0xFD,0xFD, + 0x23,0x41,0xE3,0x38,0xAF,0x9E,0xBB,0x25,0x85,0x59,0x03,0x41,0x2F,0x29,0x95,0xBF, + 0x85,0x59,0xC3,0x38,0x40,0x70,0x70,0x78,0x04,0x41,0xA2,0x30,0x0B,0xF5,0xBB,0xA1, + 0xA6,0x59,0xE3,0x38,0x02,0x03,0x09,0xAF,0x85,0x51,0xE3,0x38,0x7E,0x5E,0xFC,0x5E, + 0x64,0x49,0xE3,0x38,0x2F,0x25,0xA5,0xB5,0x44,0x41,0xE2,0x38,0x78,0x6A,0x82,0xEA, + 0x24,0x41,0xE2,0x38,0xAE,0x2D,0xBF,0x55,0x23,0x39,0xE2,0x30,0xFB,0xAE,0x3F,0xBD, + 0xA5,0x59,0x23,0x41,0xFD,0xDD,0xB9,0xA3,0xE6,0x61,0x44,0x49,0x95,0xD5,0xB7,0x0B, + 0x47,0x72,0x84,0x59,0x2B,0xA5,0xFF,0x3F,0x4E,0xB4,0x26,0x72,0x3F,0x3F,0xBD,0xF5, + 0x55,0xEE,0xD0,0xBC,0x57,0x2A,0x02,0x03,0x35,0xE6,0xD0,0xBC,0xBD,0xC8,0xC0,0xE0, + 0x93,0xCD,0x52,0xC5,0x43,0x62,0xC2,0xBC,0x93,0xCD,0xB0,0xB4,0x0E,0xBE,0xFA,0x7A, + 0x52,0xC5,0x4C,0x8B,0xB8,0xAC,0xAF,0xAD,0xD0,0xB4,0x90,0xAC,0xBE,0xF6,0xEA,0x56, + 0x63,0x59,0x43,0x51,0xAD,0x0D,0x29,0x3B,0x84,0x61,0x43,0x51,0xAA,0xE2,0xD6,0x55, + 0x63,0x59,0x23,0x51,0xAA,0xEF,0x5A,0x5F,0x43,0x51,0x04,0x49,0xB8,0xEA,0xEA,0xFE, + 0x44,0x59,0xE2,0x48,0x7F,0x3E,0x0B,0x02,0xAB,0xA3,0xA5,0x61,0x09,0x01,0x03,0x03, + 0xCC,0xAB,0x49,0x93,0xF7,0x7E,0xF8,0x60,0x6A,0x9B,0xC8,0x82,0x88,0xFB,0x7A,0xDF, + 0xC8,0x82,0x26,0x72,0x5C,0x7C,0xFC,0x7C,0x46,0x72,0x06,0x6A,0x9E,0xA6,0x2E,0x28, + 0xA8,0x82,0x03,0x41,0x5A,0x78,0x60,0xC0,0x24,0x41,0xC2,0x30,0x8B,0xAB,0xFD,0x57, + 0x44,0x49,0xC2,0x30,0x3F,0xBF,0xBD,0x6D,0x65,0x51,0xE3,0x38,0x2E,0xBE,0x7F,0xFD, + 0xA6,0x59,0xE3,0x38,0x58,0x7A,0x7F,0xFF,0x03,0x39,0xA2,0x30,0x0B,0x2B,0x97,0xB6, + 0x65,0x49,0x03,0x41,0xCD,0xE9,0xE9,0x81,0x24,0x41,0xE3,0x38,0xFA,0xB6,0xFC,0x54, + 0x44,0x41,0xE3,0x30,0x3F,0x3F,0xF5,0x55,0x44,0x41,0xC2,0x30,0x7A,0xD8,0xFF,0xF7, + 0x23,0x39,0xE2,0x30,0xFD,0xAE,0xAB,0xF7,0x23,0x39,0xC3,0x38,0xAB,0x3E,0x9A,0xBA, + 0x64,0x49,0x03,0x39,0x29,0x75,0x57,0x5F,0x47,0x6A,0x03,0x41,0xAF,0x2D,0xBD,0xFD, + 0x47,0x72,0xA5,0x59,0x33,0xEF,0xB0,0x63,0x09,0x83,0x26,0x6A,0x25,0xB5,0xEF,0xED, + 0x15,0xE6,0x8B,0x93,0x03,0x01,0x09,0xA9,0x14,0xE6,0x32,0xC5,0xF8,0xD8,0xDA,0xDE, + 0x93,0xCD,0xF1,0xBC,0xA0,0xE8,0xBC,0xDA,0x52,0xC5,0x6C,0x8B,0xA0,0xE8,0xE8,0x6A, + 0x90,0xAC,0xEE,0x9B,0x09,0x89,0xED,0xB9,0x8F,0xAC,0x4F,0xA4,0x3E,0x89,0x59,0x1E, + 0x63,0x59,0x23,0x51,0xAA,0xC0,0xFE,0xDF,0x43,0x51,0x03,0x49,0x02,0x2B,0xCA,0xFA, + 0x43,0x51,0x02,0x49,0xBE,0xAE,0xED,0xBB,0x44,0x59,0x03,0x51,0x7F,0xBB,0x3F,0x0F, + 0xC6,0x69,0x03,0x51,0xFD,0xBF,0xBF,0x3F,0xEC,0xAB,0xE9,0x8A,0x29,0x09,0x2B,0x8A, + 0x2D,0xB4,0x8B,0x9B,0x78,0xFA,0xAA,0x55,0xAB,0xA3,0x87,0x7A,0xFE,0xFA,0xE0,0x7A, + 0xA7,0x82,0x25,0x6A,0x7C,0xDC,0x7E,0x5F,0xA8,0x82,0x25,0x6A,0xBD,0x27,0x0D,0x03, + 0xA8,0x82,0xE5,0x69,0xC0,0x80,0xE8,0x56,0xE5,0x61,0xA2,0x30,0x5F,0x54,0x5C,0x58, + 0xE3,0x38,0xA2,0x30,0x8B,0xF5,0xD7,0xAA,0x24,0x49,0xC2,0x30,0x2F,0xAD,0xFD,0xBB, + 0x65,0x49,0x03,0x39,0x7C,0x5F,0x5B,0xFB,0x03,0x41,0xA2,0x28,0xBE,0xB6,0x5E,0xD8, + 0x65,0x49,0xC2,0x30,0x03,0xAB,0xED,0xED,0x23,0x41,0xA2,0x28,0xF8,0xBE,0x77,0xF7, + 0x03,0x39,0xC3,0x30,0xEF,0xAB,0x9F,0x35,0x03,0x39,0xC2,0x30,0xBF,0x7D,0xFF,0xFE, + 0x23,0x41,0xE3,0x38,0x55,0x55,0xFD,0xCB,0x23,0x41,0xC2,0x30,0xF5,0xBE,0xAE,0x20, + 0x44,0x49,0x03,0x39,0xEF,0xE3,0x7A,0x78,0x44,0x49,0x03,0x41,0x27,0xD5,0xD7,0x5A, + 0xC5,0x61,0x23,0x41,0x0E,0xBB,0xAF,0xAD,0xA8,0x7A,0xC5,0x61,0x09,0x09,0x0B,0xAB, + 0x52,0xCD,0xA8,0x7A,0x09,0x09,0x0D,0x2D,0x73,0xCD,0xD0,0xB4,0x8C,0x0C,0x0C,0xC7, + 0x32,0xC5,0x2E,0xA4,0x80,0xEA,0xF8,0x78,0xF1,0xBC,0xAD,0x93,0x5A,0xBA,0xA8,0xFF, + 0x31,0xBD,0xED,0x9B,0xAF,0x02,0xBF,0xD5,0x32,0xC5,0x8F,0xAC,0x55,0x5F,0xAA,0x25, + 0x43,0x51,0x02,0x49,0xB8,0xE0,0xFA,0x6A,0x43,0x51,0x02,0x49,0xD8,0x96,0xB5,0x2D, + 0x43,0x51,0x23,0x51,0xDD,0xFA,0x3C,0x25,0x44,0x59,0x23,0x51,0xAA,0xA8,0x80,0x4E, + 0x29,0x93,0x23,0x51,0x95,0x95,0x15,0x35,0xAB,0xA3,0x87,0x7A,0x82,0xE0,0x7A,0x5E, + 0x0A,0x93,0x67,0x72,0xA0,0x7E,0x55,0x55,0xC8,0x82,0x46,0x72,0x78,0x7F,0x7F,0x77, + 0x87,0x7A,0x26,0x6A,0xFF,0xAF,0x3F,0x2B,0xC8,0x82,0xC5,0x61,0xA2,0xF8,0x7E,0x5F, + 0x26,0x6A,0xC4,0x61,0xDE,0xEA,0x2F,0x3F,0x06,0x6A,0x82,0x30,0x78,0xE0,0xC0,0x80, + 0x03,0x39,0x81,0x28,0x0B,0x3D,0x9F,0xBF,0x44,0x49,0xA2,0x30,0xAF,0x37,0xAF,0x2F, + 0x65,0x49,0xC3,0x30,0xA8,0xAA,0xEB,0x77,0x24,0x41,0x82,0x20,0xE8,0xE2,0xF2,0x7A, + 0x24,0x41,0x82,0x20,0xA3,0xBF,0xF5,0xED,0xE3,0x30,0xA2,0x28,0x80,0xF8,0xED,0xB5, + 0x24,0x41,0xA2,0x30,0x0D,0xAF,0xFF,0xBF,0x04,0x39,0xC2,0x30,0xB4,0xFF,0xFF,0xFF, + 0x85,0x49,0x03,0x39,0xFF,0xE9,0xE3,0x7D,0x44,0x49,0xE3,0x38,0x80,0xE0,0x5B,0xFD, + 0x23,0x41,0xE2,0x38,0x82,0x57,0xD5,0x55,0x43,0x41,0xC2,0x30,0xAA,0xA9,0xAF,0x8F, + 0x85,0x51,0x02,0x39,0x2E,0x3F,0x3D,0x29,0x67,0x72,0xC5,0x59,0xBD,0xCD,0x89,0xDD, + 0x31,0xC5,0x06,0x62,0x0D,0x0D,0x05,0x25,0x53,0xCD,0x8C,0x8B,0x02,0xEA,0xFF,0x5E, + 0x90,0xAC,0xAD,0x93,0x78,0x5F,0x55,0x55,0xEE,0x9B,0x4B,0x83,0x22,0x2B,0xEB,0x7E, + 0x0E,0x9C,0x2B,0x7B,0x30,0xB8,0xD7,0x55,0xF1,0xBC,0x4B,0x83,0x0A,0x0A,0x2B,0xB5, + 0x23,0x51,0x02,0x41,0xF2,0xEC,0x9E,0xAC,0x23,0x49,0x02,0x49,0x80,0xCB,0xEA,0x0C, + 0x43,0x51,0x23,0x51,0xA1,0xE3,0x8F,0xA7,0x44,0x51,0x02,0x49,0xB8,0x68,0xFA,0x5E, + 0x09,0x8B,0x03,0x49,0x35,0x35,0x25,0x25,0xE9,0x8A,0x47,0x72,0xF8,0xF8,0xFA,0xFE, + 0x87,0x7A,0x67,0x72,0xFF,0xAA,0x80,0x00,0x87,0x7A,0x46,0x72,0x7E,0x7E,0xD8,0x5A, + 0x87,0x7A,0x26,0x6A,0xAB,0xCB,0xCA,0x7A,0x26,0x72,0xA4,0x61,0x7C,0xDE,0xB6,0x2F, + 0x87,0x7A,0xE5,0x61,0xD5,0xD5,0x8B,0xAA,0x87,0x7A,0x23,0x41,0xEA,0x60,0xC0,0xEA, + 0x23,0x41,0x81,0x28,0xB7,0xA5,0x0D,0x0B,0x44,0x49,0xE2,0x38,0xEF,0x43,0x4F,0x57, + 0xC2,0x30,0x82,0x20,0x20,0xFE,0x7A,0x5F,0xE3,0x30,0x61,0x20,0x78,0xDE,0xF7,0xFD, + 0xC3,0x28,0x82,0x20,0xC9,0xBD,0xD5,0xB7,0xE3,0x30,0xA2,0x28,0xA7,0xEB,0xFF,0xBF, + 0xE3,0x30,0xA2,0x28,0x0F,0xEB,0xA8,0x9E,0x03,0x39,0xC3,0x30,0xDD,0xB5,0xF5,0x95, + 0x03,0x39,0xC2,0x30,0xA2,0x8A,0x0A,0xA7,0x03,0x41,0xE2,0x30,0xA2,0xCE,0xBF,0x2F, + 0x65,0x49,0xE2,0x38,0xD7,0xFD,0xAD,0x0F,0x43,0x49,0xE3,0x30,0xB6,0xDF,0x5B,0xE0, + 0x84,0x49,0xE2,0x38,0x2D,0x97,0xBD,0xFF,0x06,0x62,0x63,0x49,0x2D,0x3F,0xD5,0xB5, + 0x6F,0xAC,0xE6,0x59,0x25,0x35,0x35,0x35,0xD0,0xB4,0xCA,0x72,0xF8,0xF8,0x5A,0x60, + 0xAD,0x8B,0x07,0x5A,0x00,0x80,0xFA,0x57,0x4B,0x7B,0x68,0x5A,0x20,0xEB,0xFD,0xF5, + 0xED,0x93,0xEA,0x72,0xD5,0xF5,0xB5,0x0D,0x0E,0x9C,0x4B,0x83,0x3D,0xFD,0xCF,0x08, + 0x23,0x49,0x03,0x49,0x1B,0xA3,0xE8,0x97,0x43,0x51,0x23,0x51,0x75,0xA5,0x6B,0xF8, + 0x43,0x51,0x03,0x49,0xA2,0x7E,0xDE,0x7F,0x64,0x51,0xE2,0x48,0xFF,0xFF,0xFF,0x1F, + 0xE8,0x82,0x02,0x49,0x05,0x09,0x03,0x00,0xC7,0x82,0x87,0x7A,0x57,0x5F,0x77,0xF8, + 0xA7,0x7A,0x66,0x72,0xEB,0xBA,0x7A,0x1C,0xAA,0x9B,0x67,0x72,0x55,0xD5,0x2D,0xC2, + 0x49,0x93,0xE5,0x61,0xAF,0xE0,0x5C,0x55,0x67,0x7A,0x23,0x49,0xA8,0xAA,0x5A,0xD7, + 0x46,0x72,0x43,0x41,0x02,0x2A,0x55,0x55,0x47,0x72,0x03,0x41,0xC0,0xE8,0xF5,0xD5, + 0x23,0x41,0x81,0x28,0xAA,0xA8,0xE0,0x7A,0x23,0x39,0x81,0x20,0x68,0x7F,0x57,0x5D, + 0xC3,0x28,0x61,0x18,0xDF,0xBF,0xB5,0x29,0x03,0x39,0x82,0x20,0xFD,0xAF,0xA3,0x02, + 0xE2,0x30,0x82,0x20,0xD7,0xFA,0x2E,0xAC,0xE2,0x30,0xA2,0x28,0xD5,0xDF,0x5C,0x7A, + 0xE3,0x30,0x81,0x28,0x3E,0x2B,0xBF,0xED,0x04,0x39,0xA2,0x28,0x8B,0x22,0x3F,0xFD, + 0x24,0x39,0xC3,0x30,0x3D,0xEA,0xAE,0xD5,0x03,0x39,0xE2,0x30,0xA0,0x54,0x38,0x38, + 0x44,0x41,0xE2,0x38,0x0F,0xBD,0xB7,0x17,0x64,0x49,0x03,0x41,0xE0,0xB0,0xB2,0x58, + 0x44,0x41,0xE2,0x38,0x3F,0xCA,0x2A,0xF5,0xA5,0x51,0xE2,0x38,0x2A,0xAF,0x2A,0xBD, + 0x0E,0xA4,0xC5,0x59,0x35,0x15,0x95,0x95,0x52,0xC5,0x6F,0xAC,0x70,0xC2,0x29,0xB5, + 0x52,0xC5,0xEA,0x72,0x5F,0xAA,0xA0,0x80,0x6F,0xA4,0x89,0x62,0xD5,0x00,0x00,0x00, + 0x6F,0xA4,0x6B,0x83,0x2D,0x2A,0x28,0x80,0x6F,0xAC,0xCD,0x93,0xB6,0x3E,0x3A,0xAA, + 0x64,0x59,0xE2,0x40,0x3F,0xA9,0x0A,0x02,0x43,0x51,0x02,0x49,0x88,0xA8,0x68,0xF8, + 0x22,0x49,0x03,0x49,0xFE,0x5A,0xF8,0x7F,0xCB,0xA3,0x03,0x49,0x95,0x35,0x35,0x25, + 0x6A,0x9B,0xC7,0x82,0x5F,0x78,0x78,0xF8,0x8A,0x9B,0x86,0x7A,0x77,0x57,0x9F,0x2F, + 0xCB,0xA3,0x66,0x7A,0x35,0x0B,0xE2,0x58,0x8A,0x9B,0xA4,0x59,0x70,0x7E,0x5F,0x5F, + 0xE5,0x61,0x43,0x49,0x0A,0x82,0x62,0x5C,0x84,0x51,0x24,0x41,0x78,0xFF,0xFB,0xBF, + 0x06,0x62,0x03,0x41,0x5D,0xFD,0xA2,0x78,0xA4,0x51,0xC2,0x38,0xEF,0xFA,0x70,0x7F, + 0xE3,0x38,0x61,0x18,0xC8,0xEA,0xFE,0x6E,0xC2,0x30,0x61,0x18,0xDF,0x5F,0xD7,0x25, + 0xC2,0x28,0x81,0x20,0x3D,0xFA,0xB8,0xA2,0xE3,0x30,0xA2,0x28,0xA0,0xE7,0x0B,0x82, + 0xE2,0x30,0xA2,0x28,0xF2,0xC2,0x39,0x3F,0xE3,0x30,0xA2,0x28,0xD5,0xFA,0xF0,0xB8, + 0xC2,0x30,0xA2,0x28,0xFD,0xFA,0x96,0xA4,0xE2,0x30,0xA2,0x28,0xAF,0xB5,0xFF,0xFF, + 0x03,0x31,0xC2,0x30,0x35,0xFF,0xE7,0xB5,0x23,0x39,0xC2,0x30,0xB0,0xB2,0xF9,0xDD, + 0x44,0x41,0xC2,0x30,0x9F,0x3F,0xAF,0xBF,0x85,0x51,0xE3,0x30,0x78,0x78,0x5F,0xD5, + 0x24,0x39,0xC3,0x28,0xA2,0xEB,0xEB,0xBE,0xA5,0x51,0x03,0x39,0xBD,0x0D,0xA5,0xF5, + 0x88,0x6A,0x64,0x49,0x35,0x3F,0x37,0x3D,0xD0,0xB4,0xAD,0x93,0x2B,0xBF,0xF5,0x55, + 0x31,0xBD,0xED,0x9B,0x80,0xAB,0xAF,0xD5,0xF0,0xB4,0x4F,0xA4,0xDF,0xFE,0xF8,0xAA, + 0xB0,0xAC,0x4E,0xA4,0xFF,0xFF,0x5F,0xE2,0x6F,0xAC,0x0E,0x9C,0xA8,0xA0,0xFA,0x7A, + 0x64,0x51,0x23,0x49,0x0B,0x8B,0xEF,0xDD,0x43,0x51,0x02,0x49,0xFC,0x5E,0x57,0x57, + 0x23,0x49,0xE2,0x40,0xEA,0xBE,0xBB,0xA7,0x6A,0x93,0x23,0x49,0x05,0x0D,0x0D,0x09, + 0x6A,0x9B,0x08,0x8B,0x5A,0xFE,0xAA,0x02,0xCB,0xA3,0x66,0x72,0x02,0xC2,0x72,0x5E, + 0x29,0x93,0x05,0x62,0xFC,0xDF,0xFF,0x7F,0x46,0x72,0x43,0x49,0xF8,0x7C,0x57,0x55, + 0x84,0x51,0x44,0x49,0xFE,0xB3,0x98,0xE8,0x64,0x51,0x03,0x39,0x3A,0xFA,0x7E,0x7A, + 0xC5,0x61,0xE2,0x40,0x60,0xE0,0xEB,0xE5,0x03,0x41,0xC2,0x30,0xE8,0x7C,0xFE,0x7E, + 0xE2,0x30,0x61,0x18,0x6A,0x58,0x7A,0x57,0x24,0x39,0x61,0x18,0xBD,0xAD,0x0B,0xFF, + 0x23,0x39,0xA2,0x28,0xFF,0x82,0xA8,0xB5,0x03,0x39,0xA2,0x28,0xDF,0xFF,0xAA,0xB8, + 0x03,0x39,0xA2,0x28,0xAB,0x8A,0xA3,0xEF,0x03,0x31,0x82,0x20,0x88,0xA8,0xBA,0xD7, + 0xE3,0x30,0xA2,0x28,0x56,0x7E,0x80,0x82,0xE3,0x30,0x81,0x28,0xFA,0x5F,0xFE,0x0A, + 0x03,0x39,0xA2,0x28,0xFD,0xBD,0xBB,0xF8,0xE2,0x30,0xA1,0x28,0x8B,0xE2,0xBA,0xFF, + 0x03,0x31,0xC2,0x28,0xB9,0x0D,0x8A,0xEB,0x03,0x31,0xC3,0x30,0xFB,0xF8,0xD6,0x7D, + 0x03,0x31,0xC2,0x30,0x1F,0xAF,0x27,0x2E,0x64,0x49,0xC2,0x28,0x2F,0x0F,0xAF,0x25, + 0x4B,0x8B,0x64,0x49,0xBD,0x35,0x25,0x2D,0xEE,0x9B,0x6B,0x8B,0xFA,0xFA,0x60,0x6A, + 0xED,0x9B,0x2A,0x83,0x02,0x2B,0x2F,0xB7,0x6F,0xA4,0xCD,0x93,0x02,0xF7,0xFF,0x55, + 0x6F,0xAC,0xCD,0x93,0xC8,0x7F,0x55,0x55,0x2E,0x9C,0xAC,0x93,0x2A,0xAF,0xB5,0xD5, + 0x23,0x49,0x02,0x41,0xE0,0xEE,0xEF,0xDF,0x23,0x49,0xE2,0x40,0xFA,0x76,0xFF,0xAE, + 0x23,0x49,0xE2,0x40,0xFF,0xAD,0x8F,0xAA,0x49,0x93,0x03,0x49,0x01,0x09,0xF5,0xD5, + 0x29,0x93,0x84,0x59,0x00,0xA8,0xEA,0x7F,0xC8,0x82,0x03,0x41,0xA8,0xAA,0xFF,0xD5, + 0x67,0x72,0x43,0x51,0x60,0x7E,0x57,0xDF,0x85,0x51,0x22,0x41,0x37,0xB7,0x03,0xA2, + 0x84,0x49,0x44,0x49,0x62,0x7A,0x7E,0xD7,0xE6,0x61,0x23,0x41,0x57,0x55,0xBD,0x82, + 0xC4,0x59,0x03,0x39,0x55,0xD5,0x7F,0x5C,0x23,0x41,0xA2,0x28,0x68,0x6E,0x6A,0xEC, + 0x03,0x31,0x61,0x20,0xD5,0xF7,0xEB,0xAB,0x81,0x28,0xC2,0x20,0xE8,0xAA,0x8F,0xAB, + 0xE3,0x30,0x81,0x28,0x97,0xD5,0xDF,0x70,0x23,0x41,0xA1,0x28,0x7E,0xFB,0xEB,0x83, + 0xE3,0x30,0xA2,0x28,0x29,0xFB,0xDF,0x37,0x03,0x39,0x81,0x28,0xDE,0xFF,0xF7,0xE0, + 0x03,0x31,0xA2,0x28,0xEF,0xB9,0xA9,0x89,0x03,0x39,0xC2,0x30,0xFD,0x69,0xEE,0x75, + 0x03,0x39,0xC2,0x30,0xF3,0xEB,0x0D,0x8D,0xE3,0x30,0xC2,0x28,0x71,0x4B,0xEE,0x54, + 0xE3,0x30,0xA1,0x28,0x02,0x87,0x8F,0xBF,0x03,0x31,0xC2,0x28,0xFB,0xB7,0xBA,0xEB, + 0x23,0x39,0xE2,0x30,0xBD,0xDF,0x57,0xDD,0x84,0x51,0xE2,0x30,0x37,0x2D,0x3B,0x8B, + 0x2D,0xA4,0x84,0x51,0xA5,0xED,0x09,0x0B,0x8F,0xB4,0xA8,0x72,0xFF,0x55,0xEA,0x00, + 0xCD,0x9B,0x67,0x62,0xBF,0x55,0xFF,0xF8,0x4B,0x83,0x47,0x62,0xBC,0x57,0xFF,0xFF, + 0xAC,0x8B,0x67,0x62,0x00,0x2D,0xB5,0x57,0xAD,0x93,0x09,0x7B,0x00,0x22,0xAA,0xA9, + 0x02,0x41,0xE3,0x40,0x30,0xAE,0x00,0xB0,0x23,0x49,0xE2,0x40,0xAF,0xAA,0x22,0xE6, + 0x23,0x41,0xE2,0x40,0x0A,0xE0,0xE0,0x9C,0x44,0x49,0xE2,0x40,0x36,0xBD,0xFF,0xF5, + 0xE5,0x61,0x02,0x41,0xE0,0x5F,0x55,0x55,0x06,0x62,0xE2,0x40,0xB5,0x35,0x35,0x35, + 0xE5,0x61,0x84,0x51,0x5E,0xFE,0x78,0xE0,0xA5,0x51,0x23,0x41,0xE8,0xE8,0xEF,0xD7, + 0x26,0x6A,0x44,0x49,0x35,0x05,0x25,0xD5,0xE4,0x61,0x82,0x30,0xA0,0xF8,0x5C,0x56, + 0x84,0x51,0xC2,0x30,0x78,0xDA,0xFF,0xF5,0x03,0x39,0x81,0x20,0x7A,0xFA,0xF8,0x5F, + 0xC2,0x28,0x82,0x28,0x81,0x83,0xA2,0x8B,0x64,0x49,0xA2,0x28,0xAD,0x89,0x8B,0x7B, + 0x24,0x41,0x81,0x28,0x88,0xA8,0xAA,0xFD,0x44,0x49,0xE2,0x38,0x0D,0x2F,0xD7,0xDD, + 0x44,0x41,0xA1,0x28,0xDE,0x5C,0x7A,0xFA,0x04,0x39,0x81,0x28,0x00,0xA3,0xFF,0xD7, + 0xE3,0x30,0xA2,0x28,0xC0,0xF5,0xF7,0xAD,0xE3,0x30,0xA2,0x28,0x0F,0xAF,0x57,0x78, + 0x03,0x31,0xA2,0x28,0x2F,0xFF,0xAD,0xAF,0x03,0x31,0xC2,0x28,0x5F,0x7F,0xD5,0xE3, + 0x23,0x39,0xC2,0x28,0xD5,0xFD,0xAF,0xBF,0x03,0x39,0xC2,0x30,0x8B,0xBF,0xA6,0xAA, + 0x03,0x39,0xC2,0x30,0xFF,0xCA,0xAB,0x2A,0x4A,0x8B,0x03,0x39,0xF5,0xB5,0xB5,0x35, + 0x31,0xC5,0x4A,0x83,0xA9,0x82,0x02,0x00,0x10,0xC5,0x6E,0xAC,0xBF,0xF7,0x7C,0xA0, + 0x6E,0xAC,0x0A,0x83,0x5C,0x70,0x80,0x80,0x6B,0x93,0x67,0x6A,0xD5,0xF7,0xDE,0xE8, + 0x4A,0x83,0x47,0x62,0x7E,0xEA,0xAA,0x02,0x4B,0x83,0xA5,0x49,0x0F,0xDF,0x7E,0xF8, + 0x23,0x49,0xE3,0x40,0xBF,0xAB,0xAB,0xBE,0x23,0x49,0x03,0x41,0xF5,0xBF,0x4F,0x77, + 0x03,0x41,0xC2,0x38,0x28,0x2C,0xAE,0xFE,0x03,0x41,0xE2,0x38,0xA2,0xAF,0x79,0x65, + 0x02,0x41,0xE2,0x38,0x32,0x2B,0xFD,0xAF,0x26,0x6A,0xE2,0x40,0x35,0x35,0x35,0x15, + 0x26,0x6A,0x23,0x41,0xE8,0x68,0x68,0x68,0x44,0x41,0x03,0x39,0xA2,0x35,0x7D,0x5D, + 0x44,0x41,0xE2,0x30,0xBA,0x68,0x4A,0xBF,0xA4,0x51,0xA2,0x28,0x70,0x7B,0x57,0x7F, + 0xC2,0x28,0x81,0x20,0x83,0xC2,0x60,0x0A,0xE3,0x28,0x61,0x20,0xD7,0xF5,0xAB,0x22, + 0xE3,0x30,0xA2,0x28,0xFF,0xF9,0xAB,0x8A,0x03,0x31,0xA2,0x28,0x73,0x57,0x5F,0xFE, + 0xC2,0x28,0x81,0x20,0x5B,0x78,0xBE,0xAF,0x03,0x41,0x81,0x20,0x0B,0xAD,0xFF,0x57, + 0x44,0x41,0xA2,0x28,0xFA,0xEA,0x8B,0xE5,0xE2,0x30,0x81,0x28,0xEE,0x3B,0xFD,0xA8, + 0x03,0x39,0x81,0x20,0xF5,0xDE,0xAF,0x2A,0x24,0x41,0xA2,0x28,0x5F,0x5F,0x5F,0xE0, + 0x03,0x39,0x82,0x28,0xFF,0xBD,0xE3,0xEA,0x03,0x31,0x81,0x28,0xA2,0xB3,0xFF,0xDF, + 0xE2,0x30,0xA2,0x28,0x28,0xA8,0x95,0xDF,0x23,0x39,0xC2,0x30,0xAB,0x23,0xF7,0xFF, + 0x65,0x51,0x03,0x39,0xD7,0xBD,0xBD,0x39,0x6C,0x93,0x85,0x51,0x35,0xB5,0xAD,0xAD, + 0xF0,0xBC,0x0A,0x83,0x02,0x2D,0xD5,0x55,0xF0,0xBC,0xE9,0x7A,0x00,0x00,0x03,0xFD, + 0x10,0xC5,0x6E,0xAC,0x7A,0xEA,0xA2,0x8B,0x6E,0xAC,0x6B,0x8B,0x7E,0xAA,0xA8,0x80, + 0x2D,0xA4,0x0A,0x7B,0x75,0xE8,0x00,0x00,0x4E,0xA4,0x68,0x62,0x7F,0xFA,0x80,0x00, + 0x03,0x41,0xE2,0x40,0x34,0x27,0xF8,0xBB,0x23,0x49,0xE2,0x38,0xEA,0x7E,0x7F,0x55, + 0x03,0x41,0xC2,0x38,0xFF,0xAA,0xAF,0xAB,0x03,0x41,0xC2,0x38,0xA3,0xBB,0xFE,0xBA, + 0x03,0x41,0xE2,0x38,0xFA,0x5F,0xF5,0xFD,0x05,0x62,0xE2,0x40,0x15,0x15,0x15,0x95, + 0x46,0x6A,0x03,0x39,0x68,0x60,0x60,0x68,0x03,0x39,0xE2,0x30,0x02,0xAB,0x25,0x3B, + 0x23,0x39,0xE3,0x38,0x8A,0x2B,0x8B,0xBF,0x44,0x41,0xE3,0x30,0x6F,0xFA,0xA2,0xAA, + 0x44,0x39,0xE3,0x30,0x55,0xBF,0xFC,0xFA,0x24,0x41,0xE3,0x30,0x7F,0xFF,0xFA,0x3B, + 0x23,0x39,0xE3,0x30,0x55,0x7F,0xFE,0xFA,0x03,0x31,0xC3,0x28,0xFF,0xFF,0x2A,0xCA, + 0x03,0x31,0xA2,0x20,0x57,0x7E,0xAA,0xAA,0xE3,0x28,0x82,0x20,0x5D,0xF6,0xAA,0xA2, + 0x03,0x39,0x82,0x20,0x3D,0xBD,0x77,0x7F,0xE3,0x30,0x82,0x20,0x02,0x0A,0x2B,0x35, + 0x23,0x41,0xA2,0x30,0xAA,0xDE,0xFE,0xFE,0x44,0x41,0xC2,0x30,0xE0,0xCA,0x75,0xDD, + 0xE2,0x30,0xA2,0x30,0x8F,0xAF,0xA9,0x22,0x22,0x39,0xA2,0x28,0x55,0xF5,0xFD,0x3F, + 0x44,0x41,0xA1,0x28,0xD7,0xDD,0xFE,0xA2,0x43,0x41,0xE3,0x30,0xBB,0x35,0xA9,0x8B, + 0x47,0x62,0x23,0x41,0xF5,0x95,0x25,0x2B,0xE9,0x7A,0xC5,0x59,0x09,0x2B,0x8A,0x2A, + 0x0A,0x83,0xA9,0x72,0x2A,0x2B,0xFB,0xFF,0x2B,0x83,0xC9,0x7A,0x2F,0x28,0xEB,0xFF, + 0xCF,0xB4,0x0A,0x83,0x2D,0xDD,0x55,0x55,0x6E,0xAC,0x0A,0x83,0x00,0x0A,0xB5,0x55, + 0x6E,0xAC,0x4A,0x8B,0x00,0x00,0x00,0x25,0xAF,0xB4,0x4E,0xAC,0x7F,0xAB,0x0A,0x0B, + 0x03,0x41,0xC2,0x38,0xA0,0xC0,0xE8,0xFE,0x03,0x41,0xE2,0x38,0xD5,0xAD,0xD1,0x79, + 0x02,0x41,0xE2,0x38,0x7D,0x5D,0x55,0xF5,0x03,0x41,0xE2,0x38,0x77,0x57,0x5D,0xD7, + 0xE2,0x38,0xC2,0x38,0x00,0x00,0x00,0xA8,0x06,0x62,0xE2,0x38,0x95,0x15,0x95,0x15, + 0x67,0x72,0x03,0x41,0x68,0x68,0x78,0x78,0x03,0x39,0xE2,0x30,0x5E,0xEE,0xDF,0xF7, + 0x02,0x39,0xE3,0x30,0xDF,0x99,0x55,0x75,0x23,0x39,0xE3,0x30,0x0B,0xA7,0xFF,0xD5, + 0x24,0x39,0xE3,0x38,0x68,0xBB,0xFF,0x5F,0x24,0x41,0xE3,0x30,0xFF,0x29,0x8F,0xAE, + 0x24,0x41,0x03,0x39,0x71,0x57,0x7A,0x5C,0x24,0x39,0xE2,0x30,0xFF,0xFA,0xBD,0xAE, + 0x03,0x31,0xE3,0x30,0x60,0xAE,0x2E,0x03,0x03,0x31,0xC2,0x28,0xFF,0xEB,0xC8,0x00, + 0x03,0x31,0xA2,0x20,0x7E,0xFB,0xBA,0xA8,0xE2,0x28,0xA2,0x28,0x55,0x67,0x73,0xAA, + 0x03,0x31,0x81,0x20,0xA2,0xAD,0xDF,0x7F,0x03,0x39,0x82,0x20,0xA2,0xA8,0x0B,0xF5, + 0x03,0x31,0xC2,0x30,0xF7,0x2E,0x82,0xA9,0x23,0x39,0xC2,0x28,0xB9,0xA9,0xAD,0x2F, + 0x23,0x41,0xC2,0x28,0xA0,0xF8,0xDC,0xFE,0xA5,0x51,0xC2,0x28,0xFF,0xB7,0x3D,0x2F, + 0x68,0x6A,0xC5,0x51,0xBD,0x3D,0xA9,0xBF,0xC9,0x72,0x48,0x6A,0xAB,0xAB,0xAF,0x3D, + 0xE9,0x7A,0x89,0x72,0x8F,0xFF,0xB5,0xBB,0xEA,0x82,0xA9,0x7A,0x3B,0xB9,0xFB,0xF7, + 0x0A,0x83,0xC9,0x72,0x3A,0xBF,0xE9,0xAB,0x0A,0x83,0xC9,0x7A,0xA2,0x0E,0xF7,0xDA, + 0x4B,0x8B,0xEA,0x7A,0x2F,0x5D,0xFD,0x55,0x8F,0xAC,0x0A,0x83,0x0B,0xBD,0x55,0x55, + 0x03,0x39,0xC2,0x38,0xE7,0xBF,0xEB,0xEB,0x03,0x41,0xE2,0x38,0x5B,0x7F,0x55,0xD5, + 0x22,0x39,0xC2,0x38,0xF7,0xDD,0xF6,0xFF,0xE2,0x38,0xC2,0x38,0xAA,0xEA,0x02,0x0A, + 0xE2,0x38,0xC2,0x38,0x80,0xC0,0xDA,0x2A,0x84,0x51,0xC2,0x30,0x35,0x95,0xD7,0x57, + 0x26,0x6A,0x03,0x39,0x78,0x78,0x7A,0x68,0x03,0x39,0xE3,0x30,0x57,0x56,0x5A,0xBD, + 0xE2,0x30,0xC3,0x30,0x0F,0x23,0x03,0x82,0x03,0x31,0xE3,0x30,0xDD,0x97,0xF9,0x55, + 0x03,0x31,0xA2,0x30,0x82,0x2A,0xA2,0xCA,0x03,0x39,0xC3,0x30,0x0A,0xAE,0x2A,0x2A, + 0x23,0x39,0xE3,0x30,0x82,0xAF,0xAA,0xF7,0xE3,0x38,0x24,0x31,0xAB,0xEB,0xEE,0xCA, + 0x23,0x39,0xE3,0x38,0xFF,0x2E,0xAE,0xFE,0x23,0x39,0xE2,0x30,0xFA,0x8F,0x7E,0xE8, + 0x23,0x39,0xE3,0x30,0x7F,0xA8,0xAA,0xBF,0x23,0x39,0xC2,0x28,0xF7,0xBA,0xEA,0x8A, + 0x03,0x31,0xA2,0x20,0x7F,0xBA,0x88,0x00,0x03,0x31,0x81,0x20,0xD7,0xFE,0xAA,0x08, + 0xE3,0x30,0x82,0x20,0x2D,0xFF,0xAE,0x00,0x24,0x39,0xA2,0x20,0x2F,0xF5,0xBF,0x2A, + 0x65,0x41,0xC2,0x28,0xF7,0xF5,0xAF,0x2E,0x27,0x62,0x03,0x31,0xAD,0x2B,0x2A,0x02, + 0x68,0x6A,0xE6,0x59,0xBD,0xAD,0x2D,0x0F,0xC9,0x72,0x48,0x6A,0xBF,0xBA,0x8B,0xB7, + 0xC9,0x72,0x88,0x72,0xAA,0xFF,0xBE,0x6D,0xC9,0x7A,0xA8,0x72,0x28,0x81,0x8F,0x7B, + 0xC9,0x7A,0xA9,0x72,0xD0,0x6B,0x20,0x02,0xE9,0x7A,0xA9,0x72,0xAA,0xB6,0x2D,0xBA, + 0x0A,0x83,0xA9,0x72,0x2A,0xB7,0xF7,0xFF,0x0A,0x83,0xC9,0x7A,0x8B,0x8B,0xA5,0x9B, + 0x03,0x41,0xC2,0x38,0xAE,0xAE,0xEB,0xFB,0x03,0x41,0xC2,0x38,0xFB,0xEA,0xBB,0xDE, + 0xE2,0x38,0xC2,0x38,0x80,0x26,0xAB,0x32,0xE2,0x38,0xC2,0x38,0x8A,0xE0,0xB0,0xB0, + 0xE2,0x38,0xA2,0x30,0x08,0x2A,0x62,0xFC,0xE5,0x59,0xC2,0x38,0x95,0x15,0x95,0x55, + 0xA8,0x72,0xE3,0x38,0x78,0x78,0x5E,0x55,0x03,0x39,0xE3,0x30,0xF6,0xD7,0xFC,0xD5, + 0x03,0x31,0xE3,0x30,0x7D,0xFB,0xD7,0x55,0xE3,0x30,0xC2,0x28,0x20,0x2A,0xB2,0x0B, + 0x03,0x31,0xE3,0x30,0x55,0x55,0xB5,0xED,0x03,0x31,0xC2,0x30,0xAA,0xF7,0xAE,0xBA, + 0x03,0x31,0xC2,0x30,0x2E,0x8B,0xBF,0x3E,0x03,0x31,0xC3,0x30,0x9A,0xA8,0xAB,0xAA, + 0xE3,0x38,0x24,0x31,0xAA,0xAA,0xEE,0xAA,0x24,0x39,0xE3,0x30,0xFB,0xEE,0xAF,0xEB, + 0x24,0x39,0x03,0x39,0x57,0x75,0xDD,0xD5,0x24,0x39,0xE2,0x30,0xA3,0xF6,0xA8,0x0A, + 0x03,0x39,0x64,0x31,0xAA,0xA8,0x8A,0x2A,0x64,0x41,0x03,0x39,0x57,0xFF,0xAF,0x3D, + 0x85,0x49,0x03,0x31,0x55,0xDF,0xAB,0x08,0xC6,0x51,0x03,0x31,0x55,0xFD,0xBB,0x22, + 0x07,0x62,0x44,0x41,0x95,0xAD,0x0B,0x00,0x47,0x62,0xE6,0x59,0x95,0xAD,0x0E,0x82, + 0x88,0x72,0x27,0x62,0xBD,0x2F,0x2F,0x8F,0xA8,0x72,0x48,0x62,0xBF,0xAE,0x3E,0x27, + 0xC9,0x72,0x88,0x6A,0xB5,0x9D,0xED,0xF2,0xA9,0x72,0x68,0x6A,0xA0,0x20,0xA8,0x7C, + 0xC9,0x72,0x89,0x72,0x0E,0xFE,0xBF,0x2D,0xC9,0x7A,0x88,0x6A,0x02,0x2A,0xFE,0x63, + 0xEA,0x7A,0xA9,0x72,0x2F,0xE2,0x7D,0xF5,0x0A,0x7B,0xA9,0x72,0xB2,0xAB,0xED,0xBF, +}; + +static const size_t pixel_3_width = 64; +static const size_t pixel_3_height = 64; +static const size_t pixel_3_size = 2048; +static const unsigned char pixel_3_data[2048] = +{ + 0x26,0x5A,0x43,0x41,0xFE,0x7B,0xFA,0xB4,0x05,0x52,0x23,0x39,0xFF,0xFF,0x4F,0xFE, + 0xA5,0x49,0x43,0x39,0xDB,0x64,0x5E,0x8B,0x26,0x6A,0x44,0x41,0xFF,0x7F,0x69,0x03, + 0x2A,0x83,0x44,0x41,0x55,0x77,0x55,0x02,0x6E,0xA4,0x84,0x49,0x55,0x55,0x55,0x0A, + 0x52,0xC5,0xA5,0x49,0x55,0x55,0x55,0x00,0xF4,0xE5,0xC5,0x51,0x75,0x55,0x55,0x38, + 0x97,0xEE,0x64,0x49,0x5D,0x55,0xFF,0x00,0xB6,0xEE,0x84,0x49,0x55,0x55,0xBB,0x00, + 0x75,0xEE,0x64,0x49,0x0D,0x35,0x0A,0x00,0xD7,0xF6,0x34,0xE6,0xA2,0x6C,0x9E,0x27, + 0xF7,0xF6,0x55,0xE6,0x02,0xED,0xD7,0xBA,0x38,0xFF,0x76,0xEE,0xAA,0xAB,0xA7,0xAB, + 0xD7,0xF6,0x34,0xE6,0x60,0xE0,0xF8,0x50,0x14,0xDE,0x92,0xD5,0xA2,0x01,0x01,0x83, + 0xB6,0xEE,0x8B,0x8B,0x57,0x00,0x00,0x00,0xB6,0xEE,0xED,0x9B,0xF5,0x00,0x00,0x00, + 0xB6,0xF6,0x51,0xC5,0xF5,0x00,0x00,0x00,0xB3,0xD5,0xC5,0x69,0xD4,0x54,0x54,0x56, + 0xB6,0xF6,0xE5,0x69,0x02,0x03,0x0D,0x05,0xD6,0xF6,0xB6,0xF6,0xD5,0x15,0x37,0xAE, + 0xD7,0xF6,0x46,0x7A,0x00,0x00,0xC0,0x70,0xF7,0xFE,0x67,0x7A,0x96,0x17,0x35,0x35, + 0x18,0xF7,0xD7,0xF6,0x72,0xF8,0xF0,0xF0,0xF7,0xF6,0xB6,0xF6,0xEB,0xAA,0x2E,0xCA, + 0xD7,0xF6,0x14,0xDE,0xE0,0x60,0xDC,0x36,0xD7,0xF6,0xD3,0xDD,0xB9,0x82,0x00,0x00, + 0x18,0xFF,0xB6,0xEE,0x7D,0xF5,0x25,0x3F,0x38,0xFF,0xB7,0xEE,0xCB,0xEB,0xFF,0x7C, + 0xB6,0xEE,0x71,0xCD,0xF0,0xD8,0xD2,0xF2,0x96,0xEE,0x31,0xC5,0xAB,0x8F,0x8B,0x89, + 0xD6,0xF6,0xB6,0xE6,0x8A,0x22,0x88,0x02,0xF7,0xF6,0xB6,0xEE,0x5F,0x5E,0x7A,0xFA, + 0xF7,0xF6,0xB6,0xEE,0xED,0xAB,0xA9,0x2B,0x96,0xEE,0x44,0x51,0x56,0x54,0x54,0x5C, + 0x6E,0xB4,0x23,0x49,0x2D,0xAD,0xFD,0xFF,0x14,0xE6,0x06,0x6A,0x02,0xF7,0xFD,0x55, + 0x55,0xEE,0xE6,0x71,0x58,0x57,0x55,0x55,0x17,0xFF,0x87,0x8A,0x25,0x25,0x25,0x05, + 0x38,0xFF,0xD7,0xF6,0xFA,0xEA,0xA2,0x6E,0xF7,0xF6,0xF3,0xDD,0xA0,0xA8,0x78,0x28, + 0xF7,0xF6,0xD3,0xDD,0x0B,0x02,0x09,0x2F,0xF7,0xF6,0xB7,0xEE,0xFE,0xEE,0xBA,0x2A, + 0xF7,0xF6,0xD7,0xF6,0x15,0xB5,0x8B,0xA2,0x18,0xFF,0x76,0xEE,0xF8,0x58,0x5A,0x7A, + 0x75,0xEE,0x10,0xC5,0xE2,0xE2,0xE2,0x62,0x55,0xEE,0xEF,0xBC,0x0D,0x09,0x0B,0x02, + 0xD6,0xF6,0xB6,0xEE,0x22,0x08,0x00,0x01,0xF7,0xF6,0xB6,0xEE,0xAA,0xFA,0xFE,0xBA, + 0xF7,0xF6,0x96,0xEE,0x22,0x02,0xAA,0xAA,0x34,0xEE,0x02,0x41,0xF8,0xFC,0x5C,0x56, + 0xA8,0x82,0xE2,0x38,0xA8,0xBA,0xAF,0xCD,0xAB,0xA3,0x43,0x49,0xFF,0xBF,0x0B,0x2D, + 0x0D,0xB4,0x87,0x82,0x5F,0xF2,0x72,0xB6,0xF7,0xFE,0xA8,0x82,0x0D,0x09,0x02,0x00, + 0x38,0xFF,0x96,0xEE,0x7A,0x7E,0x4A,0x63,0x18,0xFF,0xF8,0xF6,0xDD,0x90,0xB0,0xB0, + 0x18,0xFF,0x55,0xE6,0xB7,0xB6,0xBC,0xB8,0x18,0xFF,0xD7,0xF6,0xDF,0xEE,0xFB,0xBA, + 0xF7,0xF6,0x75,0xEE,0x80,0x80,0x60,0x5E,0xD7,0xF6,0xF4,0xDD,0xA2,0xE2,0xB2,0xD8, + 0x76,0xEE,0xAE,0xBC,0x62,0x62,0xE2,0x6A,0x96,0xEE,0x52,0xCD,0x0B,0x22,0xBF,0xB5, + 0x95,0xEE,0xE8,0x82,0x2D,0x55,0x55,0x55,0xD6,0xF6,0xE8,0x82,0x00,0x0F,0x55,0x55, + 0xD6,0xF6,0xE8,0x8A,0x00,0x00,0x0B,0xD5,0x96,0xF6,0x23,0x41,0x56,0x56,0x5C,0x5A, + 0xE8,0x92,0xE3,0x38,0xCD,0x6D,0xE3,0xE2,0xC8,0x82,0xE2,0x38,0x2D,0xD5,0xD5,0xDE, + 0x4A,0x93,0x84,0x59,0x08,0xEA,0x7F,0x5F,0xD7,0xF6,0x88,0x7A,0x0D,0x25,0x95,0xD5, + 0x38,0xFF,0x55,0xEE,0xF0,0x98,0x9C,0x9D,0x18,0xFF,0xF8,0xF6,0xF0,0xF8,0xF8,0x58, + 0x18,0xFF,0xD7,0xF6,0x76,0xBE,0xBF,0xAB,0x18,0xFF,0x96,0xEE,0x82,0xC8,0x68,0x7A, + 0xB6,0xF6,0x55,0xE6,0xF8,0x76,0xF7,0xD7,0x96,0xEE,0x92,0xD5,0xB0,0xD0,0xD0,0xF8, + 0xD3,0xDD,0xAF,0xBC,0x60,0x60,0x70,0xDC,0x92,0xD5,0xAF,0xBC,0x03,0x8B,0xA9,0xAD, + 0xA7,0x7A,0x25,0x6A,0xAA,0xA2,0x3D,0x57,0xC7,0x82,0x45,0x72,0x0A,0xBB,0xEE,0xBD, + 0xE8,0x8A,0x87,0x7A,0x02,0xAB,0xD5,0x77,0xE8,0x82,0xC2,0x38,0xF8,0x78,0x70,0xE2, + 0xC8,0x8A,0x44,0x51,0xA2,0xE3,0xAD,0xD5,0x06,0x6A,0x03,0x41,0xFC,0xFF,0x5C,0x56, + 0x26,0x72,0x03,0x41,0xB0,0x2F,0x25,0xAD,0xA8,0x82,0x44,0x49,0x02,0x68,0x5F,0x5F, + 0x96,0xF6,0x47,0x7A,0x0B,0x2D,0x55,0x55,0xF7,0xF6,0x88,0x7A,0x00,0x00,0x0B,0xD5, + 0xF8,0xFE,0xEC,0xA3,0x00,0x00,0x00,0x2D,0xF7,0xF6,0x55,0xEE,0xF8,0x5E,0x7E,0x57, + 0x76,0xEE,0x35,0xE6,0x38,0x6A,0x80,0x20,0x76,0xEE,0xD3,0xDD,0xF0,0xF8,0x9E,0xD4, + 0x75,0xEE,0x4D,0xAC,0xD6,0x7F,0x7E,0xA0,0x31,0xCD,0xC8,0x7A,0x00,0x03,0x0B,0xB7, + 0x66,0x72,0x46,0x72,0x57,0xAE,0x0A,0x29,0x66,0x72,0x26,0x72,0xFE,0xAA,0x82,0x00, + 0xA7,0x82,0x46,0x72,0x29,0xD5,0xDF,0xFF,0x09,0x8B,0x66,0x7A,0x7F,0xAF,0xD5,0x15, + 0x87,0x82,0xA2,0x30,0xFA,0x78,0x5C,0x5C,0x23,0x41,0xA2,0x28,0xAE,0x3B,0x35,0x87, + 0x06,0x6A,0xE3,0x38,0x0F,0xEB,0xFD,0x7F,0x85,0x51,0x03,0x39,0xAB,0x49,0xFD,0xF5, + 0xC8,0x8A,0x23,0x41,0xA3,0xFD,0x5D,0xD5,0xC9,0x8A,0xC5,0x61,0xE2,0x8B,0xB5,0x57, + 0xEC,0xAB,0x84,0x51,0x3F,0xDF,0x57,0x55,0xF4,0xE5,0x06,0x6A,0x00,0x09,0x35,0xD5, + 0x55,0xEE,0x92,0xD5,0x0A,0xAF,0xBF,0xB5,0x55,0xEE,0xB3,0xDD,0xB8,0xBA,0xAA,0xAD, + 0xB6,0xF6,0xD3,0xDD,0x6A,0xA2,0xC3,0xAA,0xF3,0xDD,0x2D,0xAC,0x5C,0x80,0xA8,0x88, + 0x46,0x72,0x63,0x59,0x2D,0xD5,0x55,0x55,0x66,0x7A,0x43,0x51,0x00,0x0B,0xD5,0xD5, + 0x87,0x7A,0x64,0x59,0x00,0x00,0x0B,0xD5,0xCC,0xAB,0x87,0x7A,0x15,0x25,0x0D,0xA9, + 0x29,0x93,0xC2,0x38,0x5E,0x5E,0x5C,0x5C,0x44,0x49,0xC2,0x30,0xF5,0xB5,0x81,0x8A, + 0x84,0x51,0xE2,0x38,0x57,0xEF,0xBB,0x03,0xC6,0x61,0xA2,0x30,0xFD,0xFF,0xFE,0xD8, + 0x65,0x49,0x03,0x41,0x2A,0xF9,0xE1,0xED,0xC6,0x61,0x03,0x41,0x0A,0xE5,0xFF,0x5E, + 0xA5,0x51,0x03,0x39,0xAA,0xBE,0x75,0xFF,0xA8,0x82,0x23,0x41,0x2F,0xA5,0x3D,0xB5, + 0x14,0xE6,0x87,0x7A,0x03,0x09,0x85,0xB5,0x96,0xEE,0x10,0xC5,0xAF,0x0D,0x25,0x75, + 0x75,0xEE,0x8F,0xB4,0x00,0x00,0x00,0x57,0x55,0xEE,0xF1,0xBC,0xE8,0x80,0xBA,0x7D, + 0x84,0x59,0x23,0x51,0xFE,0xF7,0xAD,0x3E,0x84,0x59,0x23,0x51,0x8B,0xEA,0xFC,0x7E, + 0x6B,0x9B,0x23,0x51,0x55,0x55,0x95,0x35,0xAB,0xA3,0x67,0x7A,0x21,0xAA,0xA8,0xA0, + 0xE8,0x8A,0x03,0x41,0x58,0x78,0xE8,0xE8,0x64,0x51,0xE2,0x38,0xEC,0xE6,0xB7,0xF4, + 0x85,0x51,0x03,0x41,0x85,0x85,0x35,0x95,0xA5,0x59,0xC3,0x30,0xDA,0xDE,0x5C,0xDE, + 0xA5,0x59,0x03,0x39,0xEB,0xFB,0x70,0x7B,0x44,0x41,0xE3,0x38,0xEA,0xEB,0xC1,0xA1, + 0x65,0x41,0xE3,0x38,0xB2,0xFF,0xFF,0xDD,0xC5,0x59,0x23,0x41,0x3F,0x3D,0xFD,0x3B, + 0x31,0xCD,0x06,0x6A,0x35,0xB5,0xF5,0xD5,0x35,0xE6,0xAF,0xBC,0x7D,0x55,0xAE,0x82, + 0x93,0xCD,0x4E,0xAC,0x2D,0x8A,0xA0,0xA0,0x32,0xC5,0x0E,0x9C,0xA0,0xAA,0xBE,0xED, + 0x84,0x59,0x23,0x51,0x8B,0xFE,0xFE,0x57,0x43,0x59,0x23,0x49,0xF0,0x7C,0xDD,0xBD, + 0xAB,0xA3,0x44,0x59,0x35,0x25,0x05,0x05,0x0C,0xAC,0xE8,0x8A,0x7B,0x7E,0x78,0x6A, + 0xA7,0x82,0x26,0x6A,0x54,0xFE,0x9E,0x3F,0x67,0x7A,0xA2,0x30,0xDC,0x58,0x70,0x60, + 0x44,0x49,0xC2,0x30,0x2B,0xAF,0x95,0xF5,0x65,0x51,0xA2,0x30,0xFC,0xDA,0xFE,0x7A, + 0x44,0x49,0xC3,0x30,0xE2,0xE2,0xF2,0x5B,0x24,0x39,0xC2,0x30,0xC2,0xFF,0xFF,0xFD, + 0x03,0x41,0xE3,0x30,0xBB,0xEA,0xDF,0x0A,0xE6,0x59,0x03,0x41,0x3D,0xB5,0x55,0x77, + 0x88,0x7A,0x64,0x51,0x2A,0x0E,0x2D,0x25,0x15,0xDE,0x6B,0x93,0x82,0xA3,0xA9,0xA9, + 0x73,0xCD,0xED,0x9B,0xE0,0x68,0x7A,0xFE,0x11,0xBD,0x2E,0xA4,0xFD,0xF5,0xEA,0x2D, + 0x44,0x51,0x03,0x49,0xEC,0x9E,0xFF,0xFF,0x43,0x51,0x03,0x49,0x0A,0x82,0xA2,0x62, + 0x6A,0x93,0x23,0x51,0x0D,0x8D,0xA9,0xA9,0xE9,0x8A,0x46,0x72,0xF8,0xDF,0x5F,0x7F, + 0xA7,0x7A,0xC4,0x61,0x8A,0x7A,0x7A,0xDA,0x67,0x72,0x03,0x49,0x6A,0xCA,0xCA,0x80, + 0x23,0x41,0xA2,0x30,0xB9,0x3D,0x0D,0xA1,0x24,0x41,0x81,0x20,0xC0,0xEA,0x7F,0x57, + 0xE3,0x38,0x82,0x20,0xA2,0xBB,0xAD,0xBD,0x04,0x39,0xC3,0x30,0xB1,0xFB,0xD5,0xD5, + 0x44,0x49,0xE2,0x30,0x82,0xFA,0xFF,0xF5,0x44,0x41,0xE2,0x38,0xBF,0x95,0xFD,0xC3, + 0x26,0x6A,0x03,0x39,0x2F,0x2D,0xBD,0xB5,0xF1,0xBC,0x06,0x62,0x03,0xA1,0xA9,0xC9, + 0x2F,0xA4,0x89,0x62,0x28,0xAA,0xFA,0x55,0x11,0xBD,0x0B,0x7B,0x2F,0xB5,0xF5,0xFD, + 0x64,0x59,0x02,0x49,0xF7,0xE7,0xE9,0xF2,0x09,0x8B,0x23,0x49,0x55,0x55,0x95,0x15, + 0x49,0x93,0x84,0x59,0xA9,0xAA,0xA8,0x28,0xAB,0xA3,0xE5,0x61,0xFF,0xAF,0x62,0x7C, + 0xC7,0x82,0x44,0x49,0xE0,0x7E,0x5F,0x57,0x06,0x6A,0xE2,0x38,0x00,0xFF,0x7F,0x7A, + 0x03,0x41,0x61,0x18,0xA8,0xF8,0x7E,0xDF,0xE3,0x30,0x81,0x20,0xB5,0x0D,0xAF,0x2E, + 0xE2,0x30,0xA2,0x28,0x55,0x6B,0xF8,0xCB,0x03,0x39,0xA2,0x28,0x2F,0xF5,0xDD,0xF7, + 0x23,0x39,0xC2,0x30,0xEB,0xAF,0x8D,0xFD,0x64,0x49,0xE2,0x30,0x8B,0xCD,0xCD,0x7D, + 0x84,0x51,0xE2,0x30,0x2F,0xBF,0x37,0xBD,0xD1,0xB4,0x85,0x51,0x09,0x0D,0x2D,0xA5, + 0x11,0xBD,0xAC,0x8B,0x57,0xF0,0xA8,0xAB,0x6F,0xAC,0xCD,0x93,0xB9,0xA8,0x80,0xA0, + 0x64,0x59,0x02,0x41,0xF2,0x5B,0x57,0x5D,0x69,0x93,0x02,0x41,0x15,0x35,0x35,0xD5, + 0x69,0x93,0x84,0x59,0x08,0x80,0xF8,0x5F,0x66,0x72,0x43,0x49,0xE0,0x50,0x5E,0x77, + 0xA5,0x51,0x03,0x41,0xFA,0x7A,0x7A,0x2E,0xC5,0x59,0xC2,0x30,0x58,0xDB,0x7F,0x5E, + 0xE3,0x30,0x61,0x20,0x3E,0x27,0xFF,0xEA,0x03,0x39,0x81,0x20,0xB2,0xA2,0xAD,0x06, + 0xE3,0x30,0xA2,0x28,0x00,0xF2,0x7B,0xEF,0xE3,0x30,0x82,0x28,0xFE,0xA0,0x2A,0x02, + 0x03,0x39,0xC2,0x30,0xD5,0x5F,0x5E,0x73,0x03,0x31,0xC2,0x28,0xEB,0xFA,0xF9,0xAD, + 0x64,0x49,0xE3,0x30,0xB5,0x95,0x3D,0x25,0x0D,0xA4,0xA5,0x51,0x8D,0x29,0xE9,0x03, + 0x6F,0xAC,0xA9,0x72,0x2A,0xAB,0x55,0x57,0x2E,0x9C,0xA8,0x72,0x20,0xAA,0xAB,0xB5, + 0x23,0x49,0x03,0x41,0xD5,0xF5,0xDD,0xFD,0x23,0x49,0xE2,0x40,0x38,0xFE,0xDF,0x55, + 0xA4,0x59,0xE2,0x40,0x1C,0x15,0x1D,0x15,0xE5,0x61,0x23,0x39,0xEA,0x78,0x58,0x5C, + 0xE5,0x61,0xA2,0x30,0xC2,0x73,0x6F,0x7F,0x44,0x49,0x81,0x20,0xF8,0x7A,0x57,0xFF, + 0x24,0x41,0xA2,0x28,0x3D,0xA5,0x7F,0x7F,0x23,0x49,0x81,0x20,0x2A,0xAA,0xB7,0xDD, + 0x03,0x39,0xA2,0x28,0xAC,0x7C,0xD8,0xF3,0x03,0x39,0xA2,0x28,0xBF,0x7D,0x75,0xCB, + 0xE2,0x30,0xA2,0x28,0x8A,0xA3,0x8D,0x7C,0x03,0x39,0xA1,0x28,0xAB,0xA2,0x0F,0xA7, + 0xC9,0x7A,0x03,0x39,0xD5,0x15,0x35,0x3D,0x10,0xC5,0x2A,0x83,0x2A,0x80,0x0A,0xB5, + 0xD0,0xBC,0xA8,0x72,0x5E,0x58,0xA0,0xA0,0x2D,0xA4,0x06,0x5A,0xDF,0x7B,0xEA,0x00, + 0x03,0x41,0xE2,0x38,0x03,0x7A,0xFC,0x77,0x03,0x49,0xE2,0x38,0xFD,0x7D,0x55,0xDD, + 0x84,0x59,0xE2,0x38,0x15,0x95,0x95,0x95,0x46,0x6A,0x03,0x39,0x5C,0x5C,0x5C,0x54, + 0x24,0x39,0xE3,0x30,0xCA,0x0B,0xA7,0xF5,0x23,0x39,0xE2,0x30,0xFF,0xAC,0xBA,0x3F, + 0x23,0x39,0xE3,0x30,0x57,0x5E,0xEE,0xB8,0x03,0x31,0xA2,0x20,0x57,0xFA,0xA0,0x00, + 0xE3,0x30,0x81,0x20,0x2B,0xBF,0xFA,0xA0,0x44,0x41,0xA2,0x28,0xAB,0xFF,0xFF,0xD5, + 0x03,0x39,0xA2,0x28,0xDF,0xBB,0xAA,0x2A,0x64,0x49,0xC2,0x28,0xB5,0xBF,0xBE,0x37, + 0xA9,0x72,0x44,0x49,0x25,0x09,0x0B,0x2A,0x0A,0x83,0xA9,0x72,0x0A,0x8F,0xFD,0xF5, + 0x6F,0xAC,0xEA,0x7A,0x2B,0xF5,0x55,0x55,0x6E,0xAC,0x0A,0x83,0x00,0x02,0x35,0x55, + 0x03,0x41,0xE2,0x38,0xF5,0x55,0x7F,0x55,0xE2,0x38,0xC2,0x38,0xA3,0x20,0xA2,0x8A, + 0x43,0x49,0xA2,0x30,0xBF,0xFF,0x1F,0xF7,0x66,0x6A,0xE3,0x30,0x5E,0x5E,0x5C,0x57, + 0xE3,0x30,0xC3,0x30,0x03,0x02,0x00,0x80,0x03,0x31,0xE3,0x30,0x3F,0xBF,0xD5,0x7F, + 0x23,0x39,0xE3,0x30,0xEA,0xBB,0x7D,0xD5,0x03,0x39,0x04,0x31,0xBA,0xA0,0x0A,0x2B, + 0x24,0x39,0xE3,0x30,0x5E,0xEB,0xBA,0x2A,0x44,0x41,0xA2,0x20,0x5F,0xFB,0xA2,0x0A, + 0x65,0x49,0xA2,0x28,0xD5,0xFF,0xAB,0x00,0x48,0x6A,0x03,0x31,0xB5,0xA5,0x2B,0x0A, + 0xA9,0x72,0x06,0x62,0x2D,0x29,0xAB,0xAB,0xC9,0x7A,0x88,0x6A,0x2B,0xAB,0xED,0x7E, + 0xE9,0x7A,0x88,0x72,0xAE,0x2A,0xBB,0xED,0x0A,0x83,0xA9,0x72,0x2B,0xAF,0xEF,0xFD, +}; + +static const size_t pixel_4_width = 32; +static const size_t pixel_4_height = 32; +static const size_t pixel_4_size = 512; +static const unsigned char pixel_4_data[512] = +{ + 0xD7,0xF6,0xA4,0x49,0x55,0x55,0xAA,0x00,0x75,0xEE,0xA5,0x51,0x55,0x55,0x70,0x70, + 0xB6,0xF6,0x85,0x49,0x55,0xDD,0x02,0x03,0xF7,0xFE,0xE6,0x59,0x55,0xFF,0xF0,0x9C, + 0xF7,0xF6,0x85,0x49,0x55,0xAA,0x00,0x00,0x96,0xEE,0x46,0x5A,0x09,0x02,0x00,0x00, + 0xF8,0xF6,0x75,0xEE,0x0B,0x27,0x0A,0x82,0xD7,0xEE,0xB2,0xD5,0xF8,0xD8,0xD6,0x96, + 0xD6,0xF6,0xB6,0xEE,0x4A,0x82,0x00,0x02,0xD6,0xF6,0x43,0x49,0x70,0x60,0xE0,0x70, + 0x8F,0xBC,0x02,0x41,0x09,0xFF,0xFF,0xBD,0xB6,0xF6,0x47,0x82,0x17,0x15,0x37,0x07, + 0x18,0xFF,0x95,0xEE,0x68,0x70,0xAE,0x0C,0xF7,0xF6,0x35,0xE6,0x83,0x21,0x0B,0x08, + 0xF7,0xF6,0x55,0xE6,0xC2,0xC0,0x60,0x6E,0x75,0xEE,0x51,0xCD,0x1C,0x3E,0x26,0xB6, + 0xB6,0xF6,0xA7,0x7A,0x2F,0x55,0x55,0x55,0x95,0xF6,0x02,0x49,0x70,0x6A,0x7F,0x7F, + 0x47,0x7A,0xE3,0x38,0x9B,0xF8,0xF0,0x6B,0xF3,0xE5,0xA5,0x59,0x3F,0xF5,0x75,0x55, + 0xD7,0xF6,0x47,0x7A,0x00,0x00,0x0B,0xB5,0xF8,0xF6,0xB3,0xD5,0x00,0x80,0x80,0xA9, + 0x76,0xEE,0xF4,0xDD,0x40,0x40,0x48,0x70,0xB3,0xD5,0xCC,0x9B,0x28,0xA8,0xAE,0xD8, + 0x66,0x72,0x43,0x59,0x00,0x00,0x2D,0xD7,0x8A,0xA3,0xE5,0x69,0xFF,0xBF,0x3F,0x25, + 0x06,0x6A,0xC2,0x30,0xDC,0x54,0xD4,0xF4,0xC5,0x61,0x03,0x39,0xF3,0xDF,0x55,0x7F, + 0x67,0x7A,0x44,0x49,0x0E,0xA5,0xD5,0x55,0x72,0xDD,0x43,0x49,0x2F,0xB5,0xD5,0x55, + 0x14,0xE6,0xE8,0x82,0x00,0x00,0x23,0x29,0x55,0xE6,0xF0,0xBC,0x60,0xE0,0x80,0xFE, + 0x63,0x59,0x23,0x51,0x0A,0xE3,0x72,0x56,0xCB,0xA3,0x44,0x59,0x25,0x8D,0x89,0x81, + 0x87,0x7A,0x23,0x41,0x54,0x58,0x68,0x60,0x65,0x51,0xC2,0x30,0x43,0x4B,0x6B,0x6D, + 0x64,0x49,0xE3,0x30,0xE8,0xB8,0x7E,0x57,0x85,0x51,0xE3,0x38,0x2F,0x27,0x3D,0xF5, + 0x93,0xD5,0x84,0x59,0x8F,0x0D,0x0D,0x2D,0x72,0xCD,0x4E,0xA4,0xEA,0xF8,0x5C,0xF7, + 0xC5,0x61,0x23,0x49,0xD5,0x75,0x55,0x17,0x29,0x8B,0xC5,0x61,0xE1,0xB9,0xAB,0xC8, + 0x67,0x7A,0x23,0x41,0xE0,0xAC,0xF8,0x7F,0x03,0x39,0x81,0x20,0x82,0x72,0x9E,0xB7, + 0xE3,0x30,0xA2,0x28,0x0B,0xAD,0x3F,0xFE,0x44,0x49,0xE2,0x30,0xFA,0xBF,0x3D,0xFD, + 0xD1,0xBC,0x43,0x41,0x2D,0xB5,0x35,0xB5,0x4F,0xA4,0xEA,0x72,0x3A,0xB5,0x88,0x00, + 0x87,0x7A,0x02,0x41,0x17,0x95,0x55,0x55,0x29,0x93,0x23,0x49,0xE0,0x7E,0x75,0x75, + 0x64,0x51,0xA2,0x28,0xC8,0xE0,0x68,0x5E,0x03,0x41,0x82,0x20,0xAD,0xBF,0x23,0xFF, + 0xE3,0x38,0xC2,0x28,0x7E,0xB7,0x5E,0xFC,0xE3,0x30,0xC2,0x28,0x0F,0x38,0x0A,0x15, + 0xAF,0xB4,0x03,0x39,0xB5,0xA5,0x05,0x2D,0xAF,0xB4,0x27,0x5A,0xAA,0xBF,0x7E,0xA8, + 0x03,0x41,0xE2,0x38,0xFA,0x7F,0x5D,0x55,0xA5,0x51,0xE2,0x38,0xCD,0x4D,0x45,0x45, + 0x24,0x39,0xE3,0x30,0xE2,0xBD,0xF5,0x55,0x03,0x39,0xC2,0x28,0x5A,0xA0,0x00,0x0A, + 0x24,0x39,0xA2,0x28,0xBD,0xDF,0xEA,0x08,0x27,0x62,0xC2,0x28,0xD5,0xDD,0xB5,0x2F, + 0x0A,0x83,0xA5,0x51,0x09,0xAB,0x2B,0xAB,0x6E,0xAC,0xC9,0x7A,0x0B,0xD5,0xD5,0x55, +}; + +static const size_t pixel_5_width = 16; +static const size_t pixel_5_height = 16; +static const size_t pixel_5_size = 128; +static const unsigned char pixel_5_data[128] = +{ + 0x96,0xEE,0x64,0x49,0x55,0xC0,0xC0,0xC0,0x55,0xEE,0x47,0x6A,0x55,0xC2,0x9D,0x35, + 0xD7,0xF6,0x8B,0x8B,0x35,0x00,0x00,0x00,0xD7,0xF6,0xB2,0xD5,0xE0,0xF0,0xF0,0xD8, + 0x71,0xCD,0x43,0x59,0xC3,0x7F,0xFF,0xF5,0x6A,0x9B,0xE3,0x38,0x2F,0xFF,0xD7,0x57, + 0xF7,0xF6,0xC5,0x59,0x00,0x0B,0xD5,0x55,0x76,0xEE,0xAF,0xB4,0xF0,0x78,0xC2,0xAD, + 0x49,0x93,0x43,0x51,0x15,0x25,0xB5,0xA5,0x26,0x6A,0xC2,0x30,0xFC,0x58,0x50,0x5A, + 0x64,0x51,0xC2,0x28,0x2C,0xBF,0xFD,0xB5,0xD0,0xB4,0x43,0x49,0x03,0x03,0xA9,0x89, + 0xC8,0x82,0x02,0x41,0xCD,0xD5,0xD5,0x55,0x44,0x41,0xA2,0x28,0xD8,0xFC,0xFA,0xAF, + 0x85,0x49,0xC2,0x30,0xD5,0x55,0xF5,0x3F,0x0D,0xA4,0x64,0x49,0xA9,0x81,0x2B,0xEF, +}; + +static const size_t pixel_6_width = 8; +static const size_t pixel_6_height = 8; +static const size_t pixel_6_size = 32; +static const unsigned char pixel_6_data[32] = +{ + 0x34,0xE6,0x64,0x51,0xEF,0xB8,0xDB,0x5D,0xB7,0xF6,0x47,0x6A,0x02,0x80,0x82,0xA5, + 0x67,0x7A,0xC2,0x30,0xE3,0x63,0x7B,0x5D,0xF1,0xBC,0x03,0x39,0x25,0xB5,0xB5,0xB5, +}; + +static const size_t pixel_7_width = 4; +static const size_t pixel_7_height = 4; +static const size_t pixel_7_size = 8; +static const unsigned char pixel_7_data[8] = +{ + 0x14,0xDE,0x44,0x49,0x0A,0x27,0xD5,0xD5, +}; + +static const size_t pixel_8_width = 2; +static const size_t pixel_8_height = 2; +static const size_t pixel_8_size = 8; +static const unsigned char pixel_8_data[8] = +{ + 0x92,0xCD,0x44,0x49,0x33,0xDD,0x33,0xDD, +}; + +static const size_t pixel_9_width = 1; +static const size_t pixel_9_height = 1; +static const size_t pixel_9_size = 8; +static const unsigned char pixel_9_data[8] = +{ + 0x2A,0x83,0x0A,0x83,0xFB,0xEF,0xEE,0xEF, +}; diff --git a/gfx/angle/src/tests/gles_conformance_tests/generate_gles_conformance_tests.py b/gfx/angle/src/tests/gles_conformance_tests/generate_gles_conformance_tests.py new file mode 100755 index 000000000..8ed313a16 --- /dev/null +++ b/gfx/angle/src/tests/gles_conformance_tests/generate_gles_conformance_tests.py @@ -0,0 +1,68 @@ +import os +import re +import sys + +def ReadFileAsLines(filename): + """Reads a file, removing blank lines and lines that start with #""" + file = open(filename, "r") + raw_lines = file.readlines() + file.close() + lines = [] + for line in raw_lines: + line = line.strip() + if len(line) > 0 and not line.startswith("#"): + lines.append(line) + return lines + +def GetSuiteName(testName): + return testName[:testName.find("/")] + +def GetTestName(testName): + replacements = { ".test": "", ".": "_" } + splitTestName = testName.split("/") + cleanName = splitTestName[-2] + "_" + splitTestName[-1] + for replaceKey in replacements: + cleanName = cleanName.replace(replaceKey, replacements[replaceKey]) + return cleanName + +def GenerateTests(outFile, testNames): + # Remove duplicate tests + testNames = list(set(testNames)) + testSuites = [] + + outFile.write("#include \"gles_conformance_tests.h\"\n\n") + + for test in testNames: + testSuite = GetSuiteName(test) + if not testSuite in testSuites: + outFile.write("DEFINE_CONFORMANCE_TEST_CLASS(" + testSuite + ");\n\n") + testSuites.append(testSuite) + + outFile.write("TYPED_TEST(" + testSuite + ", " + GetTestName(test) + ")\n") + outFile.write("{\n") + outFile.write(" run(\"" + test + "\");\n") + outFile.write("}\n\n") + +def GenerateTestList(sourceFile, rootDir): + tests = [ ] + fileName, fileExtension = os.path.splitext(sourceFile) + if fileExtension == ".run": + lines = ReadFileAsLines(sourceFile) + for line in lines: + tests += GenerateTestList(os.path.join(os.path.dirname(sourceFile), line), rootDir) + elif fileExtension == ".test": + tests.append(os.path.relpath(os.path.realpath(sourceFile), rootDir).replace("\\", "/")) + return tests; + +def main(argv): + tests = GenerateTestList(argv[0], argv[1]) + tests.sort() + + output = open(argv[2], 'wb') + GenerateTests(output, tests) + output.close() + + return 0 + +if __name__ == '__main__': + sys.exit(main(sys.argv[1:])) diff --git a/gfx/angle/src/tests/gles_conformance_tests/gles_conformance_tests.cpp b/gfx/angle/src/tests/gles_conformance_tests/gles_conformance_tests.cpp new file mode 100755 index 000000000..0a16bc6b0 --- /dev/null +++ b/gfx/angle/src/tests/gles_conformance_tests/gles_conformance_tests.cpp @@ -0,0 +1,92 @@ +#include "gles_conformance_tests.h" +#include "GTFMain.h" + +#include <stdio.h> +#include <stdlib.h> +#include <vector> +#include <sstream> +#include <stdarg.h> + +static std::vector<char> FormatArg(const char* fmt, ...) +{ + va_list vararg; + va_start(vararg, fmt); + int len = vsnprintf(NULL, 0, fmt, vararg); + va_end(vararg); + + std::vector<char> buf(len + 1); + + va_start(vararg, fmt); + vsnprintf(buf.data(), buf.size(), fmt, vararg); + va_end(vararg); + + return buf; +} + +static std::string GetExecutableDirectory() +{ + std::vector<char> executableFileBuf(MAX_PATH); + DWORD executablePathLen = GetModuleFileNameA(NULL, executableFileBuf.data(), executableFileBuf.size()); + if (executablePathLen == 0) + { + return false; + } + + std::string executableLocation = executableFileBuf.data(); + size_t lastPathSepLoc = executableLocation.find_last_of("\\/"); + if (lastPathSepLoc != std::string::npos) + { + executableLocation = executableLocation.substr(0, lastPathSepLoc); + } + else + { + executableLocation = ""; + } + + return executableLocation; +} + +void RunConformanceTest(const std::string &testPath, EGLNativeDisplayType nativeDisplay) +{ + std::vector<char*> args; + + // Empty first argument for the program name + args.push_back(""); + + std::vector<char> widthArg = FormatArg("-width=%u", 64); + args.push_back(widthArg.data()); + + std::vector<char> heightArg = FormatArg("-height=%u", 64); + args.push_back(heightArg.data()); + + std::vector<char> displayArg = FormatArg("-d=%llu", nativeDisplay); + args.push_back(displayArg.data()); + + std::vector<char> runArg = FormatArg("-run=%s/conformance_tests/%s", GetExecutableDirectory().c_str(), testPath.c_str()); + args.push_back(runArg.data()); + + // Redirect cout + std::streambuf* oldCoutStreamBuf = std::cout.rdbuf(); + std::ostringstream strCout; + std::cout.rdbuf(strCout.rdbuf()); + + if (GTFMain(args.size(), args.data()) != 0) + { + FAIL() << "GTFMain failed."; + } + + // Restore old cout + std::cout.rdbuf(oldCoutStreamBuf); + std::string log = strCout.str(); + + // Look for failures + size_t offset = 0; + std::string offsetSearchString = "failure = "; + while ((offset = log.find("failure = ", offset)) != std::string::npos) + { + offset += offsetSearchString.length(); + + size_t failureCount = atoll(log.c_str() + offset); + EXPECT_EQ(0, failureCount) << log; + } +} diff --git a/gfx/angle/src/tests/gles_conformance_tests/gles_conformance_tests.h b/gfx/angle/src/tests/gles_conformance_tests/gles_conformance_tests.h new file mode 100755 index 000000000..df911b034 --- /dev/null +++ b/gfx/angle/src/tests/gles_conformance_tests/gles_conformance_tests.h @@ -0,0 +1,69 @@ +// +// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#ifndef CONFORMANCE_TESTS_CONFORMANCE_TEST_H_ +#define CONFORMANCE_TESTS_CONFORMANCE_TEST_H_ + +#include "gtest/gtest.h" + +#include <EGL/egl.h> +#include <EGL/eglext.h> + +#include <string> + +struct D3D9 +{ + static EGLNativeDisplayType GetNativeDisplay() + { + return EGL_DEFAULT_DISPLAY; + } +}; + +struct D3D11 +{ + static EGLNativeDisplayType GetNativeDisplay() + { + return EGL_D3D11_ONLY_DISPLAY_ANGLE; + } +}; + +#define CONFORMANCE_TESTS_ES2 2 +#define CONFORMANCE_TESTS_ES3 3 + +#if CONFORMANCE_TESTS_TYPE == CONFORMANCE_TESTS_ES2 + typedef testing::Types<D3D9, D3D11> ConformanceTestTypes; +#elif CONFORMANCE_TESTS_TYPE == CONFORMANCE_TESTS_ES3 + typedef testing::Types<D3D11> ConformanceTestTypes; +#else +# error "Unknown CONFORMANCE_TESTS_TYPE" +#endif + +#define DEFINE_CONFORMANCE_TEST_CLASS(name) \ + template <typename T> class name : public ConformanceTest<T> { }; \ + TYPED_TEST_CASE(name, ConformanceTestTypes); + +template <typename T> +class ConformanceTest : public testing::Test +{ + public: + ConformanceTest() + : mNativeDisplay(T::GetNativeDisplay()) + { + } + + protected: + void run(const std::string &testPath) + { + RunConformanceTest(testPath, mNativeDisplay); + } + + private: + EGLNativeDisplayType mNativeDisplay; +}; + +void RunConformanceTest(const std::string &testPath, EGLNativeDisplayType nativeDisplay); + +#endif // CONFORMANCE_TESTS_CONFORMANCE_TEST_H_ diff --git a/gfx/angle/src/tests/gles_conformance_tests/gles_conformance_tests_main.cpp b/gfx/angle/src/tests/gles_conformance_tests/gles_conformance_tests_main.cpp new file mode 100755 index 000000000..0b95d5c89 --- /dev/null +++ b/gfx/angle/src/tests/gles_conformance_tests/gles_conformance_tests_main.cpp @@ -0,0 +1,23 @@ +// +// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "gles_conformance_tests.h" + +#include "gtest/gtest.h" + +#include <EGL/egl.h> +#include <EGL/eglext.h> + +#include <map> +#include <string> +#include <vector> + +int main(int argc, char** argv) +{ + testing::InitGoogleTest(&argc, argv); + int rt = RUN_ALL_TESTS(); + return rt; +} diff --git a/gfx/angle/src/tests/perf_tests/ANGLEPerfTest.cpp b/gfx/angle/src/tests/perf_tests/ANGLEPerfTest.cpp new file mode 100755 index 000000000..e7c74370d --- /dev/null +++ b/gfx/angle/src/tests/perf_tests/ANGLEPerfTest.cpp @@ -0,0 +1,194 @@ +// +// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// ANGLEPerfTests: +// Base class for google test performance tests +// + +#include "ANGLEPerfTest.h" + +#include "third_party/perf/perf_test.h" + +#include <cassert> +#include <cmath> +#include <iostream> + +ANGLEPerfTest::ANGLEPerfTest(const std::string &name, const std::string &suffix) + : mName(name), + mSuffix(suffix), + mTimer(nullptr), + mRunTimeSeconds(5.0), + mNumStepsPerformed(0), + mRunning(true) +{ + mTimer = CreateTimer(); +} + +ANGLEPerfTest::~ANGLEPerfTest() +{ + SafeDelete(mTimer); +} + +void ANGLEPerfTest::run() +{ + mTimer->start(); + while (mRunning) + { + step(); + if (mRunning) + { + ++mNumStepsPerformed; + } + if (mTimer->getElapsedTime() > mRunTimeSeconds) + { + mRunning = false; + } + } + finishTest(); + mTimer->stop(); +} + +void ANGLEPerfTest::printResult(const std::string &trace, double value, const std::string &units, bool important) const +{ + perf_test::PrintResult(mName, mSuffix, trace, value, units, important); +} + +void ANGLEPerfTest::printResult(const std::string &trace, size_t value, const std::string &units, bool important) const +{ + perf_test::PrintResult(mName, mSuffix, trace, value, units, important); +} + +void ANGLEPerfTest::SetUp() +{ +} + +void ANGLEPerfTest::TearDown() +{ + double relativeScore = static_cast<double>(mNumStepsPerformed) / mTimer->getElapsedTime(); + printResult("score", static_cast<size_t>(std::round(relativeScore)), "score", true); +} + +double ANGLEPerfTest::normalizedTime(size_t value) const +{ + return static_cast<double>(value) / static_cast<double>(mNumStepsPerformed); +} + +std::string RenderTestParams::suffix() const +{ + switch (getRenderer()) + { + case EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE: + return "_d3d11"; + case EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE: + return "_d3d9"; + case EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE: + return "_gl"; + case EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE: + return "_gles"; + case EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE: + return "_default"; + default: + assert(0); + return "_unk"; + } +} + +ANGLERenderTest::ANGLERenderTest(const std::string &name, const RenderTestParams &testParams) + : ANGLEPerfTest(name, testParams.suffix()), + mTestParams(testParams), + mEGLWindow(nullptr), + mOSWindow(nullptr) +{ +} + +ANGLERenderTest::~ANGLERenderTest() +{ + SafeDelete(mOSWindow); + SafeDelete(mEGLWindow); +} + +void ANGLERenderTest::SetUp() +{ + mOSWindow = CreateOSWindow(); + mEGLWindow = new EGLWindow(mTestParams.majorVersion, mTestParams.minorVersion, + mTestParams.eglParameters); + mEGLWindow->setSwapInterval(0); + + if (!mOSWindow->initialize(mName, mTestParams.windowWidth, mTestParams.windowHeight)) + { + FAIL() << "Failed initializing OSWindow"; + return; + } + + if (!mEGLWindow->initializeGL(mOSWindow)) + { + FAIL() << "Failed initializing EGLWindow"; + return; + } + + initializeBenchmark(); + + ANGLEPerfTest::SetUp(); +} + +void ANGLERenderTest::TearDown() +{ + ANGLEPerfTest::TearDown(); + + destroyBenchmark(); + + mEGLWindow->destroyGL(); + mOSWindow->destroy(); +} + +void ANGLERenderTest::step() +{ + // Clear events that the application did not process from this frame + Event event; + bool closed = false; + while (popEvent(&event)) + { + // If the application did not catch a close event, close now + if (event.Type == Event::EVENT_CLOSED) + { + closed = true; + } + } + + if (closed) + { + abortTest(); + } + else + { + drawBenchmark(); + // Swap is needed so that the GPU driver will occasionally flush its internal command queue + // to the GPU. The null device benchmarks are only testing CPU overhead, so they don't need + // to swap. + if (mTestParams.eglParameters.deviceType != EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE) + { + mEGLWindow->swap(); + } + mOSWindow->messageLoop(); + } +} + +void ANGLERenderTest::finishTest() +{ + if (mTestParams.eglParameters.deviceType != EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE) + { + glFinish(); + } +} + +bool ANGLERenderTest::popEvent(Event *event) +{ + return mOSWindow->popEvent(event); +} + +OSWindow *ANGLERenderTest::getWindow() +{ + return mOSWindow; +} diff --git a/gfx/angle/src/tests/perf_tests/ANGLEPerfTest.h b/gfx/angle/src/tests/perf_tests/ANGLEPerfTest.h new file mode 100755 index 000000000..62f2cb444 --- /dev/null +++ b/gfx/angle/src/tests/perf_tests/ANGLEPerfTest.h @@ -0,0 +1,107 @@ +// +// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// ANGLEPerfTests: +// Base class for google test performance tests +// + +#ifndef PERF_TESTS_ANGLE_PERF_TEST_H_ +#define PERF_TESTS_ANGLE_PERF_TEST_H_ + +#include <string> +#include <vector> + +#include <gtest/gtest.h> +#include <EGL/egl.h> +#include <EGL/eglext.h> + +#include "common/angleutils.h" +#include "common/debug.h" +#include "EGLWindow.h" +#include "OSWindow.h" +#include "test_utils/angle_test_configs.h" +#include "test_utils/angle_test_instantiate.h" +#include "Timer.h" + +class Event; + +#ifndef ASSERT_GL_NO_ERROR +#define ASSERT_GL_NO_ERROR() ASSERT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()) +#endif + +class ANGLEPerfTest : public testing::Test, angle::NonCopyable +{ + public: + ANGLEPerfTest(const std::string &name, const std::string &suffix); + virtual ~ANGLEPerfTest(); + + virtual void step() = 0; + + // Called right before timer is stopped to let the test wait for asynchronous operations. + virtual void finishTest() {} + + protected: + void run(); + void printResult(const std::string &trace, double value, const std::string &units, bool important) const; + void printResult(const std::string &trace, size_t value, const std::string &units, bool important) const; + void SetUp() override; + void TearDown() override; + + // Normalize a time value according to the number of test loop iterations (mFrameCount) + double normalizedTime(size_t value) const; + + // Call if the test step was aborted and the test should stop running. + void abortTest() { mRunning = false; } + + unsigned int getNumStepsPerformed() const { return mNumStepsPerformed; } + + std::string mName; + std::string mSuffix; + Timer *mTimer; + double mRunTimeSeconds; + + private: + unsigned int mNumStepsPerformed; + bool mRunning; +}; + +struct RenderTestParams : public angle::PlatformParameters +{ + virtual std::string suffix() const; + + EGLint windowWidth; + EGLint windowHeight; +}; + +class ANGLERenderTest : public ANGLEPerfTest +{ + public: + ANGLERenderTest(const std::string &name, const RenderTestParams &testParams); + ~ANGLERenderTest(); + + virtual void initializeBenchmark() { } + virtual void destroyBenchmark() { } + + virtual void drawBenchmark() = 0; + + bool popEvent(Event *event); + + OSWindow *getWindow(); + + protected: + const RenderTestParams &mTestParams; + + private: + void SetUp() override; + void TearDown() override; + + void step() override; + void finishTest() override; + + EGLWindow *mEGLWindow; + OSWindow *mOSWindow; +}; + +#endif // PERF_TESTS_ANGLE_PERF_TEST_H_ diff --git a/gfx/angle/src/tests/perf_tests/BufferSubData.cpp b/gfx/angle/src/tests/perf_tests/BufferSubData.cpp new file mode 100755 index 000000000..5818d52ee --- /dev/null +++ b/gfx/angle/src/tests/perf_tests/BufferSubData.cpp @@ -0,0 +1,418 @@ +// +// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// BufferSubDataBenchmark: +// Performance test for ANGLE buffer updates. +// + +#include <sstream> + +#include "ANGLEPerfTest.h" +#include "shader_utils.h" + +using namespace angle; + +namespace +{ + +struct BufferSubDataParams final : public RenderTestParams +{ + BufferSubDataParams() + { + // Common default values + majorVersion = 2; + minorVersion = 0; + windowWidth = 512; + windowHeight = 512; + updateSize = 3000; + bufferSize = 40000000; + iterations = 4; + updateRate = 1; + } + + std::string suffix() const override; + + GLboolean vertexNormalized; + GLenum vertexType; + GLint vertexComponentCount; + unsigned int updateRate; + + // static parameters + GLsizeiptr updateSize; + GLsizeiptr bufferSize; + unsigned int iterations; +}; + +std::ostream &operator<<(std::ostream &os, const BufferSubDataParams ¶ms) +{ + os << params.suffix().substr(1); + return os; +} + +class BufferSubDataBenchmark : public ANGLERenderTest, + public ::testing::WithParamInterface<BufferSubDataParams> +{ + public: + BufferSubDataBenchmark(); + + void initializeBenchmark() override; + void destroyBenchmark() override; + void drawBenchmark() override; + + private: + GLuint mProgram; + GLuint mBuffer; + uint8_t *mUpdateData; + int mNumTris; +}; + +GLfloat *GetFloatData(GLint componentCount) +{ + static GLfloat vertices2[] = + { + 1, 2, + 0, 0, + 2, 0, + }; + + static GLfloat vertices3[] = + { + 1, 2, 1, + 0, 0, 1, + 2, 0, 1, + }; + + static GLfloat vertices4[] = + { + 1, 2, 1, 3, + 0, 0, 1, 3, + 2, 0, 1, 3, + }; + + switch (componentCount) + { + case 2: + return vertices2; + case 3: + return vertices3; + case 4: + return vertices4; + default: + return nullptr; + } +} + +template <class T> +GLsizeiptr GetNormalizedData(GLsizeiptr numElements, GLfloat *floatData, std::vector<uint8_t> *data) +{ + GLsizeiptr triDataSize = sizeof(T) * numElements; + data->resize(triDataSize); + + T *destPtr = reinterpret_cast<T*>(data->data()); + + for (GLsizeiptr dataIndex = 0; dataIndex < numElements; dataIndex++) + { + GLfloat scaled = floatData[dataIndex] * 0.25f; + destPtr[dataIndex] = static_cast<T>(scaled * static_cast<GLfloat>(std::numeric_limits<T>::max())); + } + + return triDataSize; +} + +template <class T> +GLsizeiptr GetIntData(GLsizeiptr numElements, GLfloat *floatData, std::vector<uint8_t> *data) +{ + GLsizeiptr triDataSize = sizeof(T) * numElements; + data->resize(triDataSize); + + T *destPtr = reinterpret_cast<T*>(data->data()); + + for (GLsizeiptr dataIndex = 0; dataIndex < numElements; dataIndex++) + { + destPtr[dataIndex] = static_cast<T>(floatData[dataIndex]); + } + + return triDataSize; +} + +GLsizeiptr GetVertexData(GLenum type, GLint componentCount, GLboolean normalized, std::vector<uint8_t> *data) +{ + GLsizeiptr triDataSize = 0; + GLfloat *floatData = GetFloatData(componentCount); + + if (type == GL_FLOAT) + { + triDataSize = sizeof(GLfloat) * componentCount * 3; + data->resize(triDataSize); + memcpy(data->data(), floatData, triDataSize); + } + else if (normalized == GL_TRUE) + { + GLsizeiptr numElements = componentCount * 3; + + switch (type) + { + case GL_BYTE: + triDataSize = GetNormalizedData<GLbyte>(numElements, floatData, data); + break; + case GL_SHORT: + triDataSize = GetNormalizedData<GLshort>(numElements, floatData, data); + break; + case GL_INT: + triDataSize = GetNormalizedData<GLint>(numElements, floatData, data); + break; + case GL_UNSIGNED_BYTE: + triDataSize = GetNormalizedData<GLubyte>(numElements, floatData, data); + break; + case GL_UNSIGNED_SHORT: + triDataSize = GetNormalizedData<GLushort>(numElements, floatData, data); + break; + case GL_UNSIGNED_INT: + triDataSize = GetNormalizedData<GLuint>(numElements, floatData, data); + break; + default: + assert(0); + } + } + else + { + GLsizeiptr numElements = componentCount * 3; + + switch (type) + { + case GL_BYTE: + triDataSize = GetIntData<GLbyte>(numElements, floatData, data); + break; + case GL_SHORT: + triDataSize = GetIntData<GLshort>(numElements, floatData, data); + break; + case GL_INT: + triDataSize = GetIntData<GLint>(numElements, floatData, data); + break; + case GL_UNSIGNED_BYTE: + triDataSize = GetIntData<GLubyte>(numElements, floatData, data); + break; + case GL_UNSIGNED_SHORT: + triDataSize = GetIntData<GLushort>(numElements, floatData, data); + break; + case GL_UNSIGNED_INT: + triDataSize = GetIntData<GLuint>(numElements, floatData, data); + break; + default: + assert(0); + } + } + + return triDataSize; +} + +std::string BufferSubDataParams::suffix() const +{ + std::stringstream strstr; + + strstr << RenderTestParams::suffix(); + + if (vertexNormalized) + { + strstr << "_norm"; + } + + switch (vertexType) + { + case GL_FLOAT: + strstr << "_float"; + break; + case GL_INT: + strstr << "_int"; + break; + case GL_BYTE: + strstr << "_byte"; + break; + case GL_SHORT: + strstr << "_short"; + break; + case GL_UNSIGNED_INT: + strstr << "_uint"; + break; + case GL_UNSIGNED_BYTE: + strstr << "_ubyte"; + break; + case GL_UNSIGNED_SHORT: + strstr << "_ushort"; + break; + default: + strstr << "_vunk_" << vertexType << "_"; + break; + } + + strstr << vertexComponentCount; + strstr << "_every" << updateRate; + + return strstr.str(); +} + +BufferSubDataBenchmark::BufferSubDataBenchmark() + : ANGLERenderTest("BufferSubData", GetParam()), + mProgram(0), + mBuffer(0), + mUpdateData(nullptr), + mNumTris(0) +{ +} + +void BufferSubDataBenchmark::initializeBenchmark() +{ + const auto ¶ms = GetParam(); + + ASSERT_LT(1, params.vertexComponentCount); + ASSERT_LT(0u, params.iterations); + + const std::string vs = SHADER_SOURCE + ( + attribute vec2 vPosition; + uniform float uScale; + uniform float uOffset; + void main() + { + gl_Position = vec4(vPosition * vec2(uScale) - vec2(uOffset), 0, 1); + } + ); + + const std::string fs = SHADER_SOURCE + ( + precision mediump float; + void main() + { + gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); + } + ); + + mProgram = CompileProgram(vs, fs); + ASSERT_NE(0u, mProgram); + + // Use the program object + glUseProgram(mProgram); + + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + + + std::vector<uint8_t> zeroData(params.bufferSize); + memset(&zeroData[0], 0, zeroData.size()); + + glGenBuffers(1, &mBuffer); + glBindBuffer(GL_ARRAY_BUFFER, mBuffer); + glBufferData(GL_ARRAY_BUFFER, params.bufferSize, &zeroData[0], GL_DYNAMIC_DRAW); + + glVertexAttribPointer(0, params.vertexComponentCount, params.vertexType, + params.vertexNormalized, 0, 0); + glEnableVertexAttribArray(0); + + if (params.updateSize > 0) + { + mUpdateData = new uint8_t[params.updateSize]; + } + + std::vector<uint8_t> data; + GLsizei triDataSize = static_cast<GLsizei>(GetVertexData(params.vertexType, + params.vertexComponentCount, + params.vertexNormalized, &data)); + + mNumTris = static_cast<int>(params.updateSize / triDataSize); + for (int i = 0, offset = 0; i < mNumTris; ++i) + { + memcpy(mUpdateData + offset, &data[0], triDataSize); + offset += triDataSize; + } + + if (params.updateSize == 0) + { + mNumTris = 1; + glBufferSubData(GL_ARRAY_BUFFER, 0, data.size(), &data[0]); + } + + // Set the viewport + glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight()); + + GLfloat scale = 0.5f; + GLfloat offset = 0.5f; + + if (params.vertexNormalized == GL_TRUE) + { + scale = 2.0f; + offset = 0.5f; + } + + glUniform1f(glGetUniformLocation(mProgram, "uScale"), scale); + glUniform1f(glGetUniformLocation(mProgram, "uOffset"), offset); + + ASSERT_GL_NO_ERROR(); +} + +void BufferSubDataBenchmark::destroyBenchmark() +{ + glDeleteProgram(mProgram); + glDeleteBuffers(1, &mBuffer); + SafeDeleteArray(mUpdateData); +} + +void BufferSubDataBenchmark::drawBenchmark() +{ + glClear(GL_COLOR_BUFFER_BIT); + + const auto ¶ms = GetParam(); + + for (unsigned int it = 0; it < params.iterations; it++) + { + if (params.updateSize > 0 && ((getNumStepsPerformed() % params.updateRate) == 0)) + { + glBufferSubData(GL_ARRAY_BUFFER, 0, params.updateSize, mUpdateData); + } + + glDrawArrays(GL_TRIANGLES, 0, 3 * mNumTris); + } + + ASSERT_GL_NO_ERROR(); +} + +BufferSubDataParams BufferUpdateD3D11Params() +{ + BufferSubDataParams params; + params.eglParameters = egl_platform::D3D11(); + params.vertexType = GL_FLOAT; + params.vertexComponentCount = 4; + params.vertexNormalized = GL_FALSE; + return params; +} + +BufferSubDataParams BufferUpdateD3D9Params() +{ + BufferSubDataParams params; + params.eglParameters = egl_platform::D3D9(); + params.vertexType = GL_FLOAT; + params.vertexComponentCount = 4; + params.vertexNormalized = GL_FALSE; + return params; +} + +BufferSubDataParams BufferUpdateOpenGLParams() +{ + BufferSubDataParams params; + params.eglParameters = egl_platform::OPENGL(); + params.vertexType = GL_FLOAT; + params.vertexComponentCount = 4; + params.vertexNormalized = GL_FALSE; + return params; +} + +TEST_P(BufferSubDataBenchmark, Run) +{ + run(); +} + +ANGLE_INSTANTIATE_TEST(BufferSubDataBenchmark, + BufferUpdateD3D11Params(), BufferUpdateD3D9Params(), + BufferUpdateOpenGLParams()); + +} // namespace diff --git a/gfx/angle/src/tests/perf_tests/DrawCallPerf.cpp b/gfx/angle/src/tests/perf_tests/DrawCallPerf.cpp new file mode 100755 index 000000000..e5007e19e --- /dev/null +++ b/gfx/angle/src/tests/perf_tests/DrawCallPerf.cpp @@ -0,0 +1,256 @@ +// +// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// DrawCallPerf: +// Performance tests for ANGLE draw call overhead. +// + +#include <sstream> + +#include "ANGLEPerfTest.h" +#include "shader_utils.h" + +using namespace angle; + +namespace +{ + +struct DrawCallPerfParams final : public RenderTestParams +{ + // Common default options + DrawCallPerfParams() + { + majorVersion = 2; + minorVersion = 0; + windowWidth = 256; + windowHeight = 256; + } + + std::string suffix() const override + { + std::stringstream strstr; + + strstr << RenderTestParams::suffix(); + + if (numTris == 0) + { + strstr << "_validation_only"; + } + + if (useFBO) + { + strstr << "_render_to_texture"; + } + + if (eglParameters.deviceType == EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE) + { + strstr << "_null"; + } + + return strstr.str(); + } + + unsigned int iterations = 50; + double runTimeSeconds = 10.0; + int numTris = 1; + bool useFBO = false; +}; + +std::ostream &operator<<(std::ostream &os, const DrawCallPerfParams ¶ms) +{ + os << params.suffix().substr(1); + return os; +} + +class DrawCallPerfBenchmark : public ANGLERenderTest, + public ::testing::WithParamInterface<DrawCallPerfParams> +{ + public: + DrawCallPerfBenchmark(); + + void initializeBenchmark() override; + void destroyBenchmark() override; + void drawBenchmark() override; + + private: + GLuint mProgram = 0; + GLuint mBuffer = 0; + GLuint mFBO = 0; + GLuint mTexture = 0; + int mNumTris = GetParam().numTris; +}; + +DrawCallPerfBenchmark::DrawCallPerfBenchmark() : ANGLERenderTest("DrawCallPerf", GetParam()) +{ + mRunTimeSeconds = GetParam().runTimeSeconds; +} + +void DrawCallPerfBenchmark::initializeBenchmark() +{ + const auto ¶ms = GetParam(); + + ASSERT_LT(0u, params.iterations); + + const std::string vs = SHADER_SOURCE + ( + attribute vec2 vPosition; + uniform float uScale; + uniform float uOffset; + void main() + { + gl_Position = vec4(vPosition * vec2(uScale) - vec2(uOffset), 0, 1); + } + ); + + const std::string fs = SHADER_SOURCE + ( + precision mediump float; + void main() + { + gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); + } + ); + + mProgram = CompileProgram(vs, fs); + ASSERT_NE(0u, mProgram); + + // Use the program object + glUseProgram(mProgram); + + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + + std::vector<GLfloat> floatData; + + for (int quadIndex = 0; quadIndex < mNumTris; ++quadIndex) + { + floatData.push_back(1); + floatData.push_back(2); + floatData.push_back(0); + floatData.push_back(0); + floatData.push_back(2); + floatData.push_back(0); + } + + glGenBuffers(1, &mBuffer); + glBindBuffer(GL_ARRAY_BUFFER, mBuffer); + + // To avoid generating GL errors when testing validation-only + if (floatData.empty()) + { + floatData.push_back(0.0f); + } + + glBufferData(GL_ARRAY_BUFFER, floatData.size() * sizeof(GLfloat), &floatData[0], GL_STATIC_DRAW); + + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0); + glEnableVertexAttribArray(0); + + // Set the viewport + glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight()); + + GLfloat scale = 0.5f; + GLfloat offset = 0.5f; + + glUniform1f(glGetUniformLocation(mProgram, "uScale"), scale); + glUniform1f(glGetUniformLocation(mProgram, "uOffset"), offset); + + if (params.useFBO) + { + glGenFramebuffers(1, &mFBO); + glBindFramebuffer(GL_FRAMEBUFFER, mFBO); + glGenTextures(1, &mTexture); + glBindTexture(GL_TEXTURE_2D, mTexture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWindow()->getWidth(), getWindow()->getHeight(), + 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTexture, 0); + } + + ASSERT_GL_NO_ERROR(); +} + +void DrawCallPerfBenchmark::destroyBenchmark() +{ + glDeleteProgram(mProgram); + glDeleteBuffers(1, &mBuffer); + glDeleteTextures(1, &mTexture); + glDeleteFramebuffers(1, &mFBO); +} + +void DrawCallPerfBenchmark::drawBenchmark() +{ + // This workaround fixes a huge queue of graphics commands accumulating on the GL + // back-end. The GL back-end doesn't have a proper NULL device at the moment. + // TODO(jmadill): Remove this when/if we ever get a proper OpenGL NULL device. + const auto &eglParams = GetParam().eglParameters; + if (eglParams.deviceType != EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE || + (eglParams.renderer != EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE && + eglParams.renderer != EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE)) + { + glClear(GL_COLOR_BUFFER_BIT); + } + + const auto ¶ms = GetParam(); + + for (unsigned int it = 0; it < params.iterations; it++) + { + glDrawArrays(GL_TRIANGLES, 0, static_cast<GLsizei>(3 * mNumTris)); + } + + ASSERT_GL_NO_ERROR(); +} + +using namespace egl_platform; + +DrawCallPerfParams DrawCallPerfD3D11Params(bool useNullDevice, bool renderToTexture) +{ + DrawCallPerfParams params; + params.eglParameters = useNullDevice ? D3D11_NULL() : D3D11(); + params.useFBO = renderToTexture; + return params; +} + +DrawCallPerfParams DrawCallPerfD3D9Params(bool useNullDevice, bool renderToTexture) +{ + DrawCallPerfParams params; + params.eglParameters = useNullDevice ? D3D9_NULL() : D3D9(); + params.useFBO = renderToTexture; + return params; +} + +DrawCallPerfParams DrawCallPerfOpenGLParams(bool useNullDevice, bool renderToTexture) +{ + DrawCallPerfParams params; + params.eglParameters = useNullDevice ? OPENGL_NULL() : OPENGL(); + params.useFBO = renderToTexture; + return params; +} + +DrawCallPerfParams DrawCallPerfValidationOnly() +{ + DrawCallPerfParams params; + params.eglParameters = DEFAULT(); + params.iterations = 10000; + params.numTris = 0; + params.runTimeSeconds = 5.0; + return params; +} + +TEST_P(DrawCallPerfBenchmark, Run) +{ + run(); +} + +ANGLE_INSTANTIATE_TEST(DrawCallPerfBenchmark, + DrawCallPerfD3D9Params(false, false), + DrawCallPerfD3D9Params(true, false), + DrawCallPerfD3D11Params(false, false), + DrawCallPerfD3D11Params(true, false), + DrawCallPerfD3D11Params(true, true), + DrawCallPerfOpenGLParams(false, false), + DrawCallPerfOpenGLParams(true, false), + DrawCallPerfOpenGLParams(true, true), + DrawCallPerfValidationOnly()); + +} // namespace diff --git a/gfx/angle/src/tests/perf_tests/DynamicPromotionPerfTest.cpp b/gfx/angle/src/tests/perf_tests/DynamicPromotionPerfTest.cpp new file mode 100755 index 000000000..738314354 --- /dev/null +++ b/gfx/angle/src/tests/perf_tests/DynamicPromotionPerfTest.cpp @@ -0,0 +1,189 @@ +// +// Copyright 2016 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// DynamicPromotionPerfTest: +// Tests that ANGLE will promote buffer specfied with DYNAMIC usage to static after a number of +// iterations without changing the data. It specifically affects the D3D back-end, which treats +// dynamic and static buffers quite differently. +// + +#include "ANGLEPerfTest.h" +#include "random_utils.h" +#include "shader_utils.h" +#include "Vector.h" + +using namespace angle; + +namespace +{ + +struct DynamicPromotionParams final : public RenderTestParams +{ + DynamicPromotionParams(); + std::string suffix() const override; + + size_t vertexCount; + unsigned int iterations; +}; + +DynamicPromotionParams::DynamicPromotionParams() : vertexCount(1024), iterations(4) +{ +} + +std::string DynamicPromotionParams::suffix() const +{ + return RenderTestParams::suffix(); +} + +std::ostream &operator<<(std::ostream &os, const DynamicPromotionParams ¶ms) +{ + os << params.suffix().substr(1); + return os; +} + +class DynamicPromotionPerfTest : public ANGLERenderTest, + public testing::WithParamInterface<DynamicPromotionParams> +{ + public: + DynamicPromotionPerfTest(); + + void initializeBenchmark() override; + void destroyBenchmark() override; + void drawBenchmark() override; + + private: + GLuint mProgram; + GLuint mElementArrayBuffer; + GLuint mArrayBuffer; +}; + +DynamicPromotionPerfTest::DynamicPromotionPerfTest() + : ANGLERenderTest("DynamicPromotion", GetParam()), + mProgram(0), + mElementArrayBuffer(0), + mArrayBuffer(0) +{ +} + +void DynamicPromotionPerfTest::initializeBenchmark() +{ + const std::string &vertexShaderSource = + "attribute vec2 position;\n" + "attribute vec3 color;\n" + "varying vec3 vColor;\n" + "void main()\n" + "{\n" + " vColor = color;\n" + " gl_Position = vec4(position, 0, 1);\n" + "}"; + + const std::string &fragmentShaderSource = + "varying mediump vec3 vColor;\n" + "void main()\n" + "{\n" + " gl_FragColor = vec4(vColor, 1);\n" + "}"; + + mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource); + ASSERT_NE(0u, mProgram); + + const size_t vertexCount = GetParam().vertexCount; + + std::vector<GLushort> indexData; + std::vector<Vector2> positionData; + std::vector<Vector3> colorData; + + ASSERT_GE(static_cast<size_t>(std::numeric_limits<GLushort>::max()), vertexCount); + + RNG rng(1); + + for (size_t index = 0; index < vertexCount; ++index) + { + indexData.push_back(static_cast<GLushort>(index)); + + Vector2 position(rng.randomNegativeOneToOne(), rng.randomNegativeOneToOne()); + positionData.push_back(position); + + Vector3 color(rng.randomFloat(), rng.randomFloat(), rng.randomFloat()); + colorData.push_back(color); + } + + glGenBuffers(1, &mElementArrayBuffer); + glGenBuffers(1, &mArrayBuffer); + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mElementArrayBuffer); + glBindBuffer(GL_ARRAY_BUFFER, mArrayBuffer); + + GLsizeiptr elementArraySize = sizeof(GLushort) * vertexCount; + GLsizeiptr positionArraySize = sizeof(Vector2) * vertexCount; + GLsizeiptr colorArraySize = sizeof(Vector3) * vertexCount; + + // The DYNAMIC_DRAW usage is the key to the test. + glBufferData(GL_ELEMENT_ARRAY_BUFFER, elementArraySize, indexData.data(), GL_DYNAMIC_DRAW); + glBufferData(GL_ARRAY_BUFFER, positionArraySize + colorArraySize, nullptr, GL_DYNAMIC_DRAW); + glBufferSubData(GL_ARRAY_BUFFER, 0, positionArraySize, positionData.data()); + glBufferSubData(GL_ARRAY_BUFFER, positionArraySize, colorArraySize, colorData.data()); + + glUseProgram(mProgram); + GLint positionLocation = glGetAttribLocation(mProgram, "position"); + ASSERT_NE(-1, positionLocation); + GLint colorLocation = glGetAttribLocation(mProgram, "color"); + ASSERT_NE(-1, colorLocation); + + glVertexAttribPointer(positionLocation, 2, GL_FLOAT, GL_FALSE, 0, nullptr); + glVertexAttribPointer(colorLocation, 3, GL_FLOAT, GL_FALSE, 0, + reinterpret_cast<const GLvoid *>(positionArraySize)); + + glEnableVertexAttribArray(positionLocation); + glEnableVertexAttribArray(colorLocation); + + ASSERT_GL_NO_ERROR(); +} + +void DynamicPromotionPerfTest::destroyBenchmark() +{ + glDeleteProgram(mProgram); + glDeleteBuffers(1, &mElementArrayBuffer); + glDeleteBuffers(1, &mArrayBuffer); +} + +void DynamicPromotionPerfTest::drawBenchmark() +{ + unsigned int iterations = GetParam().iterations; + size_t vertexCount = GetParam().vertexCount; + + glClear(GL_COLOR_BUFFER_BIT); + for (unsigned int count = 0; count < iterations; ++count) + { + glDrawElements(GL_TRIANGLES, static_cast<GLsizei>(vertexCount), GL_UNSIGNED_SHORT, nullptr); + } + + ASSERT_GL_NO_ERROR(); +} + +DynamicPromotionParams DynamicPromotionD3D11Params() +{ + DynamicPromotionParams params; + params.eglParameters = egl_platform::D3D11(); + return params; +} + +DynamicPromotionParams DynamicPromotionD3D9Params() +{ + DynamicPromotionParams params; + params.eglParameters = egl_platform::D3D9(); + return params; +} + +TEST_P(DynamicPromotionPerfTest, Run) +{ + run(); +} + +ANGLE_INSTANTIATE_TEST(DynamicPromotionPerfTest, + DynamicPromotionD3D11Params(), + DynamicPromotionD3D9Params()); + +} // anonymous namespace diff --git a/gfx/angle/src/tests/perf_tests/EGLInitializePerf.cpp b/gfx/angle/src/tests/perf_tests/EGLInitializePerf.cpp new file mode 100755 index 000000000..210ba2745 --- /dev/null +++ b/gfx/angle/src/tests/perf_tests/EGLInitializePerf.cpp @@ -0,0 +1,161 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// EGLInitializePerfTest: +// Performance test for device creation. +// + +#include "ANGLEPerfTest.h" +#include "Timer.h" +#include "test_utils/angle_test_configs.h" +#include "test_utils/angle_test_instantiate.h" +#include "platform/Platform.h" + +using namespace testing; + +namespace +{ + +// Only applies to D3D11 +class CapturePlatform : public angle::Platform +{ + public: + CapturePlatform() + : mTimer(CreateTimer()), + mLoadDLLsMS(0), + mCreateDeviceMS(0), + mInitResourcesMS(0) + { + mTimer->start(); + } + + double currentTime() override; + void histogramCustomCounts( + const char *name, int sample, int min, int max, int bucketCount) override; + + size_t getLoadDLLsMS() const { return mLoadDLLsMS; } + size_t getCreateDeviceMS() const { return mCreateDeviceMS; } + size_t getInitResourcesMS() const { return mInitResourcesMS; } + + private: + Timer *mTimer; + size_t mLoadDLLsMS; + size_t mCreateDeviceMS; + size_t mInitResourcesMS; +}; + +double CapturePlatform::currentTime() +{ + return mTimer->getElapsedTime(); +} + +void CapturePlatform::histogramCustomCounts( + const char *name, int sample, int /*min*/, int /*max*/, int /*bucketCount*/) +{ + // These must match the names of the histograms. + if (strcmp(name, "GPU.ANGLE.Renderer11InitializeDLLsMS") == 0) + { + mLoadDLLsMS += static_cast<size_t>(sample); + } + // Note: not captured in debug, due to creating a debug device + else if (strcmp(name, "GPU.ANGLE.D3D11CreateDeviceMS") == 0) + { + mCreateDeviceMS += static_cast<size_t>(sample); + } + else if (strcmp(name, "GPU.ANGLE.Renderer11InitializeDeviceMS") == 0) + { + mInitResourcesMS += static_cast<size_t>(sample); + } +} + +class EGLInitializePerfTest : public ANGLEPerfTest, + public WithParamInterface<angle::PlatformParameters> +{ + public: + EGLInitializePerfTest(); + ~EGLInitializePerfTest(); + + void step() override; + void TearDown() override; + + private: + OSWindow *mOSWindow; + EGLDisplay mDisplay; + CapturePlatform mCapturePlatform; +}; + +EGLInitializePerfTest::EGLInitializePerfTest() + : ANGLEPerfTest("EGLInitialize", "_run"), + mOSWindow(nullptr), + mDisplay(EGL_NO_DISPLAY) +{ + auto platform = GetParam().eglParameters; + + std::vector<EGLint> displayAttributes; + displayAttributes.push_back(EGL_PLATFORM_ANGLE_TYPE_ANGLE); + displayAttributes.push_back(platform.renderer); + displayAttributes.push_back(EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE); + displayAttributes.push_back(platform.majorVersion); + displayAttributes.push_back(EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE); + displayAttributes.push_back(platform.minorVersion); + + if (platform.renderer == EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE || + platform.renderer == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE) + { + displayAttributes.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE); + displayAttributes.push_back(platform.deviceType); + } + displayAttributes.push_back(EGL_NONE); + + mOSWindow = CreateOSWindow(); + mOSWindow->initialize("EGLInitialize Test", 64, 64); + + auto eglGetPlatformDisplayEXT = + reinterpret_cast<PFNEGLGETPLATFORMDISPLAYEXTPROC>(eglGetProcAddress("eglGetPlatformDisplayEXT")); + if (eglGetPlatformDisplayEXT == nullptr) + { + std::cerr << "Error getting platform display!" << std::endl; + return; + } + + mDisplay = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, + reinterpret_cast<void *>(mOSWindow->getNativeDisplay()), + &displayAttributes[0]); + + ANGLEPlatformInitialize(&mCapturePlatform); +} + +EGLInitializePerfTest::~EGLInitializePerfTest() +{ + SafeDelete(mOSWindow); +} + +void EGLInitializePerfTest::step() +{ + ASSERT_NE(EGL_NO_DISPLAY, mDisplay); + + EGLint majorVersion, minorVersion; + ASSERT_EQ(static_cast<EGLBoolean>(EGL_TRUE), eglInitialize(mDisplay, &majorVersion, &minorVersion)); + ASSERT_EQ(static_cast<EGLBoolean>(EGL_TRUE), eglTerminate(mDisplay)); +} + +void EGLInitializePerfTest::TearDown() +{ + ANGLEPerfTest::TearDown(); + printResult("LoadDLLs", normalizedTime(mCapturePlatform.getLoadDLLsMS()), "ms", true); + printResult("D3D11CreateDevice", normalizedTime(mCapturePlatform.getCreateDeviceMS()), "ms", true); + printResult("InitResources", normalizedTime(mCapturePlatform.getInitResourcesMS()), "ms", true); + + ANGLEPlatformShutdown(); +} + +TEST_P(EGLInitializePerfTest, Run) +{ + run(); +} + +ANGLE_INSTANTIATE_TEST(EGLInitializePerfTest, angle::ES2_D3D11()); + +} // namespace diff --git a/gfx/angle/src/tests/perf_tests/IndexConversionPerf.cpp b/gfx/angle/src/tests/perf_tests/IndexConversionPerf.cpp new file mode 100755 index 000000000..d05e79d09 --- /dev/null +++ b/gfx/angle/src/tests/perf_tests/IndexConversionPerf.cpp @@ -0,0 +1,271 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// IndexConversionPerf: +// Performance tests for ANGLE index conversion in D3D11. +// + +#include <sstream> + +#include "ANGLEPerfTest.h" +#include "shader_utils.h" + +using namespace angle; + +namespace +{ + +struct IndexConversionPerfParams final : public RenderTestParams +{ + std::string suffix() const override + { + std::stringstream strstr; + + if (indexRangeOffset > 0) + { + strstr << "_index_range"; + } + + strstr << RenderTestParams::suffix(); + + return strstr.str(); + } + + unsigned int iterations; + unsigned int numIndexTris; + + // A second test, which covers using index ranges with an offset. + unsigned int indexRangeOffset; +}; + +// Provide a custom gtest parameter name function for IndexConversionPerfParams. +std::ostream &operator<<(std::ostream &stream, const IndexConversionPerfParams ¶m) +{ + stream << param.suffix().substr(1); + return stream; +} + +class IndexConversionPerfTest : public ANGLERenderTest, + public ::testing::WithParamInterface<IndexConversionPerfParams> +{ + public: + IndexConversionPerfTest(); + + void initializeBenchmark() override; + void destroyBenchmark() override; + void drawBenchmark() override; + + private: + void updateBufferData(); + void drawConversion(); + void drawIndexRange(); + + GLuint mProgram; + GLuint mVertexBuffer; + GLuint mIndexBuffer; + std::vector<GLushort> mIndexData; +}; + +IndexConversionPerfTest::IndexConversionPerfTest() + : ANGLERenderTest("IndexConversionPerfTest", GetParam()), + mProgram(0), + mVertexBuffer(0), + mIndexBuffer(0) +{ + mRunTimeSeconds = 3.0; +} + +void IndexConversionPerfTest::initializeBenchmark() +{ + const auto ¶ms = GetParam(); + + ASSERT_LT(0u, params.iterations); + ASSERT_LT(0u, params.numIndexTris); + + const std::string vs = SHADER_SOURCE + ( + attribute vec2 vPosition; + uniform float uScale; + uniform float uOffset; + void main() + { + gl_Position = vec4(vPosition * vec2(uScale) - vec2(uOffset), 0, 1); + } + ); + + const std::string fs = SHADER_SOURCE + ( + precision mediump float; + void main() + { + gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); + } + ); + + mProgram = CompileProgram(vs, fs); + ASSERT_NE(0u, mProgram); + + // Use the program object + glUseProgram(mProgram); + + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + + // Initialize the vertex data + std::vector<GLfloat> floatData; + + size_t numTris = std::numeric_limits<GLushort>::max() / 3 + 1; + for (size_t triIndex = 0; triIndex < numTris; ++triIndex) + { + floatData.push_back(1); + floatData.push_back(2); + floatData.push_back(0); + floatData.push_back(0); + floatData.push_back(2); + floatData.push_back(0); + } + + glGenBuffers(1, &mVertexBuffer); + glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffer); + glBufferData(GL_ARRAY_BUFFER, floatData.size() * sizeof(GLfloat), &floatData[0], GL_STATIC_DRAW); + + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0); + glEnableVertexAttribArray(0); + + // Initialize the index buffer + for (unsigned int triIndex = 0; triIndex < params.numIndexTris; ++triIndex) + { + // Handle two different types of tests, one with index conversion triggered by a -1 index. + if (params.indexRangeOffset == 0) + { + mIndexData.push_back(std::numeric_limits<GLushort>::max()); + } + else + { + mIndexData.push_back(0); + } + + mIndexData.push_back(1); + mIndexData.push_back(2); + } + + glGenBuffers(1, &mIndexBuffer); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer); + updateBufferData(); + + // Set the viewport + glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight()); + + GLfloat scale = 0.5f; + GLfloat offset = 0.5f; + + glUniform1f(glGetUniformLocation(mProgram, "uScale"), scale); + glUniform1f(glGetUniformLocation(mProgram, "uOffset"), offset); + + ASSERT_GL_NO_ERROR(); +} + +void IndexConversionPerfTest::updateBufferData() +{ + glBufferData(GL_ELEMENT_ARRAY_BUFFER, mIndexData.size() * sizeof(mIndexData[0]), &mIndexData[0], GL_STATIC_DRAW); +} + +void IndexConversionPerfTest::destroyBenchmark() +{ + glDeleteProgram(mProgram); + glDeleteBuffers(1, &mVertexBuffer); + glDeleteBuffers(1, &mIndexBuffer); +} + +void IndexConversionPerfTest::drawBenchmark() +{ + const auto ¶ms = GetParam(); + + if (params.indexRangeOffset == 0) + { + drawConversion(); + } + else + { + drawIndexRange(); + } +} + +void IndexConversionPerfTest::drawConversion() +{ + const auto ¶ms = GetParam(); + + // Trigger an update to ensure we convert once a frame + updateBufferData(); + + for (unsigned int it = 0; it < params.iterations; it++) + { + glDrawElements(GL_TRIANGLES, + static_cast<GLsizei>(params.numIndexTris * 3 - 1), + GL_UNSIGNED_SHORT, + reinterpret_cast<GLvoid*>(0)); + } + + ASSERT_GL_NO_ERROR(); +} + +void IndexConversionPerfTest::drawIndexRange() +{ + const auto ¶ms = GetParam(); + + unsigned int indexCount = 3; + size_t offset = static_cast<size_t>(indexCount * getNumStepsPerformed()); + + offset %= (params.numIndexTris * 3); + + // This test increments an offset each step. Drawing repeatedly may cause the system memory + // to release. Then, using a fresh offset will require index range validation, which pages + // it back in. The performance should be good even if the data is was used quite a bit. + for (unsigned int it = 0; it < params.iterations; it++) + { + glDrawElements(GL_TRIANGLES, static_cast<GLsizei>(indexCount), GL_UNSIGNED_SHORT, + reinterpret_cast<GLvoid *>(offset)); + } + + ASSERT_GL_NO_ERROR(); +} + +IndexConversionPerfParams IndexConversionPerfD3D11Params() +{ + IndexConversionPerfParams params; + params.eglParameters = egl_platform::D3D11_NULL(); + params.majorVersion = 2; + params.minorVersion = 0; + params.windowWidth = 256; + params.windowHeight = 256; + params.iterations = 225; + params.numIndexTris = 3000; + params.indexRangeOffset = 0; + return params; +} + +IndexConversionPerfParams IndexRangeOffsetPerfD3D11Params() +{ + IndexConversionPerfParams params; + params.eglParameters = egl_platform::D3D11_NULL(); + params.majorVersion = 2; + params.minorVersion = 0; + params.windowWidth = 256; + params.windowHeight = 256; + params.iterations = 16; + params.numIndexTris = 50000; + params.indexRangeOffset = 64; + return params; +} + +TEST_P(IndexConversionPerfTest, Run) +{ + run(); +} + +ANGLE_INSTANTIATE_TEST(IndexConversionPerfTest, + IndexConversionPerfD3D11Params(), + IndexRangeOffsetPerfD3D11Params()); + +} // namespace diff --git a/gfx/angle/src/tests/perf_tests/IndexDataManagerTest.cpp b/gfx/angle/src/tests/perf_tests/IndexDataManagerTest.cpp new file mode 100755 index 000000000..696b81bb5 --- /dev/null +++ b/gfx/angle/src/tests/perf_tests/IndexDataManagerTest.cpp @@ -0,0 +1,186 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// IndexDataManagerPerfTest: +// Performance test for index buffer management. +// + +#include "ANGLEPerfTest.h" + +#include <gmock/gmock.h> + +#include "angle_unittests_utils.h" +#include "libANGLE/renderer/d3d/BufferD3D.h" +#include "libANGLE/renderer/d3d/IndexBuffer.h" +#include "libANGLE/renderer/d3d/IndexDataManager.h" + +using namespace testing; + +namespace +{ + +class MockIndexBuffer : public rx::IndexBuffer +{ + public: + MockIndexBuffer(unsigned int bufferSize, GLenum indexType) + : mBufferSize(bufferSize), + mIndexType(indexType) + { + } + + MOCK_METHOD3(initialize, gl::Error(unsigned int, GLenum, bool)); + MOCK_METHOD3(mapBuffer, gl::Error(unsigned int, unsigned int, void**)); + MOCK_METHOD0(unmapBuffer, gl::Error()); + MOCK_METHOD0(discard, gl::Error()); + MOCK_METHOD2(setSize, gl::Error(unsigned int, GLenum)); + + // inlined for speed + GLenum getIndexType() const override { return mIndexType; } + unsigned int getBufferSize() const override { return mBufferSize; } + + private: + unsigned int mBufferSize; + GLenum mIndexType; +}; + +class MockBufferFactoryD3D : public rx::BufferFactoryD3D +{ + public: + MockBufferFactoryD3D(unsigned int bufferSize, GLenum indexType) + : mBufferSize(bufferSize), + mIndexType(indexType) + { + } + + MOCK_METHOD0(createVertexBuffer, rx::VertexBuffer*()); + MOCK_CONST_METHOD1(getVertexConversionType, rx::VertexConversionType(gl::VertexFormatType)); + MOCK_CONST_METHOD1(getVertexComponentType, GLenum(gl::VertexFormatType)); + MOCK_CONST_METHOD3(getVertexSpaceRequired, + gl::ErrorOrResult<unsigned int>(const gl::VertexAttribute &, + GLsizei, + GLsizei)); + + // Dependency injection + rx::IndexBuffer* createIndexBuffer() override + { + return new MockIndexBuffer(mBufferSize, mIndexType); + } + + private: + unsigned int mBufferSize; + GLenum mIndexType; +}; + +class MockBufferD3D : public rx::BufferD3D +{ + public: + MockBufferD3D(rx::BufferFactoryD3D *factory) : BufferD3D(mockState, factory), mData() {} + + // BufferImpl + gl::Error setData(GLenum target, const void *data, size_t size, GLenum) override + { + mData.resize(size); + if (data && size > 0) + { + memcpy(&mData[0], data, size); + } + return gl::Error(GL_NO_ERROR); + } + + MOCK_METHOD4(setSubData, gl::Error(GLenum, const void *, size_t, size_t)); + MOCK_METHOD4(copySubData, gl::Error(BufferImpl*, GLintptr, GLintptr, GLsizeiptr)); + MOCK_METHOD2(map, gl::Error(GLenum, GLvoid **)); + MOCK_METHOD4(mapRange, gl::Error(size_t, size_t, GLbitfield, GLvoid **)); + MOCK_METHOD1(unmap, gl::Error(GLboolean *)); + + // BufferD3D + MOCK_METHOD0(markTransformFeedbackUsage, gl::Error()); + + // inlined for speed + bool supportsDirectBinding() const override { return false; } + size_t getSize() const override { return mData.size(); } + + gl::Error getData(const uint8_t **outData) override + { + *outData = &mData[0]; + return gl::Error(GL_NO_ERROR); + } + + private: + gl::BufferState mockState; + std::vector<uint8_t> mData; +}; + +class MockGLFactoryD3D : public rx::MockGLFactory +{ + public: + MockGLFactoryD3D(MockBufferFactoryD3D *bufferFactory) : mBufferFactory(bufferFactory) {} + + rx::BufferImpl *createBuffer(const gl::BufferState &state) override + { + MockBufferD3D *mockBufferD3D = new MockBufferD3D(mBufferFactory); + + EXPECT_CALL(*mBufferFactory, createVertexBuffer()) + .WillOnce(Return(nullptr)) + .RetiresOnSaturation(); + mockBufferD3D->initializeStaticData(); + + return mockBufferD3D; + } + + MockBufferFactoryD3D *mBufferFactory; +}; + +class IndexDataManagerPerfTest : public ANGLEPerfTest +{ + public: + IndexDataManagerPerfTest(); + + void step() override; + + rx::IndexDataManager mIndexDataManager; + GLsizei mIndexCount; + unsigned int mBufferSize; + MockBufferFactoryD3D mMockBufferFactory; + MockGLFactoryD3D mMockGLFactory; + gl::Buffer mIndexBuffer; +}; + +IndexDataManagerPerfTest::IndexDataManagerPerfTest() + : ANGLEPerfTest("IndexDataManger", "_run"), + mIndexDataManager(&mMockBufferFactory, rx::RENDERER_D3D11), + mIndexCount(4000), + mBufferSize(mIndexCount * sizeof(GLushort)), + mMockBufferFactory(mBufferSize, GL_UNSIGNED_SHORT), + mMockGLFactory(&mMockBufferFactory), + mIndexBuffer(&mMockGLFactory, 1) +{ + std::vector<GLushort> indexData(mIndexCount); + for (GLsizei index = 0; index < mIndexCount; ++index) + { + indexData[index] = static_cast<GLushort>(index); + } + mIndexBuffer.bufferData(GL_ARRAY_BUFFER, &indexData[0], indexData.size() * sizeof(GLushort), + GL_STATIC_DRAW); +} + +void IndexDataManagerPerfTest::step() +{ + rx::TranslatedIndexData translatedIndexData; + for (unsigned int iteration = 0; iteration < 100; ++iteration) + { + mIndexBuffer.getIndexRange(GL_UNSIGNED_SHORT, 0, mIndexCount, false, + &translatedIndexData.indexRange); + mIndexDataManager.prepareIndexData(GL_UNSIGNED_SHORT, mIndexCount, &mIndexBuffer, nullptr, + &translatedIndexData, false); + } +} + +TEST_F(IndexDataManagerPerfTest, Run) +{ + run(); +} + +} // anonymous namespace diff --git a/gfx/angle/src/tests/perf_tests/InstancingPerf.cpp b/gfx/angle/src/tests/perf_tests/InstancingPerf.cpp new file mode 100755 index 000000000..eb02c10e9 --- /dev/null +++ b/gfx/angle/src/tests/perf_tests/InstancingPerf.cpp @@ -0,0 +1,366 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// InstancingPerf: +// Performance tests for ANGLE instanced draw calls. +// + +#include <cmath> +#include <sstream> + +#include "ANGLEPerfTest.h" +#include "Matrix.h" +#include "random_utils.h" +#include "shader_utils.h" +#include "Vector.h" + +using namespace angle; +using namespace egl_platform; + +namespace +{ + +float AnimationSignal(float t) +{ + float l = t / 2.0f; + float f = l - std::floor(l); + return (f > 0.5f ? 1.0f - f : f) * 4.0f - 1.0f; +} + +template <typename T> +size_t VectorSizeBytes(const std::vector<T> &vec) +{ + return sizeof(T) * vec.size(); +} + +Vector3 RandomVector3(RNG *rng) +{ + return Vector3(rng->randomNegativeOneToOne(), rng->randomNegativeOneToOne(), + rng->randomNegativeOneToOne()); +} + +struct InstancingPerfParams final : public RenderTestParams +{ + // Common default options + InstancingPerfParams() + { + majorVersion = 2; + minorVersion = 0; + windowWidth = 256; + windowHeight = 256; + iterations = 1; + runTimeSeconds = 10.0; + animationEnabled = false; + instancingEnabled = true; + } + + std::string suffix() const override + { + std::stringstream strstr; + + strstr << RenderTestParams::suffix(); + + if (!instancingEnabled) + { + strstr << "_billboards"; + } + + return strstr.str(); + } + + unsigned int iterations; + double runTimeSeconds; + bool animationEnabled; + bool instancingEnabled; +}; + +std::ostream &operator<<(std::ostream &os, const InstancingPerfParams ¶ms) +{ + os << params.suffix().substr(1); + return os; +} + +class InstancingPerfBenchmark : public ANGLERenderTest, + public ::testing::WithParamInterface<InstancingPerfParams> +{ + public: + InstancingPerfBenchmark(); + + void initializeBenchmark() override; + void destroyBenchmark() override; + void drawBenchmark() override; + + private: + GLuint mProgram; + std::vector<GLuint> mBuffers; + GLuint mNumPoints; + std::vector<Vector3> mTranslateData; + std::vector<float> mSizeData; + std::vector<Vector3> mColorData; + angle::RNG mRNG; +}; + +InstancingPerfBenchmark::InstancingPerfBenchmark() + : ANGLERenderTest("InstancingPerf", GetParam()), mProgram(0), mNumPoints(75000) +{ + mRunTimeSeconds = GetParam().runTimeSeconds; +} + +void InstancingPerfBenchmark::initializeBenchmark() +{ + const auto ¶ms = GetParam(); + + ASSERT_LT(0u, params.iterations); + + const std::string vs = + "attribute vec2 aPosition;\n" + "attribute vec3 aTranslate;\n" + "attribute float aScale;\n" + "attribute vec3 aColor;\n" + "uniform mat4 uWorldMatrix;\n" + "uniform mat4 uProjectionMatrix;\n" + "varying vec3 vColor;\n" + "void main()\n" + "{\n" + " vec4 position = uWorldMatrix * vec4(aTranslate, 1.0);\n" + " position.xy += aPosition * aScale;\n" + " gl_Position = uProjectionMatrix * position;\n" + " vColor = aColor;\n" + "}\n"; + + const std::string fs = + "precision mediump float;\n" + "varying vec3 vColor;\n" + "void main()\n" + "{\n" + " gl_FragColor = vec4(vColor, 1.0);\n" + "}\n"; + + mProgram = CompileProgram(vs, fs); + ASSERT_NE(0u, mProgram); + + glUseProgram(mProgram); + + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + + GLuint baseIndexData[6] = {0, 1, 2, 1, 3, 2}; + Vector2 basePositionData[4] = {Vector2(-1.0f, 1.0f), Vector2(1.0f, 1.0f), Vector2(-1.0f, -1.0f), + Vector2(1.0f, -1.0f)}; + + std::vector<GLuint> indexData; + std::vector<Vector2> positionData; + + if (!params.instancingEnabled) + { + GLuint pointVertexStride = 4; + for (GLuint pointIndex = 0; pointIndex < mNumPoints; ++pointIndex) + { + for (GLuint indexIndex = 0; indexIndex < 6; ++indexIndex) + { + indexData.push_back(baseIndexData[indexIndex] + pointIndex * pointVertexStride); + } + + Vector3 randVec = RandomVector3(&mRNG); + for (GLuint vertexIndex = 0; vertexIndex < 4; ++vertexIndex) + { + positionData.push_back(basePositionData[vertexIndex]); + mTranslateData.push_back(randVec); + } + } + + mSizeData.resize(mNumPoints * 4, 0.012f); + mColorData.resize(mNumPoints * 4, Vector3(1.0f, 0.0f, 0.0f)); + } + else + { + for (GLuint index : baseIndexData) + { + indexData.push_back(index); + } + + for (const Vector2 &position : basePositionData) + { + positionData.push_back(position); + } + + for (GLuint pointIndex = 0; pointIndex < mNumPoints; ++pointIndex) + { + Vector3 randVec = RandomVector3(&mRNG); + mTranslateData.push_back(randVec); + } + + mSizeData.resize(mNumPoints, 0.012f); + mColorData.resize(mNumPoints, Vector3(1.0f, 0.0f, 0.0f)); + } + + mBuffers.resize(5, 0); + glGenBuffers(static_cast<GLsizei>(mBuffers.size()), &mBuffers[0]); + + // Index Data + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mBuffers[0]); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, VectorSizeBytes(indexData), &indexData[0], + GL_STATIC_DRAW); + + // Position Data + glBindBuffer(GL_ARRAY_BUFFER, mBuffers[1]); + glBufferData(GL_ARRAY_BUFFER, VectorSizeBytes(positionData), &positionData[0], GL_STATIC_DRAW); + GLint positionLocation = glGetAttribLocation(mProgram, "aPosition"); + ASSERT_NE(-1, positionLocation); + glVertexAttribPointer(positionLocation, 2, GL_FLOAT, GL_FALSE, 8, nullptr); + glEnableVertexAttribArray(positionLocation); + + // Translate Data + glBindBuffer(GL_ARRAY_BUFFER, mBuffers[2]); + glBufferData(GL_ARRAY_BUFFER, VectorSizeBytes(mTranslateData), &mTranslateData[0], + GL_STATIC_DRAW); + GLint translateLocation = glGetAttribLocation(mProgram, "aTranslate"); + ASSERT_NE(-1, translateLocation); + glVertexAttribPointer(translateLocation, 3, GL_FLOAT, GL_FALSE, 12, nullptr); + glEnableVertexAttribArray(translateLocation); + glVertexAttribDivisorANGLE(translateLocation, 1); + + // Scale Data + glBindBuffer(GL_ARRAY_BUFFER, mBuffers[3]); + glBufferData(GL_ARRAY_BUFFER, VectorSizeBytes(mSizeData), nullptr, GL_DYNAMIC_DRAW); + GLint scaleLocation = glGetAttribLocation(mProgram, "aScale"); + ASSERT_NE(-1, scaleLocation); + glVertexAttribPointer(scaleLocation, 1, GL_FLOAT, GL_FALSE, 4, nullptr); + glEnableVertexAttribArray(scaleLocation); + glVertexAttribDivisorANGLE(scaleLocation, 1); + + // Color Data + glBindBuffer(GL_ARRAY_BUFFER, mBuffers[4]); + glBufferData(GL_ARRAY_BUFFER, VectorSizeBytes(mColorData), nullptr, GL_DYNAMIC_DRAW); + GLint colorLocation = glGetAttribLocation(mProgram, "aColor"); + ASSERT_NE(-1, colorLocation); + glVertexAttribPointer(colorLocation, 3, GL_FLOAT, GL_FALSE, 12, nullptr); + glEnableVertexAttribArray(colorLocation); + glVertexAttribDivisorANGLE(colorLocation, 1); + + // Set the viewport + glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight()); + + // Init matrices + GLint worldMatrixLocation = glGetUniformLocation(mProgram, "uWorldMatrix"); + ASSERT_NE(-1, worldMatrixLocation); + Matrix4 worldMatrix = Matrix4::translate(Vector3(0, 0, -3.0f)); + worldMatrix *= Matrix4::rotate(25.0f, Vector3(0.6f, 1.0f, 0.0f)); + glUniformMatrix4fv(worldMatrixLocation, 1, GL_FALSE, &worldMatrix.data[0]); + + GLint projectionMatrixLocation = glGetUniformLocation(mProgram, "uProjectionMatrix"); + ASSERT_NE(-1, projectionMatrixLocation); + float fov = + static_cast<float>(getWindow()->getWidth()) / static_cast<float>(getWindow()->getHeight()); + Matrix4 projectionMatrix = Matrix4::perspective(60.0f, fov, 1.0f, 300.0f); + glUniformMatrix4fv(projectionMatrixLocation, 1, GL_FALSE, &projectionMatrix.data[0]); + + getWindow()->setVisible(true); + + ASSERT_GL_NO_ERROR(); +} + +void InstancingPerfBenchmark::destroyBenchmark() +{ + glDeleteProgram(mProgram); + + if (!mBuffers.empty()) + { + glDeleteBuffers(static_cast<GLsizei>(mBuffers.size()), &mBuffers[0]); + mBuffers.clear(); + } +} + +void InstancingPerfBenchmark::drawBenchmark() +{ + glClear(GL_COLOR_BUFFER_BIT); + + const auto ¶ms = GetParam(); + + // Animatino makes the test more interesting visually, but also eats up many CPU cycles. + if (params.animationEnabled) + { + // Not implemented for billboards. + ASSERT(params.instancingEnabled); + + float time = static_cast<float>(mTimer->getElapsedTime()); + + for (size_t pointIndex = 0; pointIndex < mTranslateData.size(); ++pointIndex) + { + const Vector3 &translate = mTranslateData[pointIndex]; + + float tx = translate.x + time; + float ty = translate.y + time; + float tz = translate.z + time; + + float scale = AnimationSignal(tx) * 0.01f + 0.01f; + mSizeData[pointIndex] = scale; + + Vector3 color; + color.x = AnimationSignal(tx) * 0.5f + 0.5f; + color.y = AnimationSignal(ty) * 0.5f + 0.5f; + color.z = AnimationSignal(tz) * 0.5f + 0.5f; + + mColorData[pointIndex] = color; + } + } + + // Update scales and colors. + glBindBuffer(GL_ARRAY_BUFFER, mBuffers[3]); + glBufferSubData(GL_ARRAY_BUFFER, 0, VectorSizeBytes(mSizeData), &mSizeData[0]); + + glBindBuffer(GL_ARRAY_BUFFER, mBuffers[4]); + glBufferSubData(GL_ARRAY_BUFFER, 0, VectorSizeBytes(mColorData), &mColorData[0]); + + // Render the instances/billboards. + if (params.instancingEnabled) + { + for (unsigned int it = 0; it < params.iterations; it++) + { + glDrawElementsInstancedANGLE(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr, mNumPoints); + } + } + else + { + for (unsigned int it = 0; it < params.iterations; it++) + { + glDrawElements(GL_TRIANGLES, 6 * mNumPoints, GL_UNSIGNED_INT, nullptr); + } + } + + ASSERT_GL_NO_ERROR(); +} + +InstancingPerfParams InstancingPerfD3D11Params() +{ + InstancingPerfParams params; + params.eglParameters = D3D11(); + return params; +} + +InstancingPerfParams InstancingPerfD3D9Params() +{ + InstancingPerfParams params; + params.eglParameters = D3D9(); + return params; +} + +InstancingPerfParams InstancingPerfOpenGLParams() +{ + InstancingPerfParams params; + params.eglParameters = OPENGL(); + return params; +} + +TEST_P(InstancingPerfBenchmark, Run) +{ + run(); +} + +ANGLE_INSTANTIATE_TEST(InstancingPerfBenchmark, + InstancingPerfD3D11Params(), + InstancingPerfD3D9Params(), + InstancingPerfOpenGLParams()); + +} // anonymous namespace diff --git a/gfx/angle/src/tests/perf_tests/InterleavedAttributeData.cpp b/gfx/angle/src/tests/perf_tests/InterleavedAttributeData.cpp new file mode 100755 index 000000000..15e2a5b14 --- /dev/null +++ b/gfx/angle/src/tests/perf_tests/InterleavedAttributeData.cpp @@ -0,0 +1,231 @@ +// +// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// InterleavedAttributeData: +// Performance test for draws using interleaved attribute data in vertex buffers. +// + +#include <sstream> + +#include "ANGLEPerfTest.h" +#include "shader_utils.h" + +using namespace angle; + +namespace +{ + +struct InterleavedAttributeDataParams final : public RenderTestParams +{ + InterleavedAttributeDataParams() + { + // Common default values + majorVersion = 2; + minorVersion = 0; + windowWidth = 512; + windowHeight = 512; + numSprites = 3000; + } + + // static parameters + unsigned int numSprites; +}; + +std::ostream &operator<<(std::ostream &os, const InterleavedAttributeDataParams ¶ms) +{ + os << params.suffix().substr(1); + + if (params.eglParameters.majorVersion != EGL_DONT_CARE) + { + os << "_" << params.eglParameters.majorVersion << "_" << params.eglParameters.minorVersion; + } + + return os; +} + +class InterleavedAttributeDataBenchmark + : public ANGLERenderTest, + public ::testing::WithParamInterface<InterleavedAttributeDataParams> +{ + public: + InterleavedAttributeDataBenchmark(); + + void initializeBenchmark() override; + void destroyBenchmark() override; + void drawBenchmark() override; + + private: + GLuint mPointSpriteProgram; + GLuint mPositionColorBuffer[2]; + + // The buffers contain two floats and 3 unsigned bytes per point sprite + const size_t mBytesPerSprite = 2 * sizeof(float) + 3; +}; + +InterleavedAttributeDataBenchmark::InterleavedAttributeDataBenchmark() + : ANGLERenderTest("InterleavedAttributeData", GetParam()), mPointSpriteProgram(0) +{ +} + +void InterleavedAttributeDataBenchmark::initializeBenchmark() +{ + const auto ¶ms = GetParam(); + + // Compile point sprite shaders + const std::string vs = + "attribute vec4 aPosition;" + "attribute vec4 aColor;" + "varying vec4 vColor;" + "void main()" + "{" + " gl_PointSize = 25.0;" + " gl_Position = aPosition;" + " vColor = aColor;" + "}"; + + const std::string fs = + "precision mediump float;" + "varying vec4 vColor;" + "void main()" + "{" + " gl_FragColor = vColor;" + "}"; + + mPointSpriteProgram = CompileProgram(vs, fs); + ASSERT_NE(0u, mPointSpriteProgram); + + glClearColor(0.0f, 1.0f, 0.0f, 1.0f); + + for (size_t i = 0; i < ArraySize(mPositionColorBuffer); i++) + { + // Set up initial data for pointsprite positions and colors + std::vector<uint8_t> positionColorData(mBytesPerSprite * params.numSprites); + for (unsigned int j = 0; j < params.numSprites; j++) + { + float pointSpriteX = + (static_cast<float>(rand() % getWindow()->getWidth()) / getWindow()->getWidth()) * + 2.0f - 1.0f; + float pointSpriteY = + (static_cast<float>(rand() % getWindow()->getHeight()) / getWindow()->getHeight()) * + 2.0f - 1.0f; + GLubyte pointSpriteRed = static_cast<GLubyte>(rand() % 255); + GLubyte pointSpriteGreen = static_cast<GLubyte>(rand() % 255); + GLubyte pointSpriteBlue = static_cast<GLubyte>(rand() % 255); + + // Add position data for the pointsprite + *reinterpret_cast<float *>( + &(positionColorData[j * mBytesPerSprite + 0 * sizeof(float) + 0])) = + pointSpriteX; // X + *reinterpret_cast<float *>( + &(positionColorData[j * mBytesPerSprite + 1 * sizeof(float) + 0])) = + pointSpriteY; // Y + + // Add color data for the pointsprite + positionColorData[j * mBytesPerSprite + 2 * sizeof(float) + 0] = pointSpriteRed; // R + positionColorData[j * mBytesPerSprite + 2 * sizeof(float) + 1] = pointSpriteGreen; // G + positionColorData[j * mBytesPerSprite + 2 * sizeof(float) + 2] = pointSpriteBlue; // B + } + + // Generate the GL buffer with the position/color data + glGenBuffers(1, &mPositionColorBuffer[i]); + glBindBuffer(GL_ARRAY_BUFFER, mPositionColorBuffer[i]); + glBufferData(GL_ARRAY_BUFFER, params.numSprites * mBytesPerSprite, &(positionColorData[0]), + GL_STATIC_DRAW); + } + + ASSERT_GL_NO_ERROR(); +} + +void InterleavedAttributeDataBenchmark::destroyBenchmark() +{ + glDeleteProgram(mPointSpriteProgram); + + for (size_t i = 0; i < ArraySize(mPositionColorBuffer); i++) + { + glDeleteBuffers(1, &mPositionColorBuffer[i]); + } +} + +void InterleavedAttributeDataBenchmark::drawBenchmark() +{ + glClear(GL_COLOR_BUFFER_BIT); + + for (size_t k = 0; k < 20; k++) + { + for (size_t i = 0; i < ArraySize(mPositionColorBuffer); i++) + { + // Firstly get the attribute locations for the program + glUseProgram(mPointSpriteProgram); + GLint positionLocation = glGetAttribLocation(mPointSpriteProgram, "aPosition"); + ASSERT_NE(positionLocation, -1); + GLint colorLocation = glGetAttribLocation(mPointSpriteProgram, "aColor"); + ASSERT_NE(colorLocation, -1); + + // Bind the position data from one buffer + glBindBuffer(GL_ARRAY_BUFFER, mPositionColorBuffer[i]); + glEnableVertexAttribArray(positionLocation); + glVertexAttribPointer(positionLocation, 2, GL_FLOAT, GL_FALSE, + static_cast<GLsizei>(mBytesPerSprite), 0); + + // But bind the color data from the other buffer. + glBindBuffer(GL_ARRAY_BUFFER, + mPositionColorBuffer[(i + 1) % ArraySize(mPositionColorBuffer)]); + glEnableVertexAttribArray(colorLocation); + glVertexAttribPointer(colorLocation, 3, GL_UNSIGNED_BYTE, GL_TRUE, + static_cast<GLsizei>(mBytesPerSprite), + reinterpret_cast<void *>(2 * sizeof(float))); + + // Then draw the colored pointsprites + glDrawArrays(GL_POINTS, 0, GetParam().numSprites); + glFlush(); + + glDisableVertexAttribArray(positionLocation); + glDisableVertexAttribArray(colorLocation); + } + } + + ASSERT_GL_NO_ERROR(); +} + +TEST_P(InterleavedAttributeDataBenchmark, Run) +{ + run(); +} + +InterleavedAttributeDataParams D3D11Params() +{ + InterleavedAttributeDataParams params; + params.eglParameters = egl_platform::D3D11(); + return params; +} + +InterleavedAttributeDataParams D3D11_9_3Params() +{ + InterleavedAttributeDataParams params; + params.eglParameters = egl_platform::D3D11_FL9_3(); + return params; +} + +InterleavedAttributeDataParams D3D9Params() +{ + InterleavedAttributeDataParams params; + params.eglParameters = egl_platform::D3D9(); + return params; +} + +InterleavedAttributeDataParams OpenGLParams() +{ + InterleavedAttributeDataParams params; + params.eglParameters = egl_platform::OPENGL(); + return params; +} + +ANGLE_INSTANTIATE_TEST(InterleavedAttributeDataBenchmark, + D3D11Params(), + D3D11_9_3Params(), + D3D9Params(), + OpenGLParams()); + +} // anonymous namespace diff --git a/gfx/angle/src/tests/perf_tests/PointSprites.cpp b/gfx/angle/src/tests/perf_tests/PointSprites.cpp new file mode 100755 index 000000000..b0b23109b --- /dev/null +++ b/gfx/angle/src/tests/perf_tests/PointSprites.cpp @@ -0,0 +1,230 @@ +// +// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// PointSpritesBenchmark: +// Performance test for ANGLE point sprites. +// +// +#include "ANGLEPerfTest.h" + +#include <iostream> +#include <sstream> + +#include "shader_utils.h" +#include "random_utils.h" + +using namespace angle; + +namespace +{ + +struct PointSpritesParams final : public RenderTestParams +{ + PointSpritesParams() + { + // Common default params + majorVersion = 2; + minorVersion = 0; + windowWidth = 1280; + windowHeight = 720; + iterations = 100; + count = 10; + size = 3.0f; + numVaryings = 3; + } + + std::string suffix() const override; + + unsigned int count; + float size; + unsigned int numVaryings; + + // static parameters + unsigned int iterations; +}; + +std::ostream &operator<<(std::ostream &os, const PointSpritesParams ¶ms) +{ + os << params.suffix().substr(1); + return os; +} + +class PointSpritesBenchmark : public ANGLERenderTest, + public ::testing::WithParamInterface<PointSpritesParams> +{ + public: + PointSpritesBenchmark(); + + void initializeBenchmark() override; + void destroyBenchmark() override; + void drawBenchmark() override; + + private: + GLuint mProgram; + GLuint mBuffer; + RNG mRNG; +}; + +std::string PointSpritesParams::suffix() const +{ + std::stringstream strstr; + + strstr << RenderTestParams::suffix() + << "_" << count << "_" << size << "px" + << "_" << numVaryings << "vars"; + + return strstr.str(); +} + +PointSpritesBenchmark::PointSpritesBenchmark() + : ANGLERenderTest("PointSprites", GetParam()), mRNG(1) +{ +} + +void PointSpritesBenchmark::initializeBenchmark() +{ + const auto ¶ms = GetParam(); + + ASSERT_LT(0u, params.iterations); + + std::stringstream vstrstr; + + // Verify "numVaryings" is within MAX_VARYINGS limit + GLint maxVaryings; + glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings); + + if (params.numVaryings > static_cast<unsigned int>(maxVaryings)) + { + FAIL() << "Varying count (" << params.numVaryings << ")" + << " exceeds maximum varyings: " << maxVaryings << std::endl; + } + + vstrstr << "attribute vec2 vPosition;\n" + "uniform float uPointSize;\n"; + + for (unsigned int varCount = 0; varCount < params.numVaryings; varCount++) + { + vstrstr << "varying vec4 v" << varCount << ";\n"; + } + + vstrstr << "void main()\n" + "{\n"; + + for (unsigned int varCount = 0; varCount < params.numVaryings; varCount++) + { + vstrstr << " v" << varCount << " = vec4(1.0);\n"; + } + + vstrstr << " gl_Position = vec4(vPosition, 0, 1.0);\n" + " gl_PointSize = uPointSize;\n" + "}"; + + std::stringstream fstrstr; + + fstrstr << "precision mediump float;\n"; + + for (unsigned int varCount = 0; varCount < params.numVaryings; varCount++) + { + fstrstr << "varying vec4 v" << varCount << ";\n"; + } + + fstrstr << "void main()\n" + "{\n" + " vec4 colorOut = vec4(1.0, 0.0, 0.0, 1.0);\n"; + + for (unsigned int varCount = 0; varCount < params.numVaryings; varCount++) + { + fstrstr << " colorOut.r += v" << varCount << ".r;\n"; + } + + fstrstr << " gl_FragColor = colorOut;\n" + "}\n"; + + mProgram = CompileProgram(vstrstr.str(), fstrstr.str()); + ASSERT_NE(0u, mProgram); + + // Use the program object + glUseProgram(mProgram); + + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + + std::vector<float> vertexPositions(params.count * 2); + for (size_t pointIndex = 0; pointIndex < vertexPositions.size(); ++pointIndex) + { + vertexPositions[pointIndex] = mRNG.randomNegativeOneToOne(); + } + + glGenBuffers(1, &mBuffer); + glBindBuffer(GL_ARRAY_BUFFER, mBuffer); + glBufferData(GL_ARRAY_BUFFER, vertexPositions.size() * sizeof(float), &vertexPositions[0], GL_STATIC_DRAW); + + GLint positionLocation = glGetAttribLocation(mProgram, "vPosition"); + ASSERT_NE(-1, positionLocation); + + glVertexAttribPointer(positionLocation, 2, GL_FLOAT, GL_FALSE, 0, nullptr); + glEnableVertexAttribArray(positionLocation); + + // Set the viewport + glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight()); + + GLint pointSizeLocation = glGetUniformLocation(mProgram, "uPointSize"); + ASSERT_NE(-1, pointSizeLocation); + + glUniform1f(pointSizeLocation, params.size); + + ASSERT_GL_NO_ERROR(); +} + +void PointSpritesBenchmark::destroyBenchmark() +{ + glDeleteProgram(mProgram); + glDeleteBuffers(1, &mBuffer); +} + +void PointSpritesBenchmark::drawBenchmark() +{ + glClear(GL_COLOR_BUFFER_BIT); + + const auto ¶ms = GetParam(); + + for (unsigned int it = 0; it < params.iterations; it++) + { + //TODO(jmadill): Indexed point rendering. ANGLE is bad at this. + glDrawArrays(GL_POINTS, 0, params.count); + } + + ASSERT_GL_NO_ERROR(); +} + +PointSpritesParams D3D11Params() +{ + PointSpritesParams params; + params.eglParameters = egl_platform::D3D11(); + return params; +} + +PointSpritesParams D3D9Params() +{ + PointSpritesParams params; + params.eglParameters = egl_platform::D3D9(); + return params; +} + +PointSpritesParams OpenGLParams() +{ + PointSpritesParams params; + params.eglParameters = egl_platform::OPENGL(); + return params; +} + +} // namespace + +TEST_P(PointSpritesBenchmark, Run) +{ + run(); +} + +ANGLE_INSTANTIATE_TEST(PointSpritesBenchmark, + D3D11Params(), D3D9Params(), OpenGLParams()); diff --git a/gfx/angle/src/tests/perf_tests/TexSubImage.cpp b/gfx/angle/src/tests/perf_tests/TexSubImage.cpp new file mode 100755 index 000000000..3e4b5cf68 --- /dev/null +++ b/gfx/angle/src/tests/perf_tests/TexSubImage.cpp @@ -0,0 +1,298 @@ +// +// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// TexSubImageBenchmark: +// Performace test for ANGLE texture updates. +// + +#include <sstream> + +#include "ANGLEPerfTest.h" +#include "shader_utils.h" + +using namespace angle; + +namespace +{ + +struct TexSubImageParams final : public RenderTestParams +{ + TexSubImageParams() + { + // Common default parameters + majorVersion = 2; + minorVersion = 0; + windowWidth = 512; + windowHeight = 512; + + imageWidth = 1024; + imageHeight = 1024; + subImageWidth = 64; + subImageHeight = 64; + iterations = 9; + } + + std::string suffix() const override; + + // Static parameters + int imageWidth; + int imageHeight; + int subImageWidth; + int subImageHeight; + unsigned int iterations; +}; + +std::ostream &operator<<(std::ostream &os, const TexSubImageParams ¶ms) +{ + os << params.suffix().substr(1); + return os; +} + +class TexSubImageBenchmark : public ANGLERenderTest, + public ::testing::WithParamInterface<TexSubImageParams> +{ + public: + TexSubImageBenchmark(); + + void initializeBenchmark() override; + void destroyBenchmark() override; + void drawBenchmark() override; + + private: + GLuint createTexture(); + + // Handle to a program object + GLuint mProgram; + + // Attribute locations + GLint mPositionLoc; + GLint mTexCoordLoc; + + // Sampler location + GLint mSamplerLoc; + + // Texture handle + GLuint mTexture; + + // Buffer handle + GLuint mVertexBuffer; + GLuint mIndexBuffer; + + GLubyte *mPixels; +}; + +std::string TexSubImageParams::suffix() const +{ + // TODO(jmadill) + return RenderTestParams::suffix(); +} + +TexSubImageBenchmark::TexSubImageBenchmark() + : ANGLERenderTest("TexSubImage", GetParam()), + mProgram(0), + mPositionLoc(-1), + mTexCoordLoc(-1), + mSamplerLoc(-1), + mTexture(0), + mVertexBuffer(0), + mIndexBuffer(0), + mPixels(nullptr) +{ +} + +GLuint TexSubImageBenchmark::createTexture() +{ + const auto ¶ms = GetParam(); + + assert(params.iterations > 0); + + // Use tightly packed data + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + + // Generate a texture object + GLuint texture; + glGenTextures(1, &texture); + + // Bind the texture object + glBindTexture(GL_TEXTURE_2D, texture); + + glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8, params.imageWidth, params.imageHeight); + + // Set the filtering mode + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + return texture; +} + +void TexSubImageBenchmark::initializeBenchmark() +{ + const auto ¶ms = GetParam(); + + const std::string vs = SHADER_SOURCE + ( + attribute vec4 a_position; + attribute vec2 a_texCoord; + varying vec2 v_texCoord; + void main() + { + gl_Position = a_position; + v_texCoord = a_texCoord; + } + ); + + const std::string fs = SHADER_SOURCE + ( + precision mediump float; + varying vec2 v_texCoord; + uniform sampler2D s_texture; + void main() + { + gl_FragColor = texture2D(s_texture, v_texCoord); + } + ); + + mProgram = CompileProgram(vs, fs); + ASSERT_NE(0u, mProgram); + + // Get the attribute locations + mPositionLoc = glGetAttribLocation(mProgram, "a_position"); + mTexCoordLoc = glGetAttribLocation(mProgram, "a_texCoord"); + + // Get the sampler location + mSamplerLoc = glGetUniformLocation(mProgram, "s_texture"); + + // Build the vertex buffer + GLfloat vertices[] = + { + -0.5f, 0.5f, 0.0f, // Position 0 + 0.0f, 0.0f, // TexCoord 0 + -0.5f, -0.5f, 0.0f, // Position 1 + 0.0f, 1.0f, // TexCoord 1 + 0.5f, -0.5f, 0.0f, // Position 2 + 1.0f, 1.0f, // TexCoord 2 + 0.5f, 0.5f, 0.0f, // Position 3 + 1.0f, 0.0f // TexCoord 3 + }; + + glGenBuffers(1, &mVertexBuffer); + glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + + GLushort indices[] = { 0, 1, 2, 0, 2, 3 }; + glGenBuffers(1, &mIndexBuffer); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); + + // Load the texture + mTexture = createTexture(); + + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + + mPixels = new GLubyte[params.subImageWidth * params.subImageHeight * 4]; + + // Fill the pixels structure with random data: + for (int y = 0; y < params.subImageHeight; ++y) + { + for (int x = 0; x < params.subImageWidth; ++x) + { + int offset = (x + (y * params.subImageWidth)) * 4; + mPixels[offset + 0] = rand() % 255; // Red + mPixels[offset + 1] = rand() % 255; // Green + mPixels[offset + 2] = rand() % 255; // Blue + mPixels[offset + 3] = 255; // Alpha + } + } + + ASSERT_GL_NO_ERROR(); +} + +void TexSubImageBenchmark::destroyBenchmark() +{ + glDeleteProgram(mProgram); + glDeleteBuffers(1, &mVertexBuffer); + glDeleteBuffers(1, &mIndexBuffer); + glDeleteTextures(1, &mTexture); + delete[] mPixels; +} + +void TexSubImageBenchmark::drawBenchmark() +{ + // Set the viewport + glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight()); + + // Clear the color buffer + glClear(GL_COLOR_BUFFER_BIT); + + // Use the program object + glUseProgram(mProgram); + + // Bind the buffers + glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffer); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer); + + // Load the vertex position + glVertexAttribPointer(mPositionLoc, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), 0); + // Load the texture coordinate + glVertexAttribPointer(mTexCoordLoc, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat))); + + glEnableVertexAttribArray(mPositionLoc); + glEnableVertexAttribArray(mTexCoordLoc); + + // Bind the texture + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, mTexture); + + // Set the texture sampler to texture unit to 0 + glUniform1i(mSamplerLoc, 0); + + ASSERT_GL_NO_ERROR(); + + const auto ¶ms = GetParam(); + + for (unsigned int iteration = 0; iteration < params.iterations; ++iteration) + { + glTexSubImage2D(GL_TEXTURE_2D, 0, + rand() % (params.imageWidth - params.subImageWidth), + rand() % (params.imageHeight - params.subImageHeight), + params.subImageWidth, params.subImageHeight, + GL_RGBA, GL_UNSIGNED_BYTE, mPixels); + + glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); + } + + ASSERT_GL_NO_ERROR(); +} + +TexSubImageParams D3D11Params() +{ + TexSubImageParams params; + params.eglParameters = egl_platform::D3D11(); + return params; +} + +TexSubImageParams D3D9Params() +{ + TexSubImageParams params; + params.eglParameters = egl_platform::D3D9(); + return params; +} + +TexSubImageParams OpenGLParams() +{ + TexSubImageParams params; + params.eglParameters = egl_platform::OPENGL(); + return params; +} + +} // namespace + +TEST_P(TexSubImageBenchmark, Run) +{ + run(); +} + +ANGLE_INSTANTIATE_TEST(TexSubImageBenchmark, + D3D11Params(), D3D9Params(), OpenGLParams()); diff --git a/gfx/angle/src/tests/perf_tests/TextureSampling.cpp b/gfx/angle/src/tests/perf_tests/TextureSampling.cpp new file mode 100755 index 000000000..bc00acddf --- /dev/null +++ b/gfx/angle/src/tests/perf_tests/TextureSampling.cpp @@ -0,0 +1,288 @@ +// +// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// TextureSamplingBenchmark: +// Performance test for texture sampling. The test generates a texture containing random data +// and then blurs it in a fragment shader using nearest neighbor sampling. The test is +// specifically designed to test overhead of GLSL's builtin texture*() functions that may result +// from how ANGLE translates them on each backend. +// + +#include "ANGLEPerfTest.h" + +#include <iostream> +#include <random> +#include <sstream> + +#include "shader_utils.h" + +using namespace angle; + +namespace +{ + +struct TextureSamplingParams final : public RenderTestParams +{ + TextureSamplingParams() + { + // Common default params + majorVersion = 2; + minorVersion = 0; + windowWidth = 720; + windowHeight = 720; + iterations = 4; + + numSamplers = 2; + textureSize = 32; + kernelSize = 3; + } + + std::string suffix() const override; + unsigned int numSamplers; + unsigned int textureSize; + unsigned int kernelSize; + + // static parameters + unsigned int iterations; +}; + +std::ostream &operator<<(std::ostream &os, const TextureSamplingParams ¶ms) +{ + os << params.suffix().substr(1); + return os; +} + +std::string TextureSamplingParams::suffix() const +{ + std::stringstream strstr; + + strstr << RenderTestParams::suffix() << "_" << numSamplers << "samplers"; + + return strstr.str(); +} + +class TextureSamplingBenchmark : public ANGLERenderTest, + public ::testing::WithParamInterface<TextureSamplingParams> +{ + public: + TextureSamplingBenchmark(); + + void initializeBenchmark() override; + void destroyBenchmark() override; + void drawBenchmark() override; + + private: + void initShaders(); + void initVertexBuffer(); + void initTextures(); + + GLuint mProgram; + GLuint mBuffer; + std::vector<GLuint> mTextures; +}; + +TextureSamplingBenchmark::TextureSamplingBenchmark() + : ANGLERenderTest("TextureSampling", GetParam()), mProgram(0u), mBuffer(0u) +{ +} + +void TextureSamplingBenchmark::initializeBenchmark() +{ + const auto ¶ms = GetParam(); + + ASSERT_LT(0u, params.iterations); + + // Verify "numSamplers" is within MAX_TEXTURE_IMAGE_UNITS limit + GLint maxTextureImageUnits; + glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextureImageUnits); + + if (params.numSamplers > static_cast<unsigned int>(maxTextureImageUnits)) + { + FAIL() << "Sampler count (" << params.numSamplers << ")" + << " exceeds maximum texture count: " << maxTextureImageUnits << std::endl; + } + initShaders(); + initVertexBuffer(); + initTextures(); + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight()); + + ASSERT_GL_NO_ERROR(); +} + +void TextureSamplingBenchmark::initShaders() +{ + const auto ¶ms = GetParam(); + + std::stringstream vstrstr; + vstrstr << "attribute vec2 aPosition;\n" + "varying vec2 vTextureCoordinates;\n" + "void main()\n" + "{\n" + " vTextureCoordinates = (aPosition + vec2(1.0)) * 0.5;\n" + " gl_Position = vec4(aPosition, 0, 1.0);\n" + "}"; + + std::stringstream fstrstr; + fstrstr << "precision mediump float;\n" + "varying vec2 vTextureCoordinates;\n"; + for (unsigned int count = 0; count < params.numSamplers; count++) + { + fstrstr << "uniform sampler2D uSampler" << count << ";\n"; + } + fstrstr << "void main()\n" + "{\n" + " const float inverseTextureSize = 1.0 / " + << params.textureSize << ".0;\n" + " vec4 colorOut = vec4(0.0, 0.0, 0.0, 1.0);\n"; + for (unsigned int count = 0; count < params.numSamplers; count++) + { + fstrstr << " for (int x = 0; x < " << params.kernelSize << "; ++x)\n" + " {\n" + " for (int y = 0; y < " << params.kernelSize << "; ++y)\n" + " {\n" + " colorOut += texture2D(uSampler" << count + << ", vTextureCoordinates + vec2(x, y) * inverseTextureSize) * 0.1;\n" + " }\n" + " }\n"; + } + fstrstr << " gl_FragColor = colorOut;\n" + "}\n"; + + mProgram = CompileProgram(vstrstr.str(), fstrstr.str()); + ASSERT_NE(0u, mProgram); + + // Use the program object + glUseProgram(mProgram); +} + +void TextureSamplingBenchmark::initVertexBuffer() +{ + std::vector<float> vertexPositions(12); + { + // Bottom left triangle + vertexPositions[0] = -1.0f; + vertexPositions[1] = -1.0f; + vertexPositions[2] = 1.0f; + vertexPositions[3] = -1.0f; + vertexPositions[4] = -1.0f; + vertexPositions[5] = 1.0f; + + // Top right triangle + vertexPositions[6] = -1.0f; + vertexPositions[7] = 1.0f; + vertexPositions[8] = 1.0f; + vertexPositions[9] = -1.0f; + vertexPositions[10] = 1.0f; + vertexPositions[11] = 1.0f; + } + + glGenBuffers(1, &mBuffer); + glBindBuffer(GL_ARRAY_BUFFER, mBuffer); + glBufferData(GL_ARRAY_BUFFER, vertexPositions.size() * sizeof(float), &vertexPositions[0], + GL_STATIC_DRAW); + + GLint positionLocation = glGetAttribLocation(mProgram, "aPosition"); + ASSERT_NE(-1, positionLocation); + + glVertexAttribPointer(positionLocation, 2, GL_FLOAT, GL_FALSE, 0, nullptr); + glEnableVertexAttribArray(positionLocation); +} + +void TextureSamplingBenchmark::initTextures() +{ + const auto ¶ms = GetParam(); + + unsigned int dataSize = params.textureSize * params.textureSize; + std::vector<unsigned int> randomTextureData; + randomTextureData.resize(dataSize); + + unsigned int pseudoRandom = 1u; + for (unsigned int i = 0; i < dataSize; ++i) + { + pseudoRandom = pseudoRandom * 1664525u + 1013904223u; + randomTextureData[i] = pseudoRandom; + } + + mTextures.resize(params.numSamplers); + glGenTextures(params.numSamplers, mTextures.data()); + for (unsigned int i = 0; i < params.numSamplers; ++i) + { + glActiveTexture(GL_TEXTURE0 + i); + glBindTexture(GL_TEXTURE_2D, mTextures[i]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, params.textureSize, params.textureSize, 0, GL_RGBA, + GL_UNSIGNED_BYTE, randomTextureData.data()); + } + + for (unsigned int count = 0; count < params.numSamplers; count++) + { + std::stringstream samplerstrstr; + samplerstrstr << "uSampler" << count; + GLint samplerLocation = glGetUniformLocation(mProgram, samplerstrstr.str().c_str()); + ASSERT_NE(-1, samplerLocation); + + glUniform1i(samplerLocation, count); + } +} + +void TextureSamplingBenchmark::destroyBenchmark() +{ + const auto ¶ms = GetParam(); + + glDeleteProgram(mProgram); + glDeleteBuffers(1, &mBuffer); + if (!mTextures.empty()) + { + glDeleteTextures(params.numSamplers, mTextures.data()); + } +} + +void TextureSamplingBenchmark::drawBenchmark() +{ + glClear(GL_COLOR_BUFFER_BIT); + + const auto ¶ms = GetParam(); + + for (unsigned int it = 0; it < params.iterations; ++it) + { + glDrawArrays(GL_TRIANGLES, 0, 6); + } + + ASSERT_GL_NO_ERROR(); +} + +TextureSamplingParams D3D11Params() +{ + TextureSamplingParams params; + params.eglParameters = egl_platform::D3D11(); + return params; +} + +TextureSamplingParams D3D9Params() +{ + TextureSamplingParams params; + params.eglParameters = egl_platform::D3D9(); + return params; +} + +TextureSamplingParams OpenGLParams() +{ + TextureSamplingParams params; + params.eglParameters = egl_platform::OPENGL(); + return params; +} + +} // anonymous namespace + +TEST_P(TextureSamplingBenchmark, Run) +{ + run(); +} + +ANGLE_INSTANTIATE_TEST(TextureSamplingBenchmark, D3D11Params(), D3D9Params(), OpenGLParams()); diff --git a/gfx/angle/src/tests/perf_tests/TexturesPerf.cpp b/gfx/angle/src/tests/perf_tests/TexturesPerf.cpp new file mode 100644 index 000000000..58e1a9ba6 --- /dev/null +++ b/gfx/angle/src/tests/perf_tests/TexturesPerf.cpp @@ -0,0 +1,293 @@ +// +// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// TexturesPerf: +// Performance test for setting texture state. +// + +#include "ANGLEPerfTest.h" + +#include <iostream> +#include <random> +#include <sstream> + +#include "shader_utils.h" + +namespace angle +{ + +struct TexturesParams final : public RenderTestParams +{ + TexturesParams() + { + // Common default params + majorVersion = 2; + minorVersion = 0; + windowWidth = 720; + windowHeight = 720; + iterations = 256; + + numTextures = 8; + textureRebindFrequency = 5; + textureStateUpdateFrequency = 3; + textureMipCount = 8; + } + + std::string suffix() const override; + size_t numTextures; + size_t textureRebindFrequency; + size_t textureStateUpdateFrequency; + size_t textureMipCount; + + // static parameters + size_t iterations; +}; + +std::ostream &operator<<(std::ostream &os, const TexturesParams ¶ms) +{ + os << params.suffix().substr(1); + return os; +} + +std::string TexturesParams::suffix() const +{ + std::stringstream strstr; + + strstr << RenderTestParams::suffix(); + strstr << "_" << numTextures << "_textures"; + strstr << "_" << textureRebindFrequency << "_rebind"; + strstr << "_" << textureStateUpdateFrequency << "_state"; + strstr << "_" << textureMipCount << "_mips"; + + return strstr.str(); +} + +class TexturesBenchmark : public ANGLERenderTest, + public ::testing::WithParamInterface<TexturesParams> +{ + public: + TexturesBenchmark(); + + void initializeBenchmark() override; + void destroyBenchmark() override; + void drawBenchmark() override; + + private: + void initShaders(); + void initTextures(); + + std::vector<GLuint> mTextures; + + GLuint mProgram; + std::vector<GLuint> mUniformLocations; +}; + +TexturesBenchmark::TexturesBenchmark() : ANGLERenderTest("Textures", GetParam()), mProgram(0u) +{ +} + +void TexturesBenchmark::initializeBenchmark() +{ + const auto ¶ms = GetParam(); + + ASSERT_GT(params.iterations, 0u); + + // Verify the uniform counts are within the limits + GLint maxTextureUnits; + glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextureUnits); + if (params.numTextures > static_cast<size_t>(maxTextureUnits)) + { + FAIL() << "Texture count (" << params.numTextures << ")" + << " exceeds maximum texture unit count: " << maxTextureUnits << std::endl; + } + + initShaders(); + initTextures(); + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight()); + + ASSERT_GL_NO_ERROR(); +} + +std::string GetUniformLocationName(size_t idx, bool vertexShader) +{ + std::stringstream strstr; + strstr << (vertexShader ? "vs" : "fs") << "_u_" << idx; + return strstr.str(); +} + +void TexturesBenchmark::initShaders() +{ + const auto ¶ms = GetParam(); + + std::string vs = + "void main()\n" + "{\n" + " gl_Position = vec4(0, 0, 0, 0);\n" + "}\n"; + + std::stringstream fstrstr; + for (size_t i = 0; i < params.numTextures; i++) + { + fstrstr << "uniform sampler2D tex" << i << ";"; + } + fstrstr << "void main()\n" + "{\n" + " gl_FragColor = vec4(0, 0, 0, 0)"; + for (size_t i = 0; i < params.numTextures; i++) + { + fstrstr << "+ texture2D(tex" << i << ", vec2(0, 0))"; + } + fstrstr << ";\n" + "}\n"; + + mProgram = CompileProgram(vs, fstrstr.str()); + ASSERT_NE(0u, mProgram); + + for (size_t i = 0; i < params.numTextures; ++i) + { + std::stringstream uniformName; + uniformName << "tex" << i; + + GLint location = glGetUniformLocation(mProgram, uniformName.str().c_str()); + ASSERT_NE(-1, location); + mUniformLocations.push_back(location); + } + + // Use the program object + glUseProgram(mProgram); +} + +void TexturesBenchmark::initTextures() +{ + const auto ¶ms = GetParam(); + + size_t textureSize = static_cast<size_t>(1) << params.textureMipCount; + std::vector<GLubyte> textureData(textureSize * textureSize * 4); + for (auto &byte : textureData) + { + byte = rand() % 255u; + } + + for (size_t texIndex = 0; texIndex < params.numTextures; texIndex++) + { + GLuint tex = 0; + glGenTextures(1, &tex); + + glActiveTexture(static_cast<GLenum>(GL_TEXTURE0 + texIndex)); + glBindTexture(GL_TEXTURE_2D, tex); + for (size_t mip = 0; mip < params.textureMipCount; mip++) + { + GLsizei levelSize = static_cast<GLsizei>(textureSize >> mip); + glTexImage2D(GL_TEXTURE_2D, static_cast<GLint>(mip), GL_RGBA, levelSize, levelSize, 0, + GL_RGBA, GL_UNSIGNED_BYTE, textureData.data()); + } + mTextures.push_back(tex); + + glUniform1i(mUniformLocations[texIndex], static_cast<GLint>(texIndex)); + } +} + +void TexturesBenchmark::destroyBenchmark() +{ + glDeleteProgram(mProgram); +} + +void TexturesBenchmark::drawBenchmark() +{ + const auto ¶ms = GetParam(); + + for (size_t it = 0; it < params.iterations; ++it) + { + if (it % params.textureRebindFrequency == 0) + { + // Swap two textures + size_t swapTexture = (it / params.textureRebindFrequency) % (params.numTextures - 1); + + glActiveTexture(static_cast<GLenum>(GL_TEXTURE0 + swapTexture)); + glBindTexture(GL_TEXTURE_2D, mTextures[swapTexture]); + glActiveTexture(static_cast<GLenum>(GL_TEXTURE0 + swapTexture + 1)); + glBindTexture(GL_TEXTURE_2D, mTextures[swapTexture + 1]); + std::swap(mTextures[swapTexture], mTextures[swapTexture + 1]); + } + + if (it % params.textureStateUpdateFrequency == 0) + { + // Update a texture's state + size_t stateUpdateCount = it / params.textureStateUpdateFrequency; + + const size_t numUpdateTextures = 4; + ASSERT_LE(numUpdateTextures, params.numTextures); + + size_t firstTexture = stateUpdateCount % (params.numTextures - numUpdateTextures); + + for (size_t updateTextureIdx = 0; updateTextureIdx < numUpdateTextures; + updateTextureIdx++) + { + size_t updateTexture = firstTexture + updateTextureIdx; + glActiveTexture(static_cast<GLenum>(GL_TEXTURE0 + updateTexture)); + + const GLenum minFilters[] = { + GL_NEAREST, + GL_LINEAR, + GL_NEAREST_MIPMAP_NEAREST, + GL_LINEAR_MIPMAP_NEAREST, + GL_NEAREST_MIPMAP_LINEAR, + GL_LINEAR_MIPMAP_LINEAR, + }; + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, + minFilters[stateUpdateCount % ArraySize(minFilters)]); + + const GLenum magFilters[] = { + GL_NEAREST, GL_LINEAR, + }; + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, + magFilters[stateUpdateCount % ArraySize(magFilters)]); + + const GLenum wrapParameters[] = { + GL_CLAMP_TO_EDGE, GL_REPEAT, GL_MIRRORED_REPEAT, + }; + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, + wrapParameters[stateUpdateCount % ArraySize(wrapParameters)]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, + wrapParameters[stateUpdateCount % ArraySize(wrapParameters)]); + } + } + + glDrawArrays(GL_TRIANGLES, 0, 3); + } + + ASSERT_GL_NO_ERROR(); +} + +TexturesParams D3D11Params() +{ + TexturesParams params; + params.eglParameters = egl_platform::D3D11_NULL(); + return params; +} + +TexturesParams D3D9Params() +{ + TexturesParams params; + params.eglParameters = egl_platform::D3D9_NULL(); + return params; +} + +TexturesParams OpenGLParams() +{ + TexturesParams params; + params.eglParameters = egl_platform::OPENGL_NULL(); + return params; +} + +TEST_P(TexturesBenchmark, Run) +{ + run(); +} + +ANGLE_INSTANTIATE_TEST(TexturesBenchmark, D3D11Params(), D3D9Params(), OpenGLParams()); + +} // namespace angle diff --git a/gfx/angle/src/tests/perf_tests/UniformsPerf.cpp b/gfx/angle/src/tests/perf_tests/UniformsPerf.cpp new file mode 100755 index 000000000..276b1ab9b --- /dev/null +++ b/gfx/angle/src/tests/perf_tests/UniformsPerf.cpp @@ -0,0 +1,228 @@ +// +// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// UniformsBenchmark: +// Performance test for setting uniform data. +// + +#include "ANGLEPerfTest.h" + +#include <iostream> +#include <random> +#include <sstream> + +#include "shader_utils.h" + +using namespace angle; + +namespace +{ + +struct UniformsParams final : public RenderTestParams +{ + UniformsParams() + { + // Common default params + majorVersion = 2; + minorVersion = 0; + windowWidth = 720; + windowHeight = 720; + iterations = 4; + + numVertexUniforms = 200; + numFragmentUniforms = 200; + } + + std::string suffix() const override; + size_t numVertexUniforms; + size_t numFragmentUniforms; + + // static parameters + size_t iterations; +}; + +std::ostream &operator<<(std::ostream &os, const UniformsParams ¶ms) +{ + os << params.suffix().substr(1); + return os; +} + +std::string UniformsParams::suffix() const +{ + std::stringstream strstr; + + strstr << RenderTestParams::suffix(); + strstr << "_" << numVertexUniforms << "_vertex_uniforms"; + strstr << "_" << numFragmentUniforms << "_fragment_uniforms"; + + return strstr.str(); +} + +class UniformsBenchmark : public ANGLERenderTest, + public ::testing::WithParamInterface<UniformsParams> +{ + public: + UniformsBenchmark(); + + void initializeBenchmark() override; + void destroyBenchmark() override; + void drawBenchmark() override; + + private: + void initShaders(); + void initVertexBuffer(); + void initTextures(); + + GLuint mProgram; + std::vector<GLuint> mUniformLocations; +}; + +UniformsBenchmark::UniformsBenchmark() : ANGLERenderTest("Uniforms", GetParam()), mProgram(0u) +{ +} + +void UniformsBenchmark::initializeBenchmark() +{ + const auto ¶ms = GetParam(); + + ASSERT_GT(params.iterations, 0u); + + // Verify the uniform counts are within the limits + GLint maxVertexUniforms, maxFragmentUniforms; + glGetIntegerv(GL_MAX_VERTEX_UNIFORM_VECTORS, &maxVertexUniforms); + glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_VECTORS, &maxFragmentUniforms); + + if (params.numVertexUniforms > static_cast<size_t>(maxVertexUniforms)) + { + FAIL() << "Vertex uniform count (" << params.numVertexUniforms << ")" + << " exceeds maximum vertex uniform count: " << maxVertexUniforms << std::endl; + } + if (params.numFragmentUniforms > static_cast<size_t>(maxFragmentUniforms)) + { + FAIL() << "Fragment uniform count (" << params.numFragmentUniforms << ")" + << " exceeds maximum fragment uniform count: " << maxFragmentUniforms << std::endl; + } + + initShaders(); + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight()); + + ASSERT_GL_NO_ERROR(); +} + +std::string GetUniformLocationName(size_t idx, bool vertexShader) +{ + std::stringstream strstr; + strstr << (vertexShader ? "vs" : "fs") << "_u_" << idx; + return strstr.str(); +} + +void UniformsBenchmark::initShaders() +{ + const auto ¶ms = GetParam(); + + std::stringstream vstrstr; + vstrstr << "precision mediump float;\n"; + for (size_t i = 0; i < params.numVertexUniforms; i++) + { + vstrstr << "uniform vec4 " << GetUniformLocationName(i, true) << ";\n"; + } + vstrstr << "void main()\n" + "{\n" + " gl_Position = vec4(0, 0, 0, 0);\n"; + for (size_t i = 0; i < params.numVertexUniforms; i++) + { + vstrstr << " gl_Position = gl_Position + " << GetUniformLocationName(i, true) << ";\n"; + } + vstrstr << "}"; + + std::stringstream fstrstr; + fstrstr << "precision mediump float;\n"; + for (size_t i = 0; i < params.numFragmentUniforms; i++) + { + fstrstr << "uniform vec4 " << GetUniformLocationName(i, false) << ";\n"; + } + fstrstr << "void main()\n" + "{\n" + " gl_FragColor = vec4(0, 0, 0, 0);\n"; + for (size_t i = 0; i < params.numFragmentUniforms; i++) + { + fstrstr << " gl_FragColor = gl_FragColor + " << GetUniformLocationName(i, false) + << ";\n"; + } + fstrstr << "}"; + + mProgram = CompileProgram(vstrstr.str(), fstrstr.str()); + ASSERT_NE(0u, mProgram); + + for (size_t i = 0; i < params.numVertexUniforms; ++i) + { + GLint location = glGetUniformLocation(mProgram, GetUniformLocationName(i, true).c_str()); + ASSERT_NE(-1, location); + mUniformLocations.push_back(location); + } + for (size_t i = 0; i < params.numFragmentUniforms; ++i) + { + GLint location = glGetUniformLocation(mProgram, GetUniformLocationName(i, false).c_str()); + ASSERT_NE(-1, location); + mUniformLocations.push_back(location); + } + + // Use the program object + glUseProgram(mProgram); +} + +void UniformsBenchmark::destroyBenchmark() +{ + glDeleteProgram(mProgram); +} + +void UniformsBenchmark::drawBenchmark() +{ + const auto ¶ms = GetParam(); + + for (size_t it = 0; it < params.iterations; ++it) + { + for (size_t uniform = 0; uniform < mUniformLocations.size(); ++uniform) + { + float value = static_cast<float>(uniform); + glUniform4f(mUniformLocations[uniform], value, value, value, value); + } + + glDrawArrays(GL_TRIANGLES, 0, 3); + } + + ASSERT_GL_NO_ERROR(); +} + +UniformsParams D3D11Params() +{ + UniformsParams params; + params.eglParameters = egl_platform::D3D11(); + return params; +} + +UniformsParams D3D9Params() +{ + UniformsParams params; + params.eglParameters = egl_platform::D3D9(); + return params; +} + +UniformsParams OpenGLParams() +{ + UniformsParams params; + params.eglParameters = egl_platform::OPENGL(); + return params; +} + +} // anonymous namespace + +TEST_P(UniformsBenchmark, Run) +{ + run(); +} + +ANGLE_INSTANTIATE_TEST(UniformsBenchmark, D3D11Params(), D3D9Params(), OpenGLParams()); diff --git a/gfx/angle/src/tests/perf_tests/third_party/perf/angle-mods.patch b/gfx/angle/src/tests/perf_tests/third_party/perf/angle-mods.patch new file mode 100755 index 000000000..d0b640289 --- /dev/null +++ b/gfx/angle/src/tests/perf_tests/third_party/perf/angle-mods.patch @@ -0,0 +1,61 @@ +diff --git a/tests/perf_tests/third_party/perf/perf_test.cc b/tests/perf_tests/third_party/perf/perf_test.cc +index 0d5abc0..7364330 100644 +--- a/tests/perf_tests/third_party/perf/perf_test.cc ++++ b/tests/perf_tests/third_party/perf/perf_test.cc +@@ -2,16 +2,51 @@ + // Use of this source code is governed by a BSD-style license that can be + // found in the LICENSE file. + +-#include "testing/perf/perf_test.h" ++#include "perf_test.h" + + #include <stdio.h> +- +-#include "base/logging.h" +-#include "base/strings/string_number_conversions.h" +-#include "base/strings/stringprintf.h" ++#include <stdarg.h> ++#include <vector> + + namespace { + ++namespace base { ++ ++std::string FormatString(const char *fmt, va_list vararg) { ++ static std::vector<char> buffer(512); ++ ++ // Attempt to just print to the current buffer ++ int len = vsnprintf(&buffer[0], buffer.size(), fmt, vararg); ++ if (len < 0 || static_cast<size_t>(len) >= buffer.size()) { ++ // Buffer was not large enough, calculate the required size and resize the buffer ++ len = vsnprintf(NULL, 0, fmt, vararg); ++ buffer.resize(len + 1); ++ ++ // Print again ++ vsnprintf(&buffer[0], buffer.size(), fmt, vararg); ++ } ++ ++ return std::string(buffer.data(), len); ++} ++ ++std::string StringPrintf(const char *fmt, ...) { ++ va_list vararg; ++ va_start(vararg, fmt); ++ std::string result = FormatString(fmt, vararg); ++ va_end(vararg); ++ return result; ++} ++ ++std::string UintToString(unsigned int value) { ++ return StringPrintf("%u", value); ++} ++ ++std::string DoubleToString(double value) { ++ return StringPrintf("%.10lf", value); ++} ++ ++} ++ + std::string ResultsToString(const std::string& measurement, + const std::string& modifier, + const std::string& trace, diff --git a/gfx/angle/src/tests/perf_tests/third_party/perf/perf_test.cc b/gfx/angle/src/tests/perf_tests/third_party/perf/perf_test.cc new file mode 100755 index 000000000..73643306c --- /dev/null +++ b/gfx/angle/src/tests/perf_tests/third_party/perf/perf_test.cc @@ -0,0 +1,239 @@ +// Copyright 2013 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. + +#include "perf_test.h" + +#include <stdio.h> +#include <stdarg.h> +#include <vector> + +namespace { + +namespace base { + +std::string FormatString(const char *fmt, va_list vararg) { + static std::vector<char> buffer(512); + + // Attempt to just print to the current buffer + int len = vsnprintf(&buffer[0], buffer.size(), fmt, vararg); + if (len < 0 || static_cast<size_t>(len) >= buffer.size()) { + // Buffer was not large enough, calculate the required size and resize the buffer + len = vsnprintf(NULL, 0, fmt, vararg); + buffer.resize(len + 1); + + // Print again + vsnprintf(&buffer[0], buffer.size(), fmt, vararg); + } + + return std::string(buffer.data(), len); +} + +std::string StringPrintf(const char *fmt, ...) { + va_list vararg; + va_start(vararg, fmt); + std::string result = FormatString(fmt, vararg); + va_end(vararg); + return result; +} + +std::string UintToString(unsigned int value) { + return StringPrintf("%u", value); +} + +std::string DoubleToString(double value) { + return StringPrintf("%.10lf", value); +} + +} + +std::string ResultsToString(const std::string& measurement, + const std::string& modifier, + const std::string& trace, + const std::string& values, + const std::string& prefix, + const std::string& suffix, + const std::string& units, + bool important) { + // <*>RESULT <graph_name>: <trace_name>= <value> <units> + // <*>RESULT <graph_name>: <trace_name>= {<mean>, <std deviation>} <units> + // <*>RESULT <graph_name>: <trace_name>= [<value>,value,value,...,] <units> + return base::StringPrintf("%sRESULT %s%s: %s= %s%s%s %s\n", + important ? "*" : "", measurement.c_str(), modifier.c_str(), + trace.c_str(), prefix.c_str(), values.c_str(), suffix.c_str(), + units.c_str()); +} + +void PrintResultsImpl(const std::string& measurement, + const std::string& modifier, + const std::string& trace, + const std::string& values, + const std::string& prefix, + const std::string& suffix, + const std::string& units, + bool important) { + fflush(stdout); + printf("%s", ResultsToString(measurement, modifier, trace, values, + prefix, suffix, units, important).c_str()); + fflush(stdout); +} + +} // namespace + +namespace perf_test { + +void PrintResult(const std::string& measurement, + const std::string& modifier, + const std::string& trace, + size_t value, + const std::string& units, + bool important) { + PrintResultsImpl(measurement, + modifier, + trace, + base::UintToString(static_cast<unsigned int>(value)), + std::string(), + std::string(), + units, + important); +} + +void PrintResult(const std::string& measurement, + const std::string& modifier, + const std::string& trace, + double value, + const std::string& units, + bool important) { + PrintResultsImpl(measurement, + modifier, + trace, + base::DoubleToString(value), + std::string(), + std::string(), + units, + important); +} + +void AppendResult(std::string& output, + const std::string& measurement, + const std::string& modifier, + const std::string& trace, + size_t value, + const std::string& units, + bool important) { + output += ResultsToString( + measurement, + modifier, + trace, + base::UintToString(static_cast<unsigned int>(value)), + std::string(), + std::string(), + units, + important); +} + +void PrintResult(const std::string& measurement, + const std::string& modifier, + const std::string& trace, + const std::string& value, + const std::string& units, + bool important) { + PrintResultsImpl(measurement, + modifier, + trace, + value, + std::string(), + std::string(), + units, + important); +} + +void AppendResult(std::string& output, + const std::string& measurement, + const std::string& modifier, + const std::string& trace, + const std::string& value, + const std::string& units, + bool important) { + output += ResultsToString(measurement, + modifier, + trace, + value, + std::string(), + std::string(), + units, + important); +} + +void PrintResultMeanAndError(const std::string& measurement, + const std::string& modifier, + const std::string& trace, + const std::string& mean_and_error, + const std::string& units, + bool important) { + PrintResultsImpl(measurement, modifier, trace, mean_and_error, + "{", "}", units, important); +} + +void AppendResultMeanAndError(std::string& output, + const std::string& measurement, + const std::string& modifier, + const std::string& trace, + const std::string& mean_and_error, + const std::string& units, + bool important) { + output += ResultsToString(measurement, modifier, trace, mean_and_error, + "{", "}", units, important); +} + +void PrintResultList(const std::string& measurement, + const std::string& modifier, + const std::string& trace, + const std::string& values, + const std::string& units, + bool important) { + PrintResultsImpl(measurement, modifier, trace, values, + "[", "]", units, important); +} + +void AppendResultList(std::string& output, + const std::string& measurement, + const std::string& modifier, + const std::string& trace, + const std::string& values, + const std::string& units, + bool important) { + output += ResultsToString(measurement, modifier, trace, values, + "[", "]", units, important); +} + +void PrintSystemCommitCharge(const std::string& test_name, + size_t charge, + bool important) { + PrintSystemCommitCharge(stdout, test_name, charge, important); +} + +void PrintSystemCommitCharge(FILE* target, + const std::string& test_name, + size_t charge, + bool important) { + fprintf(target, "%s", SystemCommitChargeToString(test_name, charge, + important).c_str()); +} + +std::string SystemCommitChargeToString(const std::string& test_name, + size_t charge, + bool important) { + std::string trace_name(test_name); + std::string output; + AppendResult(output, + "commit_charge", + std::string(), + "cc" + trace_name, + charge, + "kb", + important); + return output; +} + +} // namespace perf_test diff --git a/gfx/angle/src/tests/perf_tests/third_party/perf/perf_test.h b/gfx/angle/src/tests/perf_tests/third_party/perf/perf_test.h new file mode 100755 index 000000000..36e2916c5 --- /dev/null +++ b/gfx/angle/src/tests/perf_tests/third_party/perf/perf_test.h @@ -0,0 +1,116 @@ +// Copyright 2013 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. + +#ifndef TESTING_PERF_PERF_TEST_H_ +#define TESTING_PERF_PERF_TEST_H_ + +#include <string> + +namespace perf_test { + +// Prints numerical information to stdout in a controlled format, for +// post-processing. |measurement| is a description of the quantity being +// measured, e.g. "vm_peak"; |modifier| is provided as a convenience and +// will be appended directly to the name of the |measurement|, e.g. +// "_browser"; |trace| is a description of the particular data point, e.g. +// "reference"; |value| is the measured value; and |units| is a description +// of the units of measure, e.g. "bytes". If |important| is true, the output +// line will be specially marked, to notify the post-processor. The strings +// may be empty. They should not contain any colons (:) or equals signs (=). +// A typical post-processing step would be to produce graphs of the data +// produced for various builds, using the combined |measurement| + |modifier| +// string to specify a particular graph and the |trace| to identify a trace +// (i.e., data series) on that graph. +void PrintResult(const std::string& measurement, + const std::string& modifier, + const std::string& trace, + size_t value, + const std::string& units, + bool important); +void PrintResult(const std::string& measurement, + const std::string& modifier, + const std::string& trace, + double value, + const std::string& units, + bool important); + +void AppendResult(std::string& output, + const std::string& measurement, + const std::string& modifier, + const std::string& trace, + size_t value, + const std::string& units, + bool important); + +// Like the above version of PrintResult(), but takes a std::string value +// instead of a size_t. +void PrintResult(const std::string& measurement, + const std::string& modifier, + const std::string& trace, + const std::string& value, + const std::string& units, + bool important); + +void AppendResult(std::string& output, + const std::string& measurement, + const std::string& modifier, + const std::string& trace, + const std::string& value, + const std::string& units, + bool important); + +// Like PrintResult(), but prints a (mean, standard deviation) result pair. +// The |<values>| should be two comma-separated numbers, the mean and +// standard deviation (or other error metric) of the measurement. +void PrintResultMeanAndError(const std::string& measurement, + const std::string& modifier, + const std::string& trace, + const std::string& mean_and_error, + const std::string& units, + bool important); + +void AppendResultMeanAndError(std::string& output, + const std::string& measurement, + const std::string& modifier, + const std::string& trace, + const std::string& mean_and_error, + const std::string& units, + bool important); + +// Like PrintResult(), but prints an entire list of results. The |values| +// will generally be a list of comma-separated numbers. A typical +// post-processing step might produce plots of their mean and standard +// deviation. +void PrintResultList(const std::string& measurement, + const std::string& modifier, + const std::string& trace, + const std::string& values, + const std::string& units, + bool important); + +void AppendResultList(std::string& output, + const std::string& measurement, + const std::string& modifier, + const std::string& trace, + const std::string& values, + const std::string& units, + bool important); + +// Prints memory commit charge stats for use by perf graphs. +void PrintSystemCommitCharge(const std::string& test_name, + size_t charge, + bool important); + +void PrintSystemCommitCharge(FILE* target, + const std::string& test_name, + size_t charge, + bool important); + +std::string SystemCommitChargeToString(const std::string& test_name, + size_t charge, + bool important); + +} // namespace perf_test + +#endif // TESTING_PERF_PERF_TEST_H_ diff --git a/gfx/angle/src/tests/preprocessor_tests/MockDiagnostics.h b/gfx/angle/src/tests/preprocessor_tests/MockDiagnostics.h new file mode 100755 index 000000000..397617869 --- /dev/null +++ b/gfx/angle/src/tests/preprocessor_tests/MockDiagnostics.h @@ -0,0 +1,20 @@ +// +// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#ifndef PREPROCESSOR_TESTS_MOCK_DIAGNOSTICS_H_ +#define PREPROCESSOR_TESTS_MOCK_DIAGNOSTICS_H_ + +#include "gmock/gmock.h" +#include "compiler/preprocessor/DiagnosticsBase.h" + +class MockDiagnostics : public pp::Diagnostics +{ + public: + MOCK_METHOD3(print, + void(ID id, const pp::SourceLocation& loc, const std::string& text)); +}; + +#endif // PREPROCESSOR_TESTS_MOCK_DIAGNOSTICS_H_ diff --git a/gfx/angle/src/tests/preprocessor_tests/MockDirectiveHandler.h b/gfx/angle/src/tests/preprocessor_tests/MockDirectiveHandler.h new file mode 100755 index 000000000..7560adde4 --- /dev/null +++ b/gfx/angle/src/tests/preprocessor_tests/MockDirectiveHandler.h @@ -0,0 +1,34 @@ +// +// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#ifndef PREPROCESSOR_TESTS_MOCK_DIRECTIVE_HANDLER_H_ +#define PREPROCESSOR_TESTS_MOCK_DIRECTIVE_HANDLER_H_ + +#include "gmock/gmock.h" +#include "compiler/preprocessor/DirectiveHandlerBase.h" + +class MockDirectiveHandler : public pp::DirectiveHandler +{ + public: + MOCK_METHOD2(handleError, + void(const pp::SourceLocation& loc, const std::string& msg)); + + MOCK_METHOD4(handlePragma, + void(const pp::SourceLocation& loc, + const std::string& name, + const std::string& value, + bool stdgl)); + + MOCK_METHOD3(handleExtension, + void(const pp::SourceLocation& loc, + const std::string& name, + const std::string& behavior)); + + MOCK_METHOD2(handleVersion, + void(const pp::SourceLocation& loc, int version)); +}; + +#endif // PREPROCESSOR_TESTS_MOCK_DIRECTIVE_HANDLER_H_ diff --git a/gfx/angle/src/tests/preprocessor_tests/PreprocessorTest.cpp b/gfx/angle/src/tests/preprocessor_tests/PreprocessorTest.cpp new file mode 100755 index 000000000..b4acd28df --- /dev/null +++ b/gfx/angle/src/tests/preprocessor_tests/PreprocessorTest.cpp @@ -0,0 +1,29 @@ +// +// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "PreprocessorTest.h" +#include "compiler/preprocessor/Token.h" + +void PreprocessorTest::preprocess(const char* input, const char* expected) +{ + ASSERT_TRUE(mPreprocessor.init(1, &input, NULL)); + + int line = 1; + pp::Token token; + std::stringstream stream; + do + { + mPreprocessor.lex(&token); + for (; line < token.location.line; ++line) + { + stream << "\n"; + } + stream << token; + } while (token.type != pp::Token::LAST); + + std::string actual = stream.str(); + EXPECT_STREQ(expected, actual.c_str()); +} diff --git a/gfx/angle/src/tests/preprocessor_tests/PreprocessorTest.h b/gfx/angle/src/tests/preprocessor_tests/PreprocessorTest.h new file mode 100755 index 000000000..e270f1285 --- /dev/null +++ b/gfx/angle/src/tests/preprocessor_tests/PreprocessorTest.h @@ -0,0 +1,30 @@ +// +// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "gtest/gtest.h" + +#include "MockDiagnostics.h" +#include "MockDirectiveHandler.h" +#include "compiler/preprocessor/Preprocessor.h" + +#ifndef PREPROCESSOR_TESTS_PREPROCESSOR_TEST_H_ +#define PREPROCESSOR_TESTS_PREPROCESSOR_TEST_H_ + +class PreprocessorTest : public testing::Test +{ + protected: + PreprocessorTest() : mPreprocessor(&mDiagnostics, &mDirectiveHandler) { } + + // Preprocesses the input string and verifies that it matches + // expected output. + void preprocess(const char* input, const char* expected); + + MockDiagnostics mDiagnostics; + MockDirectiveHandler mDirectiveHandler; + pp::Preprocessor mPreprocessor; +}; + +#endif // PREPROCESSOR_TESTS_PREPROCESSOR_TEST_H_ diff --git a/gfx/angle/src/tests/preprocessor_tests/char_test.cpp b/gfx/angle/src/tests/preprocessor_tests/char_test.cpp new file mode 100755 index 000000000..641ef2cf8 --- /dev/null +++ b/gfx/angle/src/tests/preprocessor_tests/char_test.cpp @@ -0,0 +1,98 @@ +// +// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include <algorithm> +#include <climits> + +#include "PreprocessorTest.h" +#include "compiler/preprocessor/Token.h" + +class CharTest : public PreprocessorTest, + public testing::WithParamInterface<int> +{ +}; + +static const char kPunctuators[] = { + '.', '+', '-', '/', '*', '%', '<', '>', '[', ']', '(', ')', '{', '}', + '^', '|', '&', '~', '=', '!', ':', ';', ',', '?'}; +static const int kNumPunctuators = + sizeof(kPunctuators) / sizeof(kPunctuators[0]); + +bool isPunctuator(char c) +{ + static const char* kPunctuatorBeg = kPunctuators; + static const char* kPunctuatorEnd = kPunctuators + kNumPunctuators; + return std::find(kPunctuatorBeg, kPunctuatorEnd, c) != kPunctuatorEnd; +} + +static const char kWhitespaces[] = {' ', '\t', '\v', '\f', '\n', '\r'}; +static const int kNumWhitespaces = + sizeof(kWhitespaces) / sizeof(kWhitespaces[0]); + +bool isWhitespace(char c) +{ + static const char* kWhitespaceBeg = kWhitespaces; + static const char* kWhitespaceEnd = kWhitespaces + kNumWhitespaces; + return std::find(kWhitespaceBeg, kWhitespaceEnd, c) != kWhitespaceEnd; +} + +TEST_P(CharTest, Identified) +{ + std::string str(1, static_cast<char>(GetParam())); + const char* cstr = str.c_str(); + int length = 1; + + // Note that we pass the length param as well because the invalid + // string may contain the null character. + ASSERT_TRUE(mPreprocessor.init(1, &cstr, &length)); + + int expectedType = pp::Token::LAST; + std::string expectedValue; + + if (str[0] == '#') + { + // Lone '#' is ignored. + } + else if ((str[0] == '_') || + ((str[0] >= 'a') && (str[0] <= 'z')) || + ((str[0] >= 'A') && (str[0] <= 'Z'))) + { + expectedType = pp::Token::IDENTIFIER; + expectedValue = str; + } + else if (str[0] >= '0' && str[0] <= '9') + { + expectedType = pp::Token::CONST_INT; + expectedValue = str; + } + else if (isPunctuator(str[0])) + { + expectedType = str[0]; + expectedValue = str; + } + else if (isWhitespace(str[0])) + { + // Whitespace is ignored. + } + else + { + // Everything else is invalid. + using testing::_; + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_INVALID_CHARACTER, _, str)); + } + + pp::Token token; + mPreprocessor.lex(&token); + EXPECT_EQ(expectedType, token.type); + EXPECT_EQ(expectedValue, token.text); +}; + +// Note +1 for the max-value in range. It is there because the max-value +// not included in the range. +INSTANTIATE_TEST_CASE_P(All, CharTest, + testing::Range(CHAR_MIN, CHAR_MAX + 1)); + diff --git a/gfx/angle/src/tests/preprocessor_tests/comment_test.cpp b/gfx/angle/src/tests/preprocessor_tests/comment_test.cpp new file mode 100755 index 000000000..d3712ea64 --- /dev/null +++ b/gfx/angle/src/tests/preprocessor_tests/comment_test.cpp @@ -0,0 +1,69 @@ +// +// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "PreprocessorTest.h" +#include "compiler/preprocessor/Token.h" + +class CommentTest : public PreprocessorTest, + public testing::WithParamInterface<const char*> +{ +}; + +TEST_P(CommentTest, CommentIgnored) +{ + const char* str = GetParam(); + + ASSERT_TRUE(mPreprocessor.init(1, &str, 0)); + + pp::Token token; + mPreprocessor.lex(&token); + EXPECT_EQ(pp::Token::LAST, token.type); +} + +INSTANTIATE_TEST_CASE_P(LineComment, CommentTest, + testing::Values("//foo\n", // With newline. + "//foo", // Without newline. + "//**/", // Nested block comment. + "////", // Nested line comment. + "//\"")); // Invalid character. + +INSTANTIATE_TEST_CASE_P(BlockComment, CommentTest, + testing::Values("/*foo*/", + "/*foo\n*/", // With newline. + "/*//*/", // Nested line comment. + "/*/**/", // Nested block comment. + "/***/", // With lone '*'. + "/*\"*/")); // Invalid character. + +class BlockCommentTest : public PreprocessorTest +{ +}; + +TEST_F(BlockCommentTest, CommentReplacedWithSpace) +{ + const char* str = "/*foo*/bar"; + + ASSERT_TRUE(mPreprocessor.init(1, &str, 0)); + + pp::Token token; + mPreprocessor.lex(&token); + EXPECT_EQ(pp::Token::IDENTIFIER, token.type); + EXPECT_EQ("bar", token.text); + EXPECT_TRUE(token.hasLeadingSpace()); +} + +TEST_F(BlockCommentTest, UnterminatedComment) +{ + const char* str = "/*foo"; + + ASSERT_TRUE(mPreprocessor.init(1, &str, 0)); + + using testing::_; + EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_EOF_IN_COMMENT, _, _)); + + pp::Token token; + mPreprocessor.lex(&token); +} diff --git a/gfx/angle/src/tests/preprocessor_tests/define_test.cpp b/gfx/angle/src/tests/preprocessor_tests/define_test.cpp new file mode 100755 index 000000000..e074d1982 --- /dev/null +++ b/gfx/angle/src/tests/preprocessor_tests/define_test.cpp @@ -0,0 +1,988 @@ +// +// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "PreprocessorTest.h" +#include "compiler/preprocessor/Token.h" + +using testing::_; + +class DefineTest : public PreprocessorTest +{ +}; + +TEST_F(DefineTest, NonIdentifier) +{ + const char* input = "#define 2 foo\n" + "2\n"; + const char* expected = "\n" + "2\n"; + + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_UNEXPECTED_TOKEN, + pp::SourceLocation(0, 1), + "2")); + + preprocess(input, expected); +}; + +TEST_F(DefineTest, RedefinePredefined) +{ + const char* input = "#define __LINE__ 10\n" + "__LINE__\n" + "#define __FILE__ 20\n" + "__FILE__\n" + "#define __VERSION__ 200\n" + "__VERSION__\n" + "#define GL_ES 0\n" + "GL_ES\n"; + const char* expected = "\n" + "2\n" + "\n" + "0\n" + "\n" + "100\n" + "\n" + "1\n"; + + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_MACRO_PREDEFINED_REDEFINED, + pp::SourceLocation(0, 1), + "__LINE__")); + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_MACRO_PREDEFINED_REDEFINED, + pp::SourceLocation(0, 3), + "__FILE__")); + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_MACRO_PREDEFINED_REDEFINED, + pp::SourceLocation(0, 5), + "__VERSION__")); + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_MACRO_PREDEFINED_REDEFINED, + pp::SourceLocation(0, 7), + "GL_ES")); + + preprocess(input, expected); +} + +TEST_F(DefineTest, ReservedUnderScore1) +{ + const char* input = "#define __foo bar\n" + "__foo\n"; + const char* expected = "\n" + "bar\n"; + + EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_WARNING_MACRO_NAME_RESERVED, + pp::SourceLocation(0, 1), "__foo")); + + preprocess(input, expected); +} + +TEST_F(DefineTest, ReservedUnderScore2) +{ + const char* input = "#define foo__bar baz\n" + "foo__bar\n"; + const char* expected = "\n" + "baz\n"; + + EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_WARNING_MACRO_NAME_RESERVED, + pp::SourceLocation(0, 1), "foo__bar")); + + preprocess(input, expected); +} + +TEST_F(DefineTest, ReservedGL) +{ + const char* input = "#define GL_foo bar\n" + "GL_foo\n"; + const char* expected = "\n" + "GL_foo\n"; + + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_MACRO_NAME_RESERVED, + pp::SourceLocation(0, 1), + "GL_foo")); + + preprocess(input, expected); +} + +TEST_F(DefineTest, ObjRedefineValid) +{ + const char* input = "#define foo (1-1)\n" + "#define foo /* whitespace */ (1-1) /* other */ \n" + "foo\n"; + const char* expected = "\n" + "\n" + "(1-1)\n"; + // No error or warning. + using testing::_; + EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); + + preprocess(input, expected); +} + +TEST_F(DefineTest, ObjRedefineInvalid) +{ + const char* input = "#define foo (0)\n" + "#define foo (1-1)\n" + "foo\n"; + const char* expected = "\n" + "\n" + "(0)\n"; + + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_MACRO_REDEFINED, + pp::SourceLocation(0, 2), + "foo")); + + preprocess(input, expected); +} + +TEST_F(DefineTest, FuncRedefineValid) +{ + const char* input = "#define foo(a) ( a )\n" + "#define foo( a )( /* whitespace */ a /* other */ )\n" + "foo(b)\n"; + const char* expected = "\n" + "\n" + "( b )\n"; + // No error or warning. + using testing::_; + EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); + + preprocess(input, expected); +} + +TEST_F(DefineTest, FuncRedefineInvalid) +{ + const char* input = "#define foo(b) ( a )\n" + "#define foo(b) ( b )\n" + "foo(1)\n"; + const char* expected = "\n" + "\n" + "( a )\n"; + + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_MACRO_REDEFINED, + pp::SourceLocation(0, 2), + "foo")); + + preprocess(input, expected); +} + +TEST_F(DefineTest, ObjBasic) +{ + const char* input = "#define foo 1\n" + "foo\n"; + const char* expected = "\n" + "1\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, ObjEmpty) +{ + const char* input = "#define foo\n" + "foo\n"; + const char* expected = "\n" + "\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, ObjChain) +{ + const char* input = "#define foo 1\n" + "#define bar foo\n" + "bar\n"; + const char* expected = "\n" + "\n" + "1\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, ObjChainReverse) +{ + const char* input = "#define bar foo\n" + "#define foo 1\n" + "bar\n"; + const char* expected = "\n" + "\n" + "1\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, ObjRecursive) +{ + const char* input = "#define foo bar\n" + "#define bar baz\n" + "#define baz foo\n" + "foo\n" + "bar\n" + "baz\n"; + const char* expected = "\n" + "\n" + "\n" + "foo\n" + "bar\n" + "baz\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, ObjCompositeChain) +{ + const char* input = "#define foo 1\n" + "#define bar a foo\n" + "bar\n"; + const char* expected = "\n" + "\n" + "a 1\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, ObjCompositeChainReverse) +{ + const char* input = "#define bar a foo\n" + "#define foo 1\n" + "bar\n"; + const char* expected = "\n" + "\n" + "a 1\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, ObjCompositeRecursive) +{ + const char* input = "#define foo a bar\n" + "#define bar b baz\n" + "#define baz c foo\n" + "foo\n" + "bar\n" + "baz\n"; + const char* expected = "\n" + "\n" + "\n" + "a b c foo\n" + "b c a bar\n" + "c a b baz\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, ObjChainSelfRecursive) +{ + const char* input = "#define foo foo\n" + "#define bar foo\n" + "bar\n"; + const char* expected = "\n" + "\n" + "foo\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, ObjectLikeWithParens) +{ + const char* input = "#define foo ()1\n" + "foo()\n" + "#define bar ()2\n" + "bar()\n"; + const char* expected = "\n" + "()1()\n" + "\n" + "()2()\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, FuncEmpty) +{ + const char* input = "#define foo()\n" + "foo()\n"; + const char* expected = "\n" + "\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, FuncNoArgs) +{ + const char* input = "#define foo() bar\n" + "foo()\n"; + const char* expected = "\n" + "bar\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, FuncOneArgUnused) +{ + const char* input = "#define foo(x) 1\n" + "foo(bar)\n"; + const char* expected = "\n" + "1\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, FuncTwoArgsUnused) +{ + const char* input = "#define foo(x,y) 1\n" + "foo(bar,baz)\n"; + const char* expected = "\n" + "1\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, FuncOneArg) +{ + const char* input = "#define foo(x) ((x)+1)\n" + "foo(bar)\n"; + const char* expected = "\n" + "((bar)+1)\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, FuncTwoArgs) +{ + const char* input = "#define foo(x,y) ((x)*(y))\n" + "foo(bar,baz)\n"; + const char* expected = "\n" + "((bar)*(baz))\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, FuncEmptyArgs) +{ + const char* input = "#define zero() pass\n" + "#define one(x) pass\n" + "#define two(x,y) pass\n" + "zero()\n" + "one()\n" + "two(,)\n"; + const char* expected = "\n" + "\n" + "\n" + "pass\n" + "pass\n" + "pass\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, FuncMacroAsParam) +{ + const char* input = "#define x 0\n" + "#define foo(x) x\n" + "foo(1)\n"; + const char* expected = "\n" + "\n" + "1\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, FuncOneArgMulti) +{ + const char* input = "#define foo(x) (x)\n" + "foo(this is a multi-word argument)\n"; + const char* expected = "\n" + "(this is a multi-word argument)\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, FuncTwoArgsMulti) +{ + const char* input = "#define foo(x,y) x,two fish,red fish,y\n" + "foo(one fish, blue fish)\n"; + const char* expected = "\n" + "one fish,two fish,red fish,blue fish\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, FuncCompose) +{ + const char* input = "#define bar(x) (1+(x))\n" + "#define foo(y) (2*(y))\n" + "foo(bar(3))\n"; + const char* expected = "\n" + "\n" + "(2*((1+(3))))\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, FuncArgWithParens) +{ + const char* input = "#define foo(x) (x)\n" + "foo(argument(with parens) FTW)\n"; + const char* expected = "\n" + "(argument(with parens) FTW)\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, FuncMacroAsNonMacro) +{ + const char* input = "#define foo(bar) bar\n" + "foo bar\n"; + const char* expected = "\n" + "foo bar\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, FuncExtraNewlines) +{ + const char* input = "#define foo(a) (a)\n" + "foo\n" + "(\n" + "1\n" + ")\n"; + const char* expected = "\n" + "\n" + "\n" + "\n" + "(1)\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, ChainObjToFunc) +{ + const char* input = "#define foo() pass\n" + "#define bar foo()\n" + "bar\n"; + const char* expected = "\n" + "\n" + "pass\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, ChainObjToNonFunc) +{ + const char* input = "#define pass() fail\n" + "#define bar pass\n" + "bar\n"; + const char* expected = "\n" + "\n" + "pass\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, ChainObjToFuncWithArgs) +{ + const char* input = "#define foo(fail) fail\n" + "#define bar foo(pass)\n" + "bar\n"; + const char* expected = "\n" + "\n" + "pass\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, ChainObjToFuncCompose) +{ + const char* input = "#define baz(fail) fail\n" + "#define bar(fail) fail\n" + "#define foo bar(baz(pass))\n" + "foo\n"; + const char* expected = "\n" + "\n" + "\n" + "pass\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, ChainObjToFuncParensInText1) +{ + const char* input = "#define fail() pass\n" + "#define foo fail\n" + "foo()\n"; + const char* expected = "\n" + "\n" + "pass\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, ChainObjToFuncParensInText2) +{ + const char* input = "#define bar with,embedded,commas\n" + "#define func(x) pass\n" + "#define foo func\n" + "foo(bar)\n"; + const char* expected = "\n" + "\n" + "\n" + "pass\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, ChainObjToFuncMultiLevel) +{ + const char* input = "#define foo(x) pass\n" + "#define bar foo\n" + "#define baz bar\n" + "#define joe baz\n" + "joe (fail)\n"; + const char* expected = "\n" + "\n" + "\n" + "\n" + "pass\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, ObjToFuncRecursive) +{ + const char* input = "#define A(a,b) B(a,b)\n" + "#define C A(0,C)\n" + "C\n"; + const char* expected = "\n" + "\n" + "B(0,C)\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, ChainFuncToFuncCompose) +{ + const char* input = "#define baz(fail) fail\n" + "#define bar(fail) fail\n" + "#define foo() bar(baz(pass))\n" + "foo()\n"; + const char* expected = "\n" + "\n" + "\n" + "pass\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, FuncSelfRecursive) +{ + const char* input = "#define foo(a) foo(2*(a))\n" + "foo(3)\n"; + const char* expected = "\n" + "foo(2*(3))\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, FuncSelfCompose) +{ + const char* input = "#define foo(a) foo(2*(a))\n" + "foo(foo(3))\n"; + const char* expected = "\n" + "foo(2*(foo(2*(3))))\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, FuncSelfComposeNonFunc) +{ + const char* input = "#define foo(bar) bar\n" + "foo(foo)\n"; + const char* expected = "\n" + "foo\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, FuncSelfComposeNonFuncMultiTokenArg) +{ + const char* input = "#define foo(bar) bar\n" + "foo(1+foo)\n"; + const char* expected = "\n" + "1+foo\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, FinalizeUnexpandedMacro) +{ + const char* input = "#define expand(x) expand(x once)\n" + "#define foo(x) x\n" + "foo(expand(just))\n"; + const char* expected = "\n" + "\n" + "expand(just once)\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, FuncArgWithCommas) +{ + const char* input = "#define foo(x) pass\n" + "foo(argument (with,embedded, commas) -- baz)\n"; + const char* expected = "\n" + "pass\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, FuncArgObjMaroWithComma) +{ + const char* input = "#define foo(a) (a)\n" + "#define bar two,words\n" + "foo(bar)\n"; + const char* expected = "\n" + "\n" + "(two,words)\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, FuncLeftParenInMacroRightParenInText) +{ + const char* input = "#define bar(a) a*2\n" + "#define foo bar(\n" + "foo b)\n"; + const char* expected = "\n" + "\n" + "b*2\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, RepeatedArg) +{ + const char* input = "#define double(x) x x\n" + "double(1)\n"; + const char* expected = "\n" + "1 1\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, FuncMissingRightParen) +{ + const char* input = "#define foo(x) (2*(x))\n" + "foo(3\n"; + const char* expected = "\n" + "\n"; + + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_MACRO_UNTERMINATED_INVOCATION, + pp::SourceLocation(0, 2), + "foo")); + + preprocess(input, expected); +} + +TEST_F(DefineTest, FuncIncorrectArgCount) +{ + const char* input = "#define foo(x,y) ((x)+(y))\n" + "foo()\n" + "foo(1)\n" + "foo(1,2,3)\n"; + const char* expected = "\n" + "\n" + "\n" + "\n"; + + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_MACRO_TOO_FEW_ARGS, + pp::SourceLocation(0, 2), + "foo")); + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_MACRO_TOO_FEW_ARGS, + pp::SourceLocation(0, 3), + "foo")); + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_MACRO_TOO_MANY_ARGS, + pp::SourceLocation(0, 4), + "foo")); + + preprocess(input, expected); +} + +TEST_F(DefineTest, Undef) +{ + const char* input = "#define foo 1\n" + "foo\n" + "#undef foo\n" + "foo\n"; + const char* expected = "\n" + "1\n" + "\n" + "foo\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, UndefPredefined) +{ + const char* input = "#undef __LINE__\n" + "__LINE__\n" + "#undef __FILE__\n" + "__FILE__\n" + "#undef __VERSION__\n" + "__VERSION__\n" + "#undef GL_ES\n" + "GL_ES\n"; + const char* expected = "\n" + "2\n" + "\n" + "0\n" + "\n" + "100\n" + "\n" + "1\n"; + + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_MACRO_PREDEFINED_UNDEFINED, + pp::SourceLocation(0, 1), + "__LINE__")); + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_MACRO_PREDEFINED_UNDEFINED, + pp::SourceLocation(0, 3), + "__FILE__")); + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_MACRO_PREDEFINED_UNDEFINED, + pp::SourceLocation(0, 5), + "__VERSION__")); + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_MACRO_PREDEFINED_UNDEFINED, + pp::SourceLocation(0, 7), + "GL_ES")); + + preprocess(input, expected); +} + +TEST_F(DefineTest, UndefRedefine) +{ + const char* input = "#define foo 1\n" + "foo\n" + "#undef foo\n" + "foo\n" + "#define foo 2\n" + "foo\n"; + const char* expected = "\n" + "1\n" + "\n" + "foo\n" + "\n" + "2\n"; + + preprocess(input, expected); +} + +// Example from C99 standard section 6.10.3.5 Scope of macro definitions +TEST_F(DefineTest, C99Example) +{ + const char* input = + "#define x 3 \n" + "#define f(a) f(x * (a)) \n" + "#undef x \n" + "#define x 2 \n" + "#define g f \n" + "#define z z[0] \n" + "#define h g(~ \n" + "#define m(a) a(w) \n" + "#define w 0,1 \n" + "#define t(a) a \n" + "#define p() int \n" + "#define q(x) x \n" + " \n" + "f(y+1) + f(f(z)) % t(t(g)(0) + t)(1);\n" + "g(x+(3,4)-w) | h 5) & m\n" + " (f)^m(m);\n" + "p() i[q()] = { q(1), 23, 4, 5, };\n"; + const char* expected = + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "f(2 * (y+1)) + f(2 * (f(2 * (z[0])))) % f(2 * (0)) + t(1);\n" + "f(2 * (2+(3,4)-0,1)) | f(2 * (~ 5)) &\n" + " f(2 * (0,1))^m(0,1);\n" + "int i[] = { 1, 23, 4, 5, };\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, Predefined_GL_ES) +{ + const char* input = "GL_ES\n"; + const char* expected = "1\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, Predefined_VERSION) +{ + const char* input = "__VERSION__\n"; + const char* expected = "100\n"; + + preprocess(input, expected); +} + +TEST_F(DefineTest, Predefined_LINE1) +{ + const char* str = "\n\n__LINE__"; + ASSERT_TRUE(mPreprocessor.init(1, &str, NULL)); + + pp::Token token; + mPreprocessor.lex(&token); + EXPECT_EQ(pp::Token::CONST_INT, token.type); + EXPECT_EQ("3", token.text); +} + +TEST_F(DefineTest, Predefined_LINE2) +{ + const char* str = "#line 10\n" + "__LINE__\n"; + ASSERT_TRUE(mPreprocessor.init(1, &str, NULL)); + + pp::Token token; + mPreprocessor.lex(&token); + EXPECT_EQ(pp::Token::CONST_INT, token.type); + EXPECT_EQ("10", token.text); +} + +TEST_F(DefineTest, Predefined_FILE1) +{ + const char* const str[] = {"", "", "__FILE__"}; + ASSERT_TRUE(mPreprocessor.init(3, str, NULL)); + + pp::Token token; + mPreprocessor.lex(&token); + EXPECT_EQ(pp::Token::CONST_INT, token.type); + EXPECT_EQ("2", token.text); +} + +TEST_F(DefineTest, Predefined_FILE2) +{ + const char* const str[] = {"#line 10 20\n", "__FILE__"}; + ASSERT_TRUE(mPreprocessor.init(2, str, NULL)); + + pp::Token token; + mPreprocessor.lex(&token); + EXPECT_EQ(pp::Token::CONST_INT, token.type); + EXPECT_EQ("21", token.text); +} + +// Defined operator produced by macro expansion should be parsed inside #if directives +TEST_F(DefineTest, ExpandedDefinedParsedInsideIf) +{ + const char *input = + "#define bar 1\n" + "#define foo defined(bar)\n" + "#if foo\n" + "bar\n" + "#endif\n"; + const char *expected = + "\n" + "\n" + "\n" + "1\n" + "\n"; + preprocess(input, expected); +} + +// Defined operator produced by macro expansion should not be parsed outside #if directives +TEST_F(DefineTest, ExpandedDefinedNotParsedOutsideIf) +{ + const char *input = + "#define foo defined(bar)\n" + "foo\n"; + const char *expected = + "\n" + "defined(bar)\n"; + preprocess(input, expected); +} + +// Test that line directive expressions give errors on negative or undefined shifts. +TEST_F(DefineTest, NegativeShiftInLineDirective) +{ + const char *input = + "#line 1 << -1\n" + "#line 1 >> -1\n" + "#line 1 << x\n" + "#line 1 >> x\n"; + const char *expected = + "\n" + "\n" + "\n" + "\n"; + + EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_UNDEFINED_SHIFT, _, _)).Times(4); + EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_INVALID_LINE_NUMBER, _, _)).Times(2); + preprocess(input, expected); +} + +// Undefining a macro in its invocation parameters produces and error +TEST_F(DefineTest, UndefineInInvocation) +{ + const char *input = + "#define G(a, b) a b\n" + "G(\n" + "#undef G\n" + "1, 2)\n"; + const char *expected = "\n\n\n1 2\n"; + + EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_MACRO_UNDEFINED_WHILE_INVOKED, + pp::SourceLocation(0, 3), _)); + + preprocess(input, expected); +} + +// Undefining a macro before its invocation parameters produces and error +TEST_F(DefineTest, UndefineInInvocationPreLParen) +{ + const char *input = + "#define G(a, b) a b\n" + "G\n" + "#undef G\n" + "(1, 2)\n"; + const char *expected = "\n\n\n1 2\n"; + + EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_MACRO_UNDEFINED_WHILE_INVOKED, + pp::SourceLocation(0, 3), _)); + + preprocess(input, expected); +} + +// The name of the macro "a" is inside an incomplete macro invocation of macro "m()" in its own +// expansion. This should not result in infinite recursion. +TEST_F(DefineTest, RecursiveMacroNameInsideIncompleteMacroInvocationInMacroExpansion) +{ + const char *input = + "#define m(a)\n" + "#define a m((a)\n" + "a)\n"; + const char *expected = + "\n" + "\n" + "\n"; + preprocess(input, expected); +} diff --git a/gfx/angle/src/tests/preprocessor_tests/error_test.cpp b/gfx/angle/src/tests/preprocessor_tests/error_test.cpp new file mode 100755 index 000000000..f0cf8af65 --- /dev/null +++ b/gfx/angle/src/tests/preprocessor_tests/error_test.cpp @@ -0,0 +1,92 @@ +// +// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "PreprocessorTest.h" +#include "compiler/preprocessor/Token.h" + +class ErrorTest : public PreprocessorTest +{ +}; + +TEST_F(ErrorTest, Empty) +{ + const char* str = "#error\n"; + const char* expected = "\n"; + + using testing::_; + EXPECT_CALL(mDirectiveHandler, handleError(pp::SourceLocation(0, 1), "")); + // No error or warning. + EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); + + preprocess(str, expected); +} + +TEST_F(ErrorTest, OneTokenMessage) +{ + const char* str = "#error foo\n"; + const char* expected = "\n"; + + using testing::_; + EXPECT_CALL(mDirectiveHandler, + handleError(pp::SourceLocation(0, 1), " foo")); + // No error or warning. + EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); + + preprocess(str, expected); +} + +TEST_F(ErrorTest, TwoTokenMessage) +{ + const char* str = "#error foo bar\n"; + const char* expected = "\n"; + + using testing::_; + EXPECT_CALL(mDirectiveHandler, + handleError(pp::SourceLocation(0, 1), " foo bar")); + // No error or warning. + EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); + + preprocess(str, expected); +} + +TEST_F(ErrorTest, Comments) +{ + const char* str = "/*foo*/" + "#" + "/*foo*/" + "error" + "/*foo*/" + "foo" + "/*foo*/" + "bar" + "/*foo*/" + "//foo" + "\n"; + const char* expected = "\n"; + + using testing::_; + EXPECT_CALL(mDirectiveHandler, + handleError(pp::SourceLocation(0, 1), " foo bar")); + // No error or warning. + EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); + + preprocess(str, expected); +} + +TEST_F(ErrorTest, MissingNewline) +{ + const char* str = "#error foo"; + const char* expected = ""; + + using testing::_; + // Directive successfully parsed. + EXPECT_CALL(mDirectiveHandler, + handleError(pp::SourceLocation(0, 1), " foo")); + // Error reported about EOF. + EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_EOF_IN_DIRECTIVE, _, _)); + + preprocess(str, expected); +} diff --git a/gfx/angle/src/tests/preprocessor_tests/extension_test.cpp b/gfx/angle/src/tests/preprocessor_tests/extension_test.cpp new file mode 100755 index 000000000..468ca4982 --- /dev/null +++ b/gfx/angle/src/tests/preprocessor_tests/extension_test.cpp @@ -0,0 +1,136 @@ +// +// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "PreprocessorTest.h" +#include "compiler/preprocessor/Token.h" + +class ExtensionTest : public PreprocessorTest +{ +}; + +TEST_F(ExtensionTest, Valid) +{ + const char* str = "#extension foo : bar\n"; + const char* expected = "\n"; + + using testing::_; + EXPECT_CALL(mDirectiveHandler, + handleExtension(pp::SourceLocation(0, 1), "foo", "bar")); + // No error or warning. + EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); + + preprocess(str, expected); +} + +TEST_F(ExtensionTest, Comments) +{ + const char* str = "/*foo*/" + "#" + "/*foo*/" + "extension" + "/*foo*/" + "foo" + "/*foo*/" + ":" + "/*foo*/" + "bar" + "/*foo*/" + "//foo" + "\n"; + const char* expected = "\n"; + + using testing::_; + EXPECT_CALL(mDirectiveHandler, + handleExtension(pp::SourceLocation(0, 1), "foo", "bar")); + // No error or warning. + EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); + + preprocess(str, expected); +} + +TEST_F(ExtensionTest, MissingNewline) +{ + const char* str = "#extension foo : bar"; + const char* expected = ""; + + using testing::_; + // Directive successfully parsed. + EXPECT_CALL(mDirectiveHandler, + handleExtension(pp::SourceLocation(0, 1), "foo", "bar")); + // Error reported about EOF. + EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_EOF_IN_DIRECTIVE, _, _)); + + preprocess(str, expected); +} + +TEST_F(ExtensionTest, ExtensionAfterNonPreProcessorTokenESSL1) +{ + const char *str = "int baz = 1;\n" + "#extension foo : bar\n"; + const char *expected = "int baz = 1;\n\n"; + + using testing::_; + // Directive successfully parsed. + EXPECT_CALL(mDirectiveHandler, + handleExtension(pp::SourceLocation(0, 2), "foo", "bar")); + // Expect a warning about extension pragmas after non-preprocessor tokens. + EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_NON_PP_TOKEN_BEFORE_EXTENSION_ESSL1, _, _)); + + preprocess(str, expected); +} + +TEST_F(ExtensionTest, ExtensionAfterNonPreProcessorTokenESSL3) +{ + const char *str = "#version 300 es\n" + "int baz = 1;\n" + "#extension foo : bar\n"; + const char *expected = "\nint baz = 1;\n\n"; + + using testing::_; + // Directive successfully parsed. + EXPECT_CALL(mDirectiveHandler, + handleVersion(pp::SourceLocation(0, 1), 300)); + // Expect a error about extension pragmas after non-preprocessor tokens. + EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_NON_PP_TOKEN_BEFORE_EXTENSION_ESSL3, _, _)); + + preprocess(str, expected); +} + +struct ExtensionTestParam +{ + const char* str; + pp::Diagnostics::ID id; +}; + +using testing::WithParamInterface; +class InvalidExtensionTest : public ExtensionTest, + public WithParamInterface<ExtensionTestParam> +{ +}; + +TEST_P(InvalidExtensionTest, Identified) +{ + ExtensionTestParam param = GetParam(); + const char* expected = "\n"; + + using testing::_; + // No handleExtension call. + EXPECT_CALL(mDirectiveHandler, handleExtension(_, _, _)).Times(0); + // Invalid extension directive call. + EXPECT_CALL(mDiagnostics, print(param.id, pp::SourceLocation(0, 1), _)); + + preprocess(param.str, expected); +} + +static const ExtensionTestParam kParams[] = { + {"#extension\n", pp::Diagnostics::PP_INVALID_EXTENSION_DIRECTIVE}, + {"#extension 1\n", pp::Diagnostics::PP_INVALID_EXTENSION_NAME}, + {"#extension foo bar\n", pp::Diagnostics::PP_UNEXPECTED_TOKEN}, + {"#extension foo : \n", pp::Diagnostics::PP_INVALID_EXTENSION_DIRECTIVE}, + {"#extension foo : 1\n", pp::Diagnostics::PP_INVALID_EXTENSION_BEHAVIOR}, + {"#extension foo : bar baz\n", pp::Diagnostics::PP_UNEXPECTED_TOKEN} +}; +INSTANTIATE_TEST_CASE_P(All, InvalidExtensionTest, testing::ValuesIn(kParams)); diff --git a/gfx/angle/src/tests/preprocessor_tests/identifier_test.cpp b/gfx/angle/src/tests/preprocessor_tests/identifier_test.cpp new file mode 100755 index 000000000..4712b38cb --- /dev/null +++ b/gfx/angle/src/tests/preprocessor_tests/identifier_test.cpp @@ -0,0 +1,162 @@ +// +// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "PreprocessorTest.h" +#include "compiler/preprocessor/Token.h" + +#define CLOSED_RANGE(x, y) testing::Range(x, static_cast<char>((y) + 1)) + +class IdentifierTest : public PreprocessorTest +{ +protected: + void expectIdentifier(const std::string& str) + { + const char* cstr = str.c_str(); + ASSERT_TRUE(mPreprocessor.init(1, &cstr, 0)); + + pp::Token token; + mPreprocessor.lex(&token); + EXPECT_EQ(pp::Token::IDENTIFIER, token.type); + EXPECT_EQ(str, token.text); + } +}; + +class SingleLetterIdentifierTest : public IdentifierTest, + public testing::WithParamInterface<char> +{ +}; + +// This test covers identifier names of form [_a-zA-Z]. +TEST_P(SingleLetterIdentifierTest, Identified) +{ + std::string str(1, GetParam()); + expectIdentifier(str); +} + +// Test string: '_' +INSTANTIATE_TEST_CASE_P(Underscore, + SingleLetterIdentifierTest, + testing::Values('_')); + +// Test string: [a-z] +INSTANTIATE_TEST_CASE_P(a_z, + SingleLetterIdentifierTest, + CLOSED_RANGE('a', 'z')); + +// Test string: [A-Z] +INSTANTIATE_TEST_CASE_P(A_Z, + SingleLetterIdentifierTest, + CLOSED_RANGE('A', 'Z')); + +typedef std::tr1::tuple<char, char> IdentifierParams; +class DoubleLetterIdentifierTest : + public IdentifierTest, + public testing::WithParamInterface<IdentifierParams> +{ +}; + +// This test covers identifier names of form [_a-zA-Z][_a-zA-Z0-9]. +TEST_P(DoubleLetterIdentifierTest, Identified) +{ + std::string str; + str.push_back(std::tr1::get<0>(GetParam())); + str.push_back(std::tr1::get<1>(GetParam())); + + expectIdentifier(str); +} + +// Test string: "__" +INSTANTIATE_TEST_CASE_P(Underscore_Underscore, + DoubleLetterIdentifierTest, + testing::Combine(testing::Values('_'), + testing::Values('_'))); + +// Test string: "_"[a-z] +INSTANTIATE_TEST_CASE_P(Underscore_a_z, + DoubleLetterIdentifierTest, + testing::Combine(testing::Values('_'), + CLOSED_RANGE('a', 'z'))); + +// Test string: "_"[A-Z] +INSTANTIATE_TEST_CASE_P(Underscore_A_Z, + DoubleLetterIdentifierTest, + testing::Combine(testing::Values('_'), + CLOSED_RANGE('A', 'Z'))); + +// Test string: "_"[0-9] +INSTANTIATE_TEST_CASE_P(Underscore_0_9, + DoubleLetterIdentifierTest, + testing::Combine(testing::Values('_'), + CLOSED_RANGE('0', '9'))); + +// Test string: [a-z]"_" +INSTANTIATE_TEST_CASE_P(a_z_Underscore, + DoubleLetterIdentifierTest, + testing::Combine(CLOSED_RANGE('a', 'z'), + testing::Values('_'))); + +// Test string: [a-z][a-z] +INSTANTIATE_TEST_CASE_P(a_z_a_z, + DoubleLetterIdentifierTest, + testing::Combine(CLOSED_RANGE('a', 'z'), + CLOSED_RANGE('a', 'z'))); + +// Test string: [a-z][A-Z] +INSTANTIATE_TEST_CASE_P(a_z_A_Z, + DoubleLetterIdentifierTest, + testing::Combine(CLOSED_RANGE('a', 'z'), + CLOSED_RANGE('A', 'Z'))); + +// Test string: [a-z][0-9] +INSTANTIATE_TEST_CASE_P(a_z_0_9, + DoubleLetterIdentifierTest, + testing::Combine(CLOSED_RANGE('a', 'z'), + CLOSED_RANGE('0', '9'))); + +// Test string: [A-Z]"_" +INSTANTIATE_TEST_CASE_P(A_Z_Underscore, + DoubleLetterIdentifierTest, + testing::Combine(CLOSED_RANGE('A', 'Z'), + testing::Values('_'))); + +// Test string: [A-Z][a-z] +INSTANTIATE_TEST_CASE_P(A_Z_a_z, + DoubleLetterIdentifierTest, + testing::Combine(CLOSED_RANGE('A', 'Z'), + CLOSED_RANGE('a', 'z'))); + +// Test string: [A-Z][A-Z] +INSTANTIATE_TEST_CASE_P(A_Z_A_Z, + DoubleLetterIdentifierTest, + testing::Combine(CLOSED_RANGE('A', 'Z'), + CLOSED_RANGE('A', 'Z'))); + +// Test string: [A-Z][0-9] +INSTANTIATE_TEST_CASE_P(A_Z_0_9, + DoubleLetterIdentifierTest, + testing::Combine(CLOSED_RANGE('A', 'Z'), + CLOSED_RANGE('0', '9'))); + +// The tests above cover one-letter and various combinations of two-letter +// identifier names. This test covers all characters in a single string. +TEST_F(IdentifierTest, AllLetters) +{ + std::string str; + for (char c = 'a'; c <= 'z'; ++c) + str.push_back(c); + + str.push_back('_'); + + for (char c = 'A'; c <= 'Z'; ++c) + str.push_back(c); + + str.push_back('_'); + + for (char c = '0'; c <= '9'; ++c) + str.push_back(c); + + expectIdentifier(str); +} diff --git a/gfx/angle/src/tests/preprocessor_tests/if_test.cpp b/gfx/angle/src/tests/preprocessor_tests/if_test.cpp new file mode 100755 index 000000000..7940b564a --- /dev/null +++ b/gfx/angle/src/tests/preprocessor_tests/if_test.cpp @@ -0,0 +1,1048 @@ +// +// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "PreprocessorTest.h" +#include "compiler/preprocessor/Token.h" + +class IfTest : public PreprocessorTest +{ +}; + +TEST_F(IfTest, If_0) +{ + const char* str = "pass_1\n" + "#if 0\n" + "fail\n" + "#endif\n" + "pass_2\n"; + const char* expected = "pass_1\n" + "\n" + "\n" + "\n" + "pass_2\n"; + + preprocess(str, expected); +} + +TEST_F(IfTest, If_1) +{ + const char* str = "pass_1\n" + "#if 1\n" + "pass_2\n" + "#endif\n" + "pass_3\n"; + const char* expected = "pass_1\n" + "\n" + "pass_2\n" + "\n" + "pass_3\n"; + + preprocess(str, expected); +} + +TEST_F(IfTest, If_0_Else) +{ + const char* str = "pass_1\n" + "#if 0\n" + "fail\n" + "#else\n" + "pass_2\n" + "#endif\n" + "pass_3\n"; + const char* expected = "pass_1\n" + "\n" + "\n" + "\n" + "pass_2\n" + "\n" + "pass_3\n"; + + preprocess(str, expected); +} + +TEST_F(IfTest, If_1_Else) +{ + const char* str = "pass_1\n" + "#if 1\n" + "pass_2\n" + "#else\n" + "fail\n" + "#endif\n" + "pass_3\n"; + const char* expected = "pass_1\n" + "\n" + "pass_2\n" + "\n" + "\n" + "\n" + "pass_3\n"; + + preprocess(str, expected); +} + +TEST_F(IfTest, If_0_Elif) +{ + const char* str = "pass_1\n" + "#if 0\n" + "fail_1\n" + "#elif 0\n" + "fail_2\n" + "#elif 1\n" + "pass_2\n" + "#elif 1\n" + "fail_3\n" + "#else\n" + "fail_4\n" + "#endif\n" + "pass_3\n"; + const char* expected = "pass_1\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "pass_2\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "pass_3\n"; + + preprocess(str, expected); +} + +TEST_F(IfTest, If_1_Elif) +{ + const char* str = "pass_1\n" + "#if 1\n" + "pass_2\n" + "#elif 0\n" + "fail_1\n" + "#elif 1\n" + "fail_2\n" + "#else\n" + "fail_4\n" + "#endif\n" + "pass_3\n"; + const char* expected = "pass_1\n" + "\n" + "pass_2\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "pass_3\n"; + + preprocess(str, expected); +} + +TEST_F(IfTest, If_Elif_Else) +{ + const char* str = "pass_1\n" + "#if 0\n" + "fail_1\n" + "#elif 0\n" + "fail_2\n" + "#elif 0\n" + "fail_3\n" + "#else\n" + "pass_2\n" + "#endif\n" + "pass_3\n"; + const char* expected = "pass_1\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "pass_2\n" + "\n" + "pass_3\n"; + + preprocess(str, expected); +} + +TEST_F(IfTest, If_0_Nested) +{ + const char* str = "pass_1\n" + "#if 0\n" + "fail_1\n" + "#if 1\n" + "fail_2\n" + "#else\n" + "fail_3\n" + "#endif\n" + "#else\n" + "pass_2\n" + "#endif\n" + "pass_3\n"; + const char* expected = "pass_1\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "pass_2\n" + "\n" + "pass_3\n"; + + preprocess(str, expected); +} + +TEST_F(IfTest, If_1_Nested) +{ + const char* str = "pass_1\n" + "#if 1\n" + "pass_2\n" + "#if 1\n" + "pass_3\n" + "#else\n" + "fail_1\n" + "#endif\n" + "#else\n" + "fail_2\n" + "#endif\n" + "pass_4\n"; + const char* expected = "pass_1\n" + "\n" + "pass_2\n" + "\n" + "pass_3\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "pass_4\n"; + + preprocess(str, expected); +} + +TEST_F(IfTest, OperatorPrecedence) +{ + const char* str = "#if 1 + 2 * 3 + - (26 % 17 - + 4 / 2)\n" + "fail_1\n" + "#else\n" + "pass_1\n" + "#endif\n"; + const char* expected = "\n" + "\n" + "\n" + "pass_1\n" + "\n"; + + preprocess(str, expected); +} + +TEST_F(IfTest, OperatorDefined) +{ + const char* str = "#if defined foo\n" + "fail_1\n" + "#else\n" + "pass_1\n" + "#endif\n" + "#define foo\n" + "#if defined(foo)\n" + "pass_2\n" + "#else\n" + "fail_2\n" + "#endif\n" + "#undef foo\n" + "#if defined ( foo ) \n" + "fail_3\n" + "#else\n" + "pass_3\n" + "#endif\n"; + const char* expected = "\n" + "\n" + "\n" + "pass_1\n" + "\n" + "\n" + "\n" + "pass_2\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "pass_3\n" + "\n"; + + preprocess(str, expected); +} + +TEST_F(IfTest, OperatorEQ) +{ + const char* str = "#if 4 - 1 == 2 + 1\n" + "pass\n" + "#else\n" + "fail\n" + "#endif\n"; + const char* expected = "\n" + "pass\n" + "\n" + "\n" + "\n"; + + preprocess(str, expected); +} + +TEST_F(IfTest, OperatorNE) +{ + const char* str = "#if 1 != 2\n" + "pass\n" + "#else\n" + "fail\n" + "#endif\n"; + const char* expected = "\n" + "pass\n" + "\n" + "\n" + "\n"; + + preprocess(str, expected); +} + +TEST_F(IfTest, OperatorLess) +{ + const char* str = "#if 1 < 2\n" + "pass\n" + "#else\n" + "fail\n" + "#endif\n"; + const char* expected = "\n" + "pass\n" + "\n" + "\n" + "\n"; + + preprocess(str, expected); +} + +TEST_F(IfTest, OperatorGreater) +{ + const char* str = "#if 2 > 1\n" + "pass\n" + "#else\n" + "fail\n" + "#endif\n"; + const char* expected = "\n" + "pass\n" + "\n" + "\n" + "\n"; + + preprocess(str, expected); +} + +TEST_F(IfTest, OperatorLE) +{ + const char* str = "#if 1 <= 2\n" + "pass_1\n" + "#else\n" + "fail_1\n" + "#endif\n" + "#if 2 <= 2\n" + "pass_2\n" + "#else\n" + "fail_2\n" + "#endif\n"; + const char* expected = "\n" + "pass_1\n" + "\n" + "\n" + "\n" + "\n" + "pass_2\n" + "\n" + "\n" + "\n"; + + preprocess(str, expected); +} + +TEST_F(IfTest, OperatorGE) +{ + const char* str = "#if 2 >= 1\n" + "pass_1\n" + "#else\n" + "fail_1\n" + "#endif\n" + "#if 2 >= 2\n" + "pass_2\n" + "#else\n" + "fail_2\n" + "#endif\n"; + const char* expected = "\n" + "pass_1\n" + "\n" + "\n" + "\n" + "\n" + "pass_2\n" + "\n" + "\n" + "\n"; + + preprocess(str, expected); +} + +TEST_F(IfTest, OperatorBitwiseOR) +{ + const char* str = "#if (0xaaaaaaaa | 0x55555555) == 0xffffffff\n" + "pass\n" + "#else\n" + "fail\n" + "#endif\n"; + const char* expected = "\n" + "pass\n" + "\n" + "\n" + "\n"; + + preprocess(str, expected); +} + +TEST_F(IfTest, OperatorBitwiseAND) +{ + const char* str = "#if (0xaaaaaaa & 0x5555555) == 0\n" + "pass\n" + "#else\n" + "fail\n" + "#endif\n"; + const char* expected = "\n" + "pass\n" + "\n" + "\n" + "\n"; + + preprocess(str, expected); +} + +TEST_F(IfTest, OperatorBitwiseXOR) +{ + const char* str = "#if (0xaaaaaaa ^ 0x5555555) == 0xfffffff\n" + "pass\n" + "#else\n" + "fail\n" + "#endif\n"; + const char* expected = "\n" + "pass\n" + "\n" + "\n" + "\n"; + + preprocess(str, expected); +} + +TEST_F(IfTest, OperatorBitwiseComplement) +{ + const char* str = "#if (~ 0xdeadbeef) == -3735928560\n" + "pass\n" + "#else\n" + "fail\n" + "#endif\n"; + const char* expected = "\n" + "pass\n" + "\n" + "\n" + "\n"; + + preprocess(str, expected); +} + +TEST_F(IfTest, OperatorLeft) +{ + const char* str = "#if (1 << 12) == 4096\n" + "pass\n" + "#else\n" + "fail\n" + "#endif\n"; + const char* expected = "\n" + "pass\n" + "\n" + "\n" + "\n"; + + preprocess(str, expected); +} + +TEST_F(IfTest, OperatorRight) +{ + const char* str = "#if (31762 >> 8) == 124\n" + "pass\n" + "#else\n" + "fail\n" + "#endif\n"; + const char* expected = "\n" + "pass\n" + "\n" + "\n" + "\n"; + + preprocess(str, expected); +} + +TEST_F(IfTest, ExpressionWithMacros) +{ + const char* str = "#define one 1\n" + "#define two 2\n" + "#define three 3\n" + "#if one + two == three\n" + "pass\n" + "#else\n" + "fail\n" + "#endif\n"; + const char* expected = "\n" + "\n" + "\n" + "\n" + "pass\n" + "\n" + "\n" + "\n"; + + preprocess(str, expected); +} + +TEST_F(IfTest, JunkInsideExcludedBlockIgnored) +{ + const char* str = "#if 0\n" + "foo !@#$%^&* .1bar\n" + "#foo\n" + "#if bar\n" + "fail\n" + "#endif\n" + "#else\n" + "pass\n" + "#endif\n"; + const char* expected = "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "pass\n" + "\n"; + + preprocess(str, expected); +} + +TEST_F(IfTest, Ifdef) +{ + const char* str = "#define foo\n" + "#ifdef foo\n" + "pass_1\n" + "#else\n" + "fail_1\n" + "#endif\n" + "#undef foo\n" + "#ifdef foo\n" + "fail_2\n" + "#else\n" + "pass_2\n" + "#endif\n"; + const char* expected = "\n" + "\n" + "pass_1\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "pass_2\n" + "\n"; + + preprocess(str, expected); +} + +TEST_F(IfTest, Ifndef) +{ + const char* str = "#define foo\n" + "#ifndef foo\n" + "fail_1\n" + "#else\n" + "pass_1\n" + "#endif\n" + "#undef foo\n" + "#ifndef foo\n" + "pass_2\n" + "#else\n" + "fail_2\n" + "#endif\n"; + const char* expected = "\n" + "\n" + "\n" + "\n" + "pass_1\n" + "\n" + "\n" + "\n" + "pass_2\n" + "\n" + "\n" + "\n"; + + preprocess(str, expected); +} + +TEST_F(IfTest, MissingExpression) +{ + const char* str = "#if\n" + "#endif\n"; + ASSERT_TRUE(mPreprocessor.init(1, &str, 0)); + + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_INVALID_EXPRESSION, + pp::SourceLocation(0, 1), + "syntax error")); + + pp::Token token; + mPreprocessor.lex(&token); +} + +TEST_F(IfTest, DivisionByZero) +{ + const char* str = "#if 1 / (3 - (1 + 2))\n" + "#endif\n"; + ASSERT_TRUE(mPreprocessor.init(1, &str, 0)); + + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_DIVISION_BY_ZERO, + pp::SourceLocation(0, 1), "1 / 0")); + + pp::Token token; + mPreprocessor.lex(&token); +} + +TEST_F(IfTest, ModuloByZero) +{ + const char* str = "#if 1 % (3 - (1 + 2))\n" + "#endif\n"; + ASSERT_TRUE(mPreprocessor.init(1, &str, 0)); + + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_DIVISION_BY_ZERO, + pp::SourceLocation(0, 1), "1 % 0")); + + pp::Token token; + mPreprocessor.lex(&token); +} + +TEST_F(IfTest, DecIntegerOverflow) +{ + const char* str = "#if 4294967296\n" + "#endif\n"; + ASSERT_TRUE(mPreprocessor.init(1, &str, 0)); + + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_INTEGER_OVERFLOW, + pp::SourceLocation(0, 1), "4294967296")); + + pp::Token token; + mPreprocessor.lex(&token); +} + +TEST_F(IfTest, OctIntegerOverflow) +{ + const char* str = "#if 077777777777\n" + "#endif\n"; + ASSERT_TRUE(mPreprocessor.init(1, &str, 0)); + + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_INTEGER_OVERFLOW, + pp::SourceLocation(0, 1), "077777777777")); + + pp::Token token; + mPreprocessor.lex(&token); +} + +TEST_F(IfTest, HexIntegerOverflow) +{ + const char* str = "#if 0xfffffffff\n" + "#endif\n"; + ASSERT_TRUE(mPreprocessor.init(1, &str, 0)); + + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_INTEGER_OVERFLOW, + pp::SourceLocation(0, 1), "0xfffffffff")); + + pp::Token token; + mPreprocessor.lex(&token); +} + +TEST_F(IfTest, UndefinedMacro) +{ + const char* str = "#if UNDEFINED\n" + "#endif\n"; + ASSERT_TRUE(mPreprocessor.init(1, &str, 0)); + + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_CONDITIONAL_UNEXPECTED_TOKEN, + pp::SourceLocation(0, 1), + "UNDEFINED")); + + pp::Token token; + mPreprocessor.lex(&token); +} + +TEST_F(IfTest, InvalidExpressionIgnoredForExcludedElif) +{ + const char* str = "#if 1\n" + "pass\n" + "#elif UNDEFINED\n" + "fail\n" + "#endif\n"; + const char* expected = "\n" + "pass\n" + "\n" + "\n" + "\n"; + + // No error or warning. + using testing::_; + EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); + + preprocess(str, expected); +} + +TEST_F(IfTest, ElseWithoutIf) +{ + const char* str = "#else\n"; + ASSERT_TRUE(mPreprocessor.init(1, &str, 0)); + + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_CONDITIONAL_ELSE_WITHOUT_IF, + pp::SourceLocation(0, 1), + "else")); + + pp::Token token; + mPreprocessor.lex(&token); +} + +TEST_F(IfTest, ElifWithoutIf) +{ + const char* str = "#elif 1\n"; + ASSERT_TRUE(mPreprocessor.init(1, &str, 0)); + + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_CONDITIONAL_ELIF_WITHOUT_IF, + pp::SourceLocation(0, 1), + "elif")); + + pp::Token token; + mPreprocessor.lex(&token); +} + +TEST_F(IfTest, EndifWithoutIf) +{ + const char* str = "#endif\n"; + ASSERT_TRUE(mPreprocessor.init(1, &str, 0)); + + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_CONDITIONAL_ENDIF_WITHOUT_IF, + pp::SourceLocation(0, 1), + "endif")); + + pp::Token token; + mPreprocessor.lex(&token); +} + +TEST_F(IfTest, ElseAfterElse) +{ + const char* str = "#if 1\n" + "#else\n" + "#else\n" + "#endif\n"; + ASSERT_TRUE(mPreprocessor.init(1, &str, 0)); + + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_CONDITIONAL_ELSE_AFTER_ELSE, + pp::SourceLocation(0, 3), + "else")); + + pp::Token token; + mPreprocessor.lex(&token); +} + +TEST_F(IfTest, ElifAfterElse) +{ + const char* str = "#if 1\n" + "#else\n" + "#elif 0\n" + "#endif\n"; + ASSERT_TRUE(mPreprocessor.init(1, &str, 0)); + + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_CONDITIONAL_ELIF_AFTER_ELSE, + pp::SourceLocation(0, 3), + "elif")); + + pp::Token token; + mPreprocessor.lex(&token); +} + +TEST_F(IfTest, UnterminatedIf) +{ + const char* str = "#if 1\n"; + ASSERT_TRUE(mPreprocessor.init(1, &str, 0)); + + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_CONDITIONAL_UNTERMINATED, + pp::SourceLocation(0, 1), + "if")); + + pp::Token token; + mPreprocessor.lex(&token); +} + +TEST_F(IfTest, UnterminatedIfdef) +{ + const char* str = "#ifdef foo\n"; + ASSERT_TRUE(mPreprocessor.init(1, &str, 0)); + + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_CONDITIONAL_UNTERMINATED, + pp::SourceLocation(0, 1), + "ifdef")); + + pp::Token token; + mPreprocessor.lex(&token); +} + +// The preprocessor only allows one expression to follow an #if directive. +// Supplying two integer expressions should be an error. +TEST_F(IfTest, ExtraIntExpression) +{ + const char *str = + "#if 1 1\n" + "#endif\n"; + ASSERT_TRUE(mPreprocessor.init(1, &str, 0)); + + EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_CONDITIONAL_UNEXPECTED_TOKEN, + pp::SourceLocation(0, 1), "1")); + + pp::Token token; + mPreprocessor.lex(&token); +} + +// The preprocessor only allows one expression to follow an #if directive. +// Supplying two expressions where one uses a preprocessor define should be an error. +TEST_F(IfTest, ExtraIdentifierExpression) +{ + const char *str = + "#define one 1\n" + "#if 1 one\n" + "#endif\n"; + ASSERT_TRUE(mPreprocessor.init(1, &str, 0)); + + EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_CONDITIONAL_UNEXPECTED_TOKEN, + pp::SourceLocation(0, 2), "1")); + + pp::Token token; + mPreprocessor.lex(&token); +} + +// Divide by zero that's not evaluated because of short-circuiting should not cause an error. +TEST_F(IfTest, ShortCircuitedDivideByZero) +{ + const char *str = + "#if 1 || (2 / 0)\n" + "pass\n" + "#endif\n"; + const char *expected = + "\n" + "pass\n" + "\n"; + + preprocess(str, expected); +} + +// Undefined identifier that's not evaluated because of short-circuiting should not cause an error. +TEST_F(IfTest, ShortCircuitedUndefined) +{ + const char *str = + "#if 1 || UNDEFINED\n" + "pass\n" + "#endif\n"; + const char *expected = + "\n" + "pass\n" + "\n"; + + preprocess(str, expected); +} + +// Defined operator produced by macro expansion has undefined behavior according to C++ spec, +// which the GLSL spec references (see C++14 draft spec section 16.1.4), but this behavior is +// needed for passing dEQP tests, which enforce stricter compatibility between implementations. +TEST_F(IfTest, DefinedOperatorValidAfterMacroExpansion) +{ + const char *str = + "#define foo defined\n" + "#if !foo bar\n" + "pass\n" + "#endif\n"; + ASSERT_TRUE(mPreprocessor.init(1, &str, 0)); + + EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_CONDITIONAL_UNEXPECTED_TOKEN, + pp::SourceLocation(0, 2), "defined")); + EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_CONDITIONAL_UNEXPECTED_TOKEN, + pp::SourceLocation(0, 2), "bar")); + + pp::Token token; + mPreprocessor.lex(&token); +} + +// Defined operator produced by macro expansion has undefined behavior according to C++ spec, +// which the GLSL spec references (see C++14 draft spec section 16.1.4), but this behavior is +// needed for passing dEQP tests, which enforce stricter compatibility between implementations. +TEST_F(IfTest, UnterminatedDefinedInMacro) +{ + const char *str = + "#define foo defined(\n" + "#if foo\n" + "#endif\n"; + ASSERT_TRUE(mPreprocessor.init(1, &str, 0)); + + EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_CONDITIONAL_UNEXPECTED_TOKEN, + pp::SourceLocation(0, 2), "defined")); + EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_CONDITIONAL_UNEXPECTED_TOKEN, + pp::SourceLocation(0, 2), "(")); + + pp::Token token; + mPreprocessor.lex(&token); +} + +// Defined operator produced by macro expansion has undefined behavior according to C++ spec, +// which the GLSL spec references (see C++14 draft spec section 16.1.4), but this behavior is +// needed for passing dEQP tests, which enforce stricter compatibility between implementations. +TEST_F(IfTest, UnterminatedDefinedInMacro2) +{ + const char *str = + "#define foo defined(bar\n" + "#if foo\n" + "#endif\n"; + ASSERT_TRUE(mPreprocessor.init(1, &str, 0)); + + EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_CONDITIONAL_UNEXPECTED_TOKEN, + pp::SourceLocation(0, 2), "defined")); + EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_CONDITIONAL_UNEXPECTED_TOKEN, + pp::SourceLocation(0, 2), "(")); + + pp::Token token; + mPreprocessor.lex(&token); +} + +// Undefined shift: negative shift offset. +TEST_F(IfTest, BitShiftLeftOperatorNegativeOffset) +{ + const char *str = + "#if 2 << -1 == 1\n" + "foo\n" + "#endif\n"; + ASSERT_TRUE(mPreprocessor.init(1, &str, 0)); + + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_UNDEFINED_SHIFT, pp::SourceLocation(0, 1), "2 << -1")); + + pp::Token token; + mPreprocessor.lex(&token); +} + +// Undefined shift: shift offset is out of range. +TEST_F(IfTest, BitShiftLeftOperatorOffset32) +{ + const char *str = + "#if 2 << 32 == 1\n" + "foo\n" + "#endif\n"; + ASSERT_TRUE(mPreprocessor.init(1, &str, 0)); + + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_UNDEFINED_SHIFT, pp::SourceLocation(0, 1), "2 << 32")); + + pp::Token token; + mPreprocessor.lex(&token); +} + +// Left hand side of shift is negative. +TEST_F(IfTest, BitShiftLeftOperatorNegativeLHS) +{ + const char *str = + "#if (-2) << 1 == -4\n" + "pass\n" + "#endif\n"; + const char *expected = + "\n" + "pass\n" + "\n"; + + preprocess(str, expected); +} + +// Undefined shift: shift offset is out of range. +TEST_F(IfTest, BitShiftRightOperatorNegativeOffset) +{ + const char *str = + "#if 2 >> -1 == 4\n" + "foo\n" + "#endif\n"; + ASSERT_TRUE(mPreprocessor.init(1, &str, 0)); + + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_UNDEFINED_SHIFT, pp::SourceLocation(0, 1), "2 >> -1")); + + pp::Token token; + mPreprocessor.lex(&token); +} + +// Undefined shift: shift offset is out of range. +TEST_F(IfTest, BitShiftRightOperatorOffset32) +{ + const char *str = + "#if 2 >> 32 == 0\n" + "foo\n" + "#endif\n"; + ASSERT_TRUE(mPreprocessor.init(1, &str, 0)); + + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_UNDEFINED_SHIFT, pp::SourceLocation(0, 1), "2 >> 32")); + + pp::Token token; + mPreprocessor.lex(&token); +} + +// Left hand side of shift is negative. +TEST_F(IfTest, BitShiftRightOperatorNegativeLHS) +{ + const char *str = + "#if (-2) >> 1 == 0x7fffffff\n" + "pass\n" + "#endif\n"; + const char *expected = + "\n" + "pass\n" + "\n"; + + preprocess(str, expected); +} diff --git a/gfx/angle/src/tests/preprocessor_tests/input_test.cpp b/gfx/angle/src/tests/preprocessor_tests/input_test.cpp new file mode 100755 index 000000000..ca1878c5f --- /dev/null +++ b/gfx/angle/src/tests/preprocessor_tests/input_test.cpp @@ -0,0 +1,178 @@ +// +// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "PreprocessorTest.h" +#include "compiler/preprocessor/Input.h" +#include "compiler/preprocessor/Token.h" + +class InitTest : public PreprocessorTest +{ +}; + +TEST_F(InitTest, ZeroCount) +{ + EXPECT_TRUE(mPreprocessor.init(0, NULL, NULL)); + + pp::Token token; + mPreprocessor.lex(&token); + EXPECT_EQ(pp::Token::LAST, token.type); +} + +TEST_F(InitTest, NullString) +{ + EXPECT_FALSE(mPreprocessor.init(1, NULL, NULL)); +} + +TEST(InputTest, DefaultConstructor) +{ + pp::Input input; + EXPECT_EQ(0u, input.count()); + int lineNo = 0; + EXPECT_EQ(0u, input.read(NULL, 1, &lineNo)); +} + +TEST(InputTest, NullLength) +{ + const char* str[] = {"foo"}; + pp::Input input(1, str, NULL); + EXPECT_EQ(3u, input.length(0)); +} + +TEST(InputTest, NegativeLength) +{ + const char* str[] = {"foo"}; + int length[] = {-1}; + pp::Input input(1, str, length); + EXPECT_EQ(3u, input.length(0)); +} + +TEST(InputTest, ActualLength) +{ + const char* str[] = {"foobar"}; + int length[] = {3}; + pp::Input input(1, str, length); + // Note that strlen(str[0]) != length[0]. + // Even then Input should just accept any non-negative number. + EXPECT_EQ(static_cast<size_t>(length[0]), input.length(0)); +} + +TEST(InputTest, String) +{ + const char* str[] = {"foo"}; + pp::Input input(1, str, NULL); + EXPECT_STREQ(str[0], input.string(0)); +} + +TEST(InputTest, ReadSingleString) +{ + int count = 1; + const char* str[] = {"foo"}; + char buf[4] = {'\0', '\0', '\0', '\0'}; + + int maxSize = 1; + int lineNo = 0; + pp::Input input1(count, str, NULL); + EXPECT_EQ(1u, input1.read(buf, maxSize, &lineNo)); + EXPECT_EQ('f', buf[0]); + EXPECT_EQ(1u, input1.read(buf, maxSize, &lineNo)); + EXPECT_EQ('o', buf[0]); + EXPECT_EQ(1u, input1.read(buf, maxSize, &lineNo)); + EXPECT_EQ('o', buf[0]); + EXPECT_EQ(0u, input1.read(buf, maxSize, &lineNo)); + + maxSize = 2; + pp::Input input2(count, str, NULL); + EXPECT_EQ(2u, input2.read(buf, maxSize, &lineNo)); + EXPECT_STREQ("fo", buf); + EXPECT_EQ(1u, input2.read(buf, maxSize, &lineNo)); + EXPECT_EQ('o', buf[0]); + EXPECT_EQ(0u, input2.read(buf, maxSize, &lineNo)); + + maxSize = 3; + pp::Input input3(count, str, NULL); + EXPECT_EQ(3u, input3.read(buf, maxSize, &lineNo)); + EXPECT_STREQ("foo", buf); + EXPECT_EQ(0u, input3.read(buf, maxSize, &lineNo)); + + maxSize = 4; + pp::Input input4(count, str, NULL); + EXPECT_EQ(3u, input4.read(buf, maxSize, &lineNo)); + EXPECT_STREQ("foo", buf); + EXPECT_EQ(0u, input4.read(buf, maxSize, &lineNo)); +} + +TEST(InputTest, ReadMultipleStrings) +{ + int count = 3; + const char* str[] = {"f", "o", "o"}; + char buf[4] = {'\0', '\0', '\0', '\0'}; + + int maxSize = 1; + int lineNo = 0; + pp::Input input1(count, str, NULL); + EXPECT_EQ(1u, input1.read(buf, maxSize, &lineNo)); + EXPECT_EQ('f', buf[0]); + EXPECT_EQ(1u, input1.read(buf, maxSize, &lineNo)); + EXPECT_EQ('o', buf[0]); + EXPECT_EQ(1u, input1.read(buf, maxSize, &lineNo)); + EXPECT_EQ('o', buf[0]); + EXPECT_EQ(0u, input1.read(buf, maxSize, &lineNo)); + + maxSize = 2; + pp::Input input2(count, str, NULL); + EXPECT_EQ(2u, input2.read(buf, maxSize, &lineNo)); + EXPECT_STREQ("fo", buf); + EXPECT_EQ(1u, input2.read(buf, maxSize, &lineNo)); + EXPECT_EQ('o', buf[0]); + EXPECT_EQ(0u, input2.read(buf, maxSize, &lineNo)); + + maxSize = 3; + pp::Input input3(count, str, NULL); + EXPECT_EQ(3u, input3.read(buf, maxSize, &lineNo)); + EXPECT_STREQ("foo", buf); + EXPECT_EQ(0u, input3.read(buf, maxSize, &lineNo)); + + maxSize = 4; + pp::Input input4(count, str, NULL); + EXPECT_EQ(3u, input4.read(buf, maxSize, &lineNo)); + EXPECT_STREQ("foo", buf); + EXPECT_EQ(0u, input4.read(buf, maxSize, &lineNo)); +} + +TEST(InputTest, ReadStringsWithLength) +{ + int count = 2; + const char* str[] = {"foo", "bar"}; + // Note that the length for the first string is 2 which is less than + // strlen(str[0]. We want to make sure that the last character is ignored. + int length[] = {2, 3}; + char buf[6] = {'\0', '\0', '\0', '\0', '\0', '\0'}; + size_t maxSize = 5; + int lineNo = 0; + + pp::Input input(count, str, length); + EXPECT_EQ(maxSize, input.read(buf, maxSize, &lineNo)); + EXPECT_STREQ("fobar", buf); +} + +TEST(InputTest, ReadStringsWithLineContinuation) +{ + int count = 2; + const char* str[] = {"foo\\", "\nba\\\r\nr"}; + int length[] = {4, 7}; + char buf[11] = {'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'}; + size_t maxSize = 11; + int lineNo = 0; + + pp::Input input(count, str, length); + EXPECT_EQ(3u, input.read(buf, maxSize, &lineNo)); + EXPECT_EQ(0, lineNo); + EXPECT_EQ(2u, input.read(buf + 3, maxSize - 3, &lineNo)); + EXPECT_EQ(1, lineNo); + EXPECT_EQ(1u, input.read(buf + 5, maxSize - 5, &lineNo)); + EXPECT_EQ(2, lineNo); + EXPECT_STREQ("foobar", buf); +} diff --git a/gfx/angle/src/tests/preprocessor_tests/location_test.cpp b/gfx/angle/src/tests/preprocessor_tests/location_test.cpp new file mode 100755 index 000000000..ebaf68a83 --- /dev/null +++ b/gfx/angle/src/tests/preprocessor_tests/location_test.cpp @@ -0,0 +1,351 @@ +// +// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "PreprocessorTest.h" +#include "compiler/preprocessor/Token.h" + +class LocationTest : public PreprocessorTest +{ +protected: + void expectLocation(int count, + const char* const string[], + const int length[], + const pp::SourceLocation& location) + { + ASSERT_TRUE(mPreprocessor.init(count, string, length)); + + pp::Token token; + mPreprocessor.lex(&token); + EXPECT_EQ(pp::Token::IDENTIFIER, token.type); + EXPECT_EQ("foo", token.text); + + EXPECT_EQ(location.file, token.location.file); + EXPECT_EQ(location.line, token.location.line); + } +}; + +TEST_F(LocationTest, String0_Line1) +{ + const char* str = "foo"; + pp::SourceLocation loc(0, 1); + + SCOPED_TRACE("String0_Line1"); + expectLocation(1, &str, NULL, loc); +} + +TEST_F(LocationTest, String0_Line2) +{ + const char* str = "\nfoo"; + pp::SourceLocation loc(0, 2); + + SCOPED_TRACE("String0_Line2"); + expectLocation(1, &str, NULL, loc); +} + +TEST_F(LocationTest, String1_Line1) +{ + const char* const str[] = {"\n\n", "foo"}; + pp::SourceLocation loc(1, 1); + + SCOPED_TRACE("String1_Line1"); + expectLocation(2, str, NULL, loc); +} + +TEST_F(LocationTest, String1_Line2) +{ + const char* const str[] = {"\n\n", "\nfoo"}; + pp::SourceLocation loc(1, 2); + + SCOPED_TRACE("String1_Line2"); + expectLocation(2, str, NULL, loc); +} + +TEST_F(LocationTest, NewlineInsideCommentCounted) +{ + const char* str = "/*\n\n*/foo"; + pp::SourceLocation loc(0, 3); + + SCOPED_TRACE("NewlineInsideCommentCounted"); + expectLocation(1, &str, NULL, loc); +} + +TEST_F(LocationTest, ErrorLocationAfterComment) +{ + const char* str = "/*\n\n*/@"; + + ASSERT_TRUE(mPreprocessor.init(1, &str, NULL)); + EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_INVALID_CHARACTER, + pp::SourceLocation(0, 3), + "@")); + + pp::Token token; + mPreprocessor.lex(&token); +} + +// The location of a token straddling two or more strings is that of the +// first character of the token. + +TEST_F(LocationTest, TokenStraddlingTwoStrings) +{ + const char* const str[] = {"f", "oo"}; + pp::SourceLocation loc(0, 1); + + SCOPED_TRACE("TokenStraddlingTwoStrings"); + expectLocation(2, str, NULL, loc); +} + +TEST_F(LocationTest, TokenStraddlingThreeStrings) +{ + const char* const str[] = {"f", "o", "o"}; + pp::SourceLocation loc(0, 1); + + SCOPED_TRACE("TokenStraddlingThreeStrings"); + expectLocation(3, str, NULL, loc); +} + +TEST_F(LocationTest, EndOfFileWithoutNewline) +{ + const char* const str[] = {"foo"}; + ASSERT_TRUE(mPreprocessor.init(1, str, NULL)); + + pp::Token token; + mPreprocessor.lex(&token); + EXPECT_EQ(pp::Token::IDENTIFIER, token.type); + EXPECT_EQ("foo", token.text); + EXPECT_EQ(0, token.location.file); + EXPECT_EQ(1, token.location.line); + + mPreprocessor.lex(&token); + EXPECT_EQ(pp::Token::LAST, token.type); + EXPECT_EQ(0, token.location.file); + EXPECT_EQ(1, token.location.line); +} + +TEST_F(LocationTest, EndOfFileAfterNewline) +{ + const char* const str[] = {"foo\n"}; + ASSERT_TRUE(mPreprocessor.init(1, str, NULL)); + + pp::Token token; + mPreprocessor.lex(&token); + EXPECT_EQ(pp::Token::IDENTIFIER, token.type); + EXPECT_EQ("foo", token.text); + EXPECT_EQ(0, token.location.file); + EXPECT_EQ(1, token.location.line); + + mPreprocessor.lex(&token); + EXPECT_EQ(pp::Token::LAST, token.type); + EXPECT_EQ(0, token.location.file); + EXPECT_EQ(2, token.location.line); +} + +TEST_F(LocationTest, EndOfFileAfterEmptyString) +{ + const char* const str[] = {"foo\n", "\n", ""}; + ASSERT_TRUE(mPreprocessor.init(3, str, NULL)); + + pp::Token token; + mPreprocessor.lex(&token); + EXPECT_EQ(pp::Token::IDENTIFIER, token.type); + EXPECT_EQ("foo", token.text); + EXPECT_EQ(0, token.location.file); + EXPECT_EQ(1, token.location.line); + + mPreprocessor.lex(&token); + EXPECT_EQ(pp::Token::LAST, token.type); + EXPECT_EQ(2, token.location.file); + EXPECT_EQ(1, token.location.line); +} + +TEST_F(LocationTest, ValidLineDirective1) +{ + const char* str = "#line 10\n" + "foo"; + pp::SourceLocation loc(0, 10); + + SCOPED_TRACE("ValidLineDirective1"); + expectLocation(1, &str, NULL, loc); +} + +TEST_F(LocationTest, ValidLineDirective2) +{ + const char* str = "#line 10 20\n" + "foo"; + pp::SourceLocation loc(20, 10); + + SCOPED_TRACE("ValidLineDirective2"); + expectLocation(1, &str, NULL, loc); +} + +TEST_F(LocationTest, LineDirectiveCommentsIgnored) +{ + const char* str = "/* bar */" + "#" + "/* bar */" + "line" + "/* bar */" + "10" + "/* bar */" + "20" + "/* bar */" + "// bar " + "\n" + "foo"; + pp::SourceLocation loc(20, 10); + + SCOPED_TRACE("LineDirectiveCommentsIgnored"); + expectLocation(1, &str, NULL, loc); +} + +TEST_F(LocationTest, LineDirectiveWithMacro1) +{ + const char* str = "#define L 10\n" + "#define F(x) x\n" + "#line L F(20)\n" + "foo"; + pp::SourceLocation loc(20, 10); + + SCOPED_TRACE("LineDirectiveWithMacro1"); + expectLocation(1, &str, NULL, loc); +} + +TEST_F(LocationTest, LineDirectiveWithMacro2) +{ + const char* str = "#define LOC 10 20\n" + "#line LOC\n" + "foo"; + pp::SourceLocation loc(20, 10); + + SCOPED_TRACE("LineDirectiveWithMacro2"); + expectLocation(1, &str, NULL, loc); +} + +TEST_F(LocationTest, LineDirectiveWithPredefinedMacro) +{ + const char* str = "#line __LINE__ __FILE__\n" + "foo"; + pp::SourceLocation loc(0, 1); + + SCOPED_TRACE("LineDirectiveWithMacro"); + expectLocation(1, &str, NULL, loc); +} + +TEST_F(LocationTest, LineDirectiveNewlineBeforeStringBreak) +{ + const char* const str[] = {"#line 10 20\n", "foo"}; + // String number is incremented after it is set by the line directive. + // Also notice that line number is reset after the string break. + pp::SourceLocation loc(21, 1); + + SCOPED_TRACE("LineDirectiveNewlineBeforeStringBreak"); + expectLocation(2, str, NULL, loc); +} + +TEST_F(LocationTest, LineDirectiveNewlineAfterStringBreak) +{ + const char* const str[] = {"#line 10 20", "\nfoo"}; + // String number is incremented before it is set by the line directive. + pp::SourceLocation loc(20, 10); + + SCOPED_TRACE("LineDirectiveNewlineAfterStringBreak"); + expectLocation(2, str, NULL, loc); +} + +TEST_F(LocationTest, LineDirectiveMissingNewline) +{ + const char* str = "#line 10"; + ASSERT_TRUE(mPreprocessor.init(1, &str, NULL)); + + using testing::_; + // Error reported about EOF. + EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_EOF_IN_DIRECTIVE, _, _)); + + pp::Token token; + mPreprocessor.lex(&token); +} + +struct LineTestParam +{ + const char* str; + pp::Diagnostics::ID id; +}; + +class InvalidLineTest : public LocationTest, + public testing::WithParamInterface<LineTestParam> +{ +}; + +TEST_P(InvalidLineTest, Identified) +{ + LineTestParam param = GetParam(); + ASSERT_TRUE(mPreprocessor.init(1, ¶m.str, NULL)); + + using testing::_; + // Invalid line directive call. + EXPECT_CALL(mDiagnostics, print(param.id, pp::SourceLocation(0, 1), _)); + + pp::Token token; + mPreprocessor.lex(&token); +} + +static const LineTestParam kParams[] = { + {"#line\n", pp::Diagnostics::PP_INVALID_LINE_DIRECTIVE}, + {"#line foo\n", pp::Diagnostics::PP_INVALID_LINE_NUMBER}, + {"#line defined(foo)\n", pp::Diagnostics::PP_INVALID_LINE_NUMBER}, + {"#line 10 foo\n", pp::Diagnostics::PP_INVALID_FILE_NUMBER}, + {"#line 10 20 foo\n", pp::Diagnostics::PP_UNEXPECTED_TOKEN}, + {"#line 0xffffffff\n", pp::Diagnostics::PP_INTEGER_OVERFLOW}, + {"#line 10 0xffffffff\n", pp::Diagnostics::PP_INTEGER_OVERFLOW}}; + +INSTANTIATE_TEST_CASE_P(All, InvalidLineTest, testing::ValuesIn(kParams)); + +struct LineExpressionTestParam +{ + const char *expression; + int expectedLine; +}; + +class LineExpressionTest : public LocationTest, + public testing::WithParamInterface<LineExpressionTestParam> +{ +}; + +TEST_P(LineExpressionTest, ExpressionEvaluation) +{ + LineExpressionTestParam param = GetParam(); + const char *strs[3] = {"#line ", param.expression, "\nfoo"}; + + pp::SourceLocation loc(2, param.expectedLine); + + expectLocation(3, strs, NULL, loc); +} + +static const LineExpressionTestParam kParamsLineExpressionTest[] = { + {"1 + 2", 3}, + {"5 - 3", 2}, + {"7 * 11", 77}, + {"20 / 10", 2}, + {"10 % 5", 0}, + {"7 && 3", 1}, + {"7 || 0", 1}, + {"11 == 11", 1}, + {"11 != 11", 0}, + {"11 > 7", 1}, + {"11 < 7", 0}, + {"11 >= 7", 1}, + {"11 <= 7", 0}, + {"!11", 0}, + {"-1", -1}, + {"+9", 9}, + {"(1 + 2) * 4", 12}, + {"3 | 5", 7}, + {"3 ^ 5", 6}, + {"3 & 5", 1}, + {"~5", ~5}, + {"2 << 3", 16}, + {"16 >> 2", 4}}; + +INSTANTIATE_TEST_CASE_P(All, LineExpressionTest, testing::ValuesIn(kParamsLineExpressionTest)); diff --git a/gfx/angle/src/tests/preprocessor_tests/number_test.cpp b/gfx/angle/src/tests/preprocessor_tests/number_test.cpp new file mode 100755 index 000000000..4e295d307 --- /dev/null +++ b/gfx/angle/src/tests/preprocessor_tests/number_test.cpp @@ -0,0 +1,170 @@ +// +// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "PreprocessorTest.h" +#include "compiler/preprocessor/Token.h" + +#define CLOSED_RANGE(x, y) testing::Range(x, static_cast<char>((y) + 1)) + +class InvalidNumberTest : public PreprocessorTest, + public testing::WithParamInterface<const char*> +{ +}; + +TEST_P(InvalidNumberTest, InvalidNumberIdentified) +{ + const char* str = GetParam(); + ASSERT_TRUE(mPreprocessor.init(1, &str, 0)); + + using testing::_; + EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_INVALID_NUMBER, _, str)); + + pp::Token token; + mPreprocessor.lex(&token); +} + +INSTANTIATE_TEST_CASE_P(InvalidIntegers, InvalidNumberTest, + testing::Values("1a", "08", "0xG")); + + +INSTANTIATE_TEST_CASE_P(InvalidFloats, InvalidNumberTest, + testing::Values("1eg", "0.a", "0.1.2", ".0a", ".0.1")); + +typedef std::tr1::tuple<const char*, char> IntegerParams; +class IntegerTest : public PreprocessorTest, + public testing::WithParamInterface<IntegerParams> +{ +}; + +TEST_P(IntegerTest, Identified) +{ + std::string str(std::tr1::get<0>(GetParam())); // prefix. + str.push_back(std::tr1::get<1>(GetParam())); // digit. + const char* cstr = str.c_str(); + + ASSERT_TRUE(mPreprocessor.init(1, &cstr, 0)); + + pp::Token token; + mPreprocessor.lex(&token); + EXPECT_EQ(pp::Token::CONST_INT, token.type); + EXPECT_EQ(str, token.text); +} + +INSTANTIATE_TEST_CASE_P(DecimalInteger, + IntegerTest, + testing::Combine(testing::Values(""), + CLOSED_RANGE('0', '9'))); + +INSTANTIATE_TEST_CASE_P(OctalInteger, + IntegerTest, + testing::Combine(testing::Values("0"), + CLOSED_RANGE('0', '7'))); + +INSTANTIATE_TEST_CASE_P(HexadecimalInteger_0_9, + IntegerTest, + testing::Combine(testing::Values("0x", "0X"), + CLOSED_RANGE('0', '9'))); + +INSTANTIATE_TEST_CASE_P(HexadecimalInteger_a_f, + IntegerTest, + testing::Combine(testing::Values("0x", "0X"), + CLOSED_RANGE('a', 'f'))); + +INSTANTIATE_TEST_CASE_P(HexadecimalInteger_A_F, + IntegerTest, + testing::Combine(testing::Values("0x", "0X"), + CLOSED_RANGE('A', 'F'))); + +class FloatTest : public PreprocessorTest +{ + protected: + void expectFloat(const std::string& str) + { + const char* cstr = str.c_str(); + ASSERT_TRUE(mPreprocessor.init(1, &cstr, 0)); + + pp::Token token; + mPreprocessor.lex(&token); + EXPECT_EQ(pp::Token::CONST_FLOAT, token.type); + EXPECT_EQ(str, token.text); + } +}; + +typedef std::tr1::tuple<char, char, const char*, char> FloatScientificParams; +class FloatScientificTest : + public FloatTest, + public testing::WithParamInterface<FloatScientificParams> +{ +}; + +// This test covers floating point numbers of form [0-9][eE][+-]?[0-9]. +TEST_P(FloatScientificTest, FloatIdentified) +{ + std::string str; + str.push_back(std::tr1::get<0>(GetParam())); // significand [0-9]. + str.push_back(std::tr1::get<1>(GetParam())); // separator [eE]. + str.append(std::tr1::get<2>(GetParam())); // sign [" " "+" "-"]. + str.push_back(std::tr1::get<3>(GetParam())); // exponent [0-9]. + + SCOPED_TRACE("FloatScientificTest"); + expectFloat(str); +} + +INSTANTIATE_TEST_CASE_P(FloatScientific, + FloatScientificTest, + testing::Combine(CLOSED_RANGE('0', '9'), + testing::Values('e', 'E'), + testing::Values("", "+", "-"), + CLOSED_RANGE('0', '9'))); + +typedef std::tr1::tuple<char, char> FloatFractionParams; +class FloatFractionTest : + public FloatTest, + public testing::WithParamInterface<FloatFractionParams> +{ +}; + +// This test covers floating point numbers of form [0-9]"." and [0-9]?"."[0-9]. +TEST_P(FloatFractionTest, FloatIdentified) +{ + std::string str; + + char significand = std::tr1::get<0>(GetParam()); + if (significand != '\0') + str.push_back(significand); + + str.push_back('.'); + + char fraction = std::tr1::get<1>(GetParam()); + if (fraction != '\0') + str.push_back(fraction); + + SCOPED_TRACE("FloatFractionTest"); + expectFloat(str); +} + +INSTANTIATE_TEST_CASE_P(FloatFraction_X_X, + FloatFractionTest, + testing::Combine(CLOSED_RANGE('0', '9'), + CLOSED_RANGE('0', '9'))); + +INSTANTIATE_TEST_CASE_P(FloatFraction_0_X, + FloatFractionTest, + testing::Combine(testing::Values('\0'), + CLOSED_RANGE('0', '9'))); + +INSTANTIATE_TEST_CASE_P(FloatFraction_X_0, + FloatFractionTest, + testing::Combine(CLOSED_RANGE('0', '9'), + testing::Values('\0'))); + +// In the tests above we have tested individual parts of a float separately. +// This test has all parts of a float. +TEST_F(FloatTest, FractionScientific) +{ + SCOPED_TRACE("FractionScientific"); + expectFloat("0.1e+2"); +} diff --git a/gfx/angle/src/tests/preprocessor_tests/operator_test.cpp b/gfx/angle/src/tests/preprocessor_tests/operator_test.cpp new file mode 100755 index 000000000..505cbe3fc --- /dev/null +++ b/gfx/angle/src/tests/preprocessor_tests/operator_test.cpp @@ -0,0 +1,80 @@ +// +// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "PreprocessorTest.h" +#include "compiler/preprocessor/Token.h" + +struct OperatorTestParam +{ + const char* str; + int op; +}; + +class OperatorTest : public PreprocessorTest, + public testing::WithParamInterface<OperatorTestParam> +{ +}; + +TEST_P(OperatorTest, Identified) +{ + OperatorTestParam param = GetParam(); + + ASSERT_TRUE(mPreprocessor.init(1, ¶m.str, 0)); + + pp::Token token; + mPreprocessor.lex(&token); + EXPECT_EQ(param.op, token.type); + EXPECT_EQ(param.str, token.text); +} + +static const OperatorTestParam kOperators[] = { + {"(", '('}, + {")", ')'}, + {"[", '['}, + {"]", ']'}, + {".", '.'}, + {"+", '+'}, + {"-", '-'}, + {"~", '~'}, + {"!", '!'}, + {"*", '*'}, + {"/", '/'}, + {"%", '%'}, + {"<", '<'}, + {">", '>'}, + {"&", '&'}, + {"^", '^'}, + {"|", '|'}, + {"?", '?'}, + {":", ':'}, + {"=", '='}, + {",", ','}, + {"++", pp::Token::OP_INC}, + {"--", pp::Token::OP_DEC}, + {"<<", pp::Token::OP_LEFT}, + {">>", pp::Token::OP_RIGHT}, + {"<=", pp::Token::OP_LE}, + {">=", pp::Token::OP_GE}, + {"==", pp::Token::OP_EQ}, + {"!=", pp::Token::OP_NE}, + {"&&", pp::Token::OP_AND}, + {"^^", pp::Token::OP_XOR}, + {"||", pp::Token::OP_OR}, + {"+=", pp::Token::OP_ADD_ASSIGN}, + {"-=", pp::Token::OP_SUB_ASSIGN}, + {"*=", pp::Token::OP_MUL_ASSIGN}, + {"/=", pp::Token::OP_DIV_ASSIGN}, + {"%=", pp::Token::OP_MOD_ASSIGN}, + {"<<=", pp::Token::OP_LEFT_ASSIGN}, + {">>=", pp::Token::OP_RIGHT_ASSIGN}, + {"&=", pp::Token::OP_AND_ASSIGN}, + {"^=", pp::Token::OP_XOR_ASSIGN}, + {"|=", pp::Token::OP_OR_ASSIGN} +}; + +INSTANTIATE_TEST_CASE_P(All, OperatorTest, + testing::ValuesIn(kOperators)); + diff --git a/gfx/angle/src/tests/preprocessor_tests/pragma_test.cpp b/gfx/angle/src/tests/preprocessor_tests/pragma_test.cpp new file mode 100755 index 000000000..92992aced --- /dev/null +++ b/gfx/angle/src/tests/preprocessor_tests/pragma_test.cpp @@ -0,0 +1,154 @@ +// +// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "PreprocessorTest.h" +#include "compiler/preprocessor/Token.h" + +class PragmaTest : public PreprocessorTest +{ +}; + +TEST_F(PragmaTest, EmptyName) +{ + const char* str = "#pragma\n"; + const char* expected = "\n"; + + using testing::_; + // No handlePragma calls. + EXPECT_CALL(mDirectiveHandler, handlePragma(_, _, _, false)).Times(0); + // No error or warning. + EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); + + preprocess(str, expected); +} + +TEST_F(PragmaTest, EmptyValue) +{ + const char* str = "#pragma foo\n"; + const char* expected = "\n"; + + using testing::_; + EXPECT_CALL(mDirectiveHandler, + handlePragma(pp::SourceLocation(0, 1), "foo", "", false)); + // No error or warning. + EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); + + preprocess(str, expected); +} + +TEST_F(PragmaTest, NameValue) +{ + const char* str = "#pragma foo(bar)\n"; + const char* expected = "\n"; + + using testing::_; + EXPECT_CALL(mDirectiveHandler, + handlePragma(pp::SourceLocation(0, 1), "foo", "bar", false)); + // No error or warning. + EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); + + preprocess(str, expected); +} + +TEST_F(PragmaTest, STDGL) +{ + const char* str = "#pragma STDGL\n"; + const char* expected = "\n"; + + using testing::_; + EXPECT_CALL(mDirectiveHandler, + handlePragma(_, _, _, _)).Times(0); + // No error or warning. + EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); + + preprocess(str, expected); +} + +TEST_F(PragmaTest, STDGLInvariantAll) +{ + const char* str = "#pragma STDGL invariant(all)\n"; + const char* expected = "\n"; + + using testing::_; + EXPECT_CALL(mDirectiveHandler, + handlePragma(pp::SourceLocation(0, 1), "invariant", "all", true)); + // No error or warning. + EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); + + preprocess(str, expected); +} + +TEST_F(PragmaTest, Comments) +{ + const char* str = "/*foo*/" + "#" + "/*foo*/" + "pragma" + "/*foo*/" + "foo" + "/*foo*/" + "(" + "/*foo*/" + "bar" + "/*foo*/" + ")" + "/*foo*/" + "//foo" + "\n"; + const char* expected = "\n"; + + using testing::_; + EXPECT_CALL(mDirectiveHandler, + handlePragma(pp::SourceLocation(0, 1), "foo", "bar", false)); + // No error or warning. + EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); + + preprocess(str, expected); +} + +TEST_F(PragmaTest, MissingNewline) +{ + const char* str = "#pragma foo(bar)"; + const char* expected = ""; + + using testing::_; + // Pragma successfully parsed. + EXPECT_CALL(mDirectiveHandler, + handlePragma(pp::SourceLocation(0, 1), "foo", "bar", false)); + // Error reported about EOF. + EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_EOF_IN_DIRECTIVE, _, _)); + + preprocess(str, expected); +} + +class InvalidPragmaTest : public PragmaTest, + public testing::WithParamInterface<const char*> +{ +}; + +TEST_P(InvalidPragmaTest, Identified) +{ + const char* str = GetParam(); + const char* expected = "\n"; + + using testing::_; + // No handlePragma calls. + EXPECT_CALL(mDirectiveHandler, handlePragma(_, _, _, false)).Times(0); + // Unrecognized pragma warning. + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_UNRECOGNIZED_PRAGMA, + pp::SourceLocation(0, 1), _)); + + preprocess(str, expected); +} + +INSTANTIATE_TEST_CASE_P(All, InvalidPragmaTest, testing::Values( + "#pragma 1\n", // Invalid name. + "#pragma foo()\n", // Missing value. + "#pragma foo bar)\n", // Missing left paren, + "#pragma foo(bar\n", // Missing right paren. + "#pragma foo bar\n", // Missing parens. + "#pragma foo(bar) baz\n")); // Extra tokens. diff --git a/gfx/angle/src/tests/preprocessor_tests/space_test.cpp b/gfx/angle/src/tests/preprocessor_tests/space_test.cpp new file mode 100755 index 000000000..0c3494be5 --- /dev/null +++ b/gfx/angle/src/tests/preprocessor_tests/space_test.cpp @@ -0,0 +1,106 @@ +// +// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "PreprocessorTest.h" +#include "compiler/preprocessor/Token.h" + +class SpaceTest : public PreprocessorTest +{ + protected: + void expectSpace(const std::string& str) + { + const char* cstr = str.c_str(); + ASSERT_TRUE(mPreprocessor.init(1, &cstr, 0)); + + pp::Token token; + // "foo" is returned after ignoring the whitespace characters. + mPreprocessor.lex(&token); + EXPECT_EQ(pp::Token::IDENTIFIER, token.type); + EXPECT_EQ("foo", token.text); + // The whitespace character is however recorded with the next token. + EXPECT_TRUE(token.hasLeadingSpace()); + } +}; + +// Whitespace characters allowed in GLSL. +// Note that newline characters (\n) will be tested separately. +static const char kSpaceChars[] = {' ', '\t', '\v', '\f'}; + +// This test fixture tests the processing of a single whitespace character. +// All tests in this fixture are ran with all possible whitespace character +// allowed in GLSL. +class SpaceCharTest : public SpaceTest, + public testing::WithParamInterface<char> +{ +}; + +TEST_P(SpaceCharTest, SpaceIgnored) +{ + // Construct test string with the whitespace char before "foo". + std::string str(1, GetParam()); + str.append("foo"); + + expectSpace(str); +} + +INSTANTIATE_TEST_CASE_P(SingleSpaceChar, + SpaceCharTest, + testing::ValuesIn(kSpaceChars)); + +// This test fixture tests the processing of a string containing consecutive +// whitespace characters. All tests in this fixture are ran with all possible +// combinations of whitespace characters allowed in GLSL. +typedef std::tr1::tuple<char, char, char> SpaceStringParams; +class SpaceStringTest : public SpaceTest, + public testing::WithParamInterface<SpaceStringParams> +{ +}; + +TEST_P(SpaceStringTest, SpaceIgnored) +{ + // Construct test string with the whitespace char before "foo". + std::string str; + str.push_back(std::tr1::get<0>(GetParam())); + str.push_back(std::tr1::get<1>(GetParam())); + str.push_back(std::tr1::get<2>(GetParam())); + str.append("foo"); + + expectSpace(str); +} + +INSTANTIATE_TEST_CASE_P(SpaceCharCombination, + SpaceStringTest, + testing::Combine(testing::ValuesIn(kSpaceChars), + testing::ValuesIn(kSpaceChars), + testing::ValuesIn(kSpaceChars))); + +// The tests above make sure that the space char is recorded in the +// next token. This test makes sure that a token is not incorrectly marked +// to have leading space. +TEST_F(SpaceTest, LeadingSpace) +{ + const char* str = " foo+ -bar"; + ASSERT_TRUE(mPreprocessor.init(1, &str, 0)); + + pp::Token token; + mPreprocessor.lex(&token); + EXPECT_EQ(pp::Token::IDENTIFIER, token.type); + EXPECT_EQ("foo", token.text); + EXPECT_TRUE(token.hasLeadingSpace()); + + mPreprocessor.lex(&token); + EXPECT_EQ('+', token.type); + EXPECT_FALSE(token.hasLeadingSpace()); + + mPreprocessor.lex(&token); + EXPECT_EQ('-', token.type); + EXPECT_TRUE(token.hasLeadingSpace()); + + mPreprocessor.lex(&token); + EXPECT_EQ(pp::Token::IDENTIFIER, token.type); + EXPECT_EQ("bar", token.text); + EXPECT_FALSE(token.hasLeadingSpace()); +} diff --git a/gfx/angle/src/tests/preprocessor_tests/token_test.cpp b/gfx/angle/src/tests/preprocessor_tests/token_test.cpp new file mode 100755 index 000000000..106647c8e --- /dev/null +++ b/gfx/angle/src/tests/preprocessor_tests/token_test.cpp @@ -0,0 +1,90 @@ +// +// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "gtest/gtest.h" + +#include "compiler/preprocessor/Token.h" + +TEST(TokenTest, DefaultConstructor) +{ + pp::Token token; + EXPECT_EQ(0, token.type); + EXPECT_EQ(0u, token.flags); + EXPECT_EQ(0, token.location.line); + EXPECT_EQ(0, token.location.file); + EXPECT_EQ("", token.text); +} + +TEST(TokenTest, Assignment) +{ + pp::Token token; + token.type = 1; + token.flags = 1; + token.location.line = 1; + token.location.file = 1; + token.text.assign("foo"); + + token = pp::Token(); + EXPECT_EQ(0, token.type); + EXPECT_EQ(0u, token.flags); + EXPECT_EQ(0, token.location.line); + EXPECT_EQ(0, token.location.file); + EXPECT_EQ("", token.text); +} + +TEST(TokenTest, Equals) +{ + pp::Token token; + EXPECT_TRUE(token.equals(pp::Token())); + + token.type = 1; + EXPECT_FALSE(token.equals(pp::Token())); + token.type = 0; + + token.flags = 1; + EXPECT_FALSE(token.equals(pp::Token())); + token.flags = 0; + + token.location.line = 1; + EXPECT_FALSE(token.equals(pp::Token())); + token.location.line = 0; + + token.location.file = 1; + EXPECT_FALSE(token.equals(pp::Token())); + token.location.file = 0; + + token.text.assign("foo"); + EXPECT_FALSE(token.equals(pp::Token())); + token.text.clear(); + + EXPECT_TRUE(token.equals(pp::Token())); +} + +TEST(TokenTest, HasLeadingSpace) +{ + pp::Token token; + EXPECT_FALSE(token.hasLeadingSpace()); + token.setHasLeadingSpace(true); + EXPECT_TRUE(token.hasLeadingSpace()); + token.setHasLeadingSpace(false); + EXPECT_FALSE(token.hasLeadingSpace()); +} + +TEST(TokenTest, Write) +{ + pp::Token token; + token.text.assign("foo"); + std::stringstream out1; + out1 << token; + EXPECT_TRUE(out1.good()); + EXPECT_EQ("foo", out1.str()); + + token.setHasLeadingSpace(true); + std::stringstream out2; + out2 << token; + EXPECT_TRUE(out2.good()); + EXPECT_EQ(" foo", out2.str()); +} diff --git a/gfx/angle/src/tests/preprocessor_tests/version_test.cpp b/gfx/angle/src/tests/preprocessor_tests/version_test.cpp new file mode 100755 index 000000000..a38542db1 --- /dev/null +++ b/gfx/angle/src/tests/preprocessor_tests/version_test.cpp @@ -0,0 +1,229 @@ +// +// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "PreprocessorTest.h" +#include "compiler/preprocessor/Token.h" + +class VersionTest : public PreprocessorTest +{ +}; + +TEST_F(VersionTest, Valid) +{ + const char* str = "#version 200\n"; + const char* expected = "\n"; + + using testing::_; + EXPECT_CALL(mDirectiveHandler, + handleVersion(pp::SourceLocation(0, 1), 200)); + // No error or warning. + EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); + + preprocess(str, expected); +} + +TEST_F(VersionTest, CommentsIgnored) +{ + const char* str = "/*foo*/" + "#" + "/*foo*/" + "version" + "/*foo*/" + "200" + "/*foo*/" + "//foo" + "\n"; + const char* expected = "\n"; + + using testing::_; + EXPECT_CALL(mDirectiveHandler, + handleVersion(pp::SourceLocation(0, 1), 200)); + // No error or warning. + EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); + + preprocess(str, expected); +} + +TEST_F(VersionTest, MissingNewline) +{ + const char* str = "#version 200"; + const char* expected = ""; + + using testing::_; + // Directive successfully parsed. + EXPECT_CALL(mDirectiveHandler, + handleVersion(pp::SourceLocation(0, 1), 200)); + // Error reported about EOF. + EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_EOF_IN_DIRECTIVE, _, _)); + + preprocess(str, expected); +} + +TEST_F(VersionTest, AfterComments) +{ + const char* str = "/* block comment acceptable */\n" + "// line comment acceptable\n" + "#version 200\n"; + const char* expected = "\n\n\n"; + + using testing::_; + // Directive successfully parsed. + EXPECT_CALL(mDirectiveHandler, + handleVersion(pp::SourceLocation(0, 3), 200)); + // No error or warning. + EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); + + preprocess(str, expected); +} + +TEST_F(VersionTest, AfterWhitespace) +{ + const char* str = "\n" + "\n" + "#version 200\n"; + const char* expected = "\n\n\n"; + + using testing::_; + // Directive successfully parsed. + EXPECT_CALL(mDirectiveHandler, + handleVersion(pp::SourceLocation(0, 3), 200)); + // No error or warning. + EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); + + preprocess(str, expected); +} + +TEST_F(VersionTest, AfterValidToken) +{ + const char* str = "foo\n" + "#version 200\n"; + ASSERT_TRUE(mPreprocessor.init(1, &str, NULL)); + + using testing::_; + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_VERSION_NOT_FIRST_STATEMENT, + pp::SourceLocation(0, 2), _)); + + pp::Token token; + do + { + mPreprocessor.lex(&token); + } while (token.type != pp::Token::LAST); +} + +TEST_F(VersionTest, AfterInvalidToken) +{ + const char* str = "$\n" + "#version 200\n"; + ASSERT_TRUE(mPreprocessor.init(1, &str, NULL)); + + using testing::_; + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_INVALID_CHARACTER, + pp::SourceLocation(0, 1), "$")); + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_VERSION_NOT_FIRST_STATEMENT, + pp::SourceLocation(0, 2), _)); + + pp::Token token; + do + { + mPreprocessor.lex(&token); + } while (token.type != pp::Token::LAST); +} + +TEST_F(VersionTest, AfterValidDirective) +{ + const char* str = "#\n" + "#version 200\n"; + ASSERT_TRUE(mPreprocessor.init(1, &str, NULL)); + + using testing::_; + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_VERSION_NOT_FIRST_STATEMENT, + pp::SourceLocation(0, 2), _)); + + pp::Token token; + do + { + mPreprocessor.lex(&token); + } while (token.type != pp::Token::LAST); +} + +TEST_F(VersionTest, AfterInvalidDirective) +{ + const char* str = "#foo\n" + "#version 200\n"; + ASSERT_TRUE(mPreprocessor.init(1, &str, NULL)); + + using testing::_; + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_DIRECTIVE_INVALID_NAME, + pp::SourceLocation(0, 1), "foo")); + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_VERSION_NOT_FIRST_STATEMENT, + pp::SourceLocation(0, 2), _)); + + pp::Token token; + do + { + mPreprocessor.lex(&token); + } while (token.type != pp::Token::LAST); +} + +TEST_F(VersionTest, AfterExcludedBlock) +{ + const char* str = "#if 0\n" + "foo\n" + "#endif\n" + "#version 200\n"; + ASSERT_TRUE(mPreprocessor.init(1, &str, NULL)); + + using testing::_; + EXPECT_CALL(mDiagnostics, + print(pp::Diagnostics::PP_VERSION_NOT_FIRST_STATEMENT, + pp::SourceLocation(0, 4), _)); + + pp::Token token; + do + { + mPreprocessor.lex(&token); + } while (token.type != pp::Token::LAST); +} + +struct VersionTestParam +{ + const char* str; + pp::Diagnostics::ID id; +}; + +class InvalidVersionTest : public VersionTest, + public testing::WithParamInterface<VersionTestParam> +{ +}; + +TEST_P(InvalidVersionTest, Identified) +{ + VersionTestParam param = GetParam(); + const char* expected = "\n"; + + using testing::_; + // No handleVersion call. + EXPECT_CALL(mDirectiveHandler, handleVersion(_, _)).Times(0); + // Invalid version directive call. + EXPECT_CALL(mDiagnostics, print(param.id, pp::SourceLocation(0, 1), _)); + + preprocess(param.str, expected); +} + +static const VersionTestParam kParams[] = { + {"#version\n", pp::Diagnostics::PP_INVALID_VERSION_DIRECTIVE}, + {"#version foo\n", pp::Diagnostics::PP_INVALID_VERSION_NUMBER}, + {"#version 100 foo\n", pp::Diagnostics::PP_UNEXPECTED_TOKEN}, + {"#version 0xffffffff\n", pp::Diagnostics::PP_INTEGER_OVERFLOW} +}; + +INSTANTIATE_TEST_CASE_P(All, InvalidVersionTest, testing::ValuesIn(kParams)); diff --git a/gfx/angle/src/tests/test_utils/ANGLETest.cpp b/gfx/angle/src/tests/test_utils/ANGLETest.cpp new file mode 100755 index 000000000..77f1d8dec --- /dev/null +++ b/gfx/angle/src/tests/test_utils/ANGLETest.cpp @@ -0,0 +1,863 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// ANGLETest: +// Implementation of common ANGLE testing fixture. +// + +#include "ANGLETest.h" +#include "EGLWindow.h" +#include "OSWindow.h" +#include "platform/Platform.h" + +namespace angle +{ + +const GLColorRGB GLColorRGB::black(0u, 0u, 0u); +const GLColorRGB GLColorRGB::blue(0u, 0u, 255u); +const GLColorRGB GLColorRGB::green(0u, 255u, 0u); +const GLColorRGB GLColorRGB::red(255u, 0u, 0u); +const GLColorRGB GLColorRGB::yellow(255u, 255u, 0); + +const GLColor GLColor::black = GLColor(0u, 0u, 0u, 255u); +const GLColor GLColor::blue = GLColor(0u, 0u, 255u, 255u); +const GLColor GLColor::cyan = GLColor(0u, 255u, 255u, 255u); +const GLColor GLColor::green = GLColor(0u, 255u, 0u, 255u); +const GLColor GLColor::red = GLColor(255u, 0u, 0u, 255u); +const GLColor GLColor::transparentBlack = GLColor(0u, 0u, 0u, 0u); +const GLColor GLColor::white = GLColor(255u, 255u, 255u, 255u); +const GLColor GLColor::yellow = GLColor(255u, 255u, 0, 255u); + +namespace +{ +float ColorNorm(GLubyte channelValue) +{ + return static_cast<float>(channelValue) / 255.0f; +} + +GLubyte ColorDenorm(float colorValue) +{ + return static_cast<GLubyte>(colorValue * 255.0f); +} + +// Use a custom ANGLE platform class to capture and report internal errors. +class TestPlatform : public angle::Platform +{ + public: + TestPlatform() : mIgnoreMessages(false) {} + + void logError(const char *errorMessage) override; + void logWarning(const char *warningMessage) override; + void logInfo(const char *infoMessage) override; + + void ignoreMessages(); + void enableMessages(); + + private: + bool mIgnoreMessages; +}; + +void TestPlatform::logError(const char *errorMessage) +{ + if (mIgnoreMessages) + return; + + FAIL() << errorMessage; +} + +void TestPlatform::logWarning(const char *warningMessage) +{ + if (mIgnoreMessages) + return; + + std::cerr << "Warning: " << warningMessage << std::endl; +} + +void TestPlatform::logInfo(const char *infoMessage) +{ + if (mIgnoreMessages) + return; + + angle::WriteDebugMessage("%s\n", infoMessage); +} + +void TestPlatform::ignoreMessages() +{ + mIgnoreMessages = true; +} + +void TestPlatform::enableMessages() +{ + mIgnoreMessages = false; +} + +TestPlatform g_testPlatformInstance; + +std::array<Vector3, 4> GetIndexedQuadVertices() +{ + std::array<Vector3, 4> vertices; + vertices[0] = Vector3(-1.0f, 1.0f, 0.5f); + vertices[1] = Vector3(-1.0f, -1.0f, 0.5f); + vertices[2] = Vector3(1.0f, -1.0f, 0.5f); + vertices[3] = Vector3(1.0f, 1.0f, 0.5f); + return vertices; +} + +} // anonymous namespace + +GLColorRGB::GLColorRGB() : R(0), G(0), B(0) +{ +} + +GLColorRGB::GLColorRGB(GLubyte r, GLubyte g, GLubyte b) : R(r), G(g), B(b) +{ +} + +GLColorRGB::GLColorRGB(const Vector3 &floatColor) + : R(ColorDenorm(floatColor.x)), G(ColorDenorm(floatColor.y)), B(ColorDenorm(floatColor.z)) +{ +} + +GLColor::GLColor() : R(0), G(0), B(0), A(0) +{ +} + +GLColor::GLColor(GLubyte r, GLubyte g, GLubyte b, GLubyte a) : R(r), G(g), B(b), A(a) +{ +} + +GLColor::GLColor(const Vector4 &floatColor) + : R(ColorDenorm(floatColor.x)), + G(ColorDenorm(floatColor.y)), + B(ColorDenorm(floatColor.z)), + A(ColorDenorm(floatColor.w)) +{ +} + +GLColor::GLColor(GLuint colorValue) : R(0), G(0), B(0), A(0) +{ + memcpy(&R, &colorValue, sizeof(GLuint)); +} + +Vector4 GLColor::toNormalizedVector() const +{ + return Vector4(ColorNorm(R), ColorNorm(G), ColorNorm(B), ColorNorm(A)); +} + +GLColor ReadColor(GLint x, GLint y) +{ + GLColor actual; + glReadPixels((x), (y), 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &actual.R); + EXPECT_GL_NO_ERROR(); + return actual; +} + +bool operator==(const GLColor &a, const GLColor &b) +{ + return a.R == b.R && a.G == b.G && a.B == b.B && a.A == b.A; +} + +std::ostream &operator<<(std::ostream &ostream, const GLColor &color) +{ + ostream << "(" << static_cast<unsigned int>(color.R) << ", " + << static_cast<unsigned int>(color.G) << ", " << static_cast<unsigned int>(color.B) + << ", " << static_cast<unsigned int>(color.A) << ")"; + return ostream; +} + +} // namespace angle + +// static +std::array<Vector3, 6> ANGLETest::GetQuadVertices() +{ + std::array<Vector3, 6> vertices; + vertices[0] = Vector3(-1.0f, 1.0f, 0.5f); + vertices[1] = Vector3(-1.0f, -1.0f, 0.5f); + vertices[2] = Vector3(1.0f, -1.0f, 0.5f); + vertices[3] = Vector3(-1.0f, 1.0f, 0.5f); + vertices[4] = Vector3(1.0f, -1.0f, 0.5f); + vertices[5] = Vector3(1.0f, 1.0f, 0.5f); + return vertices; +} + +ANGLETest::ANGLETest() + : mEGLWindow(nullptr), + mWidth(16), + mHeight(16), + mIgnoreD3D11SDKLayersWarnings(false), + mQuadVertexBuffer(0) +{ + mEGLWindow = + new EGLWindow(GetParam().majorVersion, GetParam().minorVersion, GetParam().eglParameters); +} + +ANGLETest::~ANGLETest() +{ + if (mQuadVertexBuffer) + { + glDeleteBuffers(1, &mQuadVertexBuffer); + } + SafeDelete(mEGLWindow); +} + +void ANGLETest::SetUp() +{ + angle::g_testPlatformInstance.enableMessages(); + + // Resize the window before creating the context so that the first make current + // sets the viewport and scissor box to the right size. + bool needSwap = false; + if (mOSWindow->getWidth() != mWidth || mOSWindow->getHeight() != mHeight) + { + if (!mOSWindow->resize(mWidth, mHeight)) + { + FAIL() << "Failed to resize ANGLE test window."; + } + needSwap = true; + } + + if (!createEGLContext()) + { + FAIL() << "egl context creation failed."; + } + + if (needSwap) + { + // Swap the buffers so that the default framebuffer picks up the resize + // which will allow follow-up test code to assume the framebuffer covers + // the whole window. + swapBuffers(); + } + + // This Viewport command is not strictly necessary but we add it so that programs + // taking OpenGL traces can guess the size of the default framebuffer and show it + // in their UIs + glViewport(0, 0, mWidth, mHeight); + + const auto &info = testing::UnitTest::GetInstance()->current_test_info(); + angle::WriteDebugMessage("Entering %s.%s\n", info->test_case_name(), info->name()); +} + +void ANGLETest::TearDown() +{ + checkD3D11SDKLayersMessages(); + + const auto &info = testing::UnitTest::GetInstance()->current_test_info(); + angle::WriteDebugMessage("Exiting %s.%s\n", info->test_case_name(), info->name()); + + swapBuffers(); + mOSWindow->messageLoop(); + + if (!destroyEGLContext()) + { + FAIL() << "egl context destruction failed."; + } + + // Check for quit message + Event myEvent; + while (mOSWindow->popEvent(&myEvent)) + { + if (myEvent.Type == Event::EVENT_CLOSED) + { + exit(0); + } + } +} + +void ANGLETest::swapBuffers() +{ + if (mEGLWindow->isGLInitialized()) + { + mEGLWindow->swap(); + } +} + +void ANGLETest::setupQuadVertexBuffer(GLfloat positionAttribZ, GLfloat positionAttribXYScale) +{ + if (mQuadVertexBuffer == 0) + { + glGenBuffers(1, &mQuadVertexBuffer); + } + + auto quadVertices = GetQuadVertices(); + for (Vector3 &vertex : quadVertices) + { + vertex.x *= positionAttribXYScale; + vertex.y *= positionAttribXYScale; + vertex.z = positionAttribZ; + } + + glBindBuffer(GL_ARRAY_BUFFER, mQuadVertexBuffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 3 * 6, quadVertices.data(), GL_STATIC_DRAW); +} + +void ANGLETest::setupIndexedQuadVertexBuffer(GLfloat positionAttribZ, GLfloat positionAttribXYScale) +{ + if (mQuadVertexBuffer == 0) + { + glGenBuffers(1, &mQuadVertexBuffer); + } + + auto quadVertices = angle::GetIndexedQuadVertices(); + for (Vector3 &vertex : quadVertices) + { + vertex.x *= positionAttribXYScale; + vertex.y *= positionAttribXYScale; + vertex.z = positionAttribZ; + } + + glBindBuffer(GL_ARRAY_BUFFER, mQuadVertexBuffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 3 * 4, quadVertices.data(), GL_STATIC_DRAW); +} + +// static +void ANGLETest::drawQuad(GLuint program, + const std::string &positionAttribName, + GLfloat positionAttribZ) +{ + drawQuad(program, positionAttribName, positionAttribZ, 1.0f); +} + +// static +void ANGLETest::drawQuad(GLuint program, + const std::string &positionAttribName, + GLfloat positionAttribZ, + GLfloat positionAttribXYScale) +{ + drawQuad(program, positionAttribName, positionAttribZ, positionAttribXYScale, false); +} + +void ANGLETest::drawQuad(GLuint program, + const std::string &positionAttribName, + GLfloat positionAttribZ, + GLfloat positionAttribXYScale, + bool useVertexBuffer) +{ + GLint previousProgram = 0; + glGetIntegerv(GL_CURRENT_PROGRAM, &previousProgram); + if (previousProgram != static_cast<GLint>(program)) + { + glUseProgram(program); + } + + GLint positionLocation = glGetAttribLocation(program, positionAttribName.c_str()); + + if (useVertexBuffer) + { + setupQuadVertexBuffer(positionAttribZ, positionAttribXYScale); + glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, 0); + glBindBuffer(GL_ARRAY_BUFFER, 0); + } + else + { + auto quadVertices = GetQuadVertices(); + for (Vector3 &vertex : quadVertices) + { + vertex.x *= positionAttribXYScale; + vertex.y *= positionAttribXYScale; + vertex.z = positionAttribZ; + } + + glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, quadVertices.data()); + } + glEnableVertexAttribArray(positionLocation); + + glDrawArrays(GL_TRIANGLES, 0, 6); + + glDisableVertexAttribArray(positionLocation); + glVertexAttribPointer(positionLocation, 4, GL_FLOAT, GL_FALSE, 0, NULL); + + if (previousProgram != static_cast<GLint>(program)) + { + glUseProgram(previousProgram); + } +} + +void ANGLETest::drawIndexedQuad(GLuint program, + const std::string &positionAttribName, + GLfloat positionAttribZ) +{ + drawIndexedQuad(program, positionAttribName, positionAttribZ, 1.0f); +} + +void ANGLETest::drawIndexedQuad(GLuint program, + const std::string &positionAttribName, + GLfloat positionAttribZ, + GLfloat positionAttribXYScale) +{ + GLint positionLocation = glGetAttribLocation(program, positionAttribName.c_str()); + + GLint activeProgram = 0; + glGetIntegerv(GL_CURRENT_PROGRAM, &activeProgram); + if (static_cast<GLuint>(activeProgram) != program) + { + glUseProgram(program); + } + + GLuint prevBinding = 0; + glGetIntegerv(GL_ARRAY_BUFFER_BINDING, reinterpret_cast<GLint *>(&prevBinding)); + + setupIndexedQuadVertexBuffer(positionAttribZ, positionAttribXYScale); + + glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, nullptr); + glEnableVertexAttribArray(positionLocation); + glBindBuffer(GL_ARRAY_BUFFER, prevBinding); + + const GLushort indices[] = { + 0, 1, 2, 0, 2, 3, + }; + + glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices); + + glDisableVertexAttribArray(positionLocation); + glVertexAttribPointer(positionLocation, 4, GL_FLOAT, GL_FALSE, 0, NULL); + + if (static_cast<GLuint>(activeProgram) != program) + { + glUseProgram(static_cast<GLuint>(activeProgram)); + } +} + +GLuint ANGLETest::compileShader(GLenum type, const std::string &source) +{ + GLuint shader = glCreateShader(type); + + const char *sourceArray[1] = { source.c_str() }; + glShaderSource(shader, 1, sourceArray, NULL); + glCompileShader(shader); + + GLint compileResult; + glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult); + + if (compileResult == 0) + { + GLint infoLogLength; + glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength); + + if (infoLogLength == 0) + { + std::cerr << "shader compilation failed with empty log." << std::endl; + } + else + { + std::vector<GLchar> infoLog(infoLogLength); + glGetShaderInfoLog(shader, static_cast<GLsizei>(infoLog.size()), NULL, &infoLog[0]); + + std::cerr << "shader compilation failed: " << &infoLog[0]; + } + + glDeleteShader(shader); + shader = 0; + } + + return shader; +} + +void ANGLETest::checkD3D11SDKLayersMessages() +{ +#if defined(ANGLE_PLATFORM_WINDOWS) && !defined(NDEBUG) + // In debug D3D11 mode, check ID3D11InfoQueue to see if any D3D11 SDK Layers messages + // were outputted by the test + if (mIgnoreD3D11SDKLayersWarnings || + mEGLWindow->getPlatform().renderer != EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE || + mEGLWindow->getDisplay() == EGL_NO_DISPLAY) + { + return; + } + + const char *extensionString = + static_cast<const char *>(eglQueryString(mEGLWindow->getDisplay(), EGL_EXTENSIONS)); + if (!strstr(extensionString, "EGL_EXT_device_query")) + { + return; + } + + EGLAttrib device = 0; + EGLAttrib angleDevice = 0; + + PFNEGLQUERYDISPLAYATTRIBEXTPROC queryDisplayAttribEXT; + PFNEGLQUERYDEVICEATTRIBEXTPROC queryDeviceAttribEXT; + + queryDisplayAttribEXT = reinterpret_cast<PFNEGLQUERYDISPLAYATTRIBEXTPROC>( + eglGetProcAddress("eglQueryDisplayAttribEXT")); + queryDeviceAttribEXT = reinterpret_cast<PFNEGLQUERYDEVICEATTRIBEXTPROC>( + eglGetProcAddress("eglQueryDeviceAttribEXT")); + ASSERT_NE(nullptr, queryDisplayAttribEXT); + ASSERT_NE(nullptr, queryDeviceAttribEXT); + + ASSERT_EGL_TRUE(queryDisplayAttribEXT(mEGLWindow->getDisplay(), EGL_DEVICE_EXT, &angleDevice)); + ASSERT_EGL_TRUE(queryDeviceAttribEXT(reinterpret_cast<EGLDeviceEXT>(angleDevice), + EGL_D3D11_DEVICE_ANGLE, &device)); + ID3D11Device *d3d11Device = reinterpret_cast<ID3D11Device *>(device); + + ID3D11InfoQueue *infoQueue = nullptr; + HRESULT hr = + d3d11Device->QueryInterface(__uuidof(infoQueue), reinterpret_cast<void **>(&infoQueue)); + if (SUCCEEDED(hr)) + { + UINT64 numStoredD3DDebugMessages = + infoQueue->GetNumStoredMessagesAllowedByRetrievalFilter(); + + if (numStoredD3DDebugMessages > 0) + { + for (UINT64 i = 0; i < numStoredD3DDebugMessages; i++) + { + SIZE_T messageLength = 0; + hr = infoQueue->GetMessage(i, nullptr, &messageLength); + + if (SUCCEEDED(hr)) + { + D3D11_MESSAGE *pMessage = + reinterpret_cast<D3D11_MESSAGE *>(malloc(messageLength)); + infoQueue->GetMessage(i, pMessage, &messageLength); + + std::cout << "Message " << i << ":" + << " " << pMessage->pDescription << "\n"; + free(pMessage); + } + } + + FAIL() << numStoredD3DDebugMessages + << " D3D11 SDK Layers message(s) detected! Test Failed.\n"; + } + } + + SafeRelease(infoQueue); +#endif +} + +static bool checkExtensionExists(const char *allExtensions, const std::string &extName) +{ + return strstr(allExtensions, extName.c_str()) != nullptr; +} + +bool ANGLETest::extensionEnabled(const std::string &extName) +{ + return checkExtensionExists(reinterpret_cast<const char *>(glGetString(GL_EXTENSIONS)), + extName); +} + +bool ANGLETest::eglDisplayExtensionEnabled(EGLDisplay display, const std::string &extName) +{ + return checkExtensionExists(eglQueryString(display, EGL_EXTENSIONS), extName); +} + +bool ANGLETest::eglClientExtensionEnabled(const std::string &extName) +{ + return checkExtensionExists(eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS), extName); +} + +bool ANGLETest::eglDeviceExtensionEnabled(EGLDeviceEXT device, const std::string &extName) +{ + PFNEGLQUERYDEVICESTRINGEXTPROC eglQueryDeviceStringEXT = + reinterpret_cast<PFNEGLQUERYDEVICESTRINGEXTPROC>( + eglGetProcAddress("eglQueryDeviceStringEXT")); + return checkExtensionExists(eglQueryDeviceStringEXT(device, EGL_EXTENSIONS), extName); +} + +void ANGLETest::setWindowWidth(int width) +{ + mWidth = width; +} + +void ANGLETest::setWindowHeight(int height) +{ + mHeight = height; +} + +void ANGLETest::setConfigRedBits(int bits) +{ + mEGLWindow->setConfigRedBits(bits); +} + +void ANGLETest::setConfigGreenBits(int bits) +{ + mEGLWindow->setConfigGreenBits(bits); +} + +void ANGLETest::setConfigBlueBits(int bits) +{ + mEGLWindow->setConfigBlueBits(bits); +} + +void ANGLETest::setConfigAlphaBits(int bits) +{ + mEGLWindow->setConfigAlphaBits(bits); +} + +void ANGLETest::setConfigDepthBits(int bits) +{ + mEGLWindow->setConfigDepthBits(bits); +} + +void ANGLETest::setConfigStencilBits(int bits) +{ + mEGLWindow->setConfigStencilBits(bits); +} + +void ANGLETest::setMultisampleEnabled(bool enabled) +{ + mEGLWindow->setMultisample(enabled); +} + +void ANGLETest::setDebugEnabled(bool enabled) +{ + mEGLWindow->setDebugEnabled(enabled); +} + +void ANGLETest::setNoErrorEnabled(bool enabled) +{ + mEGLWindow->setNoErrorEnabled(enabled); +} + +void ANGLETest::setWebGLCompatibilityEnabled(bool webglCompatibility) +{ + mEGLWindow->setWebGLCompatibilityEnabled(webglCompatibility); +} + +void ANGLETest::setBindGeneratesResource(bool bindGeneratesResource) +{ + mEGLWindow->setBindGeneratesResource(bindGeneratesResource); +} + +int ANGLETest::getClientMajorVersion() const +{ + return mEGLWindow->getClientMajorVersion(); +} + +int ANGLETest::getClientMinorVersion() const +{ + return mEGLWindow->getClientMinorVersion(); +} + +EGLWindow *ANGLETest::getEGLWindow() const +{ + return mEGLWindow; +} + +int ANGLETest::getWindowWidth() const +{ + return mWidth; +} + +int ANGLETest::getWindowHeight() const +{ + return mHeight; +} + +bool ANGLETest::isMultisampleEnabled() const +{ + return mEGLWindow->isMultisample(); +} + +bool ANGLETest::createEGLContext() +{ + return mEGLWindow->initializeGL(mOSWindow); +} + +bool ANGLETest::destroyEGLContext() +{ + mEGLWindow->destroyGL(); + return true; +} + +bool ANGLETest::InitTestWindow() +{ + mOSWindow = CreateOSWindow(); + if (!mOSWindow->initialize("ANGLE_TEST", 128, 128)) + { + return false; + } + + mOSWindow->setVisible(true); + + return true; +} + +bool ANGLETest::DestroyTestWindow() +{ + if (mOSWindow) + { + mOSWindow->destroy(); + delete mOSWindow; + mOSWindow = NULL; + } + + return true; +} + +void ANGLETest::SetWindowVisible(bool isVisible) +{ + mOSWindow->setVisible(isVisible); +} + +bool IsIntel() +{ + std::string rendererString(reinterpret_cast<const char *>(glGetString(GL_RENDERER))); + return (rendererString.find("Intel") != std::string::npos); +} + +bool IsAdreno() +{ + std::string rendererString(reinterpret_cast<const char *>(glGetString(GL_RENDERER))); + return (rendererString.find("Adreno") != std::string::npos); +} + +bool IsAMD() +{ + std::string rendererString(reinterpret_cast<const char *>(glGetString(GL_RENDERER))); + return (rendererString.find("AMD") != std::string::npos) || + (rendererString.find("ATI") != std::string::npos); +} + +bool IsNVIDIA() +{ + std::string rendererString(reinterpret_cast<const char *>(glGetString(GL_RENDERER))); + return (rendererString.find("NVIDIA") != std::string::npos); +} + +bool IsD3D11() +{ + std::string rendererString(reinterpret_cast<const char *>(glGetString(GL_RENDERER))); + return (rendererString.find("Direct3D11 vs_5_0") != std::string::npos); +} + +bool IsD3D11_FL93() +{ + std::string rendererString(reinterpret_cast<const char *>(glGetString(GL_RENDERER))); + return (rendererString.find("Direct3D11 vs_4_0_") != std::string::npos); +} + +bool IsD3D9() +{ + std::string rendererString(reinterpret_cast<const char *>(glGetString(GL_RENDERER))); + return (rendererString.find("Direct3D9") != std::string::npos); +} + +bool IsD3DSM3() +{ + return IsD3D9() || IsD3D11_FL93(); +} + +bool IsDesktopOpenGL() +{ + return IsOpenGL() && !IsOpenGLES(); +} + +bool IsOpenGLES() +{ + std::string rendererString(reinterpret_cast<const char *>(glGetString(GL_RENDERER))); + return (rendererString.find("OpenGL ES") != std::string::npos); +} + +bool IsOpenGL() +{ + std::string rendererString(reinterpret_cast<const char *>(glGetString(GL_RENDERER))); + return (rendererString.find("OpenGL") != std::string::npos); +} + +bool IsAndroid() +{ +#if defined(ANGLE_PLATFORM_ANDROID) + return true; +#else + return false; +#endif +} + +bool IsLinux() +{ +#if defined(ANGLE_PLATFORM_LINUX) + return true; +#else + return false; +#endif +} + +bool IsOSX() +{ +#if defined(ANGLE_PLATFORM_APPLE) + return true; +#else + return false; +#endif +} + +bool IsWindows() +{ +#if defined(ANGLE_PLATFORM_WINDOWS) + return true; +#else + return false; +#endif +} + +bool IsDebug() +{ +#if !defined(NDEBUG) + return true; +#else + return false; +#endif +} + +bool IsRelease() +{ + return !IsDebug(); +} + +EGLint ANGLETest::getPlatformRenderer() const +{ + assert(mEGLWindow); + return mEGLWindow->getPlatform().renderer; +} + +void ANGLETest::ignoreD3D11SDKLayersWarnings() +{ + // Some tests may need to disable the D3D11 SDK Layers Warnings checks + mIgnoreD3D11SDKLayersWarnings = true; +} + +OSWindow *ANGLETest::mOSWindow = NULL; + +void ANGLETestEnvironment::SetUp() +{ + mGLESLibrary.reset(angle::loadLibrary("libGLESv2")); + if (mGLESLibrary) + { + auto initFunc = reinterpret_cast<ANGLEPlatformInitializeFunc>( + mGLESLibrary->getSymbol("ANGLEPlatformInitialize")); + if (initFunc) + { + initFunc(&angle::g_testPlatformInstance); + } + } + + if (!ANGLETest::InitTestWindow()) + { + FAIL() << "Failed to create ANGLE test window."; + } +} + +void ANGLETestEnvironment::TearDown() +{ + ANGLETest::DestroyTestWindow(); + + if (mGLESLibrary) + { + auto shutdownFunc = reinterpret_cast<ANGLEPlatformShutdownFunc>( + mGLESLibrary->getSymbol("ANGLEPlatformShutdown")); + if (shutdownFunc) + { + shutdownFunc(); + } + } +} + +void IgnoreANGLEPlatformMessages() +{ + // Negative tests may trigger expected errors/warnings in the ANGLE Platform. + angle::g_testPlatformInstance.ignoreMessages(); +} diff --git a/gfx/angle/src/tests/test_utils/ANGLETest.h b/gfx/angle/src/tests/test_utils/ANGLETest.h new file mode 100755 index 000000000..a1bef48e6 --- /dev/null +++ b/gfx/angle/src/tests/test_utils/ANGLETest.h @@ -0,0 +1,274 @@ +// +// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// ANGLETest: +// Implementation of common ANGLE testing fixture. +// + +#ifndef ANGLE_TESTS_ANGLE_TEST_H_ +#define ANGLE_TESTS_ANGLE_TEST_H_ + +#include <gtest/gtest.h> +#include <algorithm> +#include <array> + +#include "angle_gl.h" +#include "angle_test_configs.h" +#include "common/angleutils.h" +#include "shader_utils.h" +#include "system_utils.h" +#include "Vector.h" + +#define EXPECT_GL_ERROR(err) EXPECT_EQ(static_cast<GLenum>(err), glGetError()) +#define EXPECT_GL_NO_ERROR() EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()) + +#define ASSERT_GL_ERROR(err) ASSERT_EQ(static_cast<GLenum>(err), glGetError()) +#define ASSERT_GL_NO_ERROR() ASSERT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()) + +#define EXPECT_EGL_ERROR(err) EXPECT_EQ((err), eglGetError()) +#define EXPECT_EGL_SUCCESS() EXPECT_EGL_ERROR(EGL_SUCCESS) + +// EGLBoolean is |unsigned int| but EGL_TRUE is 0, not 0u. +#define ASSERT_EGL_TRUE(a) ASSERT_EQ(static_cast<EGLBoolean>(EGL_TRUE), (a)) +#define ASSERT_EGL_FALSE(a) ASSERT_EQ(static_cast<EGLBoolean>(EGL_FALSE), (a)) +#define EXPECT_EGL_TRUE(a) EXPECT_EQ(static_cast<EGLBoolean>(EGL_TRUE), (a)) +#define EXPECT_EGL_FALSE(a) EXPECT_EQ(static_cast<EGLBoolean>(EGL_FALSE), (a)) + +#define ASSERT_EGL_ERROR(err) ASSERT_EQ((err), eglGetError()) +#define ASSERT_EGL_SUCCESS() ASSERT_EGL_ERROR(EGL_SUCCESS) + +#define ASSERT_GLENUM_EQ(expected, actual) ASSERT_EQ(static_cast<GLenum>(expected), static_cast<GLenum>(actual)) +#define EXPECT_GLENUM_EQ(expected, actual) EXPECT_EQ(static_cast<GLenum>(expected), static_cast<GLenum>(actual)) + +namespace angle +{ +struct GLColorRGB +{ + GLColorRGB(); + GLColorRGB(GLubyte r, GLubyte g, GLubyte b); + GLColorRGB(const Vector3 &floatColor); + + GLubyte R, G, B; + + static const GLColorRGB black; + static const GLColorRGB blue; + static const GLColorRGB green; + static const GLColorRGB red; + static const GLColorRGB yellow; +}; + +struct GLColor +{ + GLColor(); + GLColor(GLubyte r, GLubyte g, GLubyte b, GLubyte a); + GLColor(const Vector4 &floatColor); + GLColor(GLuint colorValue); + + Vector4 toNormalizedVector() const; + + GLubyte R, G, B, A; + + static const GLColor black; + static const GLColor blue; + static const GLColor cyan; + static const GLColor green; + static const GLColor red; + static const GLColor transparentBlack; + static const GLColor white; + static const GLColor yellow; +}; + +// Useful to cast any type to GLubyte. +template <typename TR, typename TG, typename TB, typename TA> +GLColor MakeGLColor(TR r, TG g, TB b, TA a) +{ + return GLColor(static_cast<GLubyte>(r), static_cast<GLubyte>(g), static_cast<GLubyte>(b), + static_cast<GLubyte>(a)); +} + +bool operator==(const GLColor &a, const GLColor &b); +std::ostream &operator<<(std::ostream &ostream, const GLColor &color); +GLColor ReadColor(GLint x, GLint y); + +} // namespace angle + +#define EXPECT_PIXEL_EQ(x, y, r, g, b, a) \ + EXPECT_EQ(angle::MakeGLColor(r, g, b, a), angle::ReadColor(x, y)) + +#define EXPECT_PIXEL_ALPHA_EQ(x, y, a) EXPECT_EQ(a, angle::ReadColor(x, y).A) + +#define EXPECT_PIXEL_COLOR_EQ(x, y, angleColor) EXPECT_EQ(angleColor, angle::ReadColor(x, y)) + +#define EXPECT_PIXEL_NEAR(x, y, r, g, b, a, abs_error) \ +{ \ + GLubyte pixel[4]; \ + glReadPixels((x), (y), 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixel); \ + EXPECT_GL_NO_ERROR(); \ + EXPECT_NEAR((r), pixel[0], abs_error); \ + EXPECT_NEAR((g), pixel[1], abs_error); \ + EXPECT_NEAR((b), pixel[2], abs_error); \ + EXPECT_NEAR((a), pixel[3], abs_error); \ +} + +// TODO(jmadill): Figure out how we can use GLColor's nice printing with EXPECT_NEAR. +#define EXPECT_PIXEL_COLOR_NEAR(x, y, angleColor, abs_error) \ + EXPECT_PIXEL_NEAR(x, y, angleColor.R, angleColor.G, angleColor.B, angleColor.A, abs_error) + +#define EXPECT_COLOR_NEAR(expected, actual, abs_error) \ + \ +{ \ + EXPECT_NEAR(expected.R, actual.R, abs_error); \ + EXPECT_NEAR(expected.G, actual.G, abs_error); \ + EXPECT_NEAR(expected.B, actual.B, abs_error); \ + EXPECT_NEAR(expected.A, actual.A, abs_error); \ + \ +} + +class EGLWindow; +class OSWindow; + +class ANGLETest : public ::testing::TestWithParam<angle::PlatformParameters> +{ + protected: + ANGLETest(); + ~ANGLETest(); + + public: + static bool InitTestWindow(); + static bool DestroyTestWindow(); + static void SetWindowVisible(bool isVisible); + static bool eglDisplayExtensionEnabled(EGLDisplay display, const std::string &extName); + + protected: + virtual void SetUp(); + virtual void TearDown(); + + virtual void swapBuffers(); + + void setupQuadVertexBuffer(GLfloat positionAttribZ, GLfloat positionAttribXYScale); + void setupIndexedQuadVertexBuffer(GLfloat positionAttribZ, GLfloat positionAttribXYScale); + + void drawQuad(GLuint program, const std::string &positionAttribName, GLfloat positionAttribZ); + void drawQuad(GLuint program, + const std::string &positionAttribName, + GLfloat positionAttribZ, + GLfloat positionAttribXYScale); + void drawQuad(GLuint program, + const std::string &positionAttribName, + GLfloat positionAttribZ, + GLfloat positionAttribXYScale, + bool useVertexBuffer); + static std::array<Vector3, 6> GetQuadVertices(); + void drawIndexedQuad(GLuint program, + const std::string &positionAttribName, + GLfloat positionAttribZ); + void drawIndexedQuad(GLuint program, + const std::string &positionAttribName, + GLfloat positionAttribZ, + GLfloat positionAttribXYScale); + + static GLuint compileShader(GLenum type, const std::string &source); + static bool extensionEnabled(const std::string &extName); + static bool eglClientExtensionEnabled(const std::string &extName); + static bool eglDeviceExtensionEnabled(EGLDeviceEXT device, const std::string &extName); + + void setWindowWidth(int width); + void setWindowHeight(int height); + void setConfigRedBits(int bits); + void setConfigGreenBits(int bits); + void setConfigBlueBits(int bits); + void setConfigAlphaBits(int bits); + void setConfigDepthBits(int bits); + void setConfigStencilBits(int bits); + void setMultisampleEnabled(bool enabled); + void setDebugEnabled(bool enabled); + void setNoErrorEnabled(bool enabled); + void setWebGLCompatibilityEnabled(bool webglCompatibility); + void setBindGeneratesResource(bool bindGeneratesResource); + + int getClientMajorVersion() const; + int getClientMinorVersion() const; + + EGLWindow *getEGLWindow() const; + int getWindowWidth() const; + int getWindowHeight() const; + bool isMultisampleEnabled() const; + + EGLint getPlatformRenderer() const; + + void ignoreD3D11SDKLayersWarnings(); + + private: + bool createEGLContext(); + bool destroyEGLContext(); + + void checkD3D11SDKLayersMessages(); + + EGLWindow *mEGLWindow; + int mWidth; + int mHeight; + + bool mIgnoreD3D11SDKLayersWarnings; + + // Used for indexed quad rendering + GLuint mQuadVertexBuffer; + + static OSWindow *mOSWindow; +}; + +class ANGLETestEnvironment : public testing::Environment +{ + public: + void SetUp() override; + void TearDown() override; + + private: + // For loading and freeing platform + std::unique_ptr<angle::Library> mGLESLibrary; +}; + +// Driver vendors +bool IsIntel(); +bool IsAdreno(); +bool IsAMD(); +bool IsNVIDIA(); + +// Renderer back-ends +// Note: FL9_3 is explicitly *not* considered D3D11. +bool IsD3D11(); +bool IsD3D11_FL93(); +// Is a D3D9-class renderer. +bool IsD3D9(); +// Is D3D9 or SM9_3 renderer. +bool IsD3DSM3(); +bool IsDesktopOpenGL(); +bool IsOpenGLES(); +bool IsOpenGL(); + +// Operating systems +bool IsAndroid(); +bool IsLinux(); +bool IsOSX(); +bool IsWindows(); + +// Debug/Release +bool IsDebug(); +bool IsRelease(); + +// Negative tests may trigger expected errors/warnings in the ANGLE Platform. +void IgnoreANGLEPlatformMessages(); + +// Note: git cl format messes up this formatting. +#define ANGLE_SKIP_TEST_IF(COND) \ + \ +if(COND) \ + \ +{ \ + std::cout << "Test skipped: " #COND "." << std::endl; \ + return; \ + \ +} + +#endif // ANGLE_TESTS_ANGLE_TEST_H_ diff --git a/gfx/angle/src/tests/test_utils/angle_test_configs.cpp b/gfx/angle/src/tests/test_utils/angle_test_configs.cpp new file mode 100755 index 000000000..76690ca7b --- /dev/null +++ b/gfx/angle/src/tests/test_utils/angle_test_configs.cpp @@ -0,0 +1,598 @@ +// +// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#include "test_utils/angle_test_configs.h" + +namespace angle +{ + +PlatformParameters::PlatformParameters() + : PlatformParameters(2, 0, EGLPlatformParameters()) +{ +} + +PlatformParameters::PlatformParameters(EGLint majorVersion, EGLint minorVersion, + const EGLPlatformParameters &eglPlatformParameters) + : majorVersion(majorVersion), + minorVersion(minorVersion), + eglParameters(eglPlatformParameters) +{ +} + +EGLint PlatformParameters::getRenderer() const +{ + return eglParameters.renderer; +} + +bool operator<(const PlatformParameters &a, const PlatformParameters &b) +{ + if (a.majorVersion != b.majorVersion) + { + return a.majorVersion < b.majorVersion; + } + + if (a.minorVersion != b.minorVersion) + { + return a.minorVersion < b.minorVersion; + } + + return a.eglParameters < b.eglParameters; +} + +bool operator==(const PlatformParameters &a, const PlatformParameters &b) +{ + return (a.majorVersion == b.majorVersion) && + (a.minorVersion == b.minorVersion) && + (a.eglParameters == b.eglParameters); +} + +std::ostream &operator<<(std::ostream& stream, const PlatformParameters &pp) +{ + stream << "ES" << pp.majorVersion << "_" ; + if (pp.minorVersion != 0) + { + stream << pp.minorVersion << "_"; + } + + switch (pp.eglParameters.renderer) + { + case EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE: + stream << "D3D9"; + break; + case EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE: + stream << "D3D11"; + break; + case EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE: + stream << "OPENGL"; + break; + case EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE: + stream << "OPENGLES"; + break; + case EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE: + stream << "DEFAULT"; + break; + default: + UNREACHABLE(); + break; + } + + if (pp.eglParameters.majorVersion != EGL_DONT_CARE) + { + stream << "_" << pp.eglParameters.majorVersion; + } + + if (pp.eglParameters.minorVersion != EGL_DONT_CARE) + { + stream << "_" << pp.eglParameters.minorVersion; + } + + switch (pp.eglParameters.deviceType) + { + case EGL_DONT_CARE: + case EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE: + // default + break; + + case EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE: + stream << "_NULL"; + break; + + case EGL_PLATFORM_ANGLE_DEVICE_TYPE_REFERENCE_ANGLE: + stream << "_REFERENCE"; + break; + + case EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE: + stream << "_WARP"; + break; + + default: + UNREACHABLE(); + break; + } + + switch (pp.eglParameters.presentPath) + { + case EGL_EXPERIMENTAL_PRESENT_PATH_COPY_ANGLE: + stream << "_PRESENT_PATH_COPY"; + break; + + case EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE: + stream << "_PRESENT_PATH_FAST"; + break; + + case EGL_DONT_CARE: + // default + break; + + default: + UNREACHABLE(); + break; + } + + return stream; +} + +// EGL platforms +namespace egl_platform +{ + +EGLPlatformParameters DEFAULT() +{ + return EGLPlatformParameters(EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE); +} + +EGLPlatformParameters DEFAULT_NULL() +{ + return EGLPlatformParameters( + EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE, + EGL_DONT_CARE, EGL_DONT_CARE, + EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE); +} + +EGLPlatformParameters D3D9() +{ + return EGLPlatformParameters( + EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE, + EGL_DONT_CARE, EGL_DONT_CARE, + EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE); +} + +EGLPlatformParameters D3D9_NULL() +{ + return EGLPlatformParameters( + EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE, + EGL_DONT_CARE, EGL_DONT_CARE, + EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE); +} + +EGLPlatformParameters D3D9_REFERENCE() +{ + return EGLPlatformParameters( + EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE, + EGL_DONT_CARE, EGL_DONT_CARE, + EGL_PLATFORM_ANGLE_DEVICE_TYPE_REFERENCE_ANGLE); +} + +EGLPlatformParameters D3D11() +{ + return EGLPlatformParameters( + EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, + EGL_DONT_CARE, EGL_DONT_CARE, + EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE); +} + +EGLPlatformParameters D3D11(EGLenum presentPath) +{ + return EGLPlatformParameters(EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, EGL_DONT_CARE, EGL_DONT_CARE, + EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE, presentPath); +} + +EGLPlatformParameters D3D11_FL11_1() +{ + return EGLPlatformParameters( + EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, + 11, 1, + EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE); +} + +EGLPlatformParameters D3D11_FL11_0() +{ + return EGLPlatformParameters( + EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, + 11, 0, + EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE); +} + +EGLPlatformParameters D3D11_FL10_1() +{ + return EGLPlatformParameters( + EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, + 10, 1, + EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE); +} + +EGLPlatformParameters D3D11_FL10_0() +{ + return EGLPlatformParameters( + EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, + 10, 0, + EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE); +} + +EGLPlatformParameters D3D11_FL9_3() +{ + return EGLPlatformParameters( + EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, + 9, 3, + EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE); +} + +EGLPlatformParameters D3D11_NULL() +{ + return EGLPlatformParameters( + EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, + EGL_DONT_CARE, EGL_DONT_CARE, + EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE); +} + +EGLPlatformParameters D3D11_WARP() +{ + return EGLPlatformParameters( + EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, + EGL_DONT_CARE, EGL_DONT_CARE, + EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE); +} + +EGLPlatformParameters D3D11_FL11_1_WARP() +{ + return EGLPlatformParameters( + EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, + 11, 1, + EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE); +} + +EGLPlatformParameters D3D11_FL11_0_WARP() +{ + return EGLPlatformParameters( + EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, + 11, 0, + EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE); +} + +EGLPlatformParameters D3D11_FL10_1_WARP() +{ + return EGLPlatformParameters( + EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, + 10, 1, + EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE); +} + +EGLPlatformParameters D3D11_FL10_0_WARP() +{ + return EGLPlatformParameters( + EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, + 10, 0, + EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE); +} + +EGLPlatformParameters D3D11_FL9_3_WARP() +{ + return EGLPlatformParameters( + EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, + 9, 3, + EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE); +} + +EGLPlatformParameters D3D11_REFERENCE() +{ + return EGLPlatformParameters( + EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, + EGL_DONT_CARE, EGL_DONT_CARE, + EGL_PLATFORM_ANGLE_DEVICE_TYPE_REFERENCE_ANGLE); +} + +EGLPlatformParameters D3D11_FL11_1_REFERENCE() +{ + return EGLPlatformParameters( + EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, + 11, 1, + EGL_PLATFORM_ANGLE_DEVICE_TYPE_REFERENCE_ANGLE); +} + +EGLPlatformParameters D3D11_FL11_0_REFERENCE() +{ + return EGLPlatformParameters( + EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, + 11, 0, + EGL_PLATFORM_ANGLE_DEVICE_TYPE_REFERENCE_ANGLE); +} + +EGLPlatformParameters D3D11_FL10_1_REFERENCE() +{ + return EGLPlatformParameters( + EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, + 10, 1, + EGL_PLATFORM_ANGLE_DEVICE_TYPE_REFERENCE_ANGLE); +} + +EGLPlatformParameters D3D11_FL10_0_REFERENCE() +{ + return EGLPlatformParameters( + EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, + 10, 0, + EGL_PLATFORM_ANGLE_DEVICE_TYPE_REFERENCE_ANGLE); +} + +EGLPlatformParameters D3D11_FL9_3_REFERENCE() +{ + return EGLPlatformParameters( + EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, + 9, 3, + EGL_PLATFORM_ANGLE_DEVICE_TYPE_REFERENCE_ANGLE); +} + +EGLPlatformParameters OPENGL() +{ + return EGLPlatformParameters(EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE); +} + + +EGLPlatformParameters OPENGL(EGLint major, EGLint minor) +{ + return EGLPlatformParameters( + EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE, + major, minor, + EGL_DONT_CARE); +} + +EGLPlatformParameters OPENGL_NULL() +{ + return EGLPlatformParameters( + EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE, + 0, 0, + EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE); +} + +EGLPlatformParameters OPENGLES() +{ + return EGLPlatformParameters(EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE); +} + +EGLPlatformParameters OPENGLES(EGLint major, EGLint minor) +{ + return EGLPlatformParameters(EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE, major, minor, + EGL_DONT_CARE); +} + +} // namespace egl_platform + +// ANGLE tests platforms +PlatformParameters ES2_D3D9() +{ + return PlatformParameters(2, 0, egl_platform::D3D9()); +} + +PlatformParameters ES2_D3D9_REFERENCE() +{ + return PlatformParameters(2, 0, egl_platform::D3D9_REFERENCE()); +} + +PlatformParameters ES2_D3D11() +{ + return PlatformParameters(2, 0, egl_platform::D3D11()); +} + +PlatformParameters ES2_D3D11(EGLenum presentPath) +{ + return PlatformParameters(2, 0, egl_platform::D3D11(presentPath)); +} + +PlatformParameters ES2_D3D11_FL11_0() +{ + return PlatformParameters(2, 0, egl_platform::D3D11_FL11_0()); +} + +PlatformParameters ES2_D3D11_FL10_1() +{ + return PlatformParameters(2, 0, egl_platform::D3D11_FL10_1()); +} + +PlatformParameters ES2_D3D11_FL10_0() +{ + return PlatformParameters(2, 0, egl_platform::D3D11_FL10_0()); +} + +PlatformParameters ES2_D3D11_FL9_3() +{ + return PlatformParameters(2, 0, egl_platform::D3D11_FL9_3()); +} + +PlatformParameters ES2_D3D11_WARP() +{ + return PlatformParameters(2, 0, egl_platform::D3D11_WARP()); +} + +PlatformParameters ES2_D3D11_FL11_0_WARP() +{ + return PlatformParameters(2, 0, egl_platform::D3D11_FL11_0_WARP()); +} + +PlatformParameters ES2_D3D11_FL10_1_WARP() +{ + return PlatformParameters(2, 0, egl_platform::D3D11_FL10_1_WARP()); +} + +PlatformParameters ES2_D3D11_FL10_0_WARP() +{ + return PlatformParameters(2, 0, egl_platform::D3D11_FL10_0_WARP()); +} + +PlatformParameters ES2_D3D11_FL9_3_WARP() +{ + return PlatformParameters(2, 0, egl_platform::D3D11_FL9_3_WARP()); +} + +PlatformParameters ES2_D3D11_REFERENCE() +{ + return PlatformParameters(2, 0, egl_platform::D3D11_REFERENCE()); +} + +PlatformParameters ES2_D3D11_FL11_0_REFERENCE() +{ + return PlatformParameters(2, 0, egl_platform::D3D11_FL11_0_REFERENCE()); +} + +PlatformParameters ES2_D3D11_FL10_1_REFERENCE() +{ + return PlatformParameters(2, 0, egl_platform::D3D11_FL10_1_REFERENCE()); +} + +PlatformParameters ES2_D3D11_FL10_0_REFERENCE() +{ + return PlatformParameters(2, 0, egl_platform::D3D11_FL10_0_REFERENCE()); +} + +PlatformParameters ES2_D3D11_FL9_3_REFERENCE() +{ + return PlatformParameters(2, 0, egl_platform::D3D11_FL9_3_REFERENCE()); +} + +PlatformParameters ES3_D3D11() +{ + return PlatformParameters(3, 0, egl_platform::D3D11()); +} + +PlatformParameters ES3_D3D11_FL11_1() +{ + return PlatformParameters(3, 0, egl_platform::D3D11_FL11_1()); +} + +PlatformParameters ES3_D3D11_FL11_0() +{ + return PlatformParameters(3, 0, egl_platform::D3D11_FL11_0()); +} + +PlatformParameters ES3_D3D11_FL10_1() +{ + return PlatformParameters(3, 0, egl_platform::D3D11_FL10_1()); +} + +PlatformParameters ES3_D3D11_FL10_0() +{ + return PlatformParameters(3, 0, egl_platform::D3D11_FL10_0()); +} + +PlatformParameters ES3_D3D11_WARP() +{ + return PlatformParameters(3, 0, egl_platform::D3D11_WARP()); +} + +PlatformParameters ES3_D3D11_FL11_1_WARP() +{ + return PlatformParameters(3, 0, egl_platform::D3D11_FL11_1_WARP()); +} + +PlatformParameters ES3_D3D11_FL11_0_WARP() +{ + return PlatformParameters(3, 0, egl_platform::D3D11_FL11_0_WARP()); +} + +PlatformParameters ES3_D3D11_FL10_1_WARP() +{ + return PlatformParameters(3, 0, egl_platform::D3D11_FL10_1_WARP()); +} + +PlatformParameters ES3_D3D11_FL10_0_WARP() +{ + return PlatformParameters(3, 0, egl_platform::D3D11_FL10_0_WARP()); +} + +PlatformParameters ES3_D3D11_REFERENCE() +{ + return PlatformParameters(3, 0, egl_platform::D3D11_REFERENCE()); +} + +PlatformParameters ES3_D3D11_FL11_1_REFERENCE() +{ + return PlatformParameters(3, 0, egl_platform::D3D11_FL11_1_REFERENCE()); +} + +PlatformParameters ES3_D3D11_FL11_0_REFERENCE() +{ + return PlatformParameters(3, 0, egl_platform::D3D11_FL11_0_REFERENCE()); +} + +PlatformParameters ES3_D3D11_FL10_1_REFERENCE() +{ + return PlatformParameters(3, 0, egl_platform::D3D11_FL10_1_REFERENCE()); +} + +PlatformParameters ES3_D3D11_FL10_0_REFERENCE() +{ + return PlatformParameters(3, 0, egl_platform::D3D11_FL10_0_REFERENCE()); +} + +PlatformParameters ES2_OPENGLES() +{ + return PlatformParameters(2, 0, egl_platform::OPENGLES()); +} + +PlatformParameters ES2_OPENGLES(EGLint major, EGLint minor) +{ + return PlatformParameters(2, 0, egl_platform::OPENGLES(major, minor)); +} + +PlatformParameters ES3_OPENGLES() +{ + return PlatformParameters(3, 0, egl_platform::OPENGLES()); +} + +PlatformParameters ES3_OPENGLES(EGLint major, EGLint minor) +{ + return PlatformParameters(3, 0, egl_platform::OPENGLES(major, minor)); +} + +PlatformParameters ES31_OPENGLES() +{ + return PlatformParameters(3, 1, egl_platform::OPENGLES()); +} + +PlatformParameters ES31_OPENGLES(EGLint major, EGLint minor) +{ + return PlatformParameters(3, 1, egl_platform::OPENGLES(major, minor)); +} + +PlatformParameters ES2_OPENGL() +{ + return PlatformParameters(2, 0, egl_platform::OPENGL()); +} + +PlatformParameters ES2_OPENGL(EGLint major, EGLint minor) +{ + return PlatformParameters(2, 0, egl_platform::OPENGL(major, minor)); +} + +PlatformParameters ES3_OPENGL() +{ + return PlatformParameters(3, 0, egl_platform::OPENGL()); +} + +PlatformParameters ES3_OPENGL(EGLint major, EGLint minor) +{ + return PlatformParameters(3, 0, egl_platform::OPENGL(major, minor)); +} + +PlatformParameters ES31_OPENGL() +{ + return PlatformParameters(3, 1, egl_platform::OPENGL()); +} + +PlatformParameters ES31_OPENGL(EGLint major, EGLint minor) +{ + return PlatformParameters(3, 1, egl_platform::OPENGL(major, minor)); +} + +} // namespace angle diff --git a/gfx/angle/src/tests/test_utils/angle_test_configs.h b/gfx/angle/src/tests/test_utils/angle_test_configs.h new file mode 100755 index 000000000..fa595a556 --- /dev/null +++ b/gfx/angle/src/tests/test_utils/angle_test_configs.h @@ -0,0 +1,144 @@ +// +// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +#ifndef ANGLE_TEST_CONFIGS_H_ +#define ANGLE_TEST_CONFIGS_H_ + +// On Linux EGL/egl.h includes X.h which does defines for some very common +// names that are used by gtest (like None and Bool) and causes a lot of +// compilation errors. To work around this, even if this file doesn't use it, +// we include gtest before EGL so that it compiles fine in other files that +// want to use gtest. +#include <gtest/gtest.h> + +#include <EGL/egl.h> +#include <EGL/eglext.h> + +#include "angle_test_instantiate.h" +#include "EGLWindow.h" + +namespace angle +{ + +struct PlatformParameters +{ + PlatformParameters(); + PlatformParameters(EGLint majorVersion, EGLint minorVersion, + const EGLPlatformParameters &eglPlatformParameters); + + EGLint getRenderer() const; + + EGLint majorVersion; + EGLint minorVersion; + EGLPlatformParameters eglParameters; +}; + +bool operator<(const PlatformParameters &a, const PlatformParameters &b); +bool operator==(const PlatformParameters &a, const PlatformParameters &b); +std::ostream &operator<<(std::ostream& stream, const PlatformParameters &pp); + +// EGL platforms +namespace egl_platform +{ + +EGLPlatformParameters DEFAULT(); +EGLPlatformParameters DEFAULT_NULL(); + +EGLPlatformParameters D3D9(); +EGLPlatformParameters D3D9_NULL(); +EGLPlatformParameters D3D9_REFERENCE(); + +EGLPlatformParameters D3D11(); +EGLPlatformParameters D3D11(EGLenum presentPath); +EGLPlatformParameters D3D11_FL11_1(); +EGLPlatformParameters D3D11_FL11_0(); +EGLPlatformParameters D3D11_FL10_1(); +EGLPlatformParameters D3D11_FL10_0(); +EGLPlatformParameters D3D11_FL9_3(); + +EGLPlatformParameters D3D11_NULL(); + +EGLPlatformParameters D3D11_WARP(); +EGLPlatformParameters D3D11_FL11_1_WARP(); +EGLPlatformParameters D3D11_FL11_0_WARP(); +EGLPlatformParameters D3D11_FL10_1_WARP(); +EGLPlatformParameters D3D11_FL10_0_WARP(); +EGLPlatformParameters D3D11_FL9_3_WARP(); + +EGLPlatformParameters D3D11_REFERENCE(); +EGLPlatformParameters D3D11_FL11_1_REFERENCE(); +EGLPlatformParameters D3D11_FL11_0_REFERENCE(); +EGLPlatformParameters D3D11_FL10_1_REFERENCE(); +EGLPlatformParameters D3D11_FL10_0_REFERENCE(); +EGLPlatformParameters D3D11_FL9_3_REFERENCE(); + +EGLPlatformParameters OPENGL(); +EGLPlatformParameters OPENGL(EGLint major, EGLint minor); +EGLPlatformParameters OPENGL_NULL(); + +EGLPlatformParameters OPENGLES(); +EGLPlatformParameters OPENGLES(EGLint major, EGLint minor); + +} // namespace egl_platform + +// ANGLE tests platforms +PlatformParameters ES2_D3D9(); +PlatformParameters ES2_D3D9_REFERENCE(); + +PlatformParameters ES2_D3D11(); +PlatformParameters ES2_D3D11(EGLenum presentPath); +PlatformParameters ES2_D3D11_FL11_0(); +PlatformParameters ES2_D3D11_FL10_1(); +PlatformParameters ES2_D3D11_FL10_0(); +PlatformParameters ES2_D3D11_FL9_3(); + +PlatformParameters ES2_D3D11_WARP(); +PlatformParameters ES2_D3D11_FL11_0_WARP(); +PlatformParameters ES2_D3D11_FL10_1_WARP(); +PlatformParameters ES2_D3D11_FL10_0_WARP(); +PlatformParameters ES2_D3D11_FL9_3_WARP(); + +PlatformParameters ES2_D3D11_REFERENCE(); +PlatformParameters ES2_D3D11_FL11_0_REFERENCE(); +PlatformParameters ES2_D3D11_FL10_1_REFERENCE(); +PlatformParameters ES2_D3D11_FL10_0_REFERENCE(); +PlatformParameters ES2_D3D11_FL9_3_REFERENCE(); + +PlatformParameters ES3_D3D11(); +PlatformParameters ES3_D3D11_FL11_1(); +PlatformParameters ES3_D3D11_FL11_0(); +PlatformParameters ES3_D3D11_FL10_1(); +PlatformParameters ES3_D3D11_FL10_0(); + +PlatformParameters ES3_D3D11_WARP(); +PlatformParameters ES3_D3D11_FL11_1_WARP(); +PlatformParameters ES3_D3D11_FL11_0_WARP(); +PlatformParameters ES3_D3D11_FL10_1_WARP(); +PlatformParameters ES3_D3D11_FL10_0_WARP(); + +PlatformParameters ES3_D3D11_REFERENCE(); +PlatformParameters ES3_D3D11_FL11_1_REFERENCE(); +PlatformParameters ES3_D3D11_FL11_0_REFERENCE(); +PlatformParameters ES3_D3D11_FL10_1_REFERENCE(); +PlatformParameters ES3_D3D11_FL10_0_REFERENCE(); + +PlatformParameters ES2_OPENGL(); +PlatformParameters ES2_OPENGL(EGLint major, EGLint minor); +PlatformParameters ES3_OPENGL(); +PlatformParameters ES3_OPENGL(EGLint major, EGLint minor); +PlatformParameters ES31_OPENGL(); +PlatformParameters ES31_OPENGL(EGLint major, EGLint minor); + +PlatformParameters ES2_OPENGLES(); +PlatformParameters ES2_OPENGLES(EGLint major, EGLint minor); +PlatformParameters ES3_OPENGLES(); +PlatformParameters ES3_OPENGLES(EGLint major, EGLint minor); +PlatformParameters ES31_OPENGLES(); +PlatformParameters ES31_OPENGLES(EGLint major, EGLint minor); + +} // namespace angle + +#endif // ANGLE_TEST_CONFIGS_H_ diff --git a/gfx/angle/src/tests/test_utils/angle_test_instantiate.cpp b/gfx/angle/src/tests/test_utils/angle_test_instantiate.cpp new file mode 100755 index 000000000..a928d85e1 --- /dev/null +++ b/gfx/angle/src/tests/test_utils/angle_test_instantiate.cpp @@ -0,0 +1,88 @@ +// +// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +// angle_test_instantiate.cpp: Adds support for filtering parameterized +// tests by platform, so we skip unsupported configs. + +#include "test_utils/angle_test_instantiate.h" + +#include <map> +#include <iostream> + +#include "EGLWindow.h" +#include "OSWindow.h" +#include "test_utils/angle_test_configs.h" + +namespace angle +{ + +bool IsPlatformAvailable(const PlatformParameters ¶m) +{ + switch (param.getRenderer()) + { + case EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE: + break; + + case EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE: +#ifndef ANGLE_ENABLE_D3D9 + return false; +#endif + break; + + case EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE: +#ifndef ANGLE_ENABLE_D3D11 + return false; +#endif + break; + + case EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE: + case EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE: +#ifndef ANGLE_ENABLE_OPENGL + return false; +#endif + break; + + default: + UNREACHABLE(); + break; + } + + static std::map<PlatformParameters, bool> paramAvailabilityCache; + auto iter = paramAvailabilityCache.find(param); + if (iter != paramAvailabilityCache.end()) + { + return iter->second; + } + else + { + OSWindow *osWindow = CreateOSWindow(); + bool result = osWindow->initialize("CONFIG_TESTER", 1, 1); + + if (result) + { + EGLWindow *eglWindow = + new EGLWindow(param.majorVersion, param.minorVersion, param.eglParameters); + result = eglWindow->initializeGL(osWindow); + + eglWindow->destroyGL(); + SafeDelete(eglWindow); + } + + osWindow->destroy(); + SafeDelete(osWindow); + + paramAvailabilityCache[param] = result; + + if (!result) + { + std::cout << "Skipping tests using configuration " << param << " because it is not available." << std::endl; + } + + return result; + } +} + +} diff --git a/gfx/angle/src/tests/test_utils/angle_test_instantiate.h b/gfx/angle/src/tests/test_utils/angle_test_instantiate.h new file mode 100755 index 000000000..a7b6a81aa --- /dev/null +++ b/gfx/angle/src/tests/test_utils/angle_test_instantiate.h @@ -0,0 +1,52 @@ +// +// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +// angle_test_instantiate.h: Adds support for filtering parameterized +// tests by platform, so we skip unsupported configs. + +#ifndef ANGLE_TEST_INSTANTIATE_H_ +#define ANGLE_TEST_INSTANTIATE_H_ + +#include <gtest/gtest.h> + +#include "common/debug.h" + +namespace angle +{ + +struct PlatformParameters; + +bool IsPlatformAvailable(const PlatformParameters ¶m); + +// This functions is used to filter which tests should be registered, +// T must be or inherit from angle::PlatformParameters. +template <typename T> +std::vector<T> FilterTestParams(const T *params, size_t numParams) +{ + std::vector<T> filtered; + + for (size_t i = 0; i < numParams; i++) + { + if (IsPlatformAvailable(params[i])) + { + filtered.push_back(params[i]); + } + } + + return filtered; +} + +// Instantiate the test once for each extra argument. The types of all the +// arguments must match, and getRenderer must be implemented for that type. +#define ANGLE_INSTANTIATE_TEST(testName, firstParam, ...) \ + const decltype(firstParam) testName##params[] = { firstParam, ##__VA_ARGS__ }; \ + INSTANTIATE_TEST_CASE_P(, testName, \ + testing::ValuesIn(::angle::FilterTestParams(testName##params, ArraySize(testName##params))), \ + testing::PrintToStringParamName()); + +} // namespace angle + +#endif // ANGLE_TEST_INSTANTIATE_H_ diff --git a/gfx/angle/src/tests/test_utils/compiler_test.cpp b/gfx/angle/src/tests/test_utils/compiler_test.cpp new file mode 100755 index 000000000..873541ecd --- /dev/null +++ b/gfx/angle/src/tests/test_utils/compiler_test.cpp @@ -0,0 +1,256 @@ +// +// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// compiler_test.cpp: +// utilities for compiler unit tests. + +#include "tests/test_utils/compiler_test.h" + +#include "angle_gl.h" +#include "compiler/translator/Compiler.h" + +namespace sh +{ + +namespace +{ + +class ShaderVariableFinder : public TIntermTraverser +{ + public: + ShaderVariableFinder(const TString &variableName, TBasicType basicType) + : TIntermTraverser(true, false, false), + mVariableName(variableName), + mNodeFound(nullptr), + mBasicType(basicType) + { + } + + void visitSymbol(TIntermSymbol *node) + { + if (node->getBasicType() == mBasicType && node->getSymbol() == mVariableName) + { + mNodeFound = node; + } + } + + bool isFound() const { return mNodeFound != nullptr; } + const TIntermSymbol *getNode() const { return mNodeFound; } + + private: + TString mVariableName; + TIntermSymbol *mNodeFound; + TBasicType mBasicType; +}; + +class FunctionCallFinder : public TIntermTraverser +{ + public: + FunctionCallFinder(const TString &functionName) + : TIntermTraverser(true, false, false), mFunctionName(functionName), mNodeFound(nullptr) + { + } + + bool visitAggregate(Visit visit, TIntermAggregate *node) override + { + if (node->getOp() == EOpFunctionCall && + node->getFunctionSymbolInfo()->getName() == mFunctionName) + { + mNodeFound = node; + return false; + } + return true; + } + + bool isFound() const { return mNodeFound != nullptr; } + const TIntermAggregate *getNode() const { return mNodeFound; } + + private: + TString mFunctionName; + TIntermAggregate *mNodeFound; +}; + +} // anonymous namespace + +bool compileTestShader(GLenum type, + ShShaderSpec spec, + ShShaderOutput output, + const std::string &shaderString, + ShBuiltInResources *resources, + ShCompileOptions compileOptions, + std::string *translatedCode, + std::string *infoLog) +{ + sh::TCompiler *translator = sh::ConstructCompiler(type, spec, output); + if (!translator->Init(*resources)) + { + SafeDelete(translator); + return false; + } + + const char *shaderStrings[] = { shaderString.c_str() }; + + bool compilationSuccess = translator->compile(shaderStrings, 1, SH_OBJECT_CODE | compileOptions); + TInfoSink &infoSink = translator->getInfoSink(); + if (translatedCode) + *translatedCode = infoSink.obj.c_str(); + if (infoLog) + *infoLog = infoSink.info.c_str(); + SafeDelete(translator); + return compilationSuccess; +} + +bool compileTestShader(GLenum type, + ShShaderSpec spec, + ShShaderOutput output, + const std::string &shaderString, + ShCompileOptions compileOptions, + std::string *translatedCode, + std::string *infoLog) +{ + ShBuiltInResources resources; + sh::InitBuiltInResources(&resources); + return compileTestShader(type, spec, output, shaderString, &resources, compileOptions, translatedCode, infoLog); +} + +MatchOutputCodeTest::MatchOutputCodeTest(GLenum shaderType, + ShCompileOptions defaultCompileOptions, + ShShaderOutput outputType) + : mShaderType(shaderType), mDefaultCompileOptions(defaultCompileOptions) +{ + sh::InitBuiltInResources(&mResources); + mOutputCode[outputType] = std::string(); +} + +void MatchOutputCodeTest::addOutputType(const ShShaderOutput outputType) +{ + mOutputCode[outputType] = std::string(); +} + +ShBuiltInResources *MatchOutputCodeTest::getResources() +{ + return &mResources; +} + +void MatchOutputCodeTest::compile(const std::string &shaderString) +{ + compile(shaderString, mDefaultCompileOptions); +} + +void MatchOutputCodeTest::compile(const std::string &shaderString, + const ShCompileOptions compileOptions) +{ + std::string infoLog; + for (auto &code : mOutputCode) + { + bool compilationSuccess = + compileWithSettings(code.first, shaderString, compileOptions, &code.second, &infoLog); + if (!compilationSuccess) + { + FAIL() << "Shader compilation failed:\n" << infoLog; + } + } +} + +bool MatchOutputCodeTest::compileWithSettings(ShShaderOutput output, + const std::string &shaderString, + const ShCompileOptions compileOptions, + std::string *translatedCode, + std::string *infoLog) +{ + return compileTestShader(mShaderType, SH_GLES3_SPEC, output, shaderString, &mResources, + compileOptions, translatedCode, infoLog); +} + +bool MatchOutputCodeTest::foundInCode(ShShaderOutput output, const char *stringToFind) const +{ + const auto code = mOutputCode.find(output); + EXPECT_NE(mOutputCode.end(), code); + if (code == mOutputCode.end()) + { + return false; + } + + return code->second.find(stringToFind) != std::string::npos; +} + +bool MatchOutputCodeTest::foundInCode(ShShaderOutput output, + const char *stringToFind, + const int expectedOccurrences) const +{ + const auto code = mOutputCode.find(output); + EXPECT_NE(mOutputCode.end(), code); + if (code == mOutputCode.end()) + { + return false; + } + + size_t currentPos = 0; + int occurencesLeft = expectedOccurrences; + while (occurencesLeft-- > 0) + { + auto position = code->second.find(stringToFind, currentPos); + if (position == std::string::npos) + { + return false; + } + currentPos = position + 1; + } + return code->second.find(stringToFind, currentPos) == std::string::npos; +} + +bool MatchOutputCodeTest::foundInCode(const char *stringToFind) const +{ + for (auto &code : mOutputCode) + { + if (!foundInCode(code.first, stringToFind)) + { + return false; + } + } + return true; +} + +bool MatchOutputCodeTest::foundInCode(const char *stringToFind, const int expectedOccurrences) const +{ + for (auto &code : mOutputCode) + { + if (!foundInCode(code.first, stringToFind, expectedOccurrences)) + { + return false; + } + } + return true; +} + +bool MatchOutputCodeTest::notFoundInCode(const char *stringToFind) const +{ + for (auto &code : mOutputCode) + { + if (foundInCode(code.first, stringToFind)) + { + return false; + } + } + return true; +} + +const TIntermSymbol *FindSymbolNode(TIntermNode *root, + const TString &symbolName, + TBasicType basicType) +{ + ShaderVariableFinder finder(symbolName, basicType); + root->traverse(&finder); + return finder.getNode(); +} + +const TIntermAggregate *FindFunctionCallNode(TIntermNode *root, const TString &functionName) +{ + FunctionCallFinder finder(functionName); + root->traverse(&finder); + return finder.getNode(); +} + +} // namespace sh diff --git a/gfx/angle/src/tests/test_utils/compiler_test.h b/gfx/angle/src/tests/test_utils/compiler_test.h new file mode 100755 index 000000000..a0dd2d82a --- /dev/null +++ b/gfx/angle/src/tests/test_utils/compiler_test.h @@ -0,0 +1,103 @@ +// +// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// compiler_test.h: +// utilities for compiler unit tests. + +#ifndef TESTS_TEST_UTILS_COMPILER_TEST_H_ +#define TESTS_TEST_UTILS_COMPILER_TEST_H_ + +#include <map> + +#include "gtest/gtest.h" + +#include "angle_gl.h" +#include "compiler/translator/TranslatorESSL.h" +#include "GLSLANG/ShaderLang.h" + +namespace sh +{ + +bool compileTestShader(GLenum type, + ShShaderSpec spec, + ShShaderOutput output, + const std::string &shaderString, + ShBuiltInResources *resources, + ShCompileOptions compileOptions, + std::string *translatedCode, + std::string *infoLog); + +bool compileTestShader(GLenum type, + ShShaderSpec spec, + ShShaderOutput output, + const std::string &shaderString, + ShCompileOptions compileOptions, + std::string *translatedCode, + std::string *infoLog); + +class MatchOutputCodeTest : public testing::Test +{ + protected: + MatchOutputCodeTest(GLenum shaderType, + ShCompileOptions defaultCompileOptions, + ShShaderOutput outputType); + + void addOutputType(const ShShaderOutput outputType); + + ShBuiltInResources *getResources(); + + // Compile functions clear any results from earlier calls to them. + void compile(const std::string &shaderString); + void compile(const std::string &shaderString, const ShCompileOptions compileOptions); + + bool foundInESSLCode(const char *stringToFind) const + { + return foundInCode(SH_ESSL_OUTPUT, stringToFind); + } + + bool foundInGLSLCode(const char *stringToFind) const + { + return foundInCode(SH_GLSL_COMPATIBILITY_OUTPUT, stringToFind); + } + + bool foundInCode(ShShaderOutput output, const char *stringToFind) const; + + // Test that the string occurs for exactly expectedOccurrences times + bool foundInCode(ShShaderOutput output, + const char *stringToFind, + const int expectedOccurrences) const; + + // Test that the string is found in all outputs + bool foundInCode(const char *stringToFind) const; + + // Test that the string occurs for exactly expectedOccurrences times in all outputs + bool foundInCode(const char *stringToFind, const int expectedOccurrences) const; + + // Test that the string is found in none of the outputs + bool notFoundInCode(const char *stringToFind) const; + + private: + bool compileWithSettings(ShShaderOutput output, + const std::string &shaderString, + ShCompileOptions compileOptions, + std::string *translatedCode, + std::string *infoLog); + + GLenum mShaderType; + ShCompileOptions mDefaultCompileOptions; + ShBuiltInResources mResources; + + std::map<ShShaderOutput, std::string> mOutputCode; +}; + +const TIntermSymbol *FindSymbolNode(TIntermNode *root, + const TString &symbolName, + TBasicType basicType); + +// Returns a pointer to a function call node with a mangled name functionName. +const TIntermAggregate *FindFunctionCallNode(TIntermNode *root, const TString &functionName); +} + +#endif // TESTS_TEST_UTILS_COMPILER_TEST_H_ diff --git a/gfx/angle/src/tests/test_utils/gl_raii.h b/gfx/angle/src/tests/test_utils/gl_raii.h new file mode 100755 index 000000000..b42a56396 --- /dev/null +++ b/gfx/angle/src/tests/test_utils/gl_raii.h @@ -0,0 +1,96 @@ +// +// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// gl_raii: +// Helper methods for containing GL objects like buffers and textures. + +#ifndef ANGLE_TESTS_GL_RAII_H_ +#define ANGLE_TESTS_GL_RAII_H_ + +#include <functional> + +#include "angle_gl.h" + +namespace angle +{ + +// This is a bit of hack to work around a bug in MSVS intellisense, and make it very easy to +// use the correct function pointer type without worrying about the various definitions of +// GL_APICALL. +using GLGen = decltype(glGenBuffers); +using GLDelete = decltype(glDeleteBuffers); + +template <GLGen GenF, GLDelete DeleteF> +class GLWrapper +{ + public: + GLWrapper() {} + ~GLWrapper() { DeleteF(1, &mHandle); } + + GLuint get() + { + if (!mHandle) + { + GenF(1, &mHandle); + } + return mHandle; + } + + private: + GLuint mHandle = 0; +}; + +using GLBuffer = GLWrapper<glGenBuffers, glDeleteBuffers>; +using GLTexture = GLWrapper<glGenTextures, glDeleteTextures>; +using GLFramebuffer = GLWrapper<glGenFramebuffers, glDeleteFramebuffers>; +using GLRenderbuffer = GLWrapper<glGenRenderbuffers, glDeleteRenderbuffers>; +using GLSampler = GLWrapper<glGenSamplers, glDeleteSamplers>; + +class GLProgram +{ + public: + GLProgram(const std::string &vertexShader, const std::string &fragmentShader) + : mHandle(0), mVertexShader(vertexShader), mFragmentShader(fragmentShader) + { + } + + GLProgram(const std::string &computeShader) : mHandle(0), mComputeShader(computeShader) {} + + ~GLProgram() { glDeleteProgram(mHandle); } + + GLuint get() + { + if (mHandle == 0) + { + if (!mComputeShader.empty()) + { + mHandle = CompileComputeProgram(mComputeShader); + } + else + { + mHandle = CompileProgram(mVertexShader, mFragmentShader); + } + } + return mHandle; + } + + private: + GLuint mHandle; + const std::string mVertexShader; + const std::string mFragmentShader; + const std::string mComputeShader; +}; + +#define ANGLE_GL_PROGRAM(name, vertex, fragment) \ + GLProgram name(vertex, fragment); \ + ASSERT_NE(0u, name.get()); + +#define ANGLE_GL_COMPUTE_PROGRAM(name, compute) \ + GLProgram name(compute); \ + ASSERT_NE(0u, name.get()); + +} // namespace angle + +#endif // ANGLE_TESTS_GL_RAII_H_ diff --git a/gfx/angle/src/tests/tests.gyp b/gfx/angle/src/tests/tests.gyp new file mode 100755 index 000000000..3401e994b --- /dev/null +++ b/gfx/angle/src/tests/tests.gyp @@ -0,0 +1,349 @@ +# Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +{ + 'includes': + [ + 'deqp.gypi', + '../../gyp/common_defines.gypi', + ], + 'variables': + { + 'angle_build_conformance_tests%': '0', + + 'rapidjson_include_dir': 'third_party/rapidjson/include', + 'rapidjson_headers': + [ + 'third_party/rapidjson/include/rapidjson/allocators.h', + 'third_party/rapidjson/include/rapidjson/document.h', + 'third_party/rapidjson/include/rapidjson/encodedstream.h', + 'third_party/rapidjson/include/rapidjson/encodings.h', + 'third_party/rapidjson/include/rapidjson/filereadstream.h', + 'third_party/rapidjson/include/rapidjson/filestream.h', + 'third_party/rapidjson/include/rapidjson/filewritestream.h', + 'third_party/rapidjson/include/rapidjson/memorybuffer.h', + 'third_party/rapidjson/include/rapidjson/memorystream.h', + 'third_party/rapidjson/include/rapidjson/prettywriter.h', + 'third_party/rapidjson/include/rapidjson/rapidjson.h', + 'third_party/rapidjson/include/rapidjson/reader.h', + 'third_party/rapidjson/include/rapidjson/stringbuffer.h', + 'third_party/rapidjson/include/rapidjson/writer.h', + 'third_party/rapidjson/include/rapidjson/error/en.h', + 'third_party/rapidjson/include/rapidjson/error/error.h', + 'third_party/rapidjson/include/rapidjson/internal/dtoa.h', + 'third_party/rapidjson/include/rapidjson/internal/itoa.h', + 'third_party/rapidjson/include/rapidjson/internal/meta.h', + 'third_party/rapidjson/include/rapidjson/internal/pow10.h', + 'third_party/rapidjson/include/rapidjson/internal/stack.h', + 'third_party/rapidjson/include/rapidjson/internal/strfunc.h', + 'third_party/rapidjson/include/rapidjson/msinttypes/inttypes.h', + 'third_party/rapidjson/include/rapidjson/msinttypes/stdint.h', + ], + }, + 'conditions': + [ + # GoogleTest doesn't support WinRT + ['angle_build_winrt==0', + { + 'targets': + [ + { + 'target_name': 'angle_test_support', + 'type': 'none', + 'dependencies': + [ + 'angle_internal_gmock', + 'angle_internal_gtest', + ], + }, + ], + }], + ['angle_build_winrt==0', + { + 'targets': + [ + # Hide these targets from Chromium, because it can't + # find our standalone copy of the gtest/gmock sources. + { + 'target_name': 'angle_internal_gtest', + 'type': 'static_library', + 'includes': [ '../../gyp/common_defines.gypi', ], + 'include_dirs': + [ + '<(angle_path)/testing/gtest', + '<(angle_path)/testing/gtest/include', + ], + 'sources': + [ + '<(angle_path)/testing/gtest/src/gtest-all.cc', + ], + 'defines': + [ + '_VARIADIC_MAX=10', + ], + 'all_dependent_settings': + { + 'defines': + [ + '_VARIADIC_MAX=10', + ], + 'include_dirs': + [ + '<(angle_path)/testing/gtest', + '<(angle_path)/testing/gtest/include', + ], + }, + }, + + { + 'target_name': 'angle_internal_gmock', + 'type': 'static_library', + 'includes': [ '../../gyp/common_defines.gypi', ], + 'include_dirs': + [ + '<(angle_path)/testing/gmock', + '<(angle_path)/testing/gmock/include', + '<(angle_path)/testing/gtest/include', + ], + 'sources': + [ + '<(angle_path)/testing/gmock/src/gmock-all.cc', + ], + 'defines': + [ + '_VARIADIC_MAX=10', + ], + 'all_dependent_settings': + { + 'defines': + [ + '_VARIADIC_MAX=10', + ], + 'include_dirs': + [ + '<(angle_path)/testing/gmock', + '<(angle_path)/testing/gmock/include', + '<(angle_path)/testing/gtest/include', + ], + }, + }, + + # These same target names exist on the Chromium side, + # which is forbidden, so we make them conditional on + # ANGLE's standalone build. + { + 'target_name': 'angle_unittests', + 'type': 'executable', + 'includes': + [ + '../../gyp/common_defines.gypi', + 'angle_unittests.gypi', + ], + 'sources': + [ + 'angle_unittests_main.cpp', + ], + 'msvs_settings': + { + 'VCLinkerTool': + { + 'conditions': + [ + ['angle_build_winrt==1', + { + 'AdditionalDependencies': + [ + 'runtimeobject.lib', + ], + }], + ], + }, + }, + 'msvs_disabled_warnings': + [ + 4244, # Conversion from 'type1' to 'type2', possible loss of data + ], + }, + { + 'target_name': 'angle_end2end_tests', + 'type': 'executable', + 'includes': + [ + '../../gyp/common_defines.gypi', + 'angle_end2end_tests.gypi', + ], + 'sources': + [ + 'angle_end2end_tests_main.cpp', + ], + }, + { + 'target_name': 'angle_perftests', + 'type': 'executable', + 'includes': + [ + '../../gyp/common_defines.gypi', + 'angle_perftests.gypi', + ], + 'sources': + [ + 'angle_perftests_main.cpp', + ], + }, + ], + }], + ['OS=="win"', + { + 'conditions': + [ + ['angle_build_conformance_tests', + { + 'variables': + { + 'gles_conformance_tests_output_dir': '<(SHARED_INTERMEDIATE_DIR)/conformance_tests', + 'gles_conformance_tests_input_dir': 'third_party/gles_conformance_tests/conform/GTF_ES/glsl/GTF', + 'gles_conformance_tests_generator_script': 'gles_conformance_tests/generate_gles_conformance_tests.py', + }, + 'targets': + [ + { + 'target_name': 'angle_gles2_conformance_tests', + 'type': 'executable', + 'includes': [ '../../gyp/common_defines.gypi', ], + 'dependencies': + [ + '<(angle_path)/src/angle.gyp:libGLESv2', + '<(angle_path)/src/angle.gyp:libEGL', + 'third_party/gles_conformance_tests/conform/GTF_ES/glsl/GTF/es_cts.gyp:es_cts_test_data', + 'third_party/gles_conformance_tests/conform/GTF_ES/glsl/GTF/es_cts.gyp:es2_cts', + 'angle_test_support', + ], + 'variables': + { + 'gles2_conformance_tests_input_file': '<(gles_conformance_tests_input_dir)/mustpass_es20.run', + 'gles2_conformance_tests_generated_file': '<(gles_conformance_tests_output_dir)/generated_gles2_conformance_tests.cpp', + }, + 'sources': + [ + 'gles_conformance_tests/gles_conformance_tests.cpp', + 'gles_conformance_tests/gles_conformance_tests.h', + 'gles_conformance_tests/gles_conformance_tests_main.cpp', + '<(gles2_conformance_tests_generated_file)', + ], + 'include_dirs': + [ + '<(angle_path)/include', + 'gles_conformance_tests', + ], + 'defines': + [ + 'CONFORMANCE_TESTS_TYPE=CONFORMANCE_TESTS_ES2', + ], + 'msvs_settings': + { + 'VCCLCompilerTool': + { + # MSVS has trouble compiling this due to the obj files becoming too large. + 'AdditionalOptions': [ '/bigobj' ], + }, + }, + 'actions': + [ + { + 'action_name': 'generate_gles2_conformance_tests', + 'message': 'Generating ES2 conformance tests...', + 'msvs_cygwin_shell': 0, + 'inputs': + [ + '<(gles_conformance_tests_generator_script)', + '<(gles2_conformance_tests_input_file)', + ], + 'outputs': + [ + '<(gles2_conformance_tests_generated_file)', + ], + 'action': + [ + 'python', + '<(gles_conformance_tests_generator_script)', + '<(gles2_conformance_tests_input_file)', + '<(gles_conformance_tests_input_dir)', + '<(gles2_conformance_tests_generated_file)', + ], + }, + ], + }, + { + 'target_name': 'angle_gles3_conformance_tests', + 'type': 'executable', + 'includes': [ '../../gyp/common_defines.gypi', ], + 'dependencies': + [ + '<(angle_path)/src/angle.gyp:libGLESv2', + '<(angle_path)/src/angle.gyp:libEGL', + 'third_party/gles_conformance_tests/conform/GTF_ES/glsl/GTF/es_cts.gyp:es_cts_test_data', + 'third_party/gles_conformance_tests/conform/GTF_ES/glsl/GTF/es_cts.gyp:es3_cts', + 'angle_test_support', + ], + 'variables': + { + 'gles3_conformance_tests_input_file': '<(gles_conformance_tests_input_dir)/mustpass_es30.run', + 'gles3_conformance_tests_generated_file': '<(gles_conformance_tests_output_dir)/generated_gles3_conformance_tests.cpp', + }, + 'sources': + [ + 'gles_conformance_tests/gles_conformance_tests.cpp', + 'gles_conformance_tests/gles_conformance_tests.h', + 'gles_conformance_tests/gles_conformance_tests_main.cpp', + '<(gles3_conformance_tests_generated_file)', + ], + 'include_dirs': + [ + '<(angle_path)/include', + 'gles_conformance_tests', + ], + 'defines': + [ + 'CONFORMANCE_TESTS_TYPE=CONFORMANCE_TESTS_ES3', + ], + 'msvs_settings': + { + 'VCCLCompilerTool': + { + # MSVS has trouble compiling this due to the obj files becoming too large. + 'AdditionalOptions': [ '/bigobj' ], + }, + }, + 'actions': + [ + { + 'action_name': 'generate_gles3_conformance_tests', + 'message': 'Generating ES3 conformance tests...', + 'msvs_cygwin_shell': 0, + 'inputs': + [ + '<(gles_conformance_tests_generator_script)', + '<(gles3_conformance_tests_input_file)', + ], + 'outputs': + [ + '<(gles3_conformance_tests_generated_file)', + ], + 'action': + [ + 'python', + '<(gles_conformance_tests_generator_script)', + '<(gles3_conformance_tests_input_file)', + '<(gles_conformance_tests_input_dir)', + '<(gles3_conformance_tests_generated_file)', + ], + }, + ], + }, + ], + }], + ], + }], + ], +} diff --git a/gfx/angle/src/tests/third_party/gpu_test_expectations/HowToMakeChanges.md b/gfx/angle/src/tests/third_party/gpu_test_expectations/HowToMakeChanges.md new file mode 100755 index 000000000..190a3e9c3 --- /dev/null +++ b/gfx/angle/src/tests/third_party/gpu_test_expectations/HowToMakeChanges.md @@ -0,0 +1,22 @@ +Because the ```gpu_test_expectations``` directory is based on parts of Chromium's ```gpu/config``` +directory, we want to keep a patch of the changes added to make it compile with ANGLE. This +will allow us to merge Chromium changes easily in our ```gpu_test_expectations```. + +In order to make a change to this directory, do the following: + + * copy the directory somewhere like in ```gpu_test_expectations_reverted``` + * in ```gpu_test_expectations_reverted``` run ```patch -p 1 -R < angle-mods.patch``` + * do your changes in ```gpu_test_expectations``` + * delete angle-mods.patch in both directories + * run ```diff -rupN gpu_test_expectations_reverted gpu_test_expectations > angle-mods.patch``` + * copy ```angle-mods.patch``` in ```gpu_test_expectations``` + +How to update from Chromium: + + * ```git apply -R angle-mods.patch```, ```git add . -u```, ```git commit``` + * Copy over Chromium files, ```git add . -u```, ```git commit``` + * ```git revert HEAD~``` + * ```rm angle-mods.patch``` + * ```git diff HEAD~ (`)ls(`) > angle-mods.patch```,```git add angle-mods.patch```, ```git commit --amend``` + * ```git rebase -i``` to squash the three patches into one. + diff --git a/gfx/angle/src/tests/third_party/gpu_test_expectations/angle-mods.patch b/gfx/angle/src/tests/third_party/gpu_test_expectations/angle-mods.patch new file mode 100755 index 000000000..8df858c7c --- /dev/null +++ b/gfx/angle/src/tests/third_party/gpu_test_expectations/angle-mods.patch @@ -0,0 +1,868 @@ +diff -rupN gpu_test_expectations_reverted/angle_config.h gpu_test_expectations/angle_config.h +--- gpu_test_expectations_reverted/angle_config.h 1969-12-31 19:00:00.000000000 -0500 ++++ gpu_test_expectations/angle_config.h 2016-08-23 13:50:18.282742505 -0400 +@@ -0,0 +1,66 @@ ++// ++// Copyright 2015 The ANGLE Project Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. ++// ++// angle_config.h: ++// Helpers for importing the gpu test expectations package from Chrome. ++// ++ ++#ifndef GPU_TEST_EXPECTATIONS_ANGLE_CONFIG_H_ ++#define GPU_TEST_EXPECTATIONS_ANGLE_CONFIG_H_ ++ ++#include <stdint.h> ++ ++#include <iostream> ++ ++#include "common/debug.h" ++#include "common/string_utils.h" ++ ++#define DCHECK_EQ(A,B) ASSERT((A) == (B)) ++#define DCHECK_NE(A,B) ASSERT((A) != (B)) ++#define DCHECK(X) ASSERT(X) ++#define LOG(X) std::cerr ++ ++#define GPU_EXPORT ++ ++typedef int32_t int32; ++typedef uint32_t uint32; ++typedef int64_t int64; ++typedef uint64_t uint64; ++ ++// Shim Chromium's base by importing functions in the base namespace. ++namespace base ++{ ++ using angle::kWhitespaceASCII; ++ using angle::TRIM_WHITESPACE; ++ using angle::KEEP_WHITESPACE; ++ using angle::SPLIT_WANT_ALL; ++ using angle::SPLIT_WANT_NONEMPTY; ++ using angle::SplitString; ++ using angle::SplitStringAlongWhitespace; ++ using angle::HexStringToUInt; ++ using angle::ReadFileToString; ++ ++ // StringPrintf is called differently in ANGLE but using cannot change ++ // the name of the imported function. Use a define to change the name. ++ using ::FormatString; ++ #define StringPrintf FormatString ++} ++ ++// TODO(jmadill): other platforms ++// clang-format off ++#if defined(_WIN32) || defined(_WIN64) ++# define OS_WIN ++#elif defined(ANDROID) ++# define OS_ANDROID ++#elif defined(__linux__) ++# define OS_LINUX ++#elif defined(__APPLE__) ++# define OS_MACOSX ++#else ++# error "Unsupported platform" ++#endif ++// clang-format on ++ ++#endif +diff -rupN gpu_test_expectations_reverted/gpu_info.cc gpu_test_expectations/gpu_info.cc +--- gpu_test_expectations_reverted/gpu_info.cc 2016-08-12 21:23:54.884132405 -0400 ++++ gpu_test_expectations/gpu_info.cc 2015-11-30 21:54:30.239267635 -0500 +@@ -2,7 +2,7 @@ + // Use of this source code is governed by a BSD-style license that can be + // found in the LICENSE file. + +-#include "gpu/config/gpu_info.h" ++#include "gpu_info.h" + + namespace { + +@@ -17,31 +17,6 @@ void EnumerateGPUDevice(const gpu::GPUIn + enumerator->EndGPUDevice(); + } + +-void EnumerateVideoDecodeAcceleratorSupportedProfile( +- const gpu::VideoDecodeAcceleratorSupportedProfile& profile, +- gpu::GPUInfo::Enumerator* enumerator) { +- enumerator->BeginVideoDecodeAcceleratorSupportedProfile(); +- enumerator->AddInt("profile", profile.profile); +- enumerator->AddInt("maxResolutionWidth", profile.max_resolution.width()); +- enumerator->AddInt("maxResolutionHeight", profile.max_resolution.height()); +- enumerator->AddInt("minResolutionWidth", profile.min_resolution.width()); +- enumerator->AddInt("minResolutionHeight", profile.min_resolution.height()); +- enumerator->EndVideoDecodeAcceleratorSupportedProfile(); +-} +- +-void EnumerateVideoEncodeAcceleratorSupportedProfile( +- const gpu::VideoEncodeAcceleratorSupportedProfile& profile, +- gpu::GPUInfo::Enumerator* enumerator) { +- enumerator->BeginVideoEncodeAcceleratorSupportedProfile(); +- enumerator->AddInt("profile", profile.profile); +- enumerator->AddInt("maxResolutionWidth", profile.max_resolution.width()); +- enumerator->AddInt("maxResolutionHeight", profile.max_resolution.height()); +- enumerator->AddInt("maxFramerateNumerator", profile.max_framerate_numerator); +- enumerator->AddInt("maxFramerateDenominator", +- profile.max_framerate_denominator); +- enumerator->EndVideoEncodeAcceleratorSupportedProfile(); +-} +- + } // namespace + + namespace gpu { +@@ -68,9 +43,6 @@ GPUInfo::GPUInfo() + in_process_gpu(true), + basic_info_state(kCollectInfoNone), + context_info_state(kCollectInfoNone), +-#if defined(OS_WIN) +- dx_diagnostics_info_state(kCollectInfoNone), +-#endif + jpeg_decode_accelerator_supported(false) { + } + +@@ -78,11 +50,9 @@ GPUInfo::~GPUInfo() { } + + void GPUInfo::EnumerateFields(Enumerator* enumerator) const { + struct GPUInfoKnownFields { +- base::TimeDelta initialization_time; + bool optimus; + bool amd_switchable; + bool lenovo_dcute; +- Version display_link_version; + GPUDevice gpu; + std::vector<GPUDevice> secondary_gpus; + uint64 adapter_luid; +@@ -110,14 +80,6 @@ void GPUInfo::EnumerateFields(Enumerator + bool in_process_gpu; + CollectInfoResult basic_info_state; + CollectInfoResult context_info_state; +-#if defined(OS_WIN) +- CollectInfoResult dx_diagnostics_info_state; +- DxDiagNode dx_diagnostics; +-#endif +- VideoDecodeAcceleratorSupportedProfiles +- video_decode_accelerator_supported_profiles; +- VideoEncodeAcceleratorSupportedProfiles +- video_encode_accelerator_supported_profiles; + bool jpeg_decode_accelerator_supported; + }; + +@@ -136,15 +98,9 @@ void GPUInfo::EnumerateFields(Enumerator + EnumerateGPUDevice(secondary_gpu, enumerator); + + enumerator->BeginAuxAttributes(); +- enumerator->AddTimeDeltaInSecondsF("initializationTime", +- initialization_time); + enumerator->AddBool("optimus", optimus); + enumerator->AddBool("amdSwitchable", amd_switchable); + enumerator->AddBool("lenovoDcute", lenovo_dcute); +- if (display_link_version.IsValid()) { +- enumerator->AddString("displayLinkVersion", +- display_link_version.GetString()); +- } + enumerator->AddInt64("adapterLuid", adapter_luid); + enumerator->AddString("driverVendor", driver_vendor); + enumerator->AddString("driverVersion", driver_version); +@@ -171,14 +127,7 @@ void GPUInfo::EnumerateFields(Enumerator + enumerator->AddBool("inProcessGpu", in_process_gpu); + enumerator->AddInt("basicInfoState", basic_info_state); + enumerator->AddInt("contextInfoState", context_info_state); +-#if defined(OS_WIN) +- enumerator->AddInt("DxDiagnosticsInfoState", dx_diagnostics_info_state); +-#endif + // TODO(kbr): add dx_diagnostics on Windows. +- for (const auto& profile : video_decode_accelerator_supported_profiles) +- EnumerateVideoDecodeAcceleratorSupportedProfile(profile, enumerator); +- for (const auto& profile : video_encode_accelerator_supported_profiles) +- EnumerateVideoEncodeAcceleratorSupportedProfile(profile, enumerator); + enumerator->AddBool("jpegDecodeAcceleratorSupported", + jpeg_decode_accelerator_supported); + enumerator->EndAuxAttributes(); +diff -rupN gpu_test_expectations_reverted/gpu_info.h gpu_test_expectations/gpu_info.h +--- gpu_test_expectations_reverted/gpu_info.h 2016-08-12 21:23:54.884132405 -0400 ++++ gpu_test_expectations/gpu_info.h 2015-11-30 21:54:30.239267635 -0500 +@@ -11,13 +11,7 @@ + #include <string> + #include <vector> + +-#include "base/basictypes.h" +-#include "base/time/time.h" +-#include "base/version.h" +-#include "build/build_config.h" +-#include "gpu/config/dx_diag_node.h" +-#include "gpu/gpu_export.h" +-#include "ui/gfx/geometry/size.h" ++#include "angle_config.h" + + namespace gpu { + +@@ -54,25 +48,6 @@ enum VideoCodecProfile { + VIDEO_CODEC_PROFILE_MAX = VP9PROFILE_ANY, + }; + +-// Specification of a decoding profile supported by a hardware decoder. +-struct GPU_EXPORT VideoDecodeAcceleratorSupportedProfile { +- VideoCodecProfile profile; +- gfx::Size max_resolution; +- gfx::Size min_resolution; +-}; +-using VideoDecodeAcceleratorSupportedProfiles = +- std::vector<VideoDecodeAcceleratorSupportedProfile>; +- +-// Specification of an encoding profile supported by a hardware encoder. +-struct GPU_EXPORT VideoEncodeAcceleratorSupportedProfile { +- VideoCodecProfile profile; +- gfx::Size max_resolution; +- uint32 max_framerate_numerator; +- uint32 max_framerate_denominator; +-}; +-using VideoEncodeAcceleratorSupportedProfiles = +- std::vector<VideoEncodeAcceleratorSupportedProfile>; +- + struct GPU_EXPORT GPUInfo { + struct GPU_EXPORT GPUDevice { + GPUDevice(); +@@ -104,10 +79,6 @@ struct GPU_EXPORT GPUInfo { + return !can_lose_context && !software_rendering; + } + +- // The amount of time taken to get from the process starting to the message +- // loop being pumped. +- base::TimeDelta initialization_time; +- + // Computer has NVIDIA Optimus + bool optimus; + +@@ -117,10 +88,6 @@ struct GPU_EXPORT GPUInfo { + // Lenovo dCute is installed. http://crbug.com/181665. + bool lenovo_dcute; + +- // Version of DisplayLink driver installed. Zero if not installed. +- // http://crbug.com/177611. +- Version display_link_version; +- + // Primary GPU, for exmaple, the discrete GPU in a dual GPU machine. + GPUDevice gpu; + +@@ -213,17 +180,7 @@ struct GPU_EXPORT GPUInfo { + // if the collection fails or not. + CollectInfoResult basic_info_state; + CollectInfoResult context_info_state; +-#if defined(OS_WIN) +- CollectInfoResult dx_diagnostics_info_state; + +- // The information returned by the DirectX Diagnostics Tool. +- DxDiagNode dx_diagnostics; +-#endif +- +- VideoDecodeAcceleratorSupportedProfiles +- video_decode_accelerator_supported_profiles; +- VideoEncodeAcceleratorSupportedProfiles +- video_encode_accelerator_supported_profiles; + bool jpeg_decode_accelerator_supported; + + // Note: when adding new members, please remember to update EnumerateFields +@@ -243,8 +200,6 @@ struct GPU_EXPORT GPUInfo { + virtual void AddInt(const char* name, int value) = 0; + virtual void AddString(const char* name, const std::string& value) = 0; + virtual void AddBool(const char* name, bool value) = 0; +- virtual void AddTimeDeltaInSecondsF(const char* name, +- const base::TimeDelta& value) = 0; + + // Markers indicating that a GPUDevice is being described. + virtual void BeginGPUDevice() = 0; +diff -rupN gpu_test_expectations_reverted/gpu_test_config.cc gpu_test_expectations/gpu_test_config.cc +--- gpu_test_expectations_reverted/gpu_test_config.cc 2016-08-12 21:23:54.884132405 -0400 ++++ gpu_test_expectations/gpu_test_config.cc 2016-09-09 16:40:05.597864465 -0400 +@@ -2,20 +2,205 @@ + // Use of this source code is governed by a BSD-style license that can be + // found in the LICENSE file. + +-#include "gpu/config/gpu_test_config.h" ++#include "gpu_test_config.h" + +-#include "base/logging.h" +-#include "base/sys_info.h" +-#include "gpu/config/gpu_info.h" +-#include "gpu/config/gpu_info_collector.h" +-#include "gpu/config/gpu_test_expectations_parser.h" ++#include "gpu_info.h" ++#include "gpu_test_expectations_parser.h" ++ ++#if defined(OS_LINUX) ++extern "C" { ++# include <pci/pci.h> ++} ++#endif + + #if defined(OS_MACOSX) +-#include "base/mac/mac_util.h" +-#elif defined(OS_WIN) +-#include "base/win/windows_version.h" ++#include "gpu_test_config_mac.h" ++#endif ++ ++using namespace gpu; ++ ++#if defined(OS_WIN) ++ ++namespace base { ++ ++namespace { ++ ++// Disable the deprecated function warning for GetVersionEx ++#pragma warning(disable: 4996) ++ ++class SysInfo ++{ ++ public: ++ static void OperatingSystemVersionNumbers( ++ int32 *major_version, int32 *minor_version, int32 *bugfix_version); ++}; ++ ++// static ++void SysInfo::OperatingSystemVersionNumbers( ++ int32 *major_version, int32 *minor_version, int32 *bugfix_version) ++{ ++ OSVERSIONINFOEX version_info = { sizeof version_info }; ++ ::GetVersionEx(reinterpret_cast<OSVERSIONINFO*>(&version_info)); ++ *major_version = version_info.dwMajorVersion; ++ *minor_version = version_info.dwMinorVersion; ++ *bugfix_version = version_info.dwBuildNumber; ++} ++ ++} // anonymous namespace ++ ++} // namespace base ++ ++void DeviceIDToVendorAndDevice(const std::string& id, ++ uint32* vendor_id, ++ uint32* device_id) { ++ *vendor_id = 0; ++ *device_id = 0; ++ if (id.length() < 21) ++ return; ++ std::string vendor_id_string = id.substr(8, 4); ++ std::string device_id_string = id.substr(17, 4); ++ base::HexStringToUInt(vendor_id_string, vendor_id); ++ base::HexStringToUInt(device_id_string, device_id); ++} ++ ++CollectInfoResult CollectGpuID(uint32* vendor_id, uint32* device_id) { ++ DCHECK(vendor_id && device_id); ++ *vendor_id = 0; ++ *device_id = 0; ++ ++ // Taken from http://developer.nvidia.com/object/device_ids.html ++ DISPLAY_DEVICEA dd; ++ dd.cb = sizeof(DISPLAY_DEVICEA); ++ std::string id; ++ for (int i = 0; EnumDisplayDevicesA(NULL, i, &dd, 0); ++i) { ++ if (dd.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) { ++ id = dd.DeviceID; ++ break; ++ } ++ } ++ ++ if (id.length() > 20) { ++ DeviceIDToVendorAndDevice(id, vendor_id, device_id); ++ if (*vendor_id != 0 && *device_id != 0) ++ return kCollectInfoSuccess; ++ } ++ return kCollectInfoNonFatalFailure; ++} ++ ++#endif // defined(OS_WIN) ++ ++#if defined(OS_LINUX) ++ ++const uint32 kVendorIDIntel = 0x8086; ++const uint32 kVendorIDNVidia = 0x10de; ++const uint32 kVendorIDAMD = 0x1002; ++ ++CollectInfoResult CollectPCIVideoCardInfo(GPUInfo* gpu_info) { ++ DCHECK(gpu_info); ++ ++ struct pci_access* access = pci_alloc(); ++ DCHECK(access != NULL); ++ pci_init(access); ++ pci_scan_bus(access); ++ ++ bool primary_gpu_identified = false; ++ for (pci_dev* device = access->devices; ++ device != NULL; device = device->next) { ++ pci_fill_info(device, 33); ++ bool is_gpu = false; ++ switch (device->device_class) { ++ case PCI_CLASS_DISPLAY_VGA: ++ case PCI_CLASS_DISPLAY_XGA: ++ case PCI_CLASS_DISPLAY_3D: ++ is_gpu = true; ++ break; ++ case PCI_CLASS_DISPLAY_OTHER: ++ default: ++ break; ++ } ++ if (!is_gpu) ++ continue; ++ if (device->vendor_id == 0 || device->device_id == 0) ++ continue; ++ ++ GPUInfo::GPUDevice gpu; ++ gpu.vendor_id = device->vendor_id; ++ gpu.device_id = device->device_id; ++ ++ if (!primary_gpu_identified) { ++ primary_gpu_identified = true; ++ gpu_info->gpu = gpu; ++ } else { ++ // TODO(zmo): if there are multiple GPUs, we assume the non Intel ++ // one is primary. Revisit this logic because we actually don't know ++ // which GPU we are using at this point. ++ if (gpu_info->gpu.vendor_id == kVendorIDIntel && ++ gpu.vendor_id != kVendorIDIntel) { ++ gpu_info->secondary_gpus.push_back(gpu_info->gpu); ++ gpu_info->gpu = gpu; ++ } else { ++ gpu_info->secondary_gpus.push_back(gpu); ++ } ++ } ++ } ++ ++ // Detect Optimus or AMD Switchable GPU. ++ if (gpu_info->secondary_gpus.size() == 1 && ++ gpu_info->secondary_gpus[0].vendor_id == kVendorIDIntel) { ++ if (gpu_info->gpu.vendor_id == kVendorIDNVidia) ++ gpu_info->optimus = true; ++ if (gpu_info->gpu.vendor_id == kVendorIDAMD) ++ gpu_info->amd_switchable = true; ++ } ++ ++ pci_cleanup(access); ++ if (!primary_gpu_identified) ++ return kCollectInfoNonFatalFailure; ++ return kCollectInfoSuccess; ++} ++ ++CollectInfoResult CollectGpuID(uint32* vendor_id, uint32* device_id) { ++ DCHECK(vendor_id && device_id); ++ *vendor_id = 0; ++ *device_id = 0; ++ ++ GPUInfo gpu_info; ++ CollectInfoResult result = CollectPCIVideoCardInfo(&gpu_info); ++ if (result == kCollectInfoSuccess) { ++ *vendor_id = gpu_info.gpu.vendor_id; ++ *device_id = gpu_info.gpu.device_id; ++ } ++ return result; ++} ++ ++#endif // defined(OS_LINUX) ++ ++#if defined(OS_MACOSX) ++ ++CollectInfoResult CollectGpuID(uint32* vendor_id, uint32* device_id) { ++ DCHECK(vendor_id && device_id); ++ ++ GPUInfo::GPUDevice gpu = GetActiveGPU(); ++ *vendor_id = gpu.vendor_id; ++ *device_id = gpu.device_id; ++ ++ if (*vendor_id != 0 && *device_id != 0) ++ return kCollectInfoSuccess; ++ return kCollectInfoNonFatalFailure; ++} ++ + #endif + ++#if defined(OS_ANDROID) ++CollectInfoResult CollectGpuID(uint32 *vendor_id, uint32 *device_id) ++{ ++ DCHECK(vendor_id && device_id); ++ *vendor_id = 0; ++ *device_id = 0; ++ return kCollectInfoNonFatalFailure; ++} ++#endif // defined(OS_ANDROID) ++ + namespace gpu { + + namespace { +@@ -245,33 +430,41 @@ bool GPUTestBotConfig::Matches(const std + return Matches(config); + } + +-bool GPUTestBotConfig::LoadCurrentConfig(const GPUInfo* gpu_info) { +- bool rt; +- if (gpu_info == NULL) { +- GPUInfo my_gpu_info; +- CollectInfoResult result = CollectGpuID( +- &my_gpu_info.gpu.vendor_id, &my_gpu_info.gpu.device_id); +- if (result != kCollectInfoSuccess) { +- LOG(ERROR) << "Fail to identify GPU"; +- DisableGPUInfoValidation(); +- rt = true; +- } else { +- rt = SetGPUInfo(my_gpu_info); ++bool GPUTestBotConfig::LoadCurrentConfig(const GPUInfo *gpu_info) ++{ ++ bool rt; ++ if (gpu_info == NULL) ++ { ++ GPUInfo my_gpu_info; ++ CollectInfoResult result = ++ CollectGpuID(&my_gpu_info.gpu.vendor_id, &my_gpu_info.gpu.device_id); ++ if (result != kCollectInfoSuccess) ++ { ++ LOG(ERROR) << "Fail to identify GPU\n"; ++ DisableGPUInfoValidation(); ++ rt = true; ++ } ++ else ++ { ++ rt = SetGPUInfo(my_gpu_info); ++ } ++ } ++ else ++ { ++ rt = SetGPUInfo(*gpu_info); ++ } ++ set_os(GetCurrentOS()); ++ if (os() == kOsUnknown) ++ { ++ LOG(ERROR) << "Unknown OS\n"; ++ rt = false; + } +- } else { +- rt = SetGPUInfo(*gpu_info); +- } +- set_os(GetCurrentOS()); +- if (os() == kOsUnknown) { +- LOG(ERROR) << "Unknown OS"; +- rt = false; +- } + #if defined(NDEBUG) +- set_build_type(kBuildTypeRelease); ++ set_build_type(kBuildTypeRelease); + #else +- set_build_type(kBuildTypeDebug); ++ set_build_type(kBuildTypeDebug); + #endif +- return rt; ++ return rt; + } + + // static +@@ -295,21 +488,5 @@ bool GPUTestBotConfig::CurrentConfigMatc + return false; + } + +-// static +-bool GPUTestBotConfig::GpuBlacklistedOnBot() { +-#if defined(OS_MACOSX) +- // Blacklist rule #81 disables all Gpu acceleration on Mac < 10.8 bots. +- if (CurrentConfigMatches("MAC VMWARE") && base::mac::IsOSLionOrEarlier()) { +- return true; +- } +-#elif defined(OS_WIN) +- // Blacklist rule #79 disables all Gpu acceleration before Windows 7. +- if (base::win::GetVersion() <= base::win::VERSION_VISTA) { +- return true; +- } +-#endif +- return false; +-} +- + } // namespace gpu + +diff -rupN gpu_test_expectations_reverted/gpu_test_config.h gpu_test_expectations/gpu_test_config.h +--- gpu_test_expectations_reverted/gpu_test_config.h 2016-08-12 21:23:54.884132405 -0400 ++++ gpu_test_expectations/gpu_test_config.h 2015-11-30 21:54:30.239267635 -0500 +@@ -8,9 +8,7 @@ + #include <string> + #include <vector> + +-#include "base/basictypes.h" +-#include "base/compiler_specific.h" +-#include "gpu/gpu_export.h" ++#include "angle_config.h" + + namespace gpu { + +@@ -134,9 +132,6 @@ class GPU_EXPORT GPUTestBotConfig : publ + // Check if this bot's config matches |config_data| or any of the |configs|. + static bool CurrentConfigMatches(const std::string& config_data); + static bool CurrentConfigMatches(const std::vector<std::string>& configs); +- +- // Check if the bot has blacklisted all GPU features. +- static bool GpuBlacklistedOnBot(); + }; + + } // namespace gpu +diff -rupN gpu_test_expectations_reverted/gpu_test_config_mac.h gpu_test_expectations/gpu_test_config_mac.h +--- gpu_test_expectations_reverted/gpu_test_config_mac.h 1969-12-31 19:00:00.000000000 -0500 ++++ gpu_test_expectations/gpu_test_config_mac.h 2015-11-30 21:54:30.239267635 -0500 +@@ -0,0 +1,28 @@ ++// ++// Copyright 2015 The ANGLE Project Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. ++// ++// gpu_test_config_mac.h: ++// Helper functions for gpu_test_config that have to be compiled in ObjectiveC++ ++// ++ ++#ifndef GPU_TEST_EXPECTATIONS_GPU_TEST_CONFIG_MAC_H_ ++#define GPU_TEST_EXPECTATIONS_GPU_TEST_CONFIG_MAC_H_ ++ ++#include "gpu_info.h" ++ ++namespace base { ++ ++class SysInfo ++{ ++ public: ++ static void OperatingSystemVersionNumbers( ++ int32 *major_version, int32 *minor_version, int32 *bugfix_version); ++}; ++ ++} // namespace base ++ ++gpu::GPUInfo::GPUDevice GetActiveGPU(); ++ ++#endif // GPU_TEST_EXPECTATIONS_GPU_TEST_CONFIG_MAC_H_ +diff -rupN gpu_test_expectations_reverted/gpu_test_config_mac.mm gpu_test_expectations/gpu_test_config_mac.mm +--- gpu_test_expectations_reverted/gpu_test_config_mac.mm 1969-12-31 19:00:00.000000000 -0500 ++++ gpu_test_expectations/gpu_test_config_mac.mm 2015-11-30 21:54:30.239267635 -0500 +@@ -0,0 +1,67 @@ ++// Copyright (c) 2012 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. ++ ++// gpu_test_config_mac.mm: ++// Helper functions for gpu_test_config that have to be compiled in ObjectiveC++ ++ ++#include "gpu_test_config_mac.h" ++ ++#import <Cocoa/Cocoa.h> ++ ++namespace base { ++ ++void SysInfo::OperatingSystemVersionNumbers( ++ int32 *major_version, int32 *minor_version, int32 *bugfix_version) ++{ ++#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_8 ++ Gestalt(gestaltSystemVersionMajor, reinterpret_cast<SInt32*>(major_version)); ++ Gestalt(gestaltSystemVersionMinor, reinterpret_cast<SInt32*>(minor_version)); ++ Gestalt(gestaltSystemVersionBugFix, reinterpret_cast<SInt32*>(bugfix_version)); ++#else ++ NSOperatingSystemVersion version = [[NSProcessInfo processInfo] operatingSystemVersion]; ++ *major_version = version.majorVersion; ++ *minor_version = version.minorVersion; ++ *bugfix_version = version.patchVersion; ++#endif ++} ++ ++} // namespace base ++ ++UInt32 GetEntryProperty(io_registry_entry_t entry, CFStringRef property_name) { ++ CFTypeRef type = IORegistryEntrySearchCFProperty(entry, ++ kIOServicePlane, ++ property_name, ++ kCFAllocatorDefault, ++ kIORegistryIterateRecursively | kIORegistryIterateParents); ++ CFDataRef data = reinterpret_cast<CFDataRef>(type); ++ if (!data) { ++ CFRelease(data); ++ return 0; ++ } ++ ++ UInt32 value = 0; ++ const uint32_t* valuePointer = reinterpret_cast<const uint32_t*>(CFDataGetBytePtr(data)); ++ if (valuePointer != NULL) { ++ value = *valuePointer; ++ } ++ CFRelease(data); ++ return value; ++} ++ ++gpu::GPUInfo::GPUDevice GetActiveGPU() { ++ gpu::GPUInfo::GPUDevice gpu; ++ ++ // Ignore the fact that CGDisplayIOServicePort is deprecated as Apple ++ // did not provide a good replacement for it as of 10.10. ++ // TODO(cwallez) revisit with later systems ++ #pragma clang diagnostic push ++ #pragma clang diagnostic ignored "-Wdeprecated-declarations" ++ io_registry_entry_t dsp_port = CGDisplayIOServicePort(kCGDirectMainDisplay); ++ #pragma clang diagnostic pop ++ ++ gpu.vendor_id = GetEntryProperty(dsp_port, CFSTR("vendor-id")); ++ gpu.device_id = GetEntryProperty(dsp_port, CFSTR("device-id")); ++ return gpu; ++} ++ +diff -rupN gpu_test_expectations_reverted/gpu_test_expectations_parser.cc gpu_test_expectations/gpu_test_expectations_parser.cc +--- gpu_test_expectations_reverted/gpu_test_expectations_parser.cc 2016-08-12 21:23:54.884132405 -0400 ++++ gpu_test_expectations/gpu_test_expectations_parser.cc 2015-11-30 21:54:30.239267635 -0500 +@@ -2,14 +2,43 @@ + // Use of this source code is governed by a BSD-style license that can be + // found in the LICENSE file. + +-#include "gpu/config/gpu_test_expectations_parser.h" ++#include "gpu_test_expectations_parser.h" + +-#include "base/files/file_util.h" +-#include "base/logging.h" +-#include "base/strings/string_number_conversions.h" +-#include "base/strings/string_split.h" +-#include "base/strings/string_util.h" +-#include "base/strings/stringprintf.h" ++#include "common/angleutils.h" ++ ++namespace base { ++ ++namespace { ++ ++bool StartsWithASCII(const std::string& str, ++ const std::string& search, ++ bool case_sensitive) { ++ ASSERT(!case_sensitive); ++ return str.compare(0, search.length(), search) == 0; ++} ++ ++template <class Char> inline Char ToLowerASCII(Char c) { ++ return (c >= 'A' && c <= 'Z') ? (c + ('a' - 'A')) : c; ++} ++ ++template<typename Iter> ++static inline bool DoLowerCaseEqualsASCII(Iter a_begin, ++ Iter a_end, ++ const char* b) { ++ for (Iter it = a_begin; it != a_end; ++it, ++b) { ++ if (!*b || base::ToLowerASCII(*it) != *b) ++ return false; ++ } ++ return *b == 0; ++} ++ ++bool LowerCaseEqualsASCII(const std::string& a, const char* b) { ++ return DoLowerCaseEqualsASCII(a.begin(), a.end(), b); ++} ++ ++} // anonymous namespace ++ ++} // namespace base + + namespace gpu { + +@@ -146,9 +175,9 @@ const char* kErrorMessage[] = { + }; + + Token ParseToken(const std::string& word) { +- if (base::StartsWith(word, "//", base::CompareCase::INSENSITIVE_ASCII)) ++ if (base::StartsWithASCII(word, "//", false)) + return kTokenComment; +- if (base::StartsWith(word, "0x", base::CompareCase::INSENSITIVE_ASCII)) ++ if (base::StartsWithASCII(word, "0x", false)) + return kConfigGPUDeviceID; + + for (int32 i = 0; i < kNumberOfExactMatchTokens; ++i) { +@@ -176,10 +205,10 @@ bool NamesMatching(const std::string& re + + GPUTestExpectationsParser::GPUTestExpectationsParser() { + // Some sanity check. +- DCHECK_EQ(static_cast<unsigned int>(kNumberOfExactMatchTokens), +- sizeof(kTokenData) / sizeof(kTokenData[0])); +- DCHECK_EQ(static_cast<unsigned int>(kNumberOfErrors), +- sizeof(kErrorMessage) / sizeof(kErrorMessage[0])); ++ static_assert(static_cast<unsigned int>(kNumberOfExactMatchTokens) == ++ sizeof(kTokenData) / sizeof(kTokenData[0]), "sanity check"); ++ static_assert(static_cast<unsigned int>(kNumberOfErrors) == ++ sizeof(kErrorMessage) / sizeof(kErrorMessage[0]), "sanity check"); + } + + GPUTestExpectationsParser::~GPUTestExpectationsParser() { +@@ -204,8 +233,8 @@ bool GPUTestExpectationsParser::LoadTest + return rt; + } + +-bool GPUTestExpectationsParser::LoadTestExpectations( +- const base::FilePath& path) { ++bool GPUTestExpectationsParser::LoadTestExpectationsFromFile( ++ const std::string& path) { + entries_.clear(); + error_messages_.clear(); + +@@ -399,7 +428,7 @@ bool GPUTestExpectationsParser::ParseLin + stage++; + break; + default: +- DCHECK(false); ++ UNREACHABLE(); + break; + } + } +@@ -488,7 +517,7 @@ bool GPUTestExpectationsParser::UpdateTe + config->set_api(config->api() | kTokenData[token].flag); + break; + default: +- DCHECK(false); ++ UNREACHABLE(); + break; + } + return true; +diff -rupN gpu_test_expectations_reverted/gpu_test_expectations_parser.h gpu_test_expectations/gpu_test_expectations_parser.h +--- gpu_test_expectations_reverted/gpu_test_expectations_parser.h 2016-08-12 21:23:54.884132405 -0400 ++++ gpu_test_expectations/gpu_test_expectations_parser.h 2015-11-30 21:54:30.239267635 -0500 +@@ -8,10 +8,8 @@ + #include <string> + #include <vector> + +-#include "base/basictypes.h" +-#include "base/files/file_path.h" +-#include "gpu/config/gpu_test_config.h" +-#include "gpu/gpu_export.h" ++#include "angle_config.h" ++#include "gpu_test_config.h" + + namespace gpu { + +@@ -32,7 +30,7 @@ class GPU_EXPORT GPUTestExpectationsPars + // save all the entries. Otherwise, generate error messages. + // Return true if parsing succeeds. + bool LoadTestExpectations(const std::string& data); +- bool LoadTestExpectations(const base::FilePath& path); ++ bool LoadTestExpectationsFromFile(const std::string& path); + + // Query error messages from the last LoadTestExpectations() call. + const std::vector<std::string>& GetErrorMessages() const; +diff -rupN gpu_test_expectations_reverted/HowToMakeChanges.md gpu_test_expectations/HowToMakeChanges.md +--- gpu_test_expectations_reverted/HowToMakeChanges.md 1969-12-31 19:00:00.000000000 -0500 ++++ gpu_test_expectations/HowToMakeChanges.md 2016-09-09 16:27:56.575809921 -0400 +@@ -0,0 +1,22 @@ ++Because the ```gpu_test_expectations``` directory is based on parts of Chromium's ```gpu/config``` ++directory, we want to keep a patch of the changes added to make it compile with ANGLE. This ++will allow us to merge Chromium changes easily in our ```gpu_test_expectations```. ++ ++In order to make a change to this directory, do the following: ++ ++ * copy the directory somewhere like in ```gpu_test_expectations_reverted``` ++ * in ```gpu_test_expectations_reverted``` run ```patch -p 1 -R < angle-mods.patch``` ++ * do your changes in ```gpu_test_expectations``` ++ * delete angle-mods.patch in both directories ++ * run ```diff -rupN gpu_test_expectations_reverted gpu_test_expectations > angle-mods.patch``` ++ * copy ```angle-mods.patch``` in ```gpu_test_expectations``` ++ ++How to update from Chromium: ++ ++ * ```git apply -R angle-mods.patch```, ```git add . -u```, ```git commit``` ++ * Copy over Chromium files, ```git add . -u```, ```git commit``` ++ * ```git revert HEAD~``` ++ * ```rm angle-mods.patch``` ++ * ```git diff HEAD~ (`)ls(`) > angle-mods.patch```,```git add angle-mods.patch```, ```git commit --amend``` ++ * ```git rebase -i``` to squash the three patches into one. ++ diff --git a/gfx/angle/src/tests/third_party/gpu_test_expectations/angle_config.h b/gfx/angle/src/tests/third_party/gpu_test_expectations/angle_config.h new file mode 100755 index 000000000..4e46f98cc --- /dev/null +++ b/gfx/angle/src/tests/third_party/gpu_test_expectations/angle_config.h @@ -0,0 +1,66 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// angle_config.h: +// Helpers for importing the gpu test expectations package from Chrome. +// + +#ifndef GPU_TEST_EXPECTATIONS_ANGLE_CONFIG_H_ +#define GPU_TEST_EXPECTATIONS_ANGLE_CONFIG_H_ + +#include <stdint.h> + +#include <iostream> + +#include "common/debug.h" +#include "common/string_utils.h" + +#define DCHECK_EQ(A,B) ASSERT((A) == (B)) +#define DCHECK_NE(A,B) ASSERT((A) != (B)) +#define DCHECK(X) ASSERT(X) +#define LOG(X) std::cerr + +#define GPU_EXPORT + +typedef int32_t int32; +typedef uint32_t uint32; +typedef int64_t int64; +typedef uint64_t uint64; + +// Shim Chromium's base by importing functions in the base namespace. +namespace base +{ + using angle::kWhitespaceASCII; + using angle::TRIM_WHITESPACE; + using angle::KEEP_WHITESPACE; + using angle::SPLIT_WANT_ALL; + using angle::SPLIT_WANT_NONEMPTY; + using angle::SplitString; + using angle::SplitStringAlongWhitespace; + using angle::HexStringToUInt; + using angle::ReadFileToString; + + // StringPrintf is called differently in ANGLE but using cannot change + // the name of the imported function. Use a define to change the name. + using ::FormatString; + #define StringPrintf FormatString +} + +// TODO(jmadill): other platforms +// clang-format off +#if defined(_WIN32) || defined(_WIN64) +# define OS_WIN +#elif defined(ANDROID) +# define OS_ANDROID +#elif defined(__linux__) +# define OS_LINUX +#elif defined(__APPLE__) +# define OS_MACOSX +#else +# error "Unsupported platform" +#endif +// clang-format on + +#endif diff --git a/gfx/angle/src/tests/third_party/gpu_test_expectations/gpu_info.cc b/gfx/angle/src/tests/third_party/gpu_test_expectations/gpu_info.cc new file mode 100755 index 000000000..4f279a429 --- /dev/null +++ b/gfx/angle/src/tests/third_party/gpu_test_expectations/gpu_info.cc @@ -0,0 +1,136 @@ +// Copyright (c) 2012 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. + +#include "gpu_info.h" + +namespace { + +void EnumerateGPUDevice(const gpu::GPUInfo::GPUDevice& device, + gpu::GPUInfo::Enumerator* enumerator) { + enumerator->BeginGPUDevice(); + enumerator->AddInt("vendorId", device.vendor_id); + enumerator->AddInt("deviceId", device.device_id); + enumerator->AddBool("active", device.active); + enumerator->AddString("vendorString", device.vendor_string); + enumerator->AddString("deviceString", device.device_string); + enumerator->EndGPUDevice(); +} + +} // namespace + +namespace gpu { + +GPUInfo::GPUDevice::GPUDevice() + : vendor_id(0), + device_id(0), + active(false) { +} + +GPUInfo::GPUDevice::~GPUDevice() { } + +GPUInfo::GPUInfo() + : optimus(false), + amd_switchable(false), + lenovo_dcute(false), + adapter_luid(0), + gl_reset_notification_strategy(0), + can_lose_context(false), + software_rendering(false), + direct_rendering(true), + sandboxed(false), + process_crash_count(0), + in_process_gpu(true), + basic_info_state(kCollectInfoNone), + context_info_state(kCollectInfoNone), + jpeg_decode_accelerator_supported(false) { +} + +GPUInfo::~GPUInfo() { } + +void GPUInfo::EnumerateFields(Enumerator* enumerator) const { + struct GPUInfoKnownFields { + bool optimus; + bool amd_switchable; + bool lenovo_dcute; + GPUDevice gpu; + std::vector<GPUDevice> secondary_gpus; + uint64 adapter_luid; + std::string driver_vendor; + std::string driver_version; + std::string driver_date; + std::string pixel_shader_version; + std::string vertex_shader_version; + std::string max_msaa_samples; + std::string machine_model_name; + std::string machine_model_version; + std::string gl_version_string; + std::string gl_vendor; + std::string gl_renderer; + std::string gl_extensions; + std::string gl_ws_vendor; + std::string gl_ws_version; + std::string gl_ws_extensions; + uint32 gl_reset_notification_strategy; + bool can_lose_context; + bool software_rendering; + bool direct_rendering; + bool sandboxed; + int process_crash_count; + bool in_process_gpu; + CollectInfoResult basic_info_state; + CollectInfoResult context_info_state; + bool jpeg_decode_accelerator_supported; + }; + + // If this assert fails then most likely something below needs to be updated. + // Note that this assert is only approximate. If a new field is added to + // GPUInfo which fits within the current padding then it will not be caught. + static_assert( + sizeof(GPUInfo) == sizeof(GPUInfoKnownFields), + "fields have changed in GPUInfo, GPUInfoKnownFields must be updated"); + + // Required fields (according to DevTools protocol) first. + enumerator->AddString("machineModelName", machine_model_name); + enumerator->AddString("machineModelVersion", machine_model_version); + EnumerateGPUDevice(gpu, enumerator); + for (const auto& secondary_gpu: secondary_gpus) + EnumerateGPUDevice(secondary_gpu, enumerator); + + enumerator->BeginAuxAttributes(); + enumerator->AddBool("optimus", optimus); + enumerator->AddBool("amdSwitchable", amd_switchable); + enumerator->AddBool("lenovoDcute", lenovo_dcute); + enumerator->AddInt64("adapterLuid", adapter_luid); + enumerator->AddString("driverVendor", driver_vendor); + enumerator->AddString("driverVersion", driver_version); + enumerator->AddString("driverDate", driver_date); + enumerator->AddString("pixelShaderVersion", pixel_shader_version); + enumerator->AddString("vertexShaderVersion", vertex_shader_version); + enumerator->AddString("maxMsaaSamples", max_msaa_samples); + enumerator->AddString("glVersion", gl_version); + enumerator->AddString("glVendor", gl_vendor); + enumerator->AddString("glRenderer", gl_renderer); + enumerator->AddString("glExtensions", gl_extensions); + enumerator->AddString("glWsVendor", gl_ws_vendor); + enumerator->AddString("glWsVersion", gl_ws_version); + enumerator->AddString("glWsExtensions", gl_ws_extensions); + enumerator->AddInt( + "glResetNotificationStrategy", + static_cast<int>(gl_reset_notification_strategy)); + enumerator->AddBool("can_lose_context", can_lose_context); + // TODO(kbr): add performance_stats. + enumerator->AddBool("softwareRendering", software_rendering); + enumerator->AddBool("directRendering", direct_rendering); + enumerator->AddBool("sandboxed", sandboxed); + enumerator->AddInt("processCrashCount", process_crash_count); + enumerator->AddBool("inProcessGpu", in_process_gpu); + enumerator->AddInt("basicInfoState", basic_info_state); + enumerator->AddInt("contextInfoState", context_info_state); + // TODO(kbr): add dx_diagnostics on Windows. + enumerator->AddBool("jpegDecodeAcceleratorSupported", + jpeg_decode_accelerator_supported); + enumerator->EndAuxAttributes(); +} + +} // namespace gpu diff --git a/gfx/angle/src/tests/third_party/gpu_test_expectations/gpu_info.h b/gfx/angle/src/tests/third_party/gpu_test_expectations/gpu_info.h new file mode 100755 index 000000000..0a7f9aa59 --- /dev/null +++ b/gfx/angle/src/tests/third_party/gpu_test_expectations/gpu_info.h @@ -0,0 +1,233 @@ +// Copyright (c) 2012 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. + +#ifndef GPU_CONFIG_GPU_INFO_H_ +#define GPU_CONFIG_GPU_INFO_H_ + +// Provides access to the GPU information for the system +// on which chrome is currently running. + +#include <string> +#include <vector> + +#include "angle_config.h" + +namespace gpu { + +// Result for the various Collect*Info* functions below. +// Fatal failures are for cases where we can't create a context at all or +// something, making the use of the GPU impossible. +// Non-fatal failures are for cases where we could gather most info, but maybe +// some is missing (e.g. unable to parse a version string or to detect the exact +// model). +enum CollectInfoResult { + kCollectInfoNone = 0, + kCollectInfoSuccess = 1, + kCollectInfoNonFatalFailure = 2, + kCollectInfoFatalFailure = 3 +}; + +// Video profile. This *must* match media::VideoCodecProfile. +enum VideoCodecProfile { + VIDEO_CODEC_PROFILE_UNKNOWN = -1, + VIDEO_CODEC_PROFILE_MIN = VIDEO_CODEC_PROFILE_UNKNOWN, + H264PROFILE_BASELINE = 0, + H264PROFILE_MAIN = 1, + H264PROFILE_EXTENDED = 2, + H264PROFILE_HIGH = 3, + H264PROFILE_HIGH10PROFILE = 4, + H264PROFILE_HIGH422PROFILE = 5, + H264PROFILE_HIGH444PREDICTIVEPROFILE = 6, + H264PROFILE_SCALABLEBASELINE = 7, + H264PROFILE_SCALABLEHIGH = 8, + H264PROFILE_STEREOHIGH = 9, + H264PROFILE_MULTIVIEWHIGH = 10, + VP8PROFILE_ANY = 11, + VP9PROFILE_ANY = 12, + VIDEO_CODEC_PROFILE_MAX = VP9PROFILE_ANY, +}; + +struct GPU_EXPORT GPUInfo { + struct GPU_EXPORT GPUDevice { + GPUDevice(); + ~GPUDevice(); + + // The DWORD (uint32) representing the graphics card vendor id. + uint32 vendor_id; + + // The DWORD (uint32) representing the graphics card device id. + // Device ids are unique to vendor, not to one another. + uint32 device_id; + + // Whether this GPU is the currently used one. + // Currently this field is only supported and meaningful on OS X. + bool active; + + // The strings that describe the GPU. + // In Linux these strings are obtained through libpci. + // In Win/MacOSX, these two strings are not filled at the moment. + // In Android, these are respectively GL_VENDOR and GL_RENDERER. + std::string vendor_string; + std::string device_string; + }; + + GPUInfo(); + ~GPUInfo(); + + bool SupportsAccelerated2dCanvas() const { + return !can_lose_context && !software_rendering; + } + + // Computer has NVIDIA Optimus + bool optimus; + + // Computer has AMD Dynamic Switchable Graphics + bool amd_switchable; + + // Lenovo dCute is installed. http://crbug.com/181665. + bool lenovo_dcute; + + // Primary GPU, for exmaple, the discrete GPU in a dual GPU machine. + GPUDevice gpu; + + // Secondary GPUs, for example, the integrated GPU in a dual GPU machine. + std::vector<GPUDevice> secondary_gpus; + + // On Windows, the unique identifier of the adapter the GPU process uses. + // The default is zero, which makes the browser process create its D3D device + // on the primary adapter. Note that the primary adapter can change at any + // time so it is better to specify a particular LUID. Note that valid LUIDs + // are always non-zero. + uint64 adapter_luid; + + // The vendor of the graphics driver currently installed. + std::string driver_vendor; + + // The version of the graphics driver currently installed. + std::string driver_version; + + // The date of the graphics driver currently installed. + std::string driver_date; + + // The version of the pixel/fragment shader used by the gpu. + std::string pixel_shader_version; + + // The version of the vertex shader used by the gpu. + std::string vertex_shader_version; + + // The maximum multisapling sample count, either through ES3 or + // EXT_multisampled_render_to_texture MSAA. + std::string max_msaa_samples; + + // The machine model identifier. They can contain any character, including + // whitespaces. Currently it is supported on MacOSX and Android. + // Android examples: "Naxus 5", "XT1032". + // On MacOSX, the version is stripped out of the model identifier, for + // example, the original identifier is "MacBookPro7,2", and we put + // "MacBookPro" as machine_model_name, and "7.2" as machine_model_version. + std::string machine_model_name; + + // The version of the machine model. Currently it is supported on MacOSX. + // See machine_model_name's comment. + std::string machine_model_version; + + // The GL_VERSION string. + std::string gl_version; + + // The GL_VENDOR string. + std::string gl_vendor; + + // The GL_RENDERER string. + std::string gl_renderer; + + // The GL_EXTENSIONS string. + std::string gl_extensions; + + // GL window system binding vendor. "" if not available. + std::string gl_ws_vendor; + + // GL window system binding version. "" if not available. + std::string gl_ws_version; + + // GL window system binding extensions. "" if not available. + std::string gl_ws_extensions; + + // GL reset notification strategy as defined by GL_ARB_robustness. 0 if GPU + // reset detection or notification not available. + uint32 gl_reset_notification_strategy; + + // The device semantics, i.e. whether the Vista and Windows 7 specific + // semantics are available. + bool can_lose_context; + + bool software_rendering; + + // Whether the driver uses direct rendering. True on most platforms, false on + // X11 when using remote X. + bool direct_rendering; + + // Whether the gpu process is running in a sandbox. + bool sandboxed; + + // Number of GPU process crashes recorded. + int process_crash_count; + + // True if the GPU is running in the browser process instead of its own. + bool in_process_gpu; + + // The state of whether the basic/context/DxDiagnostics info is collected and + // if the collection fails or not. + CollectInfoResult basic_info_state; + CollectInfoResult context_info_state; + + bool jpeg_decode_accelerator_supported; + + // Note: when adding new members, please remember to update EnumerateFields + // in gpu_info.cc. + + // In conjunction with EnumerateFields, this allows the embedder to + // enumerate the values in this structure without having to embed + // references to its specific member variables. This simplifies the + // addition of new fields to this type. + class Enumerator { + public: + // The following methods apply to the "current" object. Initially this + // is the root object, but calls to BeginGPUDevice/EndGPUDevice and + // BeginAuxAttributes/EndAuxAttributes change the object to which these + // calls should apply. + virtual void AddInt64(const char* name, int64 value) = 0; + virtual void AddInt(const char* name, int value) = 0; + virtual void AddString(const char* name, const std::string& value) = 0; + virtual void AddBool(const char* name, bool value) = 0; + + // Markers indicating that a GPUDevice is being described. + virtual void BeginGPUDevice() = 0; + virtual void EndGPUDevice() = 0; + + // Markers indicating that a VideoDecodeAcceleratorSupportedProfile is + // being described. + virtual void BeginVideoDecodeAcceleratorSupportedProfile() = 0; + virtual void EndVideoDecodeAcceleratorSupportedProfile() = 0; + + // Markers indicating that a VideoEncodeAcceleratorSupportedProfile is + // being described. + virtual void BeginVideoEncodeAcceleratorSupportedProfile() = 0; + virtual void EndVideoEncodeAcceleratorSupportedProfile() = 0; + + // Markers indicating that "auxiliary" attributes of the GPUInfo + // (according to the DevTools protocol) are being described. + virtual void BeginAuxAttributes() = 0; + virtual void EndAuxAttributes() = 0; + + protected: + virtual ~Enumerator() {} + }; + + // Outputs the fields in this structure to the provided enumerator. + void EnumerateFields(Enumerator* enumerator) const; +}; + +} // namespace gpu + +#endif // GPU_CONFIG_GPU_INFO_H_ diff --git a/gfx/angle/src/tests/third_party/gpu_test_expectations/gpu_test_config.cc b/gfx/angle/src/tests/third_party/gpu_test_expectations/gpu_test_config.cc new file mode 100755 index 000000000..f0bf6f063 --- /dev/null +++ b/gfx/angle/src/tests/third_party/gpu_test_expectations/gpu_test_config.cc @@ -0,0 +1,492 @@ +// Copyright (c) 2012 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. + +#include "gpu_test_config.h" + +#include "gpu_info.h" +#include "gpu_test_expectations_parser.h" + +#if defined(OS_LINUX) +extern "C" { +# include <pci/pci.h> +} +#endif + +#if defined(OS_MACOSX) +#include "gpu_test_config_mac.h" +#endif + +using namespace gpu; + +#if defined(OS_WIN) + +namespace base { + +namespace { + +// Disable the deprecated function warning for GetVersionEx +#pragma warning(disable: 4996) + +class SysInfo +{ + public: + static void OperatingSystemVersionNumbers( + int32 *major_version, int32 *minor_version, int32 *bugfix_version); +}; + +// static +void SysInfo::OperatingSystemVersionNumbers( + int32 *major_version, int32 *minor_version, int32 *bugfix_version) +{ + OSVERSIONINFOEX version_info = { sizeof version_info }; + ::GetVersionEx(reinterpret_cast<OSVERSIONINFO*>(&version_info)); + *major_version = version_info.dwMajorVersion; + *minor_version = version_info.dwMinorVersion; + *bugfix_version = version_info.dwBuildNumber; +} + +} // anonymous namespace + +} // namespace base + +void DeviceIDToVendorAndDevice(const std::string& id, + uint32* vendor_id, + uint32* device_id) { + *vendor_id = 0; + *device_id = 0; + if (id.length() < 21) + return; + std::string vendor_id_string = id.substr(8, 4); + std::string device_id_string = id.substr(17, 4); + base::HexStringToUInt(vendor_id_string, vendor_id); + base::HexStringToUInt(device_id_string, device_id); +} + +CollectInfoResult CollectGpuID(uint32* vendor_id, uint32* device_id) { + DCHECK(vendor_id && device_id); + *vendor_id = 0; + *device_id = 0; + + // Taken from http://developer.nvidia.com/object/device_ids.html + DISPLAY_DEVICEA dd; + dd.cb = sizeof(DISPLAY_DEVICEA); + std::string id; + for (int i = 0; EnumDisplayDevicesA(NULL, i, &dd, 0); ++i) { + if (dd.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) { + id = dd.DeviceID; + break; + } + } + + if (id.length() > 20) { + DeviceIDToVendorAndDevice(id, vendor_id, device_id); + if (*vendor_id != 0 && *device_id != 0) + return kCollectInfoSuccess; + } + return kCollectInfoNonFatalFailure; +} + +#endif // defined(OS_WIN) + +#if defined(OS_LINUX) + +const uint32 kVendorIDIntel = 0x8086; +const uint32 kVendorIDNVidia = 0x10de; +const uint32 kVendorIDAMD = 0x1002; + +CollectInfoResult CollectPCIVideoCardInfo(GPUInfo* gpu_info) { + DCHECK(gpu_info); + + struct pci_access* access = pci_alloc(); + DCHECK(access != NULL); + pci_init(access); + pci_scan_bus(access); + + bool primary_gpu_identified = false; + for (pci_dev* device = access->devices; + device != NULL; device = device->next) { + pci_fill_info(device, 33); + bool is_gpu = false; + switch (device->device_class) { + case PCI_CLASS_DISPLAY_VGA: + case PCI_CLASS_DISPLAY_XGA: + case PCI_CLASS_DISPLAY_3D: + is_gpu = true; + break; + case PCI_CLASS_DISPLAY_OTHER: + default: + break; + } + if (!is_gpu) + continue; + if (device->vendor_id == 0 || device->device_id == 0) + continue; + + GPUInfo::GPUDevice gpu; + gpu.vendor_id = device->vendor_id; + gpu.device_id = device->device_id; + + if (!primary_gpu_identified) { + primary_gpu_identified = true; + gpu_info->gpu = gpu; + } else { + // TODO(zmo): if there are multiple GPUs, we assume the non Intel + // one is primary. Revisit this logic because we actually don't know + // which GPU we are using at this point. + if (gpu_info->gpu.vendor_id == kVendorIDIntel && + gpu.vendor_id != kVendorIDIntel) { + gpu_info->secondary_gpus.push_back(gpu_info->gpu); + gpu_info->gpu = gpu; + } else { + gpu_info->secondary_gpus.push_back(gpu); + } + } + } + + // Detect Optimus or AMD Switchable GPU. + if (gpu_info->secondary_gpus.size() == 1 && + gpu_info->secondary_gpus[0].vendor_id == kVendorIDIntel) { + if (gpu_info->gpu.vendor_id == kVendorIDNVidia) + gpu_info->optimus = true; + if (gpu_info->gpu.vendor_id == kVendorIDAMD) + gpu_info->amd_switchable = true; + } + + pci_cleanup(access); + if (!primary_gpu_identified) + return kCollectInfoNonFatalFailure; + return kCollectInfoSuccess; +} + +CollectInfoResult CollectGpuID(uint32* vendor_id, uint32* device_id) { + DCHECK(vendor_id && device_id); + *vendor_id = 0; + *device_id = 0; + + GPUInfo gpu_info; + CollectInfoResult result = CollectPCIVideoCardInfo(&gpu_info); + if (result == kCollectInfoSuccess) { + *vendor_id = gpu_info.gpu.vendor_id; + *device_id = gpu_info.gpu.device_id; + } + return result; +} + +#endif // defined(OS_LINUX) + +#if defined(OS_MACOSX) + +CollectInfoResult CollectGpuID(uint32* vendor_id, uint32* device_id) { + DCHECK(vendor_id && device_id); + + GPUInfo::GPUDevice gpu = GetActiveGPU(); + *vendor_id = gpu.vendor_id; + *device_id = gpu.device_id; + + if (*vendor_id != 0 && *device_id != 0) + return kCollectInfoSuccess; + return kCollectInfoNonFatalFailure; +} + +#endif + +#if defined(OS_ANDROID) +CollectInfoResult CollectGpuID(uint32 *vendor_id, uint32 *device_id) +{ + DCHECK(vendor_id && device_id); + *vendor_id = 0; + *device_id = 0; + return kCollectInfoNonFatalFailure; +} +#endif // defined(OS_ANDROID) + +namespace gpu { + +namespace { + +GPUTestConfig::OS GetCurrentOS() { +#if defined(OS_CHROMEOS) + return GPUTestConfig::kOsChromeOS; +#elif defined(OS_LINUX) || defined(OS_OPENBSD) + return GPUTestConfig::kOsLinux; +#elif defined(OS_WIN) + int32 major_version = 0; + int32 minor_version = 0; + int32 bugfix_version = 0; + base::SysInfo::OperatingSystemVersionNumbers( + &major_version, &minor_version, &bugfix_version); + if (major_version == 5) + return GPUTestConfig::kOsWinXP; + if (major_version == 6 && minor_version == 0) + return GPUTestConfig::kOsWinVista; + if (major_version == 6 && minor_version == 1) + return GPUTestConfig::kOsWin7; + if (major_version == 6 && (minor_version == 2 || minor_version == 3)) + return GPUTestConfig::kOsWin8; + if (major_version == 10) + return GPUTestConfig::kOsWin10; +#elif defined(OS_MACOSX) + int32 major_version = 0; + int32 minor_version = 0; + int32 bugfix_version = 0; + base::SysInfo::OperatingSystemVersionNumbers( + &major_version, &minor_version, &bugfix_version); + if (major_version == 10) { + switch (minor_version) { + case 5: + return GPUTestConfig::kOsMacLeopard; + case 6: + return GPUTestConfig::kOsMacSnowLeopard; + case 7: + return GPUTestConfig::kOsMacLion; + case 8: + return GPUTestConfig::kOsMacMountainLion; + case 9: + return GPUTestConfig::kOsMacMavericks; + case 10: + return GPUTestConfig::kOsMacYosemite; + case 11: + return GPUTestConfig::kOsMacElCapitan; + } + } +#elif defined(OS_ANDROID) + return GPUTestConfig::kOsAndroid; +#endif + return GPUTestConfig::kOsUnknown; +} + +} // namespace anonymous + +GPUTestConfig::GPUTestConfig() + : validate_gpu_info_(true), + os_(kOsUnknown), + gpu_device_id_(0), + build_type_(kBuildTypeUnknown), + api_(kAPIUnknown) {} + +GPUTestConfig::~GPUTestConfig() { +} + +void GPUTestConfig::set_os(int32 os) { + DCHECK_EQ(0, os & ~(kOsAndroid | kOsWin | kOsMac | kOsLinux | kOsChromeOS)); + os_ = os; +} + +void GPUTestConfig::AddGPUVendor(uint32 gpu_vendor) { + DCHECK_NE(0u, gpu_vendor); + for (size_t i = 0; i < gpu_vendor_.size(); ++i) + DCHECK_NE(gpu_vendor_[i], gpu_vendor); + gpu_vendor_.push_back(gpu_vendor); +} + +void GPUTestConfig::set_gpu_device_id(uint32 id) { + gpu_device_id_ = id; +} + +void GPUTestConfig::set_build_type(int32 build_type) { + DCHECK_EQ(0, build_type & ~(kBuildTypeRelease | kBuildTypeDebug)); + build_type_ = build_type; +} + +void GPUTestConfig::set_api(int32 api) { + DCHECK_EQ(0, api & ~(kAPID3D9 | kAPID3D11 | kAPIGLDesktop | kAPIGLES)); + api_ = api; +} + +bool GPUTestConfig::IsValid() const { + if (!validate_gpu_info_) + return true; + if (gpu_device_id_ != 0 && (gpu_vendor_.size() != 1 || gpu_vendor_[0] == 0)) + return false; + return true; +} + +bool GPUTestConfig::OverlapsWith(const GPUTestConfig& config) const { + DCHECK(IsValid()); + DCHECK(config.IsValid()); + if (config.os_ != kOsUnknown && os_ != kOsUnknown && + (os_ & config.os_) == 0) + return false; + if (config.gpu_vendor_.size() > 0 && gpu_vendor_.size() > 0) { + bool shared = false; + for (size_t i = 0; i < config.gpu_vendor_.size() && !shared; ++i) { + for (size_t j = 0; j < gpu_vendor_.size(); ++j) { + if (config.gpu_vendor_[i] == gpu_vendor_[j]) { + shared = true; + break; + } + } + } + if (!shared) + return false; + } + if (config.gpu_device_id_ != 0 && gpu_device_id_ != 0 && + gpu_device_id_ != config.gpu_device_id_) + return false; + if (config.build_type_ != kBuildTypeUnknown && + build_type_ != kBuildTypeUnknown && + (build_type_ & config.build_type_) == 0) + return false; + return true; +} + +void GPUTestConfig::DisableGPUInfoValidation() { + validate_gpu_info_ = false; +} + +void GPUTestConfig::ClearGPUVendor() { + gpu_vendor_.clear(); +} + +GPUTestBotConfig::~GPUTestBotConfig() { +} + +void GPUTestBotConfig::AddGPUVendor(uint32 gpu_vendor) { + DCHECK_EQ(0u, GPUTestConfig::gpu_vendor().size()); + GPUTestConfig::AddGPUVendor(gpu_vendor); +} + +bool GPUTestBotConfig::SetGPUInfo(const GPUInfo& gpu_info) { + DCHECK(validate_gpu_info_); + if (gpu_info.gpu.device_id == 0 || gpu_info.gpu.vendor_id == 0) + return false; + ClearGPUVendor(); + AddGPUVendor(gpu_info.gpu.vendor_id); + set_gpu_device_id(gpu_info.gpu.device_id); + return true; +} + +bool GPUTestBotConfig::IsValid() const { + switch (os()) { + case kOsWinXP: + case kOsWinVista: + case kOsWin7: + case kOsWin8: + case kOsWin10: + case kOsMacLeopard: + case kOsMacSnowLeopard: + case kOsMacLion: + case kOsMacMountainLion: + case kOsMacMavericks: + case kOsMacYosemite: + case kOsMacElCapitan: + case kOsLinux: + case kOsChromeOS: + case kOsAndroid: + break; + default: + return false; + } + if (validate_gpu_info_) { + if (gpu_vendor().size() != 1 || gpu_vendor()[0] == 0) + return false; + if (gpu_device_id() == 0) + return false; + } + switch (build_type()) { + case kBuildTypeRelease: + case kBuildTypeDebug: + break; + default: + return false; + } + return true; +} + +bool GPUTestBotConfig::Matches(const GPUTestConfig& config) const { + DCHECK(IsValid()); + DCHECK(config.IsValid()); + if (config.os() != kOsUnknown && (os() & config.os()) == 0) + return false; + if (config.gpu_vendor().size() > 0) { + bool contained = false; + for (size_t i = 0; i < config.gpu_vendor().size(); ++i) { + if (config.gpu_vendor()[i] == gpu_vendor()[0]) { + contained = true; + break; + } + } + if (!contained) + return false; + } + if (config.gpu_device_id() != 0 && + gpu_device_id() != config.gpu_device_id()) + return false; + if (config.build_type() != kBuildTypeUnknown && + (build_type() & config.build_type()) == 0) + return false; + if (config.api() != 0 && (api() & config.api()) == 0) + return false; + return true; +} + +bool GPUTestBotConfig::Matches(const std::string& config_data) const { + GPUTestExpectationsParser parser; + GPUTestConfig config; + + if (!parser.ParseConfig(config_data, &config)) + return false; + return Matches(config); +} + +bool GPUTestBotConfig::LoadCurrentConfig(const GPUInfo *gpu_info) +{ + bool rt; + if (gpu_info == NULL) + { + GPUInfo my_gpu_info; + CollectInfoResult result = + CollectGpuID(&my_gpu_info.gpu.vendor_id, &my_gpu_info.gpu.device_id); + if (result != kCollectInfoSuccess) + { + LOG(ERROR) << "Fail to identify GPU\n"; + DisableGPUInfoValidation(); + rt = true; + } + else + { + rt = SetGPUInfo(my_gpu_info); + } + } + else + { + rt = SetGPUInfo(*gpu_info); + } + set_os(GetCurrentOS()); + if (os() == kOsUnknown) + { + LOG(ERROR) << "Unknown OS\n"; + rt = false; + } +#if defined(NDEBUG) + set_build_type(kBuildTypeRelease); +#else + set_build_type(kBuildTypeDebug); +#endif + return rt; +} + +// static +bool GPUTestBotConfig::CurrentConfigMatches(const std::string& config_data) { + GPUTestBotConfig my_config; + if (!my_config.LoadCurrentConfig(NULL)) + return false; + return my_config.Matches(config_data); +} + +// static +bool GPUTestBotConfig::CurrentConfigMatches( + const std::vector<std::string>& configs) { + GPUTestBotConfig my_config; + if (!my_config.LoadCurrentConfig(NULL)) + return false; + for (size_t i = 0 ; i < configs.size(); ++i) { + if (my_config.Matches(configs[i])) + return true; + } + return false; +} + +} // namespace gpu + diff --git a/gfx/angle/src/tests/third_party/gpu_test_expectations/gpu_test_config.h b/gfx/angle/src/tests/third_party/gpu_test_expectations/gpu_test_config.h new file mode 100755 index 000000000..4cbc2c07e --- /dev/null +++ b/gfx/angle/src/tests/third_party/gpu_test_expectations/gpu_test_config.h @@ -0,0 +1,140 @@ +// Copyright (c) 2012 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. + +#ifndef GPU_CONFIG_GPU_TEST_CONFIG_H_ +#define GPU_CONFIG_GPU_TEST_CONFIG_H_ + +#include <string> +#include <vector> + +#include "angle_config.h" + +namespace gpu { + +struct GPUInfo; + +class GPU_EXPORT GPUTestConfig { + public: + enum OS { + kOsUnknown = 0, + kOsWinXP = 1 << 0, + kOsWinVista = 1 << 1, + kOsWin7 = 1 << 2, + kOsWin8 = 1 << 3, + kOsMacLeopard = 1 << 4, + kOsMacSnowLeopard = 1 << 5, + kOsMacLion = 1 << 6, + kOsMacMountainLion = 1 << 7, + kOsMacMavericks = 1 << 8, + kOsMacYosemite = 1 << 9, + kOsMacElCapitan = 1 << 10, + kOsMac = kOsMacLeopard | kOsMacSnowLeopard | kOsMacLion | + kOsMacMountainLion | kOsMacMavericks | kOsMacYosemite | + kOsMacElCapitan, + kOsLinux = 1 << 11, + kOsChromeOS = 1 << 12, + kOsAndroid = 1 << 13, + kOsWin10 = 1 << 14, + kOsWin = kOsWinXP | kOsWinVista | kOsWin7 | kOsWin8 | kOsWin10, + }; + + enum BuildType { + kBuildTypeUnknown = 0, + kBuildTypeRelease = 1 << 0, + kBuildTypeDebug = 1 << 1, + }; + + enum API { + kAPIUnknown = 0, + kAPID3D9 = 1 << 0, + kAPID3D11 = 1 << 1, + kAPIGLDesktop = 1 << 2, + kAPIGLES = 1 << 3, + }; + + GPUTestConfig(); + virtual ~GPUTestConfig(); + + void set_os(int32 os); + void set_gpu_device_id(uint32 id); + void set_build_type(int32 build_type); + void set_api(int32 api); + + virtual void AddGPUVendor(uint32 gpu_vendor); + + int32 os() const { return os_; } + const std::vector<uint32>& gpu_vendor() const { return gpu_vendor_; } + uint32 gpu_device_id() const { return gpu_device_id_; } + int32 build_type() const { return build_type_; } + int32 api() const { return api_; } + + // Check if the config is valid. For example, if gpu_device_id_ is set, but + // gpu_vendor_ is unknown, then it's invalid. + virtual bool IsValid() const; + + // Check if two configs overlap, i.e., if there exists a config that matches + // both configs. + bool OverlapsWith(const GPUTestConfig& config) const; + + // Disable validation of GPU vendor and device ids. + void DisableGPUInfoValidation(); + + protected: + void ClearGPUVendor(); + + // Indicates that the OS has the notion of a numeric GPU vendor and device id + // and this data should be validated. + bool validate_gpu_info_; + + private: + // operating system. + int32 os_; + + // GPU vendor. + std::vector<uint32> gpu_vendor_; + + // GPU device id (unique to each vendor). + uint32 gpu_device_id_; + + // Release or Debug. + int32 build_type_; + + // Back-end rendering APIs. + int32 api_; +}; + +class GPU_EXPORT GPUTestBotConfig : public GPUTestConfig { + public: + GPUTestBotConfig() { } + ~GPUTestBotConfig() override; + + // This should only be called when no gpu_vendor is added. + void AddGPUVendor(uint32 gpu_vendor) override; + + // Return false if gpu_info does not have valid vendor_id and device_id. + bool SetGPUInfo(const GPUInfo& gpu_info); + + // Check if the bot config is valid, i.e., if it is one valid test-bot + // environment. For example, if a field is unknown, or if OS is not one + // fully defined OS, then it's valid. + bool IsValid() const override; + + // Check if a bot config matches a test config, i.e., the test config is a + // superset of the bot config. + bool Matches(const GPUTestConfig& config) const; + bool Matches(const std::string& config_data) const; + + // Setup the config with the current gpu testing environment. + // If gpu_info is NULL, collect GPUInfo first. + bool LoadCurrentConfig(const GPUInfo* gpu_info); + + // Check if this bot's config matches |config_data| or any of the |configs|. + static bool CurrentConfigMatches(const std::string& config_data); + static bool CurrentConfigMatches(const std::vector<std::string>& configs); +}; + +} // namespace gpu + +#endif // GPU_CONFIG_GPU_TEST_CONFIG_H_ + diff --git a/gfx/angle/src/tests/third_party/gpu_test_expectations/gpu_test_config_mac.h b/gfx/angle/src/tests/third_party/gpu_test_expectations/gpu_test_config_mac.h new file mode 100755 index 000000000..da22bd6ee --- /dev/null +++ b/gfx/angle/src/tests/third_party/gpu_test_expectations/gpu_test_config_mac.h @@ -0,0 +1,28 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// gpu_test_config_mac.h: +// Helper functions for gpu_test_config that have to be compiled in ObjectiveC++ +// + +#ifndef GPU_TEST_EXPECTATIONS_GPU_TEST_CONFIG_MAC_H_ +#define GPU_TEST_EXPECTATIONS_GPU_TEST_CONFIG_MAC_H_ + +#include "gpu_info.h" + +namespace base { + +class SysInfo +{ + public: + static void OperatingSystemVersionNumbers( + int32 *major_version, int32 *minor_version, int32 *bugfix_version); +}; + +} // namespace base + +gpu::GPUInfo::GPUDevice GetActiveGPU(); + +#endif // GPU_TEST_EXPECTATIONS_GPU_TEST_CONFIG_MAC_H_ diff --git a/gfx/angle/src/tests/third_party/gpu_test_expectations/gpu_test_config_mac.mm b/gfx/angle/src/tests/third_party/gpu_test_expectations/gpu_test_config_mac.mm new file mode 100755 index 000000000..8cbd49894 --- /dev/null +++ b/gfx/angle/src/tests/third_party/gpu_test_expectations/gpu_test_config_mac.mm @@ -0,0 +1,67 @@ +// Copyright (c) 2012 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. + +// gpu_test_config_mac.mm: +// Helper functions for gpu_test_config that have to be compiled in ObjectiveC++ + +#include "gpu_test_config_mac.h" + +#import <Cocoa/Cocoa.h> + +namespace base { + +void SysInfo::OperatingSystemVersionNumbers( + int32 *major_version, int32 *minor_version, int32 *bugfix_version) +{ +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_8 + Gestalt(gestaltSystemVersionMajor, reinterpret_cast<SInt32*>(major_version)); + Gestalt(gestaltSystemVersionMinor, reinterpret_cast<SInt32*>(minor_version)); + Gestalt(gestaltSystemVersionBugFix, reinterpret_cast<SInt32*>(bugfix_version)); +#else + NSOperatingSystemVersion version = [[NSProcessInfo processInfo] operatingSystemVersion]; + *major_version = version.majorVersion; + *minor_version = version.minorVersion; + *bugfix_version = version.patchVersion; +#endif +} + +} // namespace base + +UInt32 GetEntryProperty(io_registry_entry_t entry, CFStringRef property_name) { + CFTypeRef type = IORegistryEntrySearchCFProperty(entry, + kIOServicePlane, + property_name, + kCFAllocatorDefault, + kIORegistryIterateRecursively | kIORegistryIterateParents); + CFDataRef data = reinterpret_cast<CFDataRef>(type); + if (!data) { + CFRelease(data); + return 0; + } + + UInt32 value = 0; + const uint32_t* valuePointer = reinterpret_cast<const uint32_t*>(CFDataGetBytePtr(data)); + if (valuePointer != NULL) { + value = *valuePointer; + } + CFRelease(data); + return value; +} + +gpu::GPUInfo::GPUDevice GetActiveGPU() { + gpu::GPUInfo::GPUDevice gpu; + + // Ignore the fact that CGDisplayIOServicePort is deprecated as Apple + // did not provide a good replacement for it as of 10.10. + // TODO(cwallez) revisit with later systems + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wdeprecated-declarations" + io_registry_entry_t dsp_port = CGDisplayIOServicePort(kCGDirectMainDisplay); + #pragma clang diagnostic pop + + gpu.vendor_id = GetEntryProperty(dsp_port, CFSTR("vendor-id")); + gpu.device_id = GetEntryProperty(dsp_port, CFSTR("device-id")); + return gpu; +} + diff --git a/gfx/angle/src/tests/third_party/gpu_test_expectations/gpu_test_expectations_parser.cc b/gfx/angle/src/tests/third_party/gpu_test_expectations/gpu_test_expectations_parser.cc new file mode 100755 index 000000000..23c4d8c45 --- /dev/null +++ b/gfx/angle/src/tests/third_party/gpu_test_expectations/gpu_test_expectations_parser.cc @@ -0,0 +1,583 @@ +// Copyright (c) 2012 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. + +#include "gpu_test_expectations_parser.h" + +#include "common/angleutils.h" + +namespace base { + +namespace { + +bool StartsWithASCII(const std::string& str, + const std::string& search, + bool case_sensitive) { + ASSERT(!case_sensitive); + return str.compare(0, search.length(), search) == 0; +} + +template <class Char> inline Char ToLowerASCII(Char c) { + return (c >= 'A' && c <= 'Z') ? (c + ('a' - 'A')) : c; +} + +template<typename Iter> +static inline bool DoLowerCaseEqualsASCII(Iter a_begin, + Iter a_end, + const char* b) { + for (Iter it = a_begin; it != a_end; ++it, ++b) { + if (!*b || base::ToLowerASCII(*it) != *b) + return false; + } + return *b == 0; +} + +bool LowerCaseEqualsASCII(const std::string& a, const char* b) { + return DoLowerCaseEqualsASCII(a.begin(), a.end(), b); +} + +} // anonymous namespace + +} // namespace base + +namespace gpu { + +namespace { + +enum LineParserStage { + kLineParserBegin = 0, + kLineParserBugID, + kLineParserConfigs, + kLineParserColon, + kLineParserTestName, + kLineParserEqual, + kLineParserExpectations, +}; + +enum Token { + // os + kConfigWinXP = 0, + kConfigWinVista, + kConfigWin7, + kConfigWin8, + kConfigWin10, + kConfigWin, + kConfigMacLeopard, + kConfigMacSnowLeopard, + kConfigMacLion, + kConfigMacMountainLion, + kConfigMacMavericks, + kConfigMacYosemite, + kConfigMacElCapitan, + kConfigMac, + kConfigLinux, + kConfigChromeOS, + kConfigAndroid, + // gpu vendor + kConfigNVidia, + kConfigAMD, + kConfigIntel, + kConfigVMWare, + // build type + kConfigRelease, + kConfigDebug, + // ANGLE renderer + kConfigD3D9, + kConfigD3D11, + kConfigGLDesktop, + kConfigGLES, + // expectation + kExpectationPass, + kExpectationFail, + kExpectationFlaky, + kExpectationTimeout, + kExpectationSkip, + // separator + kSeparatorColon, + kSeparatorEqual, + + kNumberOfExactMatchTokens, + + // others + kConfigGPUDeviceID, + kTokenComment, + kTokenWord, +}; + +struct TokenInfo { + const char* name; + int32 flag; +}; + +const TokenInfo kTokenData[] = { + {"xp", GPUTestConfig::kOsWinXP}, + {"vista", GPUTestConfig::kOsWinVista}, + {"win7", GPUTestConfig::kOsWin7}, + {"win8", GPUTestConfig::kOsWin8}, + {"win10", GPUTestConfig::kOsWin10}, + {"win", GPUTestConfig::kOsWin}, + {"leopard", GPUTestConfig::kOsMacLeopard}, + {"snowleopard", GPUTestConfig::kOsMacSnowLeopard}, + {"lion", GPUTestConfig::kOsMacLion}, + {"mountainlion", GPUTestConfig::kOsMacMountainLion}, + {"mavericks", GPUTestConfig::kOsMacMavericks}, + {"yosemite", GPUTestConfig::kOsMacYosemite}, + {"elcapitan", GPUTestConfig::kOsMacElCapitan}, + {"mac", GPUTestConfig::kOsMac}, + {"linux", GPUTestConfig::kOsLinux}, + {"chromeos", GPUTestConfig::kOsChromeOS}, + {"android", GPUTestConfig::kOsAndroid}, + {"nvidia", 0x10DE}, + {"amd", 0x1002}, + {"intel", 0x8086}, + {"vmware", 0x15ad}, + {"release", GPUTestConfig::kBuildTypeRelease}, + {"debug", GPUTestConfig::kBuildTypeDebug}, + {"d3d9", GPUTestConfig::kAPID3D9}, + {"d3d11", GPUTestConfig::kAPID3D11}, + {"opengl", GPUTestConfig::kAPIGLDesktop}, + {"gles", GPUTestConfig::kAPIGLES}, + {"pass", GPUTestExpectationsParser::kGpuTestPass}, + {"fail", GPUTestExpectationsParser::kGpuTestFail}, + {"flaky", GPUTestExpectationsParser::kGpuTestFlaky}, + {"timeout", GPUTestExpectationsParser::kGpuTestTimeout}, + {"skip", GPUTestExpectationsParser::kGpuTestSkip}, + {":", 0}, + {"=", 0}, +}; + +enum ErrorType { + kErrorFileIO = 0, + kErrorIllegalEntry, + kErrorInvalidEntry, + kErrorEntryWithOsConflicts, + kErrorEntryWithGpuVendorConflicts, + kErrorEntryWithBuildTypeConflicts, + kErrorEntryWithAPIConflicts, + kErrorEntryWithGpuDeviceIdConflicts, + kErrorEntryWithExpectationConflicts, + kErrorEntriesOverlap, + + kNumberOfErrors, +}; + +const char* kErrorMessage[] = { + "file IO failed", + "entry with wrong format", + "entry invalid, likely wrong modifiers combination", + "entry with OS modifier conflicts", + "entry with GPU vendor modifier conflicts", + "entry with GPU build type conflicts", + "entry with GPU API conflicts", + "entry with GPU device id conflicts or malformat", + "entry with expectation modifier conflicts", + "two entries' configs overlap", +}; + +Token ParseToken(const std::string& word) { + if (base::StartsWithASCII(word, "//", false)) + return kTokenComment; + if (base::StartsWithASCII(word, "0x", false)) + return kConfigGPUDeviceID; + + for (int32 i = 0; i < kNumberOfExactMatchTokens; ++i) { + if (base::LowerCaseEqualsASCII(word, kTokenData[i].name)) + return static_cast<Token>(i); + } + return kTokenWord; +} + +// reference name can have the last character as *. +bool NamesMatching(const std::string& ref, const std::string& test_name) { + size_t len = ref.length(); + if (len == 0) + return false; + if (ref[len - 1] == '*') { + if (test_name.length() > len -1 && + ref.compare(0, len - 1, test_name, 0, len - 1) == 0) + return true; + return false; + } + return (ref == test_name); +} + +} // namespace anonymous + +GPUTestExpectationsParser::GPUTestExpectationsParser() { + // Some sanity check. + static_assert(static_cast<unsigned int>(kNumberOfExactMatchTokens) == + sizeof(kTokenData) / sizeof(kTokenData[0]), "sanity check"); + static_assert(static_cast<unsigned int>(kNumberOfErrors) == + sizeof(kErrorMessage) / sizeof(kErrorMessage[0]), "sanity check"); +} + +GPUTestExpectationsParser::~GPUTestExpectationsParser() { +} + +bool GPUTestExpectationsParser::LoadTestExpectations(const std::string& data) { + entries_.clear(); + error_messages_.clear(); + + std::vector<std::string> lines = base::SplitString( + data, "\n", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); + bool rt = true; + for (size_t i = 0; i < lines.size(); ++i) { + if (!ParseLine(lines[i], i + 1)) + rt = false; + } + if (DetectConflictsBetweenEntries()) { + entries_.clear(); + rt = false; + } + + return rt; +} + +bool GPUTestExpectationsParser::LoadTestExpectationsFromFile( + const std::string& path) { + entries_.clear(); + error_messages_.clear(); + + std::string data; + if (!base::ReadFileToString(path, &data)) { + error_messages_.push_back(kErrorMessage[kErrorFileIO]); + return false; + } + return LoadTestExpectations(data); +} + +int32 GPUTestExpectationsParser::GetTestExpectation( + const std::string& test_name, + const GPUTestBotConfig& bot_config) const { + for (size_t i = 0; i < entries_.size(); ++i) { + if (NamesMatching(entries_[i].test_name, test_name) && + bot_config.Matches(entries_[i].test_config)) + return entries_[i].test_expectation; + } + return kGpuTestPass; +} + +const std::vector<std::string>& +GPUTestExpectationsParser::GetErrorMessages() const { + return error_messages_; +} + +bool GPUTestExpectationsParser::ParseConfig( + const std::string& config_data, GPUTestConfig* config) { + DCHECK(config); + std::vector<std::string> tokens = base::SplitString( + config_data, base::kWhitespaceASCII, base::KEEP_WHITESPACE, + base::SPLIT_WANT_NONEMPTY); + + for (size_t i = 0; i < tokens.size(); ++i) { + Token token = ParseToken(tokens[i]); + switch (token) { + case kConfigWinXP: + case kConfigWinVista: + case kConfigWin7: + case kConfigWin8: + case kConfigWin10: + case kConfigWin: + case kConfigMacLeopard: + case kConfigMacSnowLeopard: + case kConfigMacLion: + case kConfigMacMountainLion: + case kConfigMacMavericks: + case kConfigMacYosemite: + case kConfigMacElCapitan: + case kConfigMac: + case kConfigLinux: + case kConfigChromeOS: + case kConfigAndroid: + case kConfigNVidia: + case kConfigAMD: + case kConfigIntel: + case kConfigVMWare: + case kConfigRelease: + case kConfigDebug: + case kConfigD3D9: + case kConfigD3D11: + case kConfigGLDesktop: + case kConfigGLES: + case kConfigGPUDeviceID: + if (token == kConfigGPUDeviceID) { + if (!UpdateTestConfig(config, tokens[i], 0)) + return false; + } else { + if (!UpdateTestConfig(config, token, 0)) + return false; + } + break; + default: + return false; + } + } + return true; +} + +bool GPUTestExpectationsParser::ParseLine( + const std::string& line_data, size_t line_number) { + std::vector<std::string> tokens = base::SplitString( + line_data, base::kWhitespaceASCII, base::KEEP_WHITESPACE, + base::SPLIT_WANT_NONEMPTY); + int32 stage = kLineParserBegin; + GPUTestExpectationEntry entry; + entry.line_number = line_number; + GPUTestConfig& config = entry.test_config; + bool comments_encountered = false; + for (size_t i = 0; i < tokens.size() && !comments_encountered; ++i) { + Token token = ParseToken(tokens[i]); + switch (token) { + case kTokenComment: + comments_encountered = true; + break; + case kConfigWinXP: + case kConfigWinVista: + case kConfigWin7: + case kConfigWin8: + case kConfigWin10: + case kConfigWin: + case kConfigMacLeopard: + case kConfigMacSnowLeopard: + case kConfigMacLion: + case kConfigMacMountainLion: + case kConfigMacMavericks: + case kConfigMacYosemite: + case kConfigMacElCapitan: + case kConfigMac: + case kConfigLinux: + case kConfigChromeOS: + case kConfigAndroid: + case kConfigNVidia: + case kConfigAMD: + case kConfigIntel: + case kConfigVMWare: + case kConfigRelease: + case kConfigDebug: + case kConfigD3D9: + case kConfigD3D11: + case kConfigGLDesktop: + case kConfigGLES: + case kConfigGPUDeviceID: + // MODIFIERS, could be in any order, need at least one. + if (stage != kLineParserConfigs && stage != kLineParserBugID) { + PushErrorMessage(kErrorMessage[kErrorIllegalEntry], + line_number); + return false; + } + if (token == kConfigGPUDeviceID) { + if (!UpdateTestConfig(&config, tokens[i], line_number)) + return false; + } else { + if (!UpdateTestConfig(&config, token, line_number)) + return false; + } + if (stage == kLineParserBugID) + stage++; + break; + case kSeparatorColon: + // : + if (stage != kLineParserConfigs) { + PushErrorMessage(kErrorMessage[kErrorIllegalEntry], + line_number); + return false; + } + stage++; + break; + case kSeparatorEqual: + // = + if (stage != kLineParserTestName) { + PushErrorMessage(kErrorMessage[kErrorIllegalEntry], + line_number); + return false; + } + stage++; + break; + case kTokenWord: + // BUG_ID or TEST_NAME + if (stage == kLineParserBegin) { + // Bug ID is not used for anything; ignore it. + } else if (stage == kLineParserColon) { + entry.test_name = tokens[i]; + } else { + PushErrorMessage(kErrorMessage[kErrorIllegalEntry], + line_number); + return false; + } + stage++; + break; + case kExpectationPass: + case kExpectationFail: + case kExpectationFlaky: + case kExpectationTimeout: + case kExpectationSkip: + // TEST_EXPECTATIONS + if (stage != kLineParserEqual && stage != kLineParserExpectations) { + PushErrorMessage(kErrorMessage[kErrorIllegalEntry], + line_number); + return false; + } + if ((kTokenData[token].flag & entry.test_expectation) != 0) { + PushErrorMessage(kErrorMessage[kErrorEntryWithExpectationConflicts], + line_number); + return false; + } + entry.test_expectation = + (kTokenData[token].flag | entry.test_expectation); + if (stage == kLineParserEqual) + stage++; + break; + default: + UNREACHABLE(); + break; + } + } + if (stage == kLineParserBegin) { + // The whole line is empty or all comments + return true; + } + if (stage == kLineParserExpectations) { + if (!config.IsValid()) { + PushErrorMessage(kErrorMessage[kErrorInvalidEntry], line_number); + return false; + } + entries_.push_back(entry); + return true; + } + PushErrorMessage(kErrorMessage[kErrorIllegalEntry], line_number); + return false; +} + +bool GPUTestExpectationsParser::UpdateTestConfig( + GPUTestConfig* config, int32 token, size_t line_number) { + DCHECK(config); + switch (token) { + case kConfigWinXP: + case kConfigWinVista: + case kConfigWin7: + case kConfigWin8: + case kConfigWin10: + case kConfigWin: + case kConfigMacLeopard: + case kConfigMacSnowLeopard: + case kConfigMacLion: + case kConfigMacMountainLion: + case kConfigMacMavericks: + case kConfigMacYosemite: + case kConfigMacElCapitan: + case kConfigMac: + case kConfigLinux: + case kConfigChromeOS: + case kConfigAndroid: + if ((config->os() & kTokenData[token].flag) != 0) { + PushErrorMessage(kErrorMessage[kErrorEntryWithOsConflicts], + line_number); + return false; + } + config->set_os(config->os() | kTokenData[token].flag); + break; + case kConfigNVidia: + case kConfigAMD: + case kConfigIntel: + case kConfigVMWare: + { + uint32 gpu_vendor = + static_cast<uint32>(kTokenData[token].flag); + for (size_t i = 0; i < config->gpu_vendor().size(); ++i) { + if (config->gpu_vendor()[i] == gpu_vendor) { + PushErrorMessage( + kErrorMessage[kErrorEntryWithGpuVendorConflicts], + line_number); + return false; + } + } + config->AddGPUVendor(gpu_vendor); + } + break; + case kConfigRelease: + case kConfigDebug: + if ((config->build_type() & kTokenData[token].flag) != 0) { + PushErrorMessage( + kErrorMessage[kErrorEntryWithBuildTypeConflicts], + line_number); + return false; + } + config->set_build_type( + config->build_type() | kTokenData[token].flag); + break; + case kConfigD3D9: + case kConfigD3D11: + case kConfigGLDesktop: + case kConfigGLES: + if ((config->api() & kTokenData[token].flag) != 0) { + PushErrorMessage(kErrorMessage[kErrorEntryWithAPIConflicts], + line_number); + return false; + } + config->set_api(config->api() | kTokenData[token].flag); + break; + default: + UNREACHABLE(); + break; + } + return true; +} + +bool GPUTestExpectationsParser::UpdateTestConfig( + GPUTestConfig* config, + const std::string& gpu_device_id, + size_t line_number) { + DCHECK(config); + uint32 device_id = 0; + if (config->gpu_device_id() != 0 || + !base::HexStringToUInt(gpu_device_id, &device_id) || + device_id == 0) { + PushErrorMessage(kErrorMessage[kErrorEntryWithGpuDeviceIdConflicts], + line_number); + return false; + } + config->set_gpu_device_id(device_id); + return true; +} + +bool GPUTestExpectationsParser::DetectConflictsBetweenEntries() { + bool rt = false; + for (size_t i = 0; i < entries_.size(); ++i) { + for (size_t j = i + 1; j < entries_.size(); ++j) { + if (entries_[i].test_name == entries_[j].test_name && + entries_[i].test_config.OverlapsWith(entries_[j].test_config)) { + PushErrorMessage(kErrorMessage[kErrorEntriesOverlap], + entries_[i].line_number, + entries_[j].line_number); + rt = true; + } + } + } + return rt; +} + +void GPUTestExpectationsParser::PushErrorMessage( + const std::string& message, size_t line_number) { + error_messages_.push_back( + base::StringPrintf("Line %d : %s", + static_cast<int>(line_number), message.c_str())); +} + +void GPUTestExpectationsParser::PushErrorMessage( + const std::string& message, + size_t entry1_line_number, + size_t entry2_line_number) { + error_messages_.push_back( + base::StringPrintf("Line %d and %d : %s", + static_cast<int>(entry1_line_number), + static_cast<int>(entry2_line_number), + message.c_str())); +} + +GPUTestExpectationsParser:: GPUTestExpectationEntry::GPUTestExpectationEntry() + : test_expectation(0), + line_number(0) { +} + +} // namespace gpu + diff --git a/gfx/angle/src/tests/third_party/gpu_test_expectations/gpu_test_expectations_parser.h b/gfx/angle/src/tests/third_party/gpu_test_expectations/gpu_test_expectations_parser.h new file mode 100755 index 000000000..a112700e2 --- /dev/null +++ b/gfx/angle/src/tests/third_party/gpu_test_expectations/gpu_test_expectations_parser.h @@ -0,0 +1,86 @@ +// Copyright (c) 2012 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. + +#ifndef GPU_CONFIG_GPU_TEST_EXPECTATIONS_PARSER_H_ +#define GPU_CONFIG_GPU_TEST_EXPECTATIONS_PARSER_H_ + +#include <string> +#include <vector> + +#include "angle_config.h" +#include "gpu_test_config.h" + +namespace gpu { + +class GPU_EXPORT GPUTestExpectationsParser { + public: + enum GPUTestExpectation { + kGpuTestPass = 1 << 0, + kGpuTestFail = 1 << 1, + kGpuTestFlaky = 1 << 2, + kGpuTestTimeout = 1 << 3, + kGpuTestSkip = 1 << 4, + }; + + GPUTestExpectationsParser(); + ~GPUTestExpectationsParser(); + + // Parse the text expectations, and if no error is encountered, + // save all the entries. Otherwise, generate error messages. + // Return true if parsing succeeds. + bool LoadTestExpectations(const std::string& data); + bool LoadTestExpectationsFromFile(const std::string& path); + + // Query error messages from the last LoadTestExpectations() call. + const std::vector<std::string>& GetErrorMessages() const; + + // Get the test expectation of a given test on a given bot. + int32 GetTestExpectation(const std::string& test_name, + const GPUTestBotConfig& bot_config) const; + + // Parse a list of config modifiers. If we have a valid entry with no + // conflicts, | config | stores it, and the function returns true. + bool ParseConfig(const std::string& config_data, GPUTestConfig* config); + + private: + struct GPUTestExpectationEntry { + GPUTestExpectationEntry(); + + std::string test_name; + GPUTestConfig test_config; + int32 test_expectation; + size_t line_number; + }; + + // Parse a line of text. If we have a valid entry, save it; otherwise, + // generate error messages. + bool ParseLine(const std::string& line_data, size_t line_number); + + // Update OS/GPUVendor/BuildType modifiers. May generate an error message. + bool UpdateTestConfig( + GPUTestConfig* config, int32 token, size_t line_number); + + // Update GPUDeviceID modifier. May generate an error message. + bool UpdateTestConfig(GPUTestConfig* config, + const std::string & gpu_device_id, + size_t line_number); + + // Check if two entries' config overlap with each other. May generate an + // error message. + bool DetectConflictsBetweenEntries(); + + // Save an error message, which can be queried later. + void PushErrorMessage(const std::string& message, size_t line_number); + void PushErrorMessage(const std::string& message, + size_t entry1_line_number, + size_t entry2_line_number); + + std::vector<GPUTestExpectationEntry> entries_; + std::vector<std::string> error_messages_; +}; + +} // namespace gpu + +#endif // GPU_CONFIG_GPU_TEST_EXPECTATIONS_PARSER_H_ + diff --git a/gfx/angle/src/tests/third_party/rapidjson/LICENSE b/gfx/angle/src/tests/third_party/rapidjson/LICENSE new file mode 100755 index 000000000..03d97d163 --- /dev/null +++ b/gfx/angle/src/tests/third_party/rapidjson/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) 2011 Milo Yip + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE.
\ No newline at end of file diff --git a/gfx/angle/src/tests/third_party/rapidjson/README.chromium b/gfx/angle/src/tests/third_party/rapidjson/README.chromium new file mode 100755 index 000000000..466659a8f --- /dev/null +++ b/gfx/angle/src/tests/third_party/rapidjson/README.chromium @@ -0,0 +1,8 @@ +Name: RapidJSON +URL: https://github.com/miloyip/rapidjson +Version: 24dd7ef839b79941d129e833368e913aa9c045da +License: Custom +License File: LICENSE + +Description: +RapidJSON is a JSON parser and generator for C++.
\ No newline at end of file diff --git a/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/allocators.h b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/allocators.h new file mode 100755 index 000000000..0bd2d2895 --- /dev/null +++ b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/allocators.h @@ -0,0 +1,245 @@ +// Copyright (C) 2011 Milo Yip +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef RAPIDJSON_ALLOCATORS_H_ +#define RAPIDJSON_ALLOCATORS_H_ + +#include "rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Allocator + +/*! \class rapidjson::Allocator + \brief Concept for allocating, resizing and freeing memory block. + + Note that Malloc() and Realloc() are non-static but Free() is static. + + So if an allocator need to support Free(), it needs to put its pointer in + the header of memory block. + +\code +concept Allocator { + static const bool kNeedFree; //!< Whether this allocator needs to call Free(). + + // Allocate a memory block. + // \param size of the memory block in bytes. + // \returns pointer to the memory block. + void* Malloc(size_t size); + + // Resize a memory block. + // \param originalPtr The pointer to current memory block. Null pointer is permitted. + // \param originalSize The current size in bytes. (Design issue: since some allocator may not book-keep this, explicitly pass to it can save memory.) + // \param newSize the new size in bytes. + void* Realloc(void* originalPtr, size_t originalSize, size_t newSize); + + // Free a memory block. + // \param pointer to the memory block. Null pointer is permitted. + static void Free(void *ptr); +}; +\endcode +*/ + +/////////////////////////////////////////////////////////////////////////////// +// CrtAllocator + +//! C-runtime library allocator. +/*! This class is just wrapper for standard C library memory routines. + \note implements Allocator concept +*/ +class CrtAllocator { +public: + static const bool kNeedFree = true; + void* Malloc(size_t size) { return std::malloc(size); } + void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) { (void)originalSize; return std::realloc(originalPtr, newSize); } + static void Free(void *ptr) { std::free(ptr); } +}; + +/////////////////////////////////////////////////////////////////////////////// +// MemoryPoolAllocator + +//! Default memory allocator used by the parser and DOM. +/*! This allocator allocate memory blocks from pre-allocated memory chunks. + + It does not free memory blocks. And Realloc() only allocate new memory. + + The memory chunks are allocated by BaseAllocator, which is CrtAllocator by default. + + User may also supply a buffer as the first chunk. + + If the user-buffer is full then additional chunks are allocated by BaseAllocator. + + The user-buffer is not deallocated by this allocator. + + \tparam BaseAllocator the allocator type for allocating memory chunks. Default is CrtAllocator. + \note implements Allocator concept +*/ +template <typename BaseAllocator = CrtAllocator> +class MemoryPoolAllocator { +public: + static const bool kNeedFree = false; //!< Tell users that no need to call Free() with this allocator. (concept Allocator) + + //! Constructor with chunkSize. + /*! \param chunkSize The size of memory chunk. The default is kDefaultChunkSize. + \param baseAllocator The allocator for allocating memory chunks. + */ + MemoryPoolAllocator(size_t chunkSize = kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) : + chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(0), baseAllocator_(baseAllocator), ownBaseAllocator_(0) + { + } + + //! Constructor with user-supplied buffer. + /*! The user buffer will be used firstly. When it is full, memory pool allocates new chunk with chunk size. + + The user buffer will not be deallocated when this allocator is destructed. + + \param buffer User supplied buffer. + \param size Size of the buffer in bytes. It must at least larger than sizeof(ChunkHeader). + \param chunkSize The size of memory chunk. The default is kDefaultChunkSize. + \param baseAllocator The allocator for allocating memory chunks. + */ + MemoryPoolAllocator(void *buffer, size_t size, size_t chunkSize = kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) : + chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(buffer), baseAllocator_(baseAllocator), ownBaseAllocator_(0) + { + RAPIDJSON_ASSERT(buffer != 0); + RAPIDJSON_ASSERT(size > sizeof(ChunkHeader)); + chunkHead_ = reinterpret_cast<ChunkHeader*>(buffer); + chunkHead_->capacity = size - sizeof(ChunkHeader); + chunkHead_->size = 0; + chunkHead_->next = 0; + } + + //! Destructor. + /*! This deallocates all memory chunks, excluding the user-supplied buffer. + */ + ~MemoryPoolAllocator() { + Clear(); + RAPIDJSON_DELETE(ownBaseAllocator_); + } + + //! Deallocates all memory chunks, excluding the user-supplied buffer. + void Clear() { + while(chunkHead_ != 0 && chunkHead_ != userBuffer_) { + ChunkHeader* next = chunkHead_->next; + baseAllocator_->Free(chunkHead_); + chunkHead_ = next; + } + } + + //! Computes the total capacity of allocated memory chunks. + /*! \return total capacity in bytes. + */ + size_t Capacity() const { + size_t capacity = 0; + for (ChunkHeader* c = chunkHead_; c != 0; c = c->next) + capacity += c->capacity; + return capacity; + } + + //! Computes the memory blocks allocated. + /*! \return total used bytes. + */ + size_t Size() const { + size_t size = 0; + for (ChunkHeader* c = chunkHead_; c != 0; c = c->next) + size += c->size; + return size; + } + + //! Allocates a memory block. (concept Allocator) + void* Malloc(size_t size) { + size = RAPIDJSON_ALIGN(size); + if (chunkHead_ == 0 || chunkHead_->size + size > chunkHead_->capacity) + AddChunk(chunk_capacity_ > size ? chunk_capacity_ : size); + + void *buffer = reinterpret_cast<char *>(chunkHead_ + 1) + chunkHead_->size; + chunkHead_->size += size; + return buffer; + } + + //! Resizes a memory block (concept Allocator) + void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) { + if (originalPtr == 0) + return Malloc(newSize); + + // Do not shrink if new size is smaller than original + if (originalSize >= newSize) + return originalPtr; + + // Simply expand it if it is the last allocation and there is sufficient space + if (originalPtr == (char *)(chunkHead_ + 1) + chunkHead_->size - originalSize) { + size_t increment = static_cast<size_t>(newSize - originalSize); + increment = RAPIDJSON_ALIGN(increment); + if (chunkHead_->size + increment <= chunkHead_->capacity) { + chunkHead_->size += increment; + return originalPtr; + } + } + + // Realloc process: allocate and copy memory, do not free original buffer. + void* newBuffer = Malloc(newSize); + RAPIDJSON_ASSERT(newBuffer != 0); // Do not handle out-of-memory explicitly. + return std::memcpy(newBuffer, originalPtr, originalSize); + } + + //! Frees a memory block (concept Allocator) + static void Free(void *ptr) { (void)ptr; } // Do nothing + +private: + //! Copy constructor is not permitted. + MemoryPoolAllocator(const MemoryPoolAllocator& rhs) /* = delete */; + //! Copy assignment operator is not permitted. + MemoryPoolAllocator& operator=(const MemoryPoolAllocator& rhs) /* = delete */; + + //! Creates a new chunk. + /*! \param capacity Capacity of the chunk in bytes. + */ + void AddChunk(size_t capacity) { + if (!baseAllocator_) + ownBaseAllocator_ = baseAllocator_ = RAPIDJSON_NEW(BaseAllocator()); + ChunkHeader* chunk = reinterpret_cast<ChunkHeader*>(baseAllocator_->Malloc(sizeof(ChunkHeader) + capacity)); + chunk->capacity = capacity; + chunk->size = 0; + chunk->next = chunkHead_; + chunkHead_ = chunk; + } + + static const int kDefaultChunkCapacity = 64 * 1024; //!< Default chunk capacity. + + //! Chunk header for perpending to each chunk. + /*! Chunks are stored as a singly linked list. + */ + struct ChunkHeader { + size_t capacity; //!< Capacity of the chunk in bytes (excluding the header itself). + size_t size; //!< Current size of allocated memory in bytes. + ChunkHeader *next; //!< Next chunk in the linked list. + }; + + ChunkHeader *chunkHead_; //!< Head of the chunk linked-list. Only the head chunk serves allocation. + size_t chunk_capacity_; //!< The minimum capacity of chunk when they are allocated. + void *userBuffer_; //!< User supplied buffer. + BaseAllocator* baseAllocator_; //!< base allocator for allocating memory chunks. + BaseAllocator* ownBaseAllocator_; //!< base allocator created by this object. +}; + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_ENCODINGS_H_ diff --git a/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/document.h b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/document.h new file mode 100755 index 000000000..94d6e5355 --- /dev/null +++ b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/document.h @@ -0,0 +1,1932 @@ +// Copyright (C) 2011 Milo Yip +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef RAPIDJSON_DOCUMENT_H_ +#define RAPIDJSON_DOCUMENT_H_ + +/*! \file document.h */ + +#include "reader.h" +#include "internal/meta.h" +#include "internal/strfunc.h" +#include <new> // placement new + +#ifdef _MSC_VER +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant +#elif defined(__GNUC__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_HAS_STDSTRING + +#ifndef RAPIDJSON_HAS_STDSTRING +#ifdef RAPIDJSON_DOXYGEN_RUNNING +#define RAPIDJSON_HAS_STDSTRING 1 // force generation of documentation +#else +#define RAPIDJSON_HAS_STDSTRING 0 // no std::string support by default +#endif +/*! \def RAPIDJSON_HAS_STDSTRING + \ingroup RAPIDJSON_CONFIG + \brief Enable RapidJSON support for \c std::string + + By defining this preprocessor symbol to \c 1, several convenience functions for using + \ref rapidjson::GenericValue with \c std::string are enabled, especially + for construction and comparison. + + \hideinitializer +*/ +#include <string> +#endif // RAPIDJSON_HAS_STDSTRING + +#ifndef RAPIDJSON_NOMEMBERITERATORCLASS +#include <iterator> // std::iterator, std::random_access_iterator_tag +#endif + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS +#include <utility> // std::move +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +// Forward declaration. +template <typename Encoding, typename Allocator> +class GenericValue; + +//! Name-value pair in a JSON object value. +/*! + This class was internal to GenericValue. It used to be a inner struct. + But a compiler (IBM XL C/C++ for AIX) have reported to have problem with that so it moved as a namespace scope struct. + https://code.google.com/p/rapidjson/issues/detail?id=64 +*/ +template <typename Encoding, typename Allocator> +struct GenericMember { + GenericValue<Encoding, Allocator> name; //!< name of member (must be a string) + GenericValue<Encoding, Allocator> value; //!< value of member. +}; + +/////////////////////////////////////////////////////////////////////////////// +// GenericMemberIterator + +#ifndef RAPIDJSON_NOMEMBERITERATORCLASS + +//! (Constant) member iterator for a JSON object value +/*! + \tparam Const Is this a constant iterator? + \tparam Encoding Encoding of the value. (Even non-string values need to have the same encoding in a document) + \tparam Allocator Allocator type for allocating memory of object, array and string. + + This class implements a Random Access Iterator for GenericMember elements + of a GenericValue, see ISO/IEC 14882:2003(E) C++ standard, 24.1 [lib.iterator.requirements]. + + \note This iterator implementation is mainly intended to avoid implicit + conversions from iterator values to \c NULL, + e.g. from GenericValue::FindMember. + + \note Define \c RAPIDJSON_NOMEMBERITERATORCLASS to fall back to a + pointer-based implementation, if your platform doesn't provide + the C++ <iterator> header. + + \see GenericMember, GenericValue::MemberIterator, GenericValue::ConstMemberIterator + */ +template <bool Const, typename Encoding, typename Allocator> +class GenericMemberIterator + : public std::iterator<std::random_access_iterator_tag + , typename internal::MaybeAddConst<Const,GenericMember<Encoding,Allocator> >::Type> { + + friend class GenericValue<Encoding,Allocator>; + template <bool, typename, typename> friend class GenericMemberIterator; + + typedef GenericMember<Encoding,Allocator> PlainType; + typedef typename internal::MaybeAddConst<Const,PlainType>::Type ValueType; + typedef std::iterator<std::random_access_iterator_tag,ValueType> BaseType; + +public: + //! Iterator type itself + typedef GenericMemberIterator Iterator; + //! Constant iterator type + typedef GenericMemberIterator<true,Encoding,Allocator> ConstIterator; + //! Non-constant iterator type + typedef GenericMemberIterator<false,Encoding,Allocator> NonConstIterator; + + //! Pointer to (const) GenericMember + typedef typename BaseType::pointer Pointer; + //! Reference to (const) GenericMember + typedef typename BaseType::reference Reference; + //! Signed integer type (e.g. \c ptrdiff_t) + typedef typename BaseType::difference_type DifferenceType; + + //! Default constructor (singular value) + /*! Creates an iterator pointing to no element. + \note All operations, except for comparisons, are undefined on such values. + */ + GenericMemberIterator() : ptr_() {} + + //! Iterator conversions to more const + /*! + \param it (Non-const) iterator to copy from + + Allows the creation of an iterator from another GenericMemberIterator + that is "less const". Especially, creating a non-constant iterator + from a constant iterator are disabled: + \li const -> non-const (not ok) + \li const -> const (ok) + \li non-const -> const (ok) + \li non-const -> non-const (ok) + + \note If the \c Const template parameter is already \c false, this + constructor effectively defines a regular copy-constructor. + Otherwise, the copy constructor is implicitly defined. + */ + GenericMemberIterator(const NonConstIterator & it) : ptr_(it.ptr_) {} + + //! @name stepping + //@{ + Iterator& operator++(){ ++ptr_; return *this; } + Iterator& operator--(){ --ptr_; return *this; } + Iterator operator++(int){ Iterator old(*this); ++ptr_; return old; } + Iterator operator--(int){ Iterator old(*this); --ptr_; return old; } + //@} + + //! @name increment/decrement + //@{ + Iterator operator+(DifferenceType n) const { return Iterator(ptr_+n); } + Iterator operator-(DifferenceType n) const { return Iterator(ptr_-n); } + + Iterator& operator+=(DifferenceType n) { ptr_+=n; return *this; } + Iterator& operator-=(DifferenceType n) { ptr_-=n; return *this; } + //@} + + //! @name relations + //@{ + bool operator==(ConstIterator that) const { return ptr_ == that.ptr_; } + bool operator!=(ConstIterator that) const { return ptr_ != that.ptr_; } + bool operator<=(ConstIterator that) const { return ptr_ <= that.ptr_; } + bool operator>=(ConstIterator that) const { return ptr_ >= that.ptr_; } + bool operator< (ConstIterator that) const { return ptr_ < that.ptr_; } + bool operator> (ConstIterator that) const { return ptr_ > that.ptr_; } + //@} + + //! @name dereference + //@{ + Reference operator*() const { return *ptr_; } + Pointer operator->() const { return ptr_; } + Reference operator[](DifferenceType n) const { return ptr_[n]; } + //@} + + //! Distance + DifferenceType operator-(ConstIterator that) const { return ptr_-that.ptr_; } + +private: + //! Internal constructor from plain pointer + explicit GenericMemberIterator(Pointer p) : ptr_(p) {} + + Pointer ptr_; //!< raw pointer +}; + +#else // RAPIDJSON_NOMEMBERITERATORCLASS + +// class-based member iterator implementation disabled, use plain pointers + +template <bool Const, typename Encoding, typename Allocator> +struct GenericMemberIterator; + +//! non-const GenericMemberIterator +template <typename Encoding, typename Allocator> +struct GenericMemberIterator<false,Encoding,Allocator> { + //! use plain pointer as iterator type + typedef GenericMember<Encoding,Allocator>* Iterator; +}; +//! const GenericMemberIterator +template <typename Encoding, typename Allocator> +struct GenericMemberIterator<true,Encoding,Allocator> { + //! use plain const pointer as iterator type + typedef const GenericMember<Encoding,Allocator>* Iterator; +}; + +#endif // RAPIDJSON_NOMEMBERITERATORCLASS + +/////////////////////////////////////////////////////////////////////////////// +// GenericStringRef + +//! Reference to a constant string (not taking a copy) +/*! + \tparam CharType character type of the string + + This helper class is used to automatically infer constant string + references for string literals, especially from \c const \b (!) + character arrays. + + The main use is for creating JSON string values without copying the + source string via an \ref Allocator. This requires that the referenced + string pointers have a sufficient lifetime, which exceeds the lifetime + of the associated GenericValue. + + \b Example + \code + Value v("foo"); // ok, no need to copy & calculate length + const char foo[] = "foo"; + v.SetString(foo); // ok + + const char* bar = foo; + // Value x(bar); // not ok, can't rely on bar's lifetime + Value x(StringRef(bar)); // lifetime explicitly guaranteed by user + Value y(StringRef(bar, 3)); // ok, explicitly pass length + \endcode + + \see StringRef, GenericValue::SetString +*/ +template<typename CharType> +struct GenericStringRef { + typedef CharType Ch; //!< character type of the string + + //! Create string reference from \c const character array + /*! + This constructor implicitly creates a constant string reference from + a \c const character array. It has better performance than + \ref StringRef(const CharType*) by inferring the string \ref length + from the array length, and also supports strings containing null + characters. + + \tparam N length of the string, automatically inferred + + \param str Constant character array, lifetime assumed to be longer + than the use of the string in e.g. a GenericValue + + \post \ref s == str + + \note Constant complexity. + \note There is a hidden, private overload to disallow references to + non-const character arrays to be created via this constructor. + By this, e.g. function-scope arrays used to be filled via + \c snprintf are excluded from consideration. + In such cases, the referenced string should be \b copied to the + GenericValue instead. + */ + template<SizeType N> + GenericStringRef(const CharType (&str)[N]) RAPIDJSON_NOEXCEPT + : s(str), length(N-1) {} + + //! Explicitly create string reference from \c const character pointer + /*! + This constructor can be used to \b explicitly create a reference to + a constant string pointer. + + \see StringRef(const CharType*) + + \param str Constant character pointer, lifetime assumed to be longer + than the use of the string in e.g. a GenericValue + + \post \ref s == str + + \note There is a hidden, private overload to disallow references to + non-const character arrays to be created via this constructor. + By this, e.g. function-scope arrays used to be filled via + \c snprintf are excluded from consideration. + In such cases, the referenced string should be \b copied to the + GenericValue instead. + */ + explicit GenericStringRef(const CharType* str) + : s(str), length(internal::StrLen(str)){ RAPIDJSON_ASSERT(s != NULL); } + + //! Create constant string reference from pointer and length + /*! \param str constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \param len length of the string, excluding the trailing NULL terminator + + \post \ref s == str && \ref length == len + \note Constant complexity. + */ + GenericStringRef(const CharType* str, SizeType len) + : s(str), length(len) { RAPIDJSON_ASSERT(s != NULL); } + + //! implicit conversion to plain CharType pointer + operator const Ch *() const { return s; } + + const Ch* const s; //!< plain CharType pointer + const SizeType length; //!< length of the string (excluding the trailing NULL terminator) + +private: + //! Disallow copy-assignment + GenericStringRef operator=(const GenericStringRef&); + //! Disallow construction from non-const array + template<SizeType N> + GenericStringRef(CharType (&str)[N]) /* = delete */; +}; + +//! Mark a character pointer as constant string +/*! Mark a plain character pointer as a "string literal". This function + can be used to avoid copying a character string to be referenced as a + value in a JSON GenericValue object, if the string's lifetime is known + to be valid long enough. + \tparam CharType Character type of the string + \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \return GenericStringRef string reference object + \relatesalso GenericStringRef + + \see GenericValue::GenericValue(StringRefType), GenericValue::operator=(StringRefType), GenericValue::SetString(StringRefType), GenericValue::PushBack(StringRefType, Allocator&), GenericValue::AddMember +*/ +template<typename CharType> +inline GenericStringRef<CharType> StringRef(const CharType* str) { + return GenericStringRef<CharType>(str, internal::StrLen(str)); +} + +//! Mark a character pointer as constant string +/*! Mark a plain character pointer as a "string literal". This function + can be used to avoid copying a character string to be referenced as a + value in a JSON GenericValue object, if the string's lifetime is known + to be valid long enough. + + This version has better performance with supplied length, and also + supports string containing null characters. + + \tparam CharType character type of the string + \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \param length The length of source string. + \return GenericStringRef string reference object + \relatesalso GenericStringRef +*/ +template<typename CharType> +inline GenericStringRef<CharType> StringRef(const CharType* str, size_t length) { + return GenericStringRef<CharType>(str, SizeType(length)); +} + +#if RAPIDJSON_HAS_STDSTRING +//! Mark a string object as constant string +/*! Mark a string object (e.g. \c std::string) as a "string literal". + This function can be used to avoid copying a string to be referenced as a + value in a JSON GenericValue object, if the string's lifetime is known + to be valid long enough. + + \tparam CharType character type of the string + \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \return GenericStringRef string reference object + \relatesalso GenericStringRef + \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. +*/ +template<typename CharType> +inline GenericStringRef<CharType> StringRef(const std::basic_string<CharType>& str) { + return GenericStringRef<CharType>(str.data(), SizeType(str.size())); +} +#endif + +/////////////////////////////////////////////////////////////////////////////// +// GenericValue type traits +namespace internal { + +template <typename T, typename Encoding = void, typename Allocator = void> +struct IsGenericValueImpl : FalseType {}; + +// select candidates according to nested encoding and allocator types +template <typename T> struct IsGenericValueImpl<T, typename Void<typename T::EncodingType>::Type, typename Void<typename T::AllocatorType>::Type> + : IsBaseOf<GenericValue<typename T::EncodingType, typename T::AllocatorType>, T>::Type {}; + +// helper to match arbitrary GenericValue instantiations, including derived classes +template <typename T> struct IsGenericValue : IsGenericValueImpl<T>::Type {}; + +} // namespace internal + +/////////////////////////////////////////////////////////////////////////////// +// GenericValue + +//! Represents a JSON value. Use Value for UTF8 encoding and default allocator. +/*! + A JSON value can be one of 7 types. This class is a variant type supporting + these types. + + Use the Value if UTF8 and default allocator + + \tparam Encoding Encoding of the value. (Even non-string values need to have the same encoding in a document) + \tparam Allocator Allocator type for allocating memory of object, array and string. +*/ +template <typename Encoding, typename Allocator = MemoryPoolAllocator<> > +class GenericValue { +public: + //! Name-value pair in an object. + typedef GenericMember<Encoding, Allocator> Member; + typedef Encoding EncodingType; //!< Encoding type from template parameter. + typedef Allocator AllocatorType; //!< Allocator type from template parameter. + typedef typename Encoding::Ch Ch; //!< Character type derived from Encoding. + typedef GenericStringRef<Ch> StringRefType; //!< Reference to a constant string + typedef typename GenericMemberIterator<false,Encoding,Allocator>::Iterator MemberIterator; //!< Member iterator for iterating in object. + typedef typename GenericMemberIterator<true,Encoding,Allocator>::Iterator ConstMemberIterator; //!< Constant member iterator for iterating in object. + typedef GenericValue* ValueIterator; //!< Value iterator for iterating in array. + typedef const GenericValue* ConstValueIterator; //!< Constant value iterator for iterating in array. + + //!@name Constructors and destructor. + //@{ + + //! Default constructor creates a null value. + GenericValue() RAPIDJSON_NOEXCEPT : data_(), flags_(kNullFlag) {} + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move constructor in C++11 + GenericValue(GenericValue&& rhs) RAPIDJSON_NOEXCEPT : data_(rhs.data_), flags_(rhs.flags_) { + rhs.flags_ = kNullFlag; // give up contents + } +#endif + +private: + //! Copy constructor is not permitted. + GenericValue(const GenericValue& rhs); + +public: + + //! Constructor with JSON value type. + /*! This creates a Value of specified type with default content. + \param type Type of the value. + \note Default content for number is zero. + */ + explicit GenericValue(Type type) RAPIDJSON_NOEXCEPT : data_(), flags_() { + static const unsigned defaultFlags[7] = { + kNullFlag, kFalseFlag, kTrueFlag, kObjectFlag, kArrayFlag, kShortStringFlag, + kNumberAnyFlag + }; + RAPIDJSON_ASSERT(type <= kNumberType); + flags_ = defaultFlags[type]; + + // Use ShortString to store empty string. + if (type == kStringType) + data_.ss.SetLength(0); + } + + //! Explicit copy constructor (with allocator) + /*! Creates a copy of a Value by using the given Allocator + \tparam SourceAllocator allocator of \c rhs + \param rhs Value to copy from (read-only) + \param allocator Allocator for allocating copied elements and buffers. Commonly use GenericDocument::GetAllocator(). + \see CopyFrom() + */ + template< typename SourceAllocator > + GenericValue(const GenericValue<Encoding, SourceAllocator>& rhs, Allocator & allocator); + + //! Constructor for boolean value. + /*! \param b Boolean value + \note This constructor is limited to \em real boolean values and rejects + implicitly converted types like arbitrary pointers. Use an explicit cast + to \c bool, if you want to construct a boolean JSON value in such cases. + */ +#ifndef RAPIDJSON_DOXYGEN_RUNNING // hide SFINAE from Doxygen + template <typename T> + explicit GenericValue(T b, RAPIDJSON_ENABLEIF((internal::IsSame<T,bool>))) RAPIDJSON_NOEXCEPT +#else + explicit GenericValue(bool b) RAPIDJSON_NOEXCEPT +#endif + : data_(), flags_(b ? kTrueFlag : kFalseFlag) { + // safe-guard against failing SFINAE + RAPIDJSON_STATIC_ASSERT((internal::IsSame<bool,T>::Value)); + } + + //! Constructor for int value. + explicit GenericValue(int i) RAPIDJSON_NOEXCEPT : data_(), flags_(kNumberIntFlag) { + data_.n.i64 = i; + if (i >= 0) + flags_ |= kUintFlag | kUint64Flag; + } + + //! Constructor for unsigned value. + explicit GenericValue(unsigned u) RAPIDJSON_NOEXCEPT : data_(), flags_(kNumberUintFlag) { + data_.n.u64 = u; + if (!(u & 0x80000000)) + flags_ |= kIntFlag | kInt64Flag; + } + + //! Constructor for int64_t value. + explicit GenericValue(int64_t i64) RAPIDJSON_NOEXCEPT : data_(), flags_(kNumberInt64Flag) { + data_.n.i64 = i64; + if (i64 >= 0) { + flags_ |= kNumberUint64Flag; + if (!(static_cast<uint64_t>(i64) & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x00000000))) + flags_ |= kUintFlag; + if (!(static_cast<uint64_t>(i64) & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000))) + flags_ |= kIntFlag; + } + else if (i64 >= static_cast<int64_t>(RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000))) + flags_ |= kIntFlag; + } + + //! Constructor for uint64_t value. + explicit GenericValue(uint64_t u64) RAPIDJSON_NOEXCEPT : data_(), flags_(kNumberUint64Flag) { + data_.n.u64 = u64; + if (!(u64 & RAPIDJSON_UINT64_C2(0x80000000, 0x00000000))) + flags_ |= kInt64Flag; + if (!(u64 & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x00000000))) + flags_ |= kUintFlag; + if (!(u64 & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000))) + flags_ |= kIntFlag; + } + + //! Constructor for double value. + explicit GenericValue(double d) RAPIDJSON_NOEXCEPT : data_(), flags_(kNumberDoubleFlag) { data_.n.d = d; } + + //! Constructor for constant string (i.e. do not make a copy of string) + GenericValue(const Ch* s, SizeType length) RAPIDJSON_NOEXCEPT : data_(), flags_() { SetStringRaw(StringRef(s, length)); } + + //! Constructor for constant string (i.e. do not make a copy of string) + explicit GenericValue(StringRefType s) RAPIDJSON_NOEXCEPT : data_(), flags_() { SetStringRaw(s); } + + //! Constructor for copy-string (i.e. do make a copy of string) + GenericValue(const Ch* s, SizeType length, Allocator& allocator) : data_(), flags_() { SetStringRaw(StringRef(s, length), allocator); } + + //! Constructor for copy-string (i.e. do make a copy of string) + GenericValue(const Ch*s, Allocator& allocator) : data_(), flags_() { SetStringRaw(StringRef(s), allocator); } + +#if RAPIDJSON_HAS_STDSTRING + //! Constructor for copy-string from a string object (i.e. do make a copy of string) + /*! \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. + */ + GenericValue(const std::basic_string<Ch>& s, Allocator& allocator) : data_(), flags_() { SetStringRaw(StringRef(s), allocator); } +#endif + + //! Destructor. + /*! Need to destruct elements of array, members of object, or copy-string. + */ + ~GenericValue() { + if (Allocator::kNeedFree) { // Shortcut by Allocator's trait + switch(flags_) { + case kArrayFlag: + for (GenericValue* v = data_.a.elements; v != data_.a.elements + data_.a.size; ++v) + v->~GenericValue(); + Allocator::Free(data_.a.elements); + break; + + case kObjectFlag: + for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m) + m->~Member(); + Allocator::Free(data_.o.members); + break; + + case kCopyStringFlag: + Allocator::Free(const_cast<Ch*>(data_.s.str)); + break; + + default: + break; // Do nothing for other types. + } + } + } + + //@} + + //!@name Assignment operators + //@{ + + //! Assignment with move semantics. + /*! \param rhs Source of the assignment. It will become a null value after assignment. + */ + GenericValue& operator=(GenericValue& rhs) RAPIDJSON_NOEXCEPT { + RAPIDJSON_ASSERT(this != &rhs); + this->~GenericValue(); + RawAssign(rhs); + return *this; + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move assignment in C++11 + GenericValue& operator=(GenericValue&& rhs) RAPIDJSON_NOEXCEPT { + return *this = rhs.Move(); + } +#endif + + //! Assignment of constant string reference (no copy) + /*! \param str Constant string reference to be assigned + \note This overload is needed to avoid clashes with the generic primitive type assignment overload below. + \see GenericStringRef, operator=(T) + */ + GenericValue& operator=(StringRefType str) RAPIDJSON_NOEXCEPT { + GenericValue s(str); + return *this = s; + } + + //! Assignment with primitive types. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param value The value to be assigned. + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref SetString(const Ch*, Allocator&) (for copying) or + \ref StringRef() (to explicitly mark the pointer as constant) instead. + All other pointer types would implicitly convert to \c bool, + use \ref SetBool() instead. + */ + template <typename T> + RAPIDJSON_DISABLEIF_RETURN((internal::IsPointer<T>), (GenericValue&)) + operator=(T value) { + GenericValue v(value); + return *this = v; + } + + //! Deep-copy assignment from Value + /*! Assigns a \b copy of the Value to the current Value object + \tparam SourceAllocator Allocator type of \c rhs + \param rhs Value to copy from (read-only) + \param allocator Allocator to use for copying + */ + template <typename SourceAllocator> + GenericValue& CopyFrom(const GenericValue<Encoding, SourceAllocator>& rhs, Allocator& allocator) { + RAPIDJSON_ASSERT((void*)this != (void const*)&rhs); + this->~GenericValue(); + new (this) GenericValue(rhs, allocator); + return *this; + } + + //! Exchange the contents of this value with those of other. + /*! + \param other Another value. + \note Constant complexity. + */ + GenericValue& Swap(GenericValue& other) RAPIDJSON_NOEXCEPT { + GenericValue temp; + temp.RawAssign(*this); + RawAssign(other); + other.RawAssign(temp); + return *this; + } + + //! Prepare Value for move semantics + /*! \return *this */ + GenericValue& Move() RAPIDJSON_NOEXCEPT { return *this; } + //@} + + //!@name Equal-to and not-equal-to operators + //@{ + //! Equal-to operator + /*! + \note If an object contains duplicated named member, comparing equality with any object is always \c false. + \note Linear time complexity (number of all values in the subtree and total lengths of all strings). + */ + template <typename SourceAllocator> + bool operator==(const GenericValue<Encoding, SourceAllocator>& rhs) const { + typedef GenericValue<Encoding, SourceAllocator> RhsType; + if (GetType() != rhs.GetType()) + return false; + + switch (GetType()) { + case kObjectType: // Warning: O(n^2) inner-loop + if (data_.o.size != rhs.data_.o.size) + return false; + for (ConstMemberIterator lhsMemberItr = MemberBegin(); lhsMemberItr != MemberEnd(); ++lhsMemberItr) { + typename RhsType::ConstMemberIterator rhsMemberItr = rhs.FindMember(lhsMemberItr->name); + if (rhsMemberItr == rhs.MemberEnd() || lhsMemberItr->value != rhsMemberItr->value) + return false; + } + return true; + + case kArrayType: + if (data_.a.size != rhs.data_.a.size) + return false; + for (SizeType i = 0; i < data_.a.size; i++) + if ((*this)[i] != rhs[i]) + return false; + return true; + + case kStringType: + return StringEqual(rhs); + + case kNumberType: + if (IsDouble() || rhs.IsDouble()) + return GetDouble() == rhs.GetDouble(); // May convert one operand from integer to double. + else + return data_.n.u64 == rhs.data_.n.u64; + + default: // kTrueType, kFalseType, kNullType + return true; + } + } + + //! Equal-to operator with const C-string pointer + bool operator==(const Ch* rhs) const { return *this == GenericValue(StringRef(rhs)); } + +#if RAPIDJSON_HAS_STDSTRING + //! Equal-to operator with string object + /*! \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. + */ + bool operator==(const std::basic_string<Ch>& rhs) const { return *this == GenericValue(StringRef(rhs)); } +#endif + + //! Equal-to operator with primitive types + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c double, \c true, \c false + */ + template <typename T> RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>,internal::IsGenericValue<T> >), (bool)) operator==(const T& rhs) const { return *this == GenericValue(rhs); } + + //! Not-equal-to operator + /*! \return !(*this == rhs) + */ + template <typename SourceAllocator> + bool operator!=(const GenericValue<Encoding, SourceAllocator>& rhs) const { return !(*this == rhs); } + + //! Not-equal-to operator with const C-string pointer + bool operator!=(const Ch* rhs) const { return !(*this == rhs); } + + //! Not-equal-to operator with arbitrary types + /*! \return !(*this == rhs) + */ + template <typename T> RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue<T>), (bool)) operator!=(const T& rhs) const { return !(*this == rhs); } + + //! Equal-to operator with arbitrary types (symmetric version) + /*! \return (rhs == lhs) + */ + template <typename T> friend RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue<T>), (bool)) operator==(const T& lhs, const GenericValue& rhs) { return rhs == lhs; } + + //! Not-Equal-to operator with arbitrary types (symmetric version) + /*! \return !(rhs == lhs) + */ + template <typename T> friend RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue<T>), (bool)) operator!=(const T& lhs, const GenericValue& rhs) { return !(rhs == lhs); } + //@} + + //!@name Type + //@{ + + Type GetType() const { return static_cast<Type>(flags_ & kTypeMask); } + bool IsNull() const { return flags_ == kNullFlag; } + bool IsFalse() const { return flags_ == kFalseFlag; } + bool IsTrue() const { return flags_ == kTrueFlag; } + bool IsBool() const { return (flags_ & kBoolFlag) != 0; } + bool IsObject() const { return flags_ == kObjectFlag; } + bool IsArray() const { return flags_ == kArrayFlag; } + bool IsNumber() const { return (flags_ & kNumberFlag) != 0; } + bool IsInt() const { return (flags_ & kIntFlag) != 0; } + bool IsUint() const { return (flags_ & kUintFlag) != 0; } + bool IsInt64() const { return (flags_ & kInt64Flag) != 0; } + bool IsUint64() const { return (flags_ & kUint64Flag) != 0; } + bool IsDouble() const { return (flags_ & kDoubleFlag) != 0; } + bool IsString() const { return (flags_ & kStringFlag) != 0; } + + //@} + + //!@name Null + //@{ + + GenericValue& SetNull() { this->~GenericValue(); new (this) GenericValue(); return *this; } + + //@} + + //!@name Bool + //@{ + + bool GetBool() const { RAPIDJSON_ASSERT(IsBool()); return flags_ == kTrueFlag; } + //!< Set boolean value + /*! \post IsBool() == true */ + GenericValue& SetBool(bool b) { this->~GenericValue(); new (this) GenericValue(b); return *this; } + + //@} + + //!@name Object + //@{ + + //! Set this value as an empty object. + /*! \post IsObject() == true */ + GenericValue& SetObject() { this->~GenericValue(); new (this) GenericValue(kObjectType); return *this; } + + //! Get the number of members in the object. + SizeType MemberCount() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.size; } + + //! Check whether the object is empty. + bool ObjectEmpty() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.size == 0; } + + //! Get a value from an object associated with the name. + /*! \pre IsObject() == true + \tparam T Either \c Ch or \c const \c Ch (template used for disambiguation with \ref operator[](SizeType)) + \note In version 0.1x, if the member is not found, this function returns a null value. This makes issue 7. + Since 0.2, if the name is not correct, it will assert. + If user is unsure whether a member exists, user should use HasMember() first. + A better approach is to use FindMember(). + \note Linear time complexity. + */ + template <typename T> + RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr<internal::IsSame<typename internal::RemoveConst<T>::Type, Ch> >),(GenericValue&)) operator[](T* name) { + GenericValue n(StringRef(name)); + return (*this)[n]; + } + template <typename T> + RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr<internal::IsSame<typename internal::RemoveConst<T>::Type, Ch> >),(const GenericValue&)) operator[](T* name) const { return const_cast<GenericValue&>(*this)[name]; } + + //! Get a value from an object associated with the name. + /*! \pre IsObject() == true + \tparam SourceAllocator Allocator of the \c name value + + \note Compared to \ref operator[](T*), this version is faster because it does not need a StrLen(). + And it can also handle strings with embedded null characters. + + \note Linear time complexity. + */ + template <typename SourceAllocator> + GenericValue& operator[](const GenericValue<Encoding, SourceAllocator>& name) { + MemberIterator member = FindMember(name); + if (member != MemberEnd()) + return member->value; + else { + RAPIDJSON_ASSERT(false); // see above note + static GenericValue NullValue; + return NullValue; + } + } + template <typename SourceAllocator> + const GenericValue& operator[](const GenericValue<Encoding, SourceAllocator>& name) const { return const_cast<GenericValue&>(*this)[name]; } + + //! Const member iterator + /*! \pre IsObject() == true */ + ConstMemberIterator MemberBegin() const { RAPIDJSON_ASSERT(IsObject()); return ConstMemberIterator(data_.o.members); } + //! Const \em past-the-end member iterator + /*! \pre IsObject() == true */ + ConstMemberIterator MemberEnd() const { RAPIDJSON_ASSERT(IsObject()); return ConstMemberIterator(data_.o.members + data_.o.size); } + //! Member iterator + /*! \pre IsObject() == true */ + MemberIterator MemberBegin() { RAPIDJSON_ASSERT(IsObject()); return MemberIterator(data_.o.members); } + //! \em Past-the-end member iterator + /*! \pre IsObject() == true */ + MemberIterator MemberEnd() { RAPIDJSON_ASSERT(IsObject()); return MemberIterator(data_.o.members + data_.o.size); } + + //! Check whether a member exists in the object. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Whether a member with that name exists. + \note It is better to use FindMember() directly if you need the obtain the value as well. + \note Linear time complexity. + */ + bool HasMember(const Ch* name) const { return FindMember(name) != MemberEnd(); } + + //! Check whether a member exists in the object with GenericValue name. + /*! + This version is faster because it does not need a StrLen(). It can also handle string with null character. + \param name Member name to be searched. + \pre IsObject() == true + \return Whether a member with that name exists. + \note It is better to use FindMember() directly if you need the obtain the value as well. + \note Linear time complexity. + */ + template <typename SourceAllocator> + bool HasMember(const GenericValue<Encoding, SourceAllocator>& name) const { return FindMember(name) != MemberEnd(); } + + //! Find member by name. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Iterator to member, if it exists. + Otherwise returns \ref MemberEnd(). + + \note Earlier versions of Rapidjson returned a \c NULL pointer, in case + the requested member doesn't exist. For consistency with e.g. + \c std::map, this has been changed to MemberEnd() now. + \note Linear time complexity. + */ + MemberIterator FindMember(const Ch* name) { + GenericValue n(StringRef(name)); + return FindMember(n); + } + + ConstMemberIterator FindMember(const Ch* name) const { return const_cast<GenericValue&>(*this).FindMember(name); } + + //! Find member by name. + /*! + This version is faster because it does not need a StrLen(). It can also handle string with null character. + \param name Member name to be searched. + \pre IsObject() == true + \return Iterator to member, if it exists. + Otherwise returns \ref MemberEnd(). + + \note Earlier versions of Rapidjson returned a \c NULL pointer, in case + the requested member doesn't exist. For consistency with e.g. + \c std::map, this has been changed to MemberEnd() now. + \note Linear time complexity. + */ + template <typename SourceAllocator> + MemberIterator FindMember(const GenericValue<Encoding, SourceAllocator>& name) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(name.IsString()); + MemberIterator member = MemberBegin(); + for ( ; member != MemberEnd(); ++member) + if (name.StringEqual(member->name)) + break; + return member; + } + template <typename SourceAllocator> ConstMemberIterator FindMember(const GenericValue<Encoding, SourceAllocator>& name) const { return const_cast<GenericValue&>(*this).FindMember(name); } + + //! Add a member (name-value pair) to the object. + /*! \param name A string value as name of member. + \param value Value of any type. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \note The ownership of \c name and \c value will be transferred to this object on success. + \pre IsObject() && name.IsString() + \post name.IsNull() && value.IsNull() + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(GenericValue& name, GenericValue& value, Allocator& allocator) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(name.IsString()); + + Object& o = data_.o; + if (o.size >= o.capacity) { + if (o.capacity == 0) { + o.capacity = kDefaultObjectCapacity; + o.members = reinterpret_cast<Member*>(allocator.Malloc(o.capacity * sizeof(Member))); + } + else { + SizeType oldCapacity = o.capacity; + o.capacity += (oldCapacity + 1) / 2; // grow by factor 1.5 + o.members = reinterpret_cast<Member*>(allocator.Realloc(o.members, oldCapacity * sizeof(Member), o.capacity * sizeof(Member))); + } + } + o.members[o.size].name.RawAssign(name); + o.members[o.size].value.RawAssign(value); + o.size++; + return *this; + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericValue& AddMember(GenericValue&& name, GenericValue&& value, Allocator& allocator) { + return AddMember(name, value, allocator); + } + GenericValue& AddMember(GenericValue&& name, GenericValue& value, Allocator& allocator) { + return AddMember(name, value, allocator); + } + GenericValue& AddMember(GenericValue& name, GenericValue&& value, Allocator& allocator) { + return AddMember(name, value, allocator); + } + GenericValue& AddMember(StringRefType name, GenericValue&& value, Allocator& allocator) { + GenericValue n(name); + return AddMember(n, value, allocator); + } +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + + + //! Add a member (name-value pair) to the object. + /*! \param name A constant string reference as name of member. + \param value Value of any type. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \note The ownership of \c value will be transferred to this object on success. + \pre IsObject() + \post value.IsNull() + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(StringRefType name, GenericValue& value, Allocator& allocator) { + GenericValue n(name); + return AddMember(n, value, allocator); + } + + //! Add a constant string value as member (name-value pair) to the object. + /*! \param name A constant string reference as name of member. + \param value constant string reference as value of member. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + \note This overload is needed to avoid clashes with the generic primitive type AddMember(StringRefType,T,Allocator&) overload below. + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(StringRefType name, StringRefType value, Allocator& allocator) { + GenericValue v(value); + return AddMember(name, v, allocator); + } + + //! Add any primitive value as member (name-value pair) to the object. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param name A constant string reference as name of member. + \param value Value of primitive type \c T as value of member + \param allocator Allocator for reallocating memory. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref AddMember(StringRefType, GenericValue&, Allocator&) or \ref + AddMember(StringRefType, StringRefType, Allocator&). + All other pointer types would implicitly convert to \c bool, + use an explicit cast instead, if needed. + \note Amortized Constant time complexity. + */ + template <typename T> + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (GenericValue&)) + AddMember(StringRefType name, T value, Allocator& allocator) { + GenericValue n(name); + GenericValue v(value); + return AddMember(n, v, allocator); + } + + //! Remove all members in the object. + /*! This function do not deallocate memory in the object, i.e. the capacity is unchanged. + \note Linear time complexity. + */ + void RemoveAllMembers() { + RAPIDJSON_ASSERT(IsObject()); + for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m) + m->~Member(); + data_.o.size = 0; + } + + //! Remove a member in object by its name. + /*! \param name Name of member to be removed. + \return Whether the member existed. + \note This function may reorder the object members. Use \ref + EraseMember(ConstMemberIterator) if you need to preserve the + relative order of the remaining members. + \note Linear time complexity. + */ + bool RemoveMember(const Ch* name) { + GenericValue n(StringRef(name)); + return RemoveMember(n); + } + + template <typename SourceAllocator> + bool RemoveMember(const GenericValue<Encoding, SourceAllocator>& name) { + MemberIterator m = FindMember(name); + if (m != MemberEnd()) { + RemoveMember(m); + return true; + } + else + return false; + } + + //! Remove a member in object by iterator. + /*! \param m member iterator (obtained by FindMember() or MemberBegin()). + \return the new iterator after removal. + \note This function may reorder the object members. Use \ref + EraseMember(ConstMemberIterator) if you need to preserve the + relative order of the remaining members. + \note Constant time complexity. + */ + MemberIterator RemoveMember(MemberIterator m) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(data_.o.size > 0); + RAPIDJSON_ASSERT(data_.o.members != 0); + RAPIDJSON_ASSERT(m >= MemberBegin() && m < MemberEnd()); + + MemberIterator last(data_.o.members + (data_.o.size - 1)); + if (data_.o.size > 1 && m != last) { + // Move the last one to this place + *m = *last; + } + else { + // Only one left, just destroy + m->~Member(); + } + --data_.o.size; + return m; + } + + //! Remove a member from an object by iterator. + /*! \param pos iterator to the member to remove + \pre IsObject() == true && \ref MemberBegin() <= \c pos < \ref MemberEnd() + \return Iterator following the removed element. + If the iterator \c pos refers to the last element, the \ref MemberEnd() iterator is returned. + \note This function preserves the relative order of the remaining object + members. If you do not need this, use the more efficient \ref RemoveMember(MemberIterator). + \note Linear time complexity. + */ + MemberIterator EraseMember(ConstMemberIterator pos) { + return EraseMember(pos, pos +1); + } + + //! Remove members in the range [first, last) from an object. + /*! \param first iterator to the first member to remove + \param last iterator following the last member to remove + \pre IsObject() == true && \ref MemberBegin() <= \c first <= \c last <= \ref MemberEnd() + \return Iterator following the last removed element. + \note This function preserves the relative order of the remaining object + members. + \note Linear time complexity. + */ + MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(data_.o.size > 0); + RAPIDJSON_ASSERT(data_.o.members != 0); + RAPIDJSON_ASSERT(first >= MemberBegin()); + RAPIDJSON_ASSERT(first <= last); + RAPIDJSON_ASSERT(last <= MemberEnd()); + + MemberIterator pos = MemberBegin() + (first - MemberBegin()); + for (MemberIterator itr = pos; itr != last; ++itr) + itr->~Member(); + std::memmove(&*pos, &*last, (MemberEnd() - last) * sizeof(Member)); + data_.o.size -= (last - first); + return pos; + } + + //@} + + //!@name Array + //@{ + + //! Set this value as an empty array. + /*! \post IsArray == true */ + GenericValue& SetArray() { this->~GenericValue(); new (this) GenericValue(kArrayType); return *this; } + + //! Get the number of elements in array. + SizeType Size() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.size; } + + //! Get the capacity of array. + SizeType Capacity() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.capacity; } + + //! Check whether the array is empty. + bool Empty() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.size == 0; } + + //! Remove all elements in the array. + /*! This function do not deallocate memory in the array, i.e. the capacity is unchanged. + \note Linear time complexity. + */ + void Clear() { + RAPIDJSON_ASSERT(IsArray()); + for (SizeType i = 0; i < data_.a.size; ++i) + data_.a.elements[i].~GenericValue(); + data_.a.size = 0; + } + + //! Get an element from array by index. + /*! \pre IsArray() == true + \param index Zero-based index of element. + \see operator[](T*) + */ + GenericValue& operator[](SizeType index) { + RAPIDJSON_ASSERT(IsArray()); + RAPIDJSON_ASSERT(index < data_.a.size); + return data_.a.elements[index]; + } + const GenericValue& operator[](SizeType index) const { return const_cast<GenericValue&>(*this)[index]; } + + //! Element iterator + /*! \pre IsArray() == true */ + ValueIterator Begin() { RAPIDJSON_ASSERT(IsArray()); return data_.a.elements; } + //! \em Past-the-end element iterator + /*! \pre IsArray() == true */ + ValueIterator End() { RAPIDJSON_ASSERT(IsArray()); return data_.a.elements + data_.a.size; } + //! Constant element iterator + /*! \pre IsArray() == true */ + ConstValueIterator Begin() const { return const_cast<GenericValue&>(*this).Begin(); } + //! Constant \em past-the-end element iterator + /*! \pre IsArray() == true */ + ConstValueIterator End() const { return const_cast<GenericValue&>(*this).End(); } + + //! Request the array to have enough capacity to store elements. + /*! \param newCapacity The capacity that the array at least need to have. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \note Linear time complexity. + */ + GenericValue& Reserve(SizeType newCapacity, Allocator &allocator) { + RAPIDJSON_ASSERT(IsArray()); + if (newCapacity > data_.a.capacity) { + data_.a.elements = (GenericValue*)allocator.Realloc(data_.a.elements, data_.a.capacity * sizeof(GenericValue), newCapacity * sizeof(GenericValue)); + data_.a.capacity = newCapacity; + } + return *this; + } + + //! Append a GenericValue at the end of the array. + /*! \param value Value to be appended. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \pre IsArray() == true + \post value.IsNull() == true + \return The value itself for fluent API. + \note The ownership of \c value will be transferred to this array on success. + \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. + \note Amortized constant time complexity. + */ + GenericValue& PushBack(GenericValue& value, Allocator& allocator) { + RAPIDJSON_ASSERT(IsArray()); + if (data_.a.size >= data_.a.capacity) + Reserve(data_.a.capacity == 0 ? kDefaultArrayCapacity : (data_.a.capacity + (data_.a.capacity + 1) / 2), allocator); + data_.a.elements[data_.a.size++].RawAssign(value); + return *this; + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericValue& PushBack(GenericValue&& value, Allocator& allocator) { + return PushBack(value, allocator); + } +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + + //! Append a constant string reference at the end of the array. + /*! \param value Constant string reference to be appended. + \param allocator Allocator for reallocating memory. It must be the same one used previously. Commonly use GenericDocument::GetAllocator(). + \pre IsArray() == true + \return The value itself for fluent API. + \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. + \note Amortized constant time complexity. + \see GenericStringRef + */ + GenericValue& PushBack(StringRefType value, Allocator& allocator) { + return (*this).template PushBack<StringRefType>(value, allocator); + } + + //! Append a primitive value at the end of the array. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param value Value of primitive type T to be appended. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \pre IsArray() == true + \return The value itself for fluent API. + \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref PushBack(GenericValue&, Allocator&) or \ref + PushBack(StringRefType, Allocator&). + All other pointer types would implicitly convert to \c bool, + use an explicit cast instead, if needed. + \note Amortized constant time complexity. + */ + template <typename T> + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (GenericValue&)) + PushBack(T value, Allocator& allocator) { + GenericValue v(value); + return PushBack(v, allocator); + } + + //! Remove the last element in the array. + /*! + \note Constant time complexity. + */ + GenericValue& PopBack() { + RAPIDJSON_ASSERT(IsArray()); + RAPIDJSON_ASSERT(!Empty()); + data_.a.elements[--data_.a.size].~GenericValue(); + return *this; + } + + //! Remove an element of array by iterator. + /*! + \param pos iterator to the element to remove + \pre IsArray() == true && \ref Begin() <= \c pos < \ref End() + \return Iterator following the removed element. If the iterator pos refers to the last element, the End() iterator is returned. + \note Linear time complexity. + */ + ValueIterator Erase(ConstValueIterator pos) { + return Erase(pos, pos + 1); + } + + //! Remove elements in the range [first, last) of the array. + /*! + \param first iterator to the first element to remove + \param last iterator following the last element to remove + \pre IsArray() == true && \ref Begin() <= \c first <= \c last <= \ref End() + \return Iterator following the last removed element. + \note Linear time complexity. + */ + ValueIterator Erase(ConstValueIterator first, ConstValueIterator last) { + RAPIDJSON_ASSERT(IsArray()); + RAPIDJSON_ASSERT(data_.a.size > 0); + RAPIDJSON_ASSERT(data_.a.elements != 0); + RAPIDJSON_ASSERT(first >= Begin()); + RAPIDJSON_ASSERT(first <= last); + RAPIDJSON_ASSERT(last <= End()); + ValueIterator pos = Begin() + (first - Begin()); + for (ValueIterator itr = pos; itr != last; ++itr) + itr->~GenericValue(); + std::memmove(pos, last, (End() - last) * sizeof(GenericValue)); + data_.a.size -= (last - first); + return pos; + } + + //@} + + //!@name Number + //@{ + + int GetInt() const { RAPIDJSON_ASSERT(flags_ & kIntFlag); return data_.n.i.i; } + unsigned GetUint() const { RAPIDJSON_ASSERT(flags_ & kUintFlag); return data_.n.u.u; } + int64_t GetInt64() const { RAPIDJSON_ASSERT(flags_ & kInt64Flag); return data_.n.i64; } + uint64_t GetUint64() const { RAPIDJSON_ASSERT(flags_ & kUint64Flag); return data_.n.u64; } + + double GetDouble() const { + RAPIDJSON_ASSERT(IsNumber()); + if ((flags_ & kDoubleFlag) != 0) return data_.n.d; // exact type, no conversion. + if ((flags_ & kIntFlag) != 0) return data_.n.i.i; // int -> double + if ((flags_ & kUintFlag) != 0) return data_.n.u.u; // unsigned -> double + if ((flags_ & kInt64Flag) != 0) return (double)data_.n.i64; // int64_t -> double (may lose precision) + RAPIDJSON_ASSERT((flags_ & kUint64Flag) != 0); return (double)data_.n.u64; // uint64_t -> double (may lose precision) + } + + GenericValue& SetInt(int i) { this->~GenericValue(); new (this) GenericValue(i); return *this; } + GenericValue& SetUint(unsigned u) { this->~GenericValue(); new (this) GenericValue(u); return *this; } + GenericValue& SetInt64(int64_t i64) { this->~GenericValue(); new (this) GenericValue(i64); return *this; } + GenericValue& SetUint64(uint64_t u64) { this->~GenericValue(); new (this) GenericValue(u64); return *this; } + GenericValue& SetDouble(double d) { this->~GenericValue(); new (this) GenericValue(d); return *this; } + + //@} + + //!@name String + //@{ + + const Ch* GetString() const { RAPIDJSON_ASSERT(IsString()); return ((flags_ & kInlineStrFlag) ? data_.ss.str : data_.s.str); } + + //! Get the length of string. + /*! Since rapidjson permits "\\u0000" in the json string, strlen(v.GetString()) may not equal to v.GetStringLength(). + */ + SizeType GetStringLength() const { RAPIDJSON_ASSERT(IsString()); return ((flags_ & kInlineStrFlag) ? (data_.ss.GetLength()) : data_.s.length); } + + //! Set this value as a string without copying source string. + /*! This version has better performance with supplied length, and also support string containing null character. + \param s source string pointer. + \param length The length of source string, excluding the trailing null terminator. + \return The value itself for fluent API. + \post IsString() == true && GetString() == s && GetStringLength() == length + \see SetString(StringRefType) + */ + GenericValue& SetString(const Ch* s, SizeType length) { return SetString(StringRef(s, length)); } + + //! Set this value as a string without copying source string. + /*! \param s source string reference + \return The value itself for fluent API. + \post IsString() == true && GetString() == s && GetStringLength() == s.length + */ + GenericValue& SetString(StringRefType s) { this->~GenericValue(); SetStringRaw(s); return *this; } + + //! Set this value as a string by copying from source string. + /*! This version has better performance with supplied length, and also support string containing null character. + \param s source string. + \param length The length of source string, excluding the trailing null terminator. + \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \post IsString() == true && GetString() != s && strcmp(GetString(),s) == 0 && GetStringLength() == length + */ + GenericValue& SetString(const Ch* s, SizeType length, Allocator& allocator) { this->~GenericValue(); SetStringRaw(StringRef(s, length), allocator); return *this; } + + //! Set this value as a string by copying from source string. + /*! \param s source string. + \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \post IsString() == true && GetString() != s && strcmp(GetString(),s) == 0 && GetStringLength() == length + */ + GenericValue& SetString(const Ch* s, Allocator& allocator) { return SetString(s, internal::StrLen(s), allocator); } + +#if RAPIDJSON_HAS_STDSTRING + //! Set this value as a string by copying from source string. + /*! \param s source string. + \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \post IsString() == true && GetString() != s.data() && strcmp(GetString(),s.data() == 0 && GetStringLength() == s.size() + \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. + */ + GenericValue& SetString(const std::basic_string<Ch>& s, Allocator& allocator) { return SetString(s.data(), s.size(), allocator); } +#endif + + //@} + + //! Generate events of this value to a Handler. + /*! This function adopts the GoF visitor pattern. + Typical usage is to output this JSON value as JSON text via Writer, which is a Handler. + It can also be used to deep clone this value via GenericDocument, which is also a Handler. + \tparam Handler type of handler. + \param handler An object implementing concept Handler. + */ + template <typename Handler> + bool Accept(Handler& handler) const { + switch(GetType()) { + case kNullType: return handler.Null(); + case kFalseType: return handler.Bool(false); + case kTrueType: return handler.Bool(true); + + case kObjectType: + if (!handler.StartObject()) + return false; + for (ConstMemberIterator m = MemberBegin(); m != MemberEnd(); ++m) { + RAPIDJSON_ASSERT(m->name.IsString()); // User may change the type of name by MemberIterator. + if (!handler.Key(m->name.GetString(), m->name.GetStringLength(), (m->name.flags_ & kCopyFlag) != 0)) + return false; + if (!m->value.Accept(handler)) + return false; + } + return handler.EndObject(data_.o.size); + + case kArrayType: + if (!handler.StartArray()) + return false; + for (GenericValue* v = data_.a.elements; v != data_.a.elements + data_.a.size; ++v) + if (!v->Accept(handler)) + return false; + return handler.EndArray(data_.a.size); + + case kStringType: + return handler.String(GetString(), GetStringLength(), (flags_ & kCopyFlag) != 0); + + case kNumberType: + if (IsInt()) return handler.Int(data_.n.i.i); + else if (IsUint()) return handler.Uint(data_.n.u.u); + else if (IsInt64()) return handler.Int64(data_.n.i64); + else if (IsUint64()) return handler.Uint64(data_.n.u64); + else return handler.Double(data_.n.d); + + default: + RAPIDJSON_ASSERT(false); + } + return false; + } + +private: + template <typename, typename> friend class GenericValue; + template <typename, typename, typename> friend class GenericDocument; + + enum { + kBoolFlag = 0x100, + kNumberFlag = 0x200, + kIntFlag = 0x400, + kUintFlag = 0x800, + kInt64Flag = 0x1000, + kUint64Flag = 0x2000, + kDoubleFlag = 0x4000, + kStringFlag = 0x100000, + kCopyFlag = 0x200000, + kInlineStrFlag = 0x400000, + + // Initial flags of different types. + kNullFlag = kNullType, + kTrueFlag = kTrueType | kBoolFlag, + kFalseFlag = kFalseType | kBoolFlag, + kNumberIntFlag = kNumberType | kNumberFlag | kIntFlag | kInt64Flag, + kNumberUintFlag = kNumberType | kNumberFlag | kUintFlag | kUint64Flag | kInt64Flag, + kNumberInt64Flag = kNumberType | kNumberFlag | kInt64Flag, + kNumberUint64Flag = kNumberType | kNumberFlag | kUint64Flag, + kNumberDoubleFlag = kNumberType | kNumberFlag | kDoubleFlag, + kNumberAnyFlag = kNumberType | kNumberFlag | kIntFlag | kInt64Flag | kUintFlag | kUint64Flag | kDoubleFlag, + kConstStringFlag = kStringType | kStringFlag, + kCopyStringFlag = kStringType | kStringFlag | kCopyFlag, + kShortStringFlag = kStringType | kStringFlag | kCopyFlag | kInlineStrFlag, + kObjectFlag = kObjectType, + kArrayFlag = kArrayType, + + kTypeMask = 0xFF // bitwise-and with mask of 0xFF can be optimized by compiler + }; + + static const SizeType kDefaultArrayCapacity = 16; + static const SizeType kDefaultObjectCapacity = 16; + + struct String { + const Ch* str; + SizeType length; + unsigned hashcode; //!< reserved + }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + // implementation detail: ShortString can represent zero-terminated strings up to MaxSize chars + // (excluding the terminating zero) and store a value to determine the length of the contained + // string in the last character str[LenPos] by storing "MaxSize - length" there. If the string + // to store has the maximal length of MaxSize then str[LenPos] will be 0 and therefore act as + // the string terminator as well. For getting the string length back from that value just use + // "MaxSize - str[LenPos]". + // This allows to store 11-chars strings in 32-bit mode and 15-chars strings in 64-bit mode + // inline (for `UTF8`-encoded strings). + struct ShortString { + enum { MaxChars = sizeof(String) / sizeof(Ch), MaxSize = MaxChars - 1, LenPos = MaxSize }; + Ch str[MaxChars]; + + inline static bool Usable(SizeType len) { return (MaxSize >= len); } + inline void SetLength(SizeType len) { str[LenPos] = (Ch)(MaxSize - len); } + inline SizeType GetLength() const { return (SizeType)(MaxSize - str[LenPos]); } + }; // at most as many bytes as "String" above => 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + // By using proper binary layout, retrieval of different integer types do not need conversions. + union Number { +#if RAPIDJSON_ENDIAN == RAPIDJSON_LITTLEENDIAN + struct I { + int i; + char padding[4]; + }i; + struct U { + unsigned u; + char padding2[4]; + }u; +#else + struct I { + char padding[4]; + int i; + }i; + struct U { + char padding2[4]; + unsigned u; + }u; +#endif + int64_t i64; + uint64_t u64; + double d; + }; // 8 bytes + + struct Object { + Member* members; + SizeType size; + SizeType capacity; + }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + struct Array { + GenericValue* elements; + SizeType size; + SizeType capacity; + }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + union Data { + String s; + ShortString ss; + Number n; + Object o; + Array a; + }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + // Initialize this value as array with initial data, without calling destructor. + void SetArrayRaw(GenericValue* values, SizeType count, Allocator& allocator) { + flags_ = kArrayFlag; + data_.a.elements = (GenericValue*)allocator.Malloc(count * sizeof(GenericValue)); + std::memcpy(data_.a.elements, values, count * sizeof(GenericValue)); + data_.a.size = data_.a.capacity = count; + } + + //! Initialize this value as object with initial data, without calling destructor. + void SetObjectRaw(Member* members, SizeType count, Allocator& allocator) { + flags_ = kObjectFlag; + data_.o.members = (Member*)allocator.Malloc(count * sizeof(Member)); + std::memcpy(data_.o.members, members, count * sizeof(Member)); + data_.o.size = data_.o.capacity = count; + } + + //! Initialize this value as constant string, without calling destructor. + void SetStringRaw(StringRefType s) RAPIDJSON_NOEXCEPT { + flags_ = kConstStringFlag; + data_.s.str = s; + data_.s.length = s.length; + } + + //! Initialize this value as copy string with initial data, without calling destructor. + void SetStringRaw(StringRefType s, Allocator& allocator) { + Ch* str = NULL; + if(ShortString::Usable(s.length)) { + flags_ = kShortStringFlag; + data_.ss.SetLength(s.length); + str = data_.ss.str; + } else { + flags_ = kCopyStringFlag; + data_.s.length = s.length; + str = (Ch *)allocator.Malloc((s.length + 1) * sizeof(Ch)); + data_.s.str = str; + } + std::memcpy(str, s, s.length * sizeof(Ch)); + str[s.length] = '\0'; + } + + //! Assignment without calling destructor + void RawAssign(GenericValue& rhs) RAPIDJSON_NOEXCEPT { + data_ = rhs.data_; + flags_ = rhs.flags_; + rhs.flags_ = kNullFlag; + } + + template <typename SourceAllocator> + bool StringEqual(const GenericValue<Encoding, SourceAllocator>& rhs) const { + RAPIDJSON_ASSERT(IsString()); + RAPIDJSON_ASSERT(rhs.IsString()); + + const SizeType len1 = GetStringLength(); + const SizeType len2 = rhs.GetStringLength(); + if(len1 != len2) { return false; } + + const Ch* const str1 = GetString(); + const Ch* const str2 = rhs.GetString(); + if(str1 == str2) { return true; } // fast path for constant string + + return (std::memcmp(str1, str2, sizeof(Ch) * len1) == 0); + } + + Data data_; + unsigned flags_; +}; + +//! GenericValue with UTF8 encoding +typedef GenericValue<UTF8<> > Value; + +/////////////////////////////////////////////////////////////////////////////// +// GenericDocument + +//! A document for parsing JSON text as DOM. +/*! + \note implements Handler concept + \tparam Encoding Encoding for both parsing and string storage. + \tparam Allocator Allocator for allocating memory for the DOM + \tparam StackAllocator Allocator for allocating memory for stack during parsing. + \warning Although GenericDocument inherits from GenericValue, the API does \b not provide any virtual functions, especially no virtual destructor. To avoid memory leaks, do not \c delete a GenericDocument object via a pointer to a GenericValue. +*/ +template <typename Encoding, typename Allocator = MemoryPoolAllocator<>, typename StackAllocator = CrtAllocator> +class GenericDocument : public GenericValue<Encoding, Allocator> { +public: + typedef typename Encoding::Ch Ch; //!< Character type derived from Encoding. + typedef GenericValue<Encoding, Allocator> ValueType; //!< Value type of the document. + typedef Allocator AllocatorType; //!< Allocator type from template parameter. + + //! Constructor + /*! \param allocator Optional allocator for allocating memory. + \param stackCapacity Optional initial capacity of stack in bytes. + \param stackAllocator Optional allocator for allocating memory for stack. + */ + GenericDocument(Allocator* allocator = 0, size_t stackCapacity = kDefaultStackCapacity, StackAllocator* stackAllocator = 0) : + allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_() + { + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator()); + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move constructor in C++11 + GenericDocument(GenericDocument&& rhs) RAPIDJSON_NOEXCEPT + : ValueType(std::move(rhs)), + allocator_(rhs.allocator_), + ownAllocator_(rhs.ownAllocator_), + stack_(std::move(rhs.stack_)), + parseResult_(rhs.parseResult_) + { + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.parseResult_ = ParseResult(); + } +#endif + + ~GenericDocument() { + Destroy(); + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move assignment in C++11 + GenericDocument& operator=(GenericDocument&& rhs) RAPIDJSON_NOEXCEPT + { + // The cast to ValueType is necessary here, because otherwise it would + // attempt to call GenericValue's templated assignment operator. + ValueType::operator=(std::forward<ValueType>(rhs)); + + // Calling the destructor here would prematurely call stack_'s destructor + Destroy(); + + allocator_ = rhs.allocator_; + ownAllocator_ = rhs.ownAllocator_; + stack_ = std::move(rhs.stack_); + parseResult_ = rhs.parseResult_; + + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.parseResult_ = ParseResult(); + + return *this; + } +#endif + + //!@name Parse from stream + //!@{ + + //! Parse JSON text from an input stream (with Encoding conversion) + /*! \tparam parseFlags Combination of \ref ParseFlag. + \tparam SourceEncoding Encoding of input stream + \tparam InputStream Type of input stream, implementing Stream concept + \param is Input stream to be parsed. + \return The document itself for fluent API. + */ + template <unsigned parseFlags, typename SourceEncoding, typename InputStream> + GenericDocument& ParseStream(InputStream& is) { + ValueType::SetNull(); // Remove existing root if exist + GenericReader<SourceEncoding, Encoding, Allocator> reader(&GetAllocator()); + ClearStackOnExit scope(*this); + parseResult_ = reader.template Parse<parseFlags>(is, *this); + if (parseResult_) { + RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object + this->RawAssign(*stack_.template Pop<ValueType>(1)); // Add this-> to prevent issue 13. + } + return *this; + } + + //! Parse JSON text from an input stream + /*! \tparam parseFlags Combination of \ref ParseFlag. + \tparam InputStream Type of input stream, implementing Stream concept + \param is Input stream to be parsed. + \return The document itself for fluent API. + */ + template <unsigned parseFlags, typename InputStream> + GenericDocument& ParseStream(InputStream& is) { + return ParseStream<parseFlags,Encoding,InputStream>(is); + } + + //! Parse JSON text from an input stream (with \ref kParseDefaultFlags) + /*! \tparam InputStream Type of input stream, implementing Stream concept + \param is Input stream to be parsed. + \return The document itself for fluent API. + */ + template <typename InputStream> + GenericDocument& ParseStream(InputStream& is) { + return ParseStream<kParseDefaultFlags, Encoding, InputStream>(is); + } + //!@} + + //!@name Parse in-place from mutable string + //!@{ + + //! Parse JSON text from a mutable string (with Encoding conversion) + /*! \tparam parseFlags Combination of \ref ParseFlag. + \tparam SourceEncoding Transcoding from input Encoding + \param str Mutable zero-terminated string to be parsed. + \return The document itself for fluent API. + */ + template <unsigned parseFlags, typename SourceEncoding> + GenericDocument& ParseInsitu(Ch* str) { + GenericInsituStringStream<Encoding> s(str); + return ParseStream<parseFlags | kParseInsituFlag, SourceEncoding>(s); + } + + //! Parse JSON text from a mutable string + /*! \tparam parseFlags Combination of \ref ParseFlag. + \param str Mutable zero-terminated string to be parsed. + \return The document itself for fluent API. + */ + template <unsigned parseFlags> + GenericDocument& ParseInsitu(Ch* str) { + return ParseInsitu<parseFlags, Encoding>(str); + } + + //! Parse JSON text from a mutable string (with \ref kParseDefaultFlags) + /*! \param str Mutable zero-terminated string to be parsed. + \return The document itself for fluent API. + */ + GenericDocument& ParseInsitu(Ch* str) { + return ParseInsitu<kParseDefaultFlags, Encoding>(str); + } + //!@} + + //!@name Parse from read-only string + //!@{ + + //! Parse JSON text from a read-only string (with Encoding conversion) + /*! \tparam parseFlags Combination of \ref ParseFlag (must not contain \ref kParseInsituFlag). + \tparam SourceEncoding Transcoding from input Encoding + \param str Read-only zero-terminated string to be parsed. + */ + template <unsigned parseFlags, typename SourceEncoding> + GenericDocument& Parse(const Ch* str) { + RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag)); + GenericStringStream<SourceEncoding> s(str); + return ParseStream<parseFlags, SourceEncoding>(s); + } + + //! Parse JSON text from a read-only string + /*! \tparam parseFlags Combination of \ref ParseFlag (must not contain \ref kParseInsituFlag). + \param str Read-only zero-terminated string to be parsed. + */ + template <unsigned parseFlags> + GenericDocument& Parse(const Ch* str) { + return Parse<parseFlags, Encoding>(str); + } + + //! Parse JSON text from a read-only string (with \ref kParseDefaultFlags) + /*! \param str Read-only zero-terminated string to be parsed. + */ + GenericDocument& Parse(const Ch* str) { + return Parse<kParseDefaultFlags>(str); + } + //!@} + + //!@name Handling parse errors + //!@{ + + //! Whether a parse error has occured in the last parsing. + bool HasParseError() const { return parseResult_.IsError(); } + + //! Get the \ref ParseErrorCode of last parsing. + ParseErrorCode GetParseError() const { return parseResult_.Code(); } + + //! Get the position of last parsing error in input, 0 otherwise. + size_t GetErrorOffset() const { return parseResult_.Offset(); } + + //!@} + + //! Get the allocator of this document. + Allocator& GetAllocator() { return *allocator_; } + + //! Get the capacity of stack in bytes. + size_t GetStackCapacity() const { return stack_.GetCapacity(); } + +private: + // clear stack on any exit from ParseStream, e.g. due to exception + struct ClearStackOnExit { + explicit ClearStackOnExit(GenericDocument& d) : d_(d) {} + ~ClearStackOnExit() { d_.ClearStack(); } + private: + ClearStackOnExit(const ClearStackOnExit&); + ClearStackOnExit& operator=(const ClearStackOnExit&); + GenericDocument& d_; + }; + + // callers of the following private Handler functions + template <typename,typename,typename> friend class GenericReader; // for parsing + template <typename, typename> friend class GenericValue; // for deep copying + + // Implementation of Handler + bool Null() { new (stack_.template Push<ValueType>()) ValueType(); return true; } + bool Bool(bool b) { new (stack_.template Push<ValueType>()) ValueType(b); return true; } + bool Int(int i) { new (stack_.template Push<ValueType>()) ValueType(i); return true; } + bool Uint(unsigned i) { new (stack_.template Push<ValueType>()) ValueType(i); return true; } + bool Int64(int64_t i) { new (stack_.template Push<ValueType>()) ValueType(i); return true; } + bool Uint64(uint64_t i) { new (stack_.template Push<ValueType>()) ValueType(i); return true; } + bool Double(double d) { new (stack_.template Push<ValueType>()) ValueType(d); return true; } + + bool String(const Ch* str, SizeType length, bool copy) { + if (copy) + new (stack_.template Push<ValueType>()) ValueType(str, length, GetAllocator()); + else + new (stack_.template Push<ValueType>()) ValueType(str, length); + return true; + } + + bool StartObject() { new (stack_.template Push<ValueType>()) ValueType(kObjectType); return true; } + + bool Key(const Ch* str, SizeType length, bool copy) { return String(str, length, copy); } + + bool EndObject(SizeType memberCount) { + typename ValueType::Member* members = stack_.template Pop<typename ValueType::Member>(memberCount); + stack_.template Top<ValueType>()->SetObjectRaw(members, (SizeType)memberCount, GetAllocator()); + return true; + } + + bool StartArray() { new (stack_.template Push<ValueType>()) ValueType(kArrayType); return true; } + + bool EndArray(SizeType elementCount) { + ValueType* elements = stack_.template Pop<ValueType>(elementCount); + stack_.template Top<ValueType>()->SetArrayRaw(elements, elementCount, GetAllocator()); + return true; + } + +private: + //! Prohibit copying + GenericDocument(const GenericDocument&); + //! Prohibit assignment + GenericDocument& operator=(const GenericDocument&); + + void ClearStack() { + if (Allocator::kNeedFree) + while (stack_.GetSize() > 0) // Here assumes all elements in stack array are GenericValue (Member is actually 2 GenericValue objects) + (stack_.template Pop<ValueType>(1))->~ValueType(); + else + stack_.Clear(); + stack_.ShrinkToFit(); + } + + void Destroy() { + RAPIDJSON_DELETE(ownAllocator_); + } + + static const size_t kDefaultStackCapacity = 1024; + Allocator* allocator_; + Allocator* ownAllocator_; + internal::Stack<StackAllocator> stack_; + ParseResult parseResult_; +}; + +//! GenericDocument with UTF8 encoding +typedef GenericDocument<UTF8<> > Document; + +// defined here due to the dependency on GenericDocument +template <typename Encoding, typename Allocator> +template <typename SourceAllocator> +inline +GenericValue<Encoding,Allocator>::GenericValue(const GenericValue<Encoding,SourceAllocator>& rhs, Allocator& allocator) +{ + switch (rhs.GetType()) { + case kObjectType: + case kArrayType: { // perform deep copy via SAX Handler + GenericDocument<Encoding,Allocator> d(&allocator); + rhs.Accept(d); + RawAssign(*d.stack_.template Pop<GenericValue>(1)); + } + break; + case kStringType: + if (rhs.flags_ == kConstStringFlag) { + flags_ = rhs.flags_; + data_ = *reinterpret_cast<const Data*>(&rhs.data_); + } else { + SetStringRaw(StringRef(rhs.GetString(), rhs.GetStringLength()), allocator); + } + break; + default: // kNumberType, kTrueType, kFalseType, kNullType + flags_ = rhs.flags_; + data_ = *reinterpret_cast<const Data*>(&rhs.data_); + } +} + +RAPIDJSON_NAMESPACE_END + +#if defined(_MSC_VER) || defined(__GNUC__) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_DOCUMENT_H_ diff --git a/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/encodedstream.h b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/encodedstream.h new file mode 100755 index 000000000..ee8caa05f --- /dev/null +++ b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/encodedstream.h @@ -0,0 +1,290 @@ +// Copyright (C) 2011 Milo Yip +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef RAPIDJSON_ENCODEDSTREAM_H_ +#define RAPIDJSON_ENCODEDSTREAM_H_ + +#include "rapidjson.h" + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Input byte stream wrapper with a statically bound encoding. +/*! + \tparam Encoding The interpretation of encoding of the stream. Either UTF8, UTF16LE, UTF16BE, UTF32LE, UTF32BE. + \tparam InputByteStream Type of input byte stream. For example, FileReadStream. +*/ +template <typename Encoding, typename InputByteStream> +class EncodedInputStream { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); +public: + typedef typename Encoding::Ch Ch; + + EncodedInputStream(InputByteStream& is) : is_(is) { + current_ = Encoding::TakeBOM(is_); + } + + Ch Peek() const { return current_; } + Ch Take() { Ch c = current_; current_ = Encoding::Take(is_); return c; } + size_t Tell() const { return is_.Tell(); } + + // Not implemented + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + EncodedInputStream(const EncodedInputStream&); + EncodedInputStream& operator=(const EncodedInputStream&); + + InputByteStream& is_; + Ch current_; +}; + +//! Output byte stream wrapper with statically bound encoding. +/*! + \tparam Encoding The interpretation of encoding of the stream. Either UTF8, UTF16LE, UTF16BE, UTF32LE, UTF32BE. + \tparam InputByteStream Type of input byte stream. For example, FileWriteStream. +*/ +template <typename Encoding, typename OutputByteStream> +class EncodedOutputStream { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); +public: + typedef typename Encoding::Ch Ch; + + EncodedOutputStream(OutputByteStream& os, bool putBOM = true) : os_(os) { + if (putBOM) + Encoding::PutBOM(os_); + } + + void Put(Ch c) { Encoding::Put(os_, c); } + void Flush() { os_.Flush(); } + + // Not implemented + Ch Peek() const { RAPIDJSON_ASSERT(false); } + Ch Take() { RAPIDJSON_ASSERT(false); } + size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + EncodedOutputStream(const EncodedOutputStream&); + EncodedOutputStream& operator=(const EncodedOutputStream&); + + OutputByteStream& os_; +}; + +#define RAPIDJSON_ENCODINGS_FUNC(x) UTF8<Ch>::x, UTF16LE<Ch>::x, UTF16BE<Ch>::x, UTF32LE<Ch>::x, UTF32BE<Ch>::x + +//! Input stream wrapper with dynamically bound encoding and automatic encoding detection. +/*! + \tparam CharType Type of character for reading. + \tparam InputByteStream type of input byte stream to be wrapped. +*/ +template <typename CharType, typename InputByteStream> +class AutoUTFInputStream { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); +public: + typedef CharType Ch; + + //! Constructor. + /*! + \param is input stream to be wrapped. + \param type UTF encoding type if it is not detected from the stream. + */ + AutoUTFInputStream(InputByteStream& is, UTFType type = kUTF8) : is_(&is), type_(type), hasBOM_(false) { + DetectType(); + static const TakeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Take) }; + takeFunc_ = f[type_]; + current_ = takeFunc_(*is_); + } + + UTFType GetType() const { return type_; } + bool HasBOM() const { return hasBOM_; } + + Ch Peek() const { return current_; } + Ch Take() { Ch c = current_; current_ = takeFunc_(*is_); return c; } + size_t Tell() const { return is_->Tell(); } + + // Not implemented + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + AutoUTFInputStream(const AutoUTFInputStream&); + AutoUTFInputStream& operator=(const AutoUTFInputStream&); + + // Detect encoding type with BOM or RFC 4627 + void DetectType() { + // BOM (Byte Order Mark): + // 00 00 FE FF UTF-32BE + // FF FE 00 00 UTF-32LE + // FE FF UTF-16BE + // FF FE UTF-16LE + // EF BB BF UTF-8 + + const unsigned char* c = (const unsigned char *)is_->Peek4(); + if (!c) + return; + + unsigned bom = c[0] | (c[1] << 8) | (c[2] << 16) | (c[3] << 24); + hasBOM_ = false; + if (bom == 0xFFFE0000) { type_ = kUTF32BE; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); is_->Take(); } + else if (bom == 0x0000FEFF) { type_ = kUTF32LE; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); is_->Take(); } + else if ((bom & 0xFFFF) == 0xFFFE) { type_ = kUTF16BE; hasBOM_ = true; is_->Take(); is_->Take(); } + else if ((bom & 0xFFFF) == 0xFEFF) { type_ = kUTF16LE; hasBOM_ = true; is_->Take(); is_->Take(); } + else if ((bom & 0xFFFFFF) == 0xBFBBEF) { type_ = kUTF8; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); } + + // RFC 4627: Section 3 + // "Since the first two characters of a JSON text will always be ASCII + // characters [RFC0020], it is possible to determine whether an octet + // stream is UTF-8, UTF-16 (BE or LE), or UTF-32 (BE or LE) by looking + // at the pattern of nulls in the first four octets." + // 00 00 00 xx UTF-32BE + // 00 xx 00 xx UTF-16BE + // xx 00 00 00 UTF-32LE + // xx 00 xx 00 UTF-16LE + // xx xx xx xx UTF-8 + + if (!hasBOM_) { + unsigned pattern = (c[0] ? 1 : 0) | (c[1] ? 2 : 0) | (c[2] ? 4 : 0) | (c[3] ? 8 : 0); + switch (pattern) { + case 0x08: type_ = kUTF32BE; break; + case 0x0A: type_ = kUTF16BE; break; + case 0x01: type_ = kUTF32LE; break; + case 0x05: type_ = kUTF16LE; break; + case 0x0F: type_ = kUTF8; break; + default: break; // Use type defined by user. + } + } + + // Runtime check whether the size of character type is sufficient. It only perform checks with assertion. + switch (type_) { + case kUTF8: + // Do nothing + break; + case kUTF16LE: + case kUTF16BE: + RAPIDJSON_ASSERT(sizeof(Ch) >= 2); + break; + case kUTF32LE: + case kUTF32BE: + RAPIDJSON_ASSERT(sizeof(Ch) >= 4); + break; + default: + RAPIDJSON_ASSERT(false); // Invalid type + } + } + + typedef Ch (*TakeFunc)(InputByteStream& is); + InputByteStream* is_; + UTFType type_; + Ch current_; + TakeFunc takeFunc_; + bool hasBOM_; +}; + +//! Output stream wrapper with dynamically bound encoding and automatic encoding detection. +/*! + \tparam CharType Type of character for writing. + \tparam InputByteStream type of output byte stream to be wrapped. +*/ +template <typename CharType, typename OutputByteStream> +class AutoUTFOutputStream { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); +public: + typedef CharType Ch; + + //! Constructor. + /*! + \param os output stream to be wrapped. + \param type UTF encoding type. + \param putBOM Whether to write BOM at the beginning of the stream. + */ + AutoUTFOutputStream(OutputByteStream& os, UTFType type, bool putBOM) : os_(&os), type_(type) { + // RUntime check whether the size of character type is sufficient. It only perform checks with assertion. + switch (type_) { + case kUTF16LE: + case kUTF16BE: + RAPIDJSON_ASSERT(sizeof(Ch) >= 2); + break; + case kUTF32LE: + case kUTF32BE: + RAPIDJSON_ASSERT(sizeof(Ch) >= 4); + break; + case kUTF8: + // Do nothing + break; + default: + RAPIDJSON_ASSERT(false); // Invalid UTFType + } + + static const PutFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Put) }; + putFunc_ = f[type_]; + + if (putBOM) + PutBOM(); + } + + UTFType GetType() const { return type_; } + + void Put(Ch c) { putFunc_(*os_, c); } + void Flush() { os_->Flush(); } + + // Not implemented + Ch Peek() const { RAPIDJSON_ASSERT(false); } + Ch Take() { RAPIDJSON_ASSERT(false); } + size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + AutoUTFOutputStream(const AutoUTFOutputStream&); + AutoUTFOutputStream& operator=(const AutoUTFOutputStream&); + + void PutBOM() { + typedef void (*PutBOMFunc)(OutputByteStream&); + static const PutBOMFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(PutBOM) }; + f[type_](*os_); + } + + typedef void (*PutFunc)(OutputByteStream&, Ch); + + OutputByteStream* os_; + UTFType type_; + PutFunc putFunc_; +}; + +#undef RAPIDJSON_ENCODINGS_FUNC + +RAPIDJSON_NAMESPACE_END + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_FILESTREAM_H_ diff --git a/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/encodings.h b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/encodings.h new file mode 100755 index 000000000..71595f70c --- /dev/null +++ b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/encodings.h @@ -0,0 +1,630 @@ +// Copyright (C) 2011 Milo Yip +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef RAPIDJSON_ENCODINGS_H_ +#define RAPIDJSON_ENCODINGS_H_ + +#include "rapidjson.h" + +#ifdef _MSC_VER +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4244) // conversion from 'type1' to 'type2', possible loss of data +RAPIDJSON_DIAG_OFF(4702) // unreachable code +#elif defined(__GNUC__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Encoding + +/*! \class rapidjson::Encoding + \brief Concept for encoding of Unicode characters. + +\code +concept Encoding { + typename Ch; //! Type of character. A "character" is actually a code unit in unicode's definition. + + enum { supportUnicode = 1 }; // or 0 if not supporting unicode + + //! \brief Encode a Unicode codepoint to an output stream. + //! \param os Output stream. + //! \param codepoint An unicode codepoint, ranging from 0x0 to 0x10FFFF inclusively. + template<typename OutputStream> + static void Encode(OutputStream& os, unsigned codepoint); + + //! \brief Decode a Unicode codepoint from an input stream. + //! \param is Input stream. + //! \param codepoint Output of the unicode codepoint. + //! \return true if a valid codepoint can be decoded from the stream. + template <typename InputStream> + static bool Decode(InputStream& is, unsigned* codepoint); + + //! \brief Validate one Unicode codepoint from an encoded stream. + //! \param is Input stream to obtain codepoint. + //! \param os Output for copying one codepoint. + //! \return true if it is valid. + //! \note This function just validating and copying the codepoint without actually decode it. + template <typename InputStream, typename OutputStream> + static bool Validate(InputStream& is, OutputStream& os); + + // The following functions are deal with byte streams. + + //! Take a character from input byte stream, skip BOM if exist. + template <typename InputByteStream> + static CharType TakeBOM(InputByteStream& is); + + //! Take a character from input byte stream. + template <typename InputByteStream> + static Ch Take(InputByteStream& is); + + //! Put BOM to output byte stream. + template <typename OutputByteStream> + static void PutBOM(OutputByteStream& os); + + //! Put a character to output byte stream. + template <typename OutputByteStream> + static void Put(OutputByteStream& os, Ch c); +}; +\endcode +*/ + +/////////////////////////////////////////////////////////////////////////////// +// UTF8 + +//! UTF-8 encoding. +/*! http://en.wikipedia.org/wiki/UTF-8 + http://tools.ietf.org/html/rfc3629 + \tparam CharType Code unit for storing 8-bit UTF-8 data. Default is char. + \note implements Encoding concept +*/ +template<typename CharType = char> +struct UTF8 { + typedef CharType Ch; + + enum { supportUnicode = 1 }; + + template<typename OutputStream> + static void Encode(OutputStream& os, unsigned codepoint) { + if (codepoint <= 0x7F) + os.Put(static_cast<Ch>(codepoint & 0xFF)); + else if (codepoint <= 0x7FF) { + os.Put(static_cast<Ch>(0xC0 | ((codepoint >> 6) & 0xFF))); + os.Put(static_cast<Ch>(0x80 | ((codepoint & 0x3F)))); + } + else if (codepoint <= 0xFFFF) { + os.Put(static_cast<Ch>(0xE0 | ((codepoint >> 12) & 0xFF))); + os.Put(static_cast<Ch>(0x80 | ((codepoint >> 6) & 0x3F))); + os.Put(static_cast<Ch>(0x80 | (codepoint & 0x3F))); + } + else { + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + os.Put(static_cast<Ch>(0xF0 | ((codepoint >> 18) & 0xFF))); + os.Put(static_cast<Ch>(0x80 | ((codepoint >> 12) & 0x3F))); + os.Put(static_cast<Ch>(0x80 | ((codepoint >> 6) & 0x3F))); + os.Put(static_cast<Ch>(0x80 | (codepoint & 0x3F))); + } + } + + template <typename InputStream> + static bool Decode(InputStream& is, unsigned* codepoint) { +#define COPY() c = is.Take(); *codepoint = (*codepoint << 6) | ((unsigned char)c & 0x3Fu) +#define TRANS(mask) result &= ((GetRange((unsigned char)c) & mask) != 0) +#define TAIL() COPY(); TRANS(0x70) + Ch c = is.Take(); + if (!(c & 0x80)) { + *codepoint = (unsigned char)c; + return true; + } + + unsigned char type = GetRange((unsigned char)c); + *codepoint = (0xFF >> type) & (unsigned char)c; + bool result = true; + switch (type) { + case 2: TAIL(); return result; + case 3: TAIL(); TAIL(); return result; + case 4: COPY(); TRANS(0x50); TAIL(); return result; + case 5: COPY(); TRANS(0x10); TAIL(); TAIL(); return result; + case 6: TAIL(); TAIL(); TAIL(); return result; + case 10: COPY(); TRANS(0x20); TAIL(); return result; + case 11: COPY(); TRANS(0x60); TAIL(); TAIL(); return result; + default: return false; + } +#undef COPY +#undef TRANS +#undef TAIL + } + + template <typename InputStream, typename OutputStream> + static bool Validate(InputStream& is, OutputStream& os) { +#define COPY() os.Put(c = is.Take()) +#define TRANS(mask) result &= ((GetRange((unsigned char)c) & mask) != 0) +#define TAIL() COPY(); TRANS(0x70) + Ch c; + COPY(); + if (!(c & 0x80)) + return true; + + bool result = true; + switch (GetRange((unsigned char)c)) { + case 2: TAIL(); return result; + case 3: TAIL(); TAIL(); return result; + case 4: COPY(); TRANS(0x50); TAIL(); return result; + case 5: COPY(); TRANS(0x10); TAIL(); TAIL(); return result; + case 6: TAIL(); TAIL(); TAIL(); return result; + case 10: COPY(); TRANS(0x20); TAIL(); return result; + case 11: COPY(); TRANS(0x60); TAIL(); TAIL(); return result; + default: return false; + } +#undef COPY +#undef TRANS +#undef TAIL + } + + static unsigned char GetRange(unsigned char c) { + // Referring to DFA of http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ + // With new mapping 1 -> 0x10, 7 -> 0x20, 9 -> 0x40, such that AND operation can test multiple types. + static const unsigned char type[] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, + 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8, + }; + return type[c]; + } + + template <typename InputByteStream> + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + Ch c = Take(is); + if ((unsigned char)c != 0xEFu) return c; + c = is.Take(); + if ((unsigned char)c != 0xBBu) return c; + c = is.Take(); + if ((unsigned char)c != 0xBFu) return c; + c = is.Take(); + return c; + } + + template <typename InputByteStream> + static Ch Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + return is.Take(); + } + + template <typename OutputByteStream> + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(0xEFu); os.Put(0xBBu); os.Put(0xBFu); + } + + template <typename OutputByteStream> + static void Put(OutputByteStream& os, Ch c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast<typename OutputByteStream::Ch>(c)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// UTF16 + +//! UTF-16 encoding. +/*! http://en.wikipedia.org/wiki/UTF-16 + http://tools.ietf.org/html/rfc2781 + \tparam CharType Type for storing 16-bit UTF-16 data. Default is wchar_t. C++11 may use char16_t instead. + \note implements Encoding concept + + \note For in-memory access, no need to concern endianness. The code units and code points are represented by CPU's endianness. + For streaming, use UTF16LE and UTF16BE, which handle endianness. +*/ +template<typename CharType = wchar_t> +struct UTF16 { + typedef CharType Ch; + RAPIDJSON_STATIC_ASSERT(sizeof(Ch) >= 2); + + enum { supportUnicode = 1 }; + + template<typename OutputStream> + static void Encode(OutputStream& os, unsigned codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2); + if (codepoint <= 0xFFFF) { + RAPIDJSON_ASSERT(codepoint < 0xD800 || codepoint > 0xDFFF); // Code point itself cannot be surrogate pair + os.Put(static_cast<typename OutputStream::Ch>(codepoint)); + } + else { + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + unsigned v = codepoint - 0x10000; + os.Put(static_cast<typename OutputStream::Ch>((v >> 10) | 0xD800)); + os.Put((v & 0x3FF) | 0xDC00); + } + } + + template <typename InputStream> + static bool Decode(InputStream& is, unsigned* codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 2); + Ch c = is.Take(); + if (c < 0xD800 || c > 0xDFFF) { + *codepoint = c; + return true; + } + else if (c <= 0xDBFF) { + *codepoint = (c & 0x3FF) << 10; + c = is.Take(); + *codepoint |= (c & 0x3FF); + *codepoint += 0x10000; + return c >= 0xDC00 && c <= 0xDFFF; + } + return false; + } + + template <typename InputStream, typename OutputStream> + static bool Validate(InputStream& is, OutputStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 2); + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2); + Ch c; + os.Put(c = is.Take()); + if (c < 0xD800 || c > 0xDFFF) + return true; + else if (c <= 0xDBFF) { + os.Put(c = is.Take()); + return c >= 0xDC00 && c <= 0xDFFF; + } + return false; + } +}; + +//! UTF-16 little endian encoding. +template<typename CharType = wchar_t> +struct UTF16LE : UTF16<CharType> { + template <typename InputByteStream> + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return (unsigned short)c == 0xFEFFu ? Take(is) : c; + } + + template <typename InputByteStream> + static CharType Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = (unsigned char)is.Take(); + c |= (unsigned char)is.Take() << 8; + return c; + } + + template <typename OutputByteStream> + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(0xFFu); os.Put(0xFEu); + } + + template <typename OutputByteStream> + static void Put(OutputByteStream& os, CharType c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(c & 0xFFu); + os.Put((c >> 8) & 0xFFu); + } +}; + +//! UTF-16 big endian encoding. +template<typename CharType = wchar_t> +struct UTF16BE : UTF16<CharType> { + template <typename InputByteStream> + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return (unsigned short)c == 0xFEFFu ? Take(is) : c; + } + + template <typename InputByteStream> + static CharType Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = (unsigned char)is.Take() << 8; + c |= (unsigned char)is.Take(); + return c; + } + + template <typename OutputByteStream> + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(0xFEu); os.Put(0xFFu); + } + + template <typename OutputByteStream> + static void Put(OutputByteStream& os, CharType c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put((c >> 8) & 0xFFu); + os.Put(c & 0xFFu); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// UTF32 + +//! UTF-32 encoding. +/*! http://en.wikipedia.org/wiki/UTF-32 + \tparam CharType Type for storing 32-bit UTF-32 data. Default is unsigned. C++11 may use char32_t instead. + \note implements Encoding concept + + \note For in-memory access, no need to concern endianness. The code units and code points are represented by CPU's endianness. + For streaming, use UTF32LE and UTF32BE, which handle endianness. +*/ +template<typename CharType = unsigned> +struct UTF32 { + typedef CharType Ch; + RAPIDJSON_STATIC_ASSERT(sizeof(Ch) >= 4); + + enum { supportUnicode = 1 }; + + template<typename OutputStream> + static void Encode(OutputStream& os, unsigned codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 4); + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + os.Put(codepoint); + } + + template <typename InputStream> + static bool Decode(InputStream& is, unsigned* codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 4); + Ch c = is.Take(); + *codepoint = c; + return c <= 0x10FFFF; + } + + template <typename InputStream, typename OutputStream> + static bool Validate(InputStream& is, OutputStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 4); + Ch c; + os.Put(c = is.Take()); + return c <= 0x10FFFF; + } +}; + +//! UTF-32 little endian enocoding. +template<typename CharType = unsigned> +struct UTF32LE : UTF32<CharType> { + template <typename InputByteStream> + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return (unsigned)c == 0x0000FEFFu ? Take(is) : c; + } + + template <typename InputByteStream> + static CharType Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = (unsigned char)is.Take(); + c |= (unsigned char)is.Take() << 8; + c |= (unsigned char)is.Take() << 16; + c |= (unsigned char)is.Take() << 24; + return c; + } + + template <typename OutputByteStream> + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(0xFFu); os.Put(0xFEu); os.Put(0x00u); os.Put(0x00u); + } + + template <typename OutputByteStream> + static void Put(OutputByteStream& os, CharType c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(c & 0xFFu); + os.Put((c >> 8) & 0xFFu); + os.Put((c >> 16) & 0xFFu); + os.Put((c >> 24) & 0xFFu); + } +}; + +//! UTF-32 big endian encoding. +template<typename CharType = unsigned> +struct UTF32BE : UTF32<CharType> { + template <typename InputByteStream> + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return (unsigned)c == 0x0000FEFFu ? Take(is) : c; + } + + template <typename InputByteStream> + static CharType Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = (unsigned char)is.Take() << 24; + c |= (unsigned char)is.Take() << 16; + c |= (unsigned char)is.Take() << 8; + c |= (unsigned char)is.Take(); + return c; + } + + template <typename OutputByteStream> + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(0x00u); os.Put(0x00u); os.Put(0xFEu); os.Put(0xFFu); + } + + template <typename OutputByteStream> + static void Put(OutputByteStream& os, CharType c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put((c >> 24) & 0xFFu); + os.Put((c >> 16) & 0xFFu); + os.Put((c >> 8) & 0xFFu); + os.Put(c & 0xFFu); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// ASCII + +//! ASCII encoding. +/*! http://en.wikipedia.org/wiki/ASCII + \tparam CharType Code unit for storing 7-bit ASCII data. Default is char. + \note implements Encoding concept +*/ +template<typename CharType = char> +struct ASCII { + typedef CharType Ch; + + enum { supportUnicode = 0 }; + + template<typename OutputStream> + static void Encode(OutputStream& os, unsigned codepoint) { + RAPIDJSON_ASSERT(codepoint <= 0x7F); + os.Put(static_cast<Ch>(codepoint & 0xFF)); + } + + template <typename InputStream> + static bool Decode(InputStream& is, unsigned* codepoint) { + unsigned char c = static_cast<unsigned char>(is.Take()); + *codepoint = c; + return c <= 0X7F; + } + + template <typename InputStream, typename OutputStream> + static bool Validate(InputStream& is, OutputStream& os) { + unsigned char c = is.Take(); + os.Put(c); + return c <= 0x7F; + } + + template <typename InputByteStream> + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + Ch c = Take(is); + return c; + } + + template <typename InputByteStream> + static Ch Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + return is.Take(); + } + + template <typename OutputByteStream> + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + (void)os; + } + + template <typename OutputByteStream> + static void Put(OutputByteStream& os, Ch c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast<typename OutputByteStream::Ch>(c)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// AutoUTF + +//! Runtime-specified UTF encoding type of a stream. +enum UTFType { + kUTF8 = 0, //!< UTF-8. + kUTF16LE = 1, //!< UTF-16 little endian. + kUTF16BE = 2, //!< UTF-16 big endian. + kUTF32LE = 3, //!< UTF-32 little endian. + kUTF32BE = 4 //!< UTF-32 big endian. +}; + +//! Dynamically select encoding according to stream's runtime-specified UTF encoding type. +/*! \note This class can be used with AutoUTFInputtStream and AutoUTFOutputStream, which provides GetType(). +*/ +template<typename CharType> +struct AutoUTF { + typedef CharType Ch; + + enum { supportUnicode = 1 }; + +#define RAPIDJSON_ENCODINGS_FUNC(x) UTF8<Ch>::x, UTF16LE<Ch>::x, UTF16BE<Ch>::x, UTF32LE<Ch>::x, UTF32BE<Ch>::x + + template<typename OutputStream> + RAPIDJSON_FORCEINLINE static void Encode(OutputStream& os, unsigned codepoint) { + typedef void (*EncodeFunc)(OutputStream&, unsigned); + static const EncodeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Encode) }; + (*f[os.GetType()])(os, codepoint); + } + + template <typename InputStream> + RAPIDJSON_FORCEINLINE static bool Decode(InputStream& is, unsigned* codepoint) { + typedef bool (*DecodeFunc)(InputStream&, unsigned*); + static const DecodeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Decode) }; + return (*f[is.GetType()])(is, codepoint); + } + + template <typename InputStream, typename OutputStream> + RAPIDJSON_FORCEINLINE static bool Validate(InputStream& is, OutputStream& os) { + typedef bool (*ValidateFunc)(InputStream&, OutputStream&); + static const ValidateFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Validate) }; + return (*f[is.GetType()])(is, os); + } + +#undef RAPIDJSON_ENCODINGS_FUNC +}; + +/////////////////////////////////////////////////////////////////////////////// +// Transcoder + +//! Encoding conversion. +template<typename SourceEncoding, typename TargetEncoding> +struct Transcoder { + //! Take one Unicode codepoint from source encoding, convert it to target encoding and put it to the output stream. + template<typename InputStream, typename OutputStream> + RAPIDJSON_FORCEINLINE static bool Transcode(InputStream& is, OutputStream& os) { + unsigned codepoint; + if (!SourceEncoding::Decode(is, &codepoint)) + return false; + TargetEncoding::Encode(os, codepoint); + return true; + } + + //! Validate one Unicode codepoint from an encoded stream. + template<typename InputStream, typename OutputStream> + RAPIDJSON_FORCEINLINE static bool Validate(InputStream& is, OutputStream& os) { + return Transcode(is, os); // Since source/target encoding is different, must transcode. + } +}; + +//! Specialization of Transcoder with same source and target encoding. +template<typename Encoding> +struct Transcoder<Encoding, Encoding> { + template<typename InputStream, typename OutputStream> + RAPIDJSON_FORCEINLINE static bool Transcode(InputStream& is, OutputStream& os) { + os.Put(is.Take()); // Just copy one code unit. This semantic is different from primary template class. + return true; + } + + template<typename InputStream, typename OutputStream> + RAPIDJSON_FORCEINLINE static bool Validate(InputStream& is, OutputStream& os) { + return Encoding::Validate(is, os); // source/target encoding are the same + } +}; + +RAPIDJSON_NAMESPACE_END + +#if defined(__GNUC__) || defined(_MSV_VER) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_ENCODINGS_H_ diff --git a/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/error/en.h b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/error/en.h new file mode 100755 index 000000000..01711833e --- /dev/null +++ b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/error/en.h @@ -0,0 +1,71 @@ +// Copyright (C) 2011 Milo Yip +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef RAPIDJSON_ERROR_EN_H__ +#define RAPIDJSON_ERROR_EN_H__ + +#include "error.h" + +RAPIDJSON_NAMESPACE_BEGIN + +//! Maps error code of parsing into error message. +/*! + \ingroup RAPIDJSON_ERRORS + \param parseErrorCode Error code obtained in parsing. + \return the error message. + \note User can make a copy of this function for localization. + Using switch-case is safer for future modification of error codes. +*/ +inline const RAPIDJSON_ERROR_CHARTYPE* GetParseError_En(ParseErrorCode parseErrorCode) { + switch (parseErrorCode) { + case kParseErrorNone: return RAPIDJSON_ERROR_STRING("No error."); + + case kParseErrorDocumentEmpty: return RAPIDJSON_ERROR_STRING("The document is empty."); + case kParseErrorDocumentRootNotSingular: return RAPIDJSON_ERROR_STRING("The document root must not follow by other values."); + + case kParseErrorValueInvalid: return RAPIDJSON_ERROR_STRING("Invalid value."); + + case kParseErrorObjectMissName: return RAPIDJSON_ERROR_STRING("Missing a name for object member."); + case kParseErrorObjectMissColon: return RAPIDJSON_ERROR_STRING("Missing a colon after a name of object member."); + case kParseErrorObjectMissCommaOrCurlyBracket: return RAPIDJSON_ERROR_STRING("Missing a comma or '}' after an object member."); + + case kParseErrorArrayMissCommaOrSquareBracket: return RAPIDJSON_ERROR_STRING("Missing a comma or ']' after an array element."); + + case kParseErrorStringUnicodeEscapeInvalidHex: return RAPIDJSON_ERROR_STRING("Incorrect hex digit after \\u escape in string."); + case kParseErrorStringUnicodeSurrogateInvalid: return RAPIDJSON_ERROR_STRING("The surrogate pair in string is invalid."); + case kParseErrorStringEscapeInvalid: return RAPIDJSON_ERROR_STRING("Invalid escape character in string."); + case kParseErrorStringMissQuotationMark: return RAPIDJSON_ERROR_STRING("Missing a closing quotation mark in string."); + case kParseErrorStringInvalidEncoding: return RAPIDJSON_ERROR_STRING("Invalid encoding in string."); + + case kParseErrorNumberTooBig: return RAPIDJSON_ERROR_STRING("Number too big to be stored in double."); + case kParseErrorNumberMissFraction: return RAPIDJSON_ERROR_STRING("Miss fraction part in number."); + case kParseErrorNumberMissExponent: return RAPIDJSON_ERROR_STRING("Miss exponent in number."); + + case kParseErrorTermination: return RAPIDJSON_ERROR_STRING("Terminate parsing due to Handler error."); + case kParseErrorUnspecificSyntaxError: return RAPIDJSON_ERROR_STRING("Unspecific syntax error."); + + default: + return RAPIDJSON_ERROR_STRING("Unknown error."); + } +} + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_ERROR_EN_H__ diff --git a/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/error/error.h b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/error/error.h new file mode 100755 index 000000000..161ef8787 --- /dev/null +++ b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/error/error.h @@ -0,0 +1,150 @@ +// Copyright (C) 2011 Milo Yip +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef RAPIDJSON_ERROR_ERROR_H__ +#define RAPIDJSON_ERROR_ERROR_H__ + +/*! \file error.h */ + +/*! \defgroup RAPIDJSON_ERRORS RapidJSON error handling */ + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ERROR_CHARTYPE + +//! Character type of error messages. +/*! \ingroup RAPIDJSON_ERRORS + The default character type is \c char. + On Windows, user can define this macro as \c TCHAR for supporting both + unicode/non-unicode settings. +*/ +#ifndef RAPIDJSON_ERROR_CHARTYPE +#define RAPIDJSON_ERROR_CHARTYPE char +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ERROR_STRING + +//! Macro for converting string literial to \ref RAPIDJSON_ERROR_CHARTYPE[]. +/*! \ingroup RAPIDJSON_ERRORS + By default this conversion macro does nothing. + On Windows, user can define this macro as \c _T(x) for supporting both + unicode/non-unicode settings. +*/ +#ifndef RAPIDJSON_ERROR_STRING +#define RAPIDJSON_ERROR_STRING(x) x +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// ParseErrorCode + +//! Error code of parsing. +/*! \ingroup RAPIDJSON_ERRORS + \see GenericReader::Parse, GenericReader::GetParseErrorCode +*/ +enum ParseErrorCode { + kParseErrorNone = 0, //!< No error. + + kParseErrorDocumentEmpty, //!< The document is empty. + kParseErrorDocumentRootNotSingular, //!< The document root must not follow by other values. + + kParseErrorValueInvalid, //!< Invalid value. + + kParseErrorObjectMissName, //!< Missing a name for object member. + kParseErrorObjectMissColon, //!< Missing a colon after a name of object member. + kParseErrorObjectMissCommaOrCurlyBracket, //!< Missing a comma or '}' after an object member. + + kParseErrorArrayMissCommaOrSquareBracket, //!< Missing a comma or ']' after an array element. + + kParseErrorStringUnicodeEscapeInvalidHex, //!< Incorrect hex digit after \\u escape in string. + kParseErrorStringUnicodeSurrogateInvalid, //!< The surrogate pair in string is invalid. + kParseErrorStringEscapeInvalid, //!< Invalid escape character in string. + kParseErrorStringMissQuotationMark, //!< Missing a closing quotation mark in string. + kParseErrorStringInvalidEncoding, //!< Invalid encoding in string. + + kParseErrorNumberTooBig, //!< Number too big to be stored in double. + kParseErrorNumberMissFraction, //!< Miss fraction part in number. + kParseErrorNumberMissExponent, //!< Miss exponent in number. + + kParseErrorTermination, //!< Parsing was terminated. + kParseErrorUnspecificSyntaxError, //!< Unspecific syntax error. +}; + +//! Result of parsing (wraps ParseErrorCode) +/*! + \ingroup RAPIDJSON_ERRORS + \code + Document doc; + ParseResult ok = doc.Parse("[42]"); + if (!ok) { + fprintf(stderr, "JSON parse error: %s (%u)", + GetParseError_En(ok.Code()), ok.Offset()); + exit(EXIT_FAILURE); + } + \endcode + \see GenericReader::Parse, GenericDocument::Parse +*/ +struct ParseResult { + + //! Default constructor, no error. + ParseResult() : code_(kParseErrorNone), offset_(0) {} + //! Constructor to set an error. + ParseResult(ParseErrorCode code, size_t offset) : code_(code), offset_(offset) {} + + //! Get the error code. + ParseErrorCode Code() const { return code_; } + //! Get the error offset, if \ref IsError(), 0 otherwise. + size_t Offset() const { return offset_; } + + //! Conversion to \c bool, returns \c true, iff !\ref IsError(). + operator bool() const { return !IsError(); } + //! Whether the result is an error. + bool IsError() const { return code_ != kParseErrorNone; } + + bool operator==(const ParseResult& that) const { return code_ == that.code_; } + bool operator==(ParseErrorCode code) const { return code_ == code; } + friend bool operator==(ParseErrorCode code, const ParseResult & err) { return code == err.code_; } + + //! Reset error code. + void Clear() { Set(kParseErrorNone); } + //! Update error code and offset. + void Set(ParseErrorCode code, size_t offset = 0) { code_ = code; offset_ = offset; } + +private: + ParseErrorCode code_; + size_t offset_; +}; + +//! Function pointer type of GetParseError(). +/*! \ingroup RAPIDJSON_ERRORS + + This is the prototype for \c GetParseError_X(), where \c X is a locale. + User can dynamically change locale in runtime, e.g.: +\code + GetParseErrorFunc GetParseError = GetParseError_En; // or whatever + const RAPIDJSON_ERROR_CHARTYPE* s = GetParseError(document.GetParseErrorCode()); +\endcode +*/ +typedef const RAPIDJSON_ERROR_CHARTYPE* (*GetParseErrorFunc)(ParseErrorCode); + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_ERROR_ERROR_H__ diff --git a/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/filereadstream.h b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/filereadstream.h new file mode 100755 index 000000000..5af9be579 --- /dev/null +++ b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/filereadstream.h @@ -0,0 +1,94 @@ +// Copyright (C) 2011 Milo Yip +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef RAPIDJSON_FILEREADSTREAM_H_ +#define RAPIDJSON_FILEREADSTREAM_H_ + +#include "rapidjson.h" +#include <cstdio> + +RAPIDJSON_NAMESPACE_BEGIN + +//! File byte stream for input using fread(). +/*! + \note implements Stream concept +*/ +class FileReadStream { +public: + typedef char Ch; //!< Character type (byte). + + //! Constructor. + /*! + \param fp File pointer opened for read. + \param buffer user-supplied buffer. + \param bufferSize size of buffer in bytes. Must >=4 bytes. + */ + FileReadStream(std::FILE* fp, char* buffer, size_t bufferSize) : fp_(fp), buffer_(buffer), bufferSize_(bufferSize), bufferLast_(0), current_(buffer_), readCount_(0), count_(0), eof_(false) { + RAPIDJSON_ASSERT(fp_ != 0); + RAPIDJSON_ASSERT(bufferSize >= 4); + Read(); + } + + Ch Peek() const { return *current_; } + Ch Take() { Ch c = *current_; Read(); return c; } + size_t Tell() const { return count_ + static_cast<size_t>(current_ - buffer_); } + + // Not implemented + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + + // For encoding detection only. + const Ch* Peek4() const { + return (current_ + 4 <= bufferLast_) ? current_ : 0; + } + +private: + void Read() { + if (current_ < bufferLast_) + ++current_; + else if (!eof_) { + count_ += readCount_; + readCount_ = fread(buffer_, 1, bufferSize_, fp_); + bufferLast_ = buffer_ + readCount_ - 1; + current_ = buffer_; + + if (readCount_ < bufferSize_) { + buffer_[readCount_] = '\0'; + ++bufferLast_; + eof_ = true; + } + } + } + + std::FILE* fp_; + Ch *buffer_; + size_t bufferSize_; + Ch *bufferLast_; + Ch *current_; + size_t readCount_; + size_t count_; //!< Number of characters read + bool eof_; +}; + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_FILESTREAM_H_ diff --git a/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/filestream.h b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/filestream.h new file mode 100755 index 000000000..a370c6057 --- /dev/null +++ b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/filestream.h @@ -0,0 +1,73 @@ +// Copyright (C) 2011 Milo Yip +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef RAPIDJSON_FILESTREAM_H_ +#define RAPIDJSON_FILESTREAM_H_ + +#include "rapidjson.h" +#include <cstdio> + +RAPIDJSON_NAMESPACE_BEGIN + +//! (Deprecated) Wrapper of C file stream for input or output. +/*! + This simple wrapper does not check the validity of the stream. + \note implements Stream concept + \note deprecated: This was only for basic testing in version 0.1, it is found that the performance is very low by using fgetc(). Use FileReadStream instead. +*/ +class FileStream { +public: + typedef char Ch; //!< Character type. Only support char. + + FileStream(std::FILE* fp) : fp_(fp), current_('\0'), count_(0) { Read(); } + char Peek() const { return current_; } + char Take() { char c = current_; Read(); return c; } + size_t Tell() const { return count_; } + void Put(char c) { fputc(c, fp_); } + void Flush() { fflush(fp_); } + + // Not implemented + char* PutBegin() { return 0; } + size_t PutEnd(char*) { return 0; } + +private: + // Prohibit copy constructor & assignment operator. + FileStream(const FileStream&); + FileStream& operator=(const FileStream&); + + void Read() { + RAPIDJSON_ASSERT(fp_ != 0); + int c = fgetc(fp_); + if (c != EOF) { + current_ = (char)c; + count_++; + } + else if (current_ != '\0') + current_ = '\0'; + } + + std::FILE* fp_; + char current_; + size_t count_; +}; + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_FILESTREAM_H_ diff --git a/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/filewritestream.h b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/filewritestream.h new file mode 100755 index 000000000..4352c8f17 --- /dev/null +++ b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/filewritestream.h @@ -0,0 +1,97 @@ +// Copyright (C) 2011 Milo Yip +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef RAPIDJSON_FILEWRITESTREAM_H_ +#define RAPIDJSON_FILEWRITESTREAM_H_ + +#include "rapidjson.h" +#include <cstdio> + +RAPIDJSON_NAMESPACE_BEGIN + +//! Wrapper of C file stream for input using fread(). +/*! + \note implements Stream concept +*/ +class FileWriteStream { +public: + typedef char Ch; //!< Character type. Only support char. + + FileWriteStream(std::FILE* fp, char* buffer, size_t bufferSize) : fp_(fp), buffer_(buffer), bufferEnd_(buffer + bufferSize), current_(buffer_) { + RAPIDJSON_ASSERT(fp_ != 0); + } + + void Put(char c) { + if (current_ >= bufferEnd_) + Flush(); + + *current_++ = c; + } + + void PutN(char c, size_t n) { + size_t avail = static_cast<size_t>(bufferEnd_ - current_); + while (n > avail) { + std::memset(current_, c, avail); + current_ += avail; + Flush(); + n -= avail; + avail = static_cast<size_t>(bufferEnd_ - current_); + } + + if (n > 0) { + std::memset(current_, c, n); + current_ += n; + } + } + + void Flush() { + if (current_ != buffer_) { + fwrite(buffer_, 1, static_cast<size_t>(current_ - buffer_), fp_); + current_ = buffer_; + } + } + + // Not implemented + char Peek() const { RAPIDJSON_ASSERT(false); return 0; } + char Take() { RAPIDJSON_ASSERT(false); return 0; } + size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } + char* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(char*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + // Prohibit copy constructor & assignment operator. + FileWriteStream(const FileWriteStream&); + FileWriteStream& operator=(const FileWriteStream&); + + std::FILE* fp_; + char *buffer_; + char *bufferEnd_; + char *current_; +}; + +//! Implement specialized version of PutN() with memset() for better performance. +template<> +inline void PutN(FileWriteStream& stream, char c, size_t n) { + stream.PutN(c, n); +} + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_FILESTREAM_H_ diff --git a/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/internal/biginteger.h b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/internal/biginteger.h new file mode 100755 index 000000000..72acfc385 --- /dev/null +++ b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/internal/biginteger.h @@ -0,0 +1,294 @@ +// Copyright (C) 2011 Milo Yip +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef RAPIDJSON_BIGINTEGER_H_ +#define RAPIDJSON_BIGINTEGER_H_ + +#include "../rapidjson.h" + +#if defined(_MSC_VER) && defined(_M_AMD64) +#include <intrin.h> // for _umul128 +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +class BigInteger { +public: + typedef uint64_t Type; + + BigInteger(const BigInteger& rhs) : count_(rhs.count_) { + std::memcpy(digits_, rhs.digits_, count_ * sizeof(Type)); + } + + explicit BigInteger(uint64_t u) : count_(1) { + digits_[0] = u; + } + + BigInteger(const char* decimals, size_t length) : count_(1) { + RAPIDJSON_ASSERT(length > 0); + digits_[0] = 0; + size_t i = 0; + const size_t kMaxDigitPerIteration = 19; // 2^64 = 18446744073709551616 > 10^19 + while (length >= kMaxDigitPerIteration) { + AppendDecimal64(decimals + i, decimals + i + kMaxDigitPerIteration); + length -= kMaxDigitPerIteration; + i += kMaxDigitPerIteration; + } + + if (length > 0) + AppendDecimal64(decimals + i, decimals + i + length); + } + + BigInteger& operator=(uint64_t u) { + digits_[0] = u; + count_ = 1; + return *this; + } + + BigInteger& operator+=(uint64_t u) { + Type backup = digits_[0]; + digits_[0] += u; + for (size_t i = 0; i < count_ - 1; i++) { + if (digits_[i] >= backup) + return *this; // no carry + backup = digits_[i + 1]; + digits_[i + 1] += 1; + } + + // Last carry + if (digits_[count_ - 1] < backup) + PushBack(1); + + return *this; + } + + BigInteger& operator*=(uint64_t u) { + if (u == 0) return *this = 0; + if (u == 1) return *this; + if (*this == 1) return *this = u; + + uint64_t k = 0; + for (size_t i = 0; i < count_; i++) { + uint64_t hi; + digits_[i] = MulAdd64(digits_[i], u, k, &hi); + k = hi; + } + + if (k > 0) + PushBack(k); + + return *this; + } + + BigInteger& operator*=(uint32_t u) { + if (u == 0) return *this = 0; + if (u == 1) return *this; + if (*this == 1) return *this = u; + + uint32_t k = 0; + for (size_t i = 0; i < count_; i++) { + const uint64_t c = digits_[i] >> 32; + const uint64_t d = digits_[i] & 0xFFFFFFFF; + const uint64_t uc = u * c; + const uint64_t ud = u * d; + const uint64_t p0 = ud + k; + const uint64_t p1 = uc + (p0 >> 32); + digits_[i] = (p0 & 0xFFFFFFFF) | (p1 << 32); + k = p1 >> 32; + } + + if (k > 0) + PushBack(k); + + return *this; + } + + BigInteger& operator<<=(size_t shift) { + if (IsZero() || shift == 0) return *this; + + size_t offset = shift / kTypeBit; + size_t interShift = shift % kTypeBit; + RAPIDJSON_ASSERT(count_ + offset <= kCapacity); + + if (interShift == 0) { + std::memmove(&digits_[count_ - 1 + offset], &digits_[count_ - 1], count_ * sizeof(Type)); + count_ += offset; + } + else { + digits_[count_] = 0; + for (size_t i = count_; i > 0; i--) + digits_[i + offset] = (digits_[i] << interShift) | (digits_[i - 1] >> (kTypeBit - interShift)); + digits_[offset] = digits_[0] << interShift; + count_ += offset; + if (digits_[count_]) + count_++; + } + + std::memset(digits_, 0, offset * sizeof(Type)); + + return *this; + } + + bool operator==(const BigInteger& rhs) const { + return count_ == rhs.count_ && memcmp(digits_, rhs.digits_, count_ * sizeof(Type)) == 0; + } + + bool operator==(const Type rhs) const { + return count_ == 1 && digits_[0] == rhs; + } + + BigInteger& MultiplyPow5(unsigned exp) { + static const uint32_t kPow5[12] = { + 5, + 5 * 5, + 5 * 5 * 5, + 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 + }; + if (exp == 0) return *this; + for (; exp >= 27; exp -= 27) *this *= RAPIDJSON_UINT64_C2(0X6765C793, 0XFA10079D); // 5^27 + for (; exp >= 13; exp -= 13) *this *= 1220703125u; // 5^13 + if (exp > 0) *this *= kPow5[exp - 1]; + return *this; + } + + // Compute absolute difference of this and rhs. + // Return false if this < rhs + bool Difference(const BigInteger& rhs, BigInteger* out) const { + int cmp = Compare(rhs); + if (cmp == 0) { + *out = BigInteger(0); + return false; + } + const BigInteger *a, *b; // Makes a > b + bool ret; + if (cmp < 0) { a = &rhs; b = this; ret = true; } + else { a = this; b = &rhs; ret = false; } + + Type borrow = 0; + for (size_t i = 0; i < a->count_; i++) { + Type d = a->digits_[i] - borrow; + if (i < b->count_) + d -= b->digits_[i]; + borrow = (d > a->digits_[i]) ? 1 : 0; + out->digits_[i] = d; + if (d != 0) + out->count_ = i + 1; + } + + return ret; + } + + int Compare(const BigInteger& rhs) const { + if (count_ != rhs.count_) + return count_ < rhs.count_ ? -1 : 1; + + for (size_t i = count_; i-- > 0;) + if (digits_[i] != rhs.digits_[i]) + return digits_[i] < rhs.digits_[i] ? -1 : 1; + + return 0; + } + + size_t GetCount() const { return count_; } + Type GetDigit(size_t index) const { RAPIDJSON_ASSERT(index < count_); return digits_[index]; } + bool IsZero() const { return count_ == 1 && digits_[0] == 0; } + +private: + void AppendDecimal64(const char* begin, const char* end) { + uint64_t u = ParseUint64(begin, end); + if (IsZero()) + *this = u; + else { + unsigned exp = static_cast<unsigned>(end - begin); + (MultiplyPow5(exp) <<= exp) += u; // *this = *this * 10^exp + u + } + } + + void PushBack(Type digit) { + RAPIDJSON_ASSERT(count_ < kCapacity); + digits_[count_++] = digit; + } + + static uint64_t ParseUint64(const char* begin, const char* end) { + uint64_t r = 0; + for (const char* p = begin; p != end; ++p) { + RAPIDJSON_ASSERT(*p >= '0' && *p <= '9'); + r = r * 10 + (*p - '0'); + } + return r; + } + + // Assume a * b + k < 2^128 + static uint64_t MulAdd64(uint64_t a, uint64_t b, uint64_t k, uint64_t* outHigh) { +#if defined(_MSC_VER) && defined(_M_AMD64) + uint64_t low = _umul128(a, b, outHigh) + k; + if (low < k) + (*outHigh)++; + return low; +#elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__x86_64__) + unsigned __int128 p = static_cast<unsigned __int128>(a) * static_cast<unsigned __int128>(b); + p += k; + *outHigh = p >> 64; + return static_cast<uint64_t>(p); +#else + const uint64_t a0 = a & 0xFFFFFFFF, a1 = a >> 32, b0 = b & 0xFFFFFFFF, b1 = b >> 32; + uint64_t x0 = a0 * b0, x1 = a0 * b1, x2 = a1 * b0, x3 = a1 * b1; + x1 += (x0 >> 32); // can't give carry + x1 += x2; + if (x1 < x2) + x3 += (static_cast<uint64_t>(1) << 32); + uint64_t lo = (x1 << 32) + (x0 & 0xFFFFFFFF); + uint64_t hi = x3 + (x1 >> 32); + + lo += k; + if (lo < k) + hi++; + *outHigh = hi; + return lo; +#endif + } + + static Type FullAdd(Type a, Type b, bool inCarry, bool* outCarry) { + Type c = a + b + (inCarry ? 1 : 0); + *outCarry = c < a; + return c; + } + + static const size_t kBitCount = 3328; // 64bit * 54 > 10^1000 + static const size_t kCapacity = kBitCount / sizeof(Type); + static const size_t kTypeBit = sizeof(Type) * 8; + + Type digits_[kCapacity]; + size_t count_; +}; + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_BIGINTEGER_H_ diff --git a/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/internal/diyfp.h b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/internal/diyfp.h new file mode 100755 index 000000000..174b9facf --- /dev/null +++ b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/internal/diyfp.h @@ -0,0 +1,268 @@ +// Copyright (C) 2011 Milo Yip +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This is a C++ header-only implementation of Grisu2 algorithm from the publication: +// Loitsch, Florian. "Printing floating-point numbers quickly and accurately with +// integers." ACM Sigplan Notices 45.6 (2010): 233-243. + +#ifndef RAPIDJSON_DIYFP_H_ +#define RAPIDJSON_DIYFP_H_ + +#if defined(_MSC_VER) +#include <intrin.h> +#if defined(_M_AMD64) +#pragma intrinsic(_BitScanReverse64) +#endif +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +struct DiyFp { + DiyFp() {} + + DiyFp(uint64_t fp, int exp) : f(fp), e(exp) {} + + explicit DiyFp(double d) { + union { + double d; + uint64_t u64; + } u = { d }; + + int biased_e = (u.u64 & kDpExponentMask) >> kDpSignificandSize; + uint64_t significand = (u.u64 & kDpSignificandMask); + if (biased_e != 0) { + f = significand + kDpHiddenBit; + e = biased_e - kDpExponentBias; + } + else { + f = significand; + e = kDpMinExponent + 1; + } + } + + DiyFp operator-(const DiyFp& rhs) const { + return DiyFp(f - rhs.f, e); + } + + DiyFp operator*(const DiyFp& rhs) const { +#if defined(_MSC_VER) && defined(_M_AMD64) + uint64_t h; + uint64_t l = _umul128(f, rhs.f, &h); + if (l & (uint64_t(1) << 63)) // rounding + h++; + return DiyFp(h, e + rhs.e + 64); +#elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__x86_64__) + unsigned __int128 p = static_cast<unsigned __int128>(f) * static_cast<unsigned __int128>(rhs.f); + uint64_t h = p >> 64; + uint64_t l = static_cast<uint64_t>(p); + if (l & (uint64_t(1) << 63)) // rounding + h++; + return DiyFp(h, e + rhs.e + 64); +#else + const uint64_t M32 = 0xFFFFFFFF; + const uint64_t a = f >> 32; + const uint64_t b = f & M32; + const uint64_t c = rhs.f >> 32; + const uint64_t d = rhs.f & M32; + const uint64_t ac = a * c; + const uint64_t bc = b * c; + const uint64_t ad = a * d; + const uint64_t bd = b * d; + uint64_t tmp = (bd >> 32) + (ad & M32) + (bc & M32); + tmp += 1U << 31; /// mult_round + return DiyFp(ac + (ad >> 32) + (bc >> 32) + (tmp >> 32), e + rhs.e + 64); +#endif + } + + DiyFp Normalize() const { +#if defined(_MSC_VER) && defined(_M_AMD64) + unsigned long index; + _BitScanReverse64(&index, f); + return DiyFp(f << (63 - index), e - (63 - index)); +#elif defined(__GNUC__) && __GNUC__ >= 4 + int s = __builtin_clzll(f); + return DiyFp(f << s, e - s); +#else + DiyFp res = *this; + while (!(res.f & (static_cast<uint64_t>(1) << 63))) { + res.f <<= 1; + res.e--; + } + return res; +#endif + } + + DiyFp NormalizeBoundary() const { + DiyFp res = *this; + while (!(res.f & (kDpHiddenBit << 1))) { + res.f <<= 1; + res.e--; + } + res.f <<= (kDiySignificandSize - kDpSignificandSize - 2); + res.e = res.e - (kDiySignificandSize - kDpSignificandSize - 2); + return res; + } + + void NormalizedBoundaries(DiyFp* minus, DiyFp* plus) const { + DiyFp pl = DiyFp((f << 1) + 1, e - 1).NormalizeBoundary(); + DiyFp mi = (f == kDpHiddenBit) ? DiyFp((f << 2) - 1, e - 2) : DiyFp((f << 1) - 1, e - 1); + mi.f <<= mi.e - pl.e; + mi.e = pl.e; + *plus = pl; + *minus = mi; + } + + double ToDouble() const { + union { + double d; + uint64_t u64; + }u; + uint64_t significand = f; + int exponent = e; + while (significand > kDpHiddenBit + kDpSignificandMask) { + significand >>= 1; + exponent++; + } + while (exponent > kDpDenormalExponent && (significand & kDpHiddenBit) == 0) { + significand <<= 1; + exponent--; + } + if (exponent >= kDpMaxExponent) { + u.u64 = kDpExponentMask; // Infinity + return u.d; + } + else if (exponent < kDpDenormalExponent) + return 0.0; + const uint64_t be = (exponent == kDpDenormalExponent && (significand & kDpHiddenBit) == 0) ? 0 : + static_cast<uint64_t>(exponent + kDpExponentBias); + u.u64 = (significand & kDpSignificandMask) | (be << kDpSignificandSize); + return u.d; + } + + static const int kDiySignificandSize = 64; + static const int kDpSignificandSize = 52; + static const int kDpExponentBias = 0x3FF + kDpSignificandSize; + static const int kDpMaxExponent = 0x7FF - kDpExponentBias; + static const int kDpMinExponent = -kDpExponentBias; + static const int kDpDenormalExponent = -kDpExponentBias + 1; + static const uint64_t kDpExponentMask = RAPIDJSON_UINT64_C2(0x7FF00000, 0x00000000); + static const uint64_t kDpSignificandMask = RAPIDJSON_UINT64_C2(0x000FFFFF, 0xFFFFFFFF); + static const uint64_t kDpHiddenBit = RAPIDJSON_UINT64_C2(0x00100000, 0x00000000); + + uint64_t f; + int e; +}; + +inline DiyFp GetCachedPowerByIndex(size_t index) { + // 10^-348, 10^-340, ..., 10^340 + static const uint64_t kCachedPowers_F[] = { + RAPIDJSON_UINT64_C2(0xfa8fd5a0, 0x081c0288), RAPIDJSON_UINT64_C2(0xbaaee17f, 0xa23ebf76), + RAPIDJSON_UINT64_C2(0x8b16fb20, 0x3055ac76), RAPIDJSON_UINT64_C2(0xcf42894a, 0x5dce35ea), + RAPIDJSON_UINT64_C2(0x9a6bb0aa, 0x55653b2d), RAPIDJSON_UINT64_C2(0xe61acf03, 0x3d1a45df), + RAPIDJSON_UINT64_C2(0xab70fe17, 0xc79ac6ca), RAPIDJSON_UINT64_C2(0xff77b1fc, 0xbebcdc4f), + RAPIDJSON_UINT64_C2(0xbe5691ef, 0x416bd60c), RAPIDJSON_UINT64_C2(0x8dd01fad, 0x907ffc3c), + RAPIDJSON_UINT64_C2(0xd3515c28, 0x31559a83), RAPIDJSON_UINT64_C2(0x9d71ac8f, 0xada6c9b5), + RAPIDJSON_UINT64_C2(0xea9c2277, 0x23ee8bcb), RAPIDJSON_UINT64_C2(0xaecc4991, 0x4078536d), + RAPIDJSON_UINT64_C2(0x823c1279, 0x5db6ce57), RAPIDJSON_UINT64_C2(0xc2109436, 0x4dfb5637), + RAPIDJSON_UINT64_C2(0x9096ea6f, 0x3848984f), RAPIDJSON_UINT64_C2(0xd77485cb, 0x25823ac7), + RAPIDJSON_UINT64_C2(0xa086cfcd, 0x97bf97f4), RAPIDJSON_UINT64_C2(0xef340a98, 0x172aace5), + RAPIDJSON_UINT64_C2(0xb23867fb, 0x2a35b28e), RAPIDJSON_UINT64_C2(0x84c8d4df, 0xd2c63f3b), + RAPIDJSON_UINT64_C2(0xc5dd4427, 0x1ad3cdba), RAPIDJSON_UINT64_C2(0x936b9fce, 0xbb25c996), + RAPIDJSON_UINT64_C2(0xdbac6c24, 0x7d62a584), RAPIDJSON_UINT64_C2(0xa3ab6658, 0x0d5fdaf6), + RAPIDJSON_UINT64_C2(0xf3e2f893, 0xdec3f126), RAPIDJSON_UINT64_C2(0xb5b5ada8, 0xaaff80b8), + RAPIDJSON_UINT64_C2(0x87625f05, 0x6c7c4a8b), RAPIDJSON_UINT64_C2(0xc9bcff60, 0x34c13053), + RAPIDJSON_UINT64_C2(0x964e858c, 0x91ba2655), RAPIDJSON_UINT64_C2(0xdff97724, 0x70297ebd), + RAPIDJSON_UINT64_C2(0xa6dfbd9f, 0xb8e5b88f), RAPIDJSON_UINT64_C2(0xf8a95fcf, 0x88747d94), + RAPIDJSON_UINT64_C2(0xb9447093, 0x8fa89bcf), RAPIDJSON_UINT64_C2(0x8a08f0f8, 0xbf0f156b), + RAPIDJSON_UINT64_C2(0xcdb02555, 0x653131b6), RAPIDJSON_UINT64_C2(0x993fe2c6, 0xd07b7fac), + RAPIDJSON_UINT64_C2(0xe45c10c4, 0x2a2b3b06), RAPIDJSON_UINT64_C2(0xaa242499, 0x697392d3), + RAPIDJSON_UINT64_C2(0xfd87b5f2, 0x8300ca0e), RAPIDJSON_UINT64_C2(0xbce50864, 0x92111aeb), + RAPIDJSON_UINT64_C2(0x8cbccc09, 0x6f5088cc), RAPIDJSON_UINT64_C2(0xd1b71758, 0xe219652c), + RAPIDJSON_UINT64_C2(0x9c400000, 0x00000000), RAPIDJSON_UINT64_C2(0xe8d4a510, 0x00000000), + RAPIDJSON_UINT64_C2(0xad78ebc5, 0xac620000), RAPIDJSON_UINT64_C2(0x813f3978, 0xf8940984), + RAPIDJSON_UINT64_C2(0xc097ce7b, 0xc90715b3), RAPIDJSON_UINT64_C2(0x8f7e32ce, 0x7bea5c70), + RAPIDJSON_UINT64_C2(0xd5d238a4, 0xabe98068), RAPIDJSON_UINT64_C2(0x9f4f2726, 0x179a2245), + RAPIDJSON_UINT64_C2(0xed63a231, 0xd4c4fb27), RAPIDJSON_UINT64_C2(0xb0de6538, 0x8cc8ada8), + RAPIDJSON_UINT64_C2(0x83c7088e, 0x1aab65db), RAPIDJSON_UINT64_C2(0xc45d1df9, 0x42711d9a), + RAPIDJSON_UINT64_C2(0x924d692c, 0xa61be758), RAPIDJSON_UINT64_C2(0xda01ee64, 0x1a708dea), + RAPIDJSON_UINT64_C2(0xa26da399, 0x9aef774a), RAPIDJSON_UINT64_C2(0xf209787b, 0xb47d6b85), + RAPIDJSON_UINT64_C2(0xb454e4a1, 0x79dd1877), RAPIDJSON_UINT64_C2(0x865b8692, 0x5b9bc5c2), + RAPIDJSON_UINT64_C2(0xc83553c5, 0xc8965d3d), RAPIDJSON_UINT64_C2(0x952ab45c, 0xfa97a0b3), + RAPIDJSON_UINT64_C2(0xde469fbd, 0x99a05fe3), RAPIDJSON_UINT64_C2(0xa59bc234, 0xdb398c25), + RAPIDJSON_UINT64_C2(0xf6c69a72, 0xa3989f5c), RAPIDJSON_UINT64_C2(0xb7dcbf53, 0x54e9bece), + RAPIDJSON_UINT64_C2(0x88fcf317, 0xf22241e2), RAPIDJSON_UINT64_C2(0xcc20ce9b, 0xd35c78a5), + RAPIDJSON_UINT64_C2(0x98165af3, 0x7b2153df), RAPIDJSON_UINT64_C2(0xe2a0b5dc, 0x971f303a), + RAPIDJSON_UINT64_C2(0xa8d9d153, 0x5ce3b396), RAPIDJSON_UINT64_C2(0xfb9b7cd9, 0xa4a7443c), + RAPIDJSON_UINT64_C2(0xbb764c4c, 0xa7a44410), RAPIDJSON_UINT64_C2(0x8bab8eef, 0xb6409c1a), + RAPIDJSON_UINT64_C2(0xd01fef10, 0xa657842c), RAPIDJSON_UINT64_C2(0x9b10a4e5, 0xe9913129), + RAPIDJSON_UINT64_C2(0xe7109bfb, 0xa19c0c9d), RAPIDJSON_UINT64_C2(0xac2820d9, 0x623bf429), + RAPIDJSON_UINT64_C2(0x80444b5e, 0x7aa7cf85), RAPIDJSON_UINT64_C2(0xbf21e440, 0x03acdd2d), + RAPIDJSON_UINT64_C2(0x8e679c2f, 0x5e44ff8f), RAPIDJSON_UINT64_C2(0xd433179d, 0x9c8cb841), + RAPIDJSON_UINT64_C2(0x9e19db92, 0xb4e31ba9), RAPIDJSON_UINT64_C2(0xeb96bf6e, 0xbadf77d9), + RAPIDJSON_UINT64_C2(0xaf87023b, 0x9bf0ee6b) + }; + static const int16_t kCachedPowers_E[] = { + -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980, + -954, -927, -901, -874, -847, -821, -794, -768, -741, -715, + -688, -661, -635, -608, -582, -555, -529, -502, -475, -449, + -422, -396, -369, -343, -316, -289, -263, -236, -210, -183, + -157, -130, -103, -77, -50, -24, 3, 30, 56, 83, + 109, 136, 162, 189, 216, 242, 269, 295, 322, 348, + 375, 402, 428, 455, 481, 508, 534, 561, 588, 614, + 641, 667, 694, 720, 747, 774, 800, 827, 853, 880, + 907, 933, 960, 986, 1013, 1039, 1066 + }; + return DiyFp(kCachedPowers_F[index], kCachedPowers_E[index]); +} + +inline DiyFp GetCachedPower(int e, int* K) { + + //int k = static_cast<int>(ceil((-61 - e) * 0.30102999566398114)) + 374; + double dk = (-61 - e) * 0.30102999566398114 + 347; // dk must be positive, so can do ceiling in positive + int k = static_cast<int>(dk); + if (k != dk) + k++; + + unsigned index = static_cast<unsigned>((k >> 3) + 1); + *K = -(-348 + static_cast<int>(index << 3)); // decimal exponent no need lookup table + + return GetCachedPowerByIndex(index); +} + +inline DiyFp GetCachedPower10(int exp, int *outExp) { + unsigned index = (exp + 348) / 8; + *outExp = -348 + index * 8; + return GetCachedPowerByIndex(index); + } + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_DIYFP_H_ diff --git a/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/internal/dtoa.h b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/internal/dtoa.h new file mode 100755 index 000000000..c0fa2b890 --- /dev/null +++ b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/internal/dtoa.h @@ -0,0 +1,225 @@ +// Copyright (C) 2011 Milo Yip +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This is a C++ header-only implementation of Grisu2 algorithm from the publication: +// Loitsch, Florian. "Printing floating-point numbers quickly and accurately with +// integers." ACM Sigplan Notices 45.6 (2010): 233-243. + +#ifndef RAPIDJSON_DTOA_ +#define RAPIDJSON_DTOA_ + +#include "itoa.h" // GetDigitsLut() +#include "diyfp.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +inline void GrisuRound(char* buffer, int len, uint64_t delta, uint64_t rest, uint64_t ten_kappa, uint64_t wp_w) { + while (rest < wp_w && delta - rest >= ten_kappa && + (rest + ten_kappa < wp_w || /// closer + wp_w - rest > rest + ten_kappa - wp_w)) { + buffer[len - 1]--; + rest += ten_kappa; + } +} + +inline unsigned CountDecimalDigit32(uint32_t n) { + // Simple pure C++ implementation was faster than __builtin_clz version in this situation. + if (n < 10) return 1; + if (n < 100) return 2; + if (n < 1000) return 3; + if (n < 10000) return 4; + if (n < 100000) return 5; + if (n < 1000000) return 6; + if (n < 10000000) return 7; + if (n < 100000000) return 8; + if (n < 1000000000) return 9; + return 10; +} + +inline void DigitGen(const DiyFp& W, const DiyFp& Mp, uint64_t delta, char* buffer, int* len, int* K) { + static const uint32_t kPow10[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 }; + const DiyFp one(uint64_t(1) << -Mp.e, Mp.e); + const DiyFp wp_w = Mp - W; + uint32_t p1 = static_cast<uint32_t>(Mp.f >> -one.e); + uint64_t p2 = Mp.f & (one.f - 1); + int kappa = CountDecimalDigit32(p1); + *len = 0; + + while (kappa > 0) { + uint32_t d; + switch (kappa) { + case 10: d = p1 / 1000000000; p1 %= 1000000000; break; + case 9: d = p1 / 100000000; p1 %= 100000000; break; + case 8: d = p1 / 10000000; p1 %= 10000000; break; + case 7: d = p1 / 1000000; p1 %= 1000000; break; + case 6: d = p1 / 100000; p1 %= 100000; break; + case 5: d = p1 / 10000; p1 %= 10000; break; + case 4: d = p1 / 1000; p1 %= 1000; break; + case 3: d = p1 / 100; p1 %= 100; break; + case 2: d = p1 / 10; p1 %= 10; break; + case 1: d = p1; p1 = 0; break; + default: +#if defined(_MSC_VER) + __assume(0); +#elif __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) + __builtin_unreachable(); +#else + d = 0; +#endif + } + if (d || *len) + buffer[(*len)++] = static_cast<char>('0' + static_cast<char>(d)); + kappa--; + uint64_t tmp = (static_cast<uint64_t>(p1) << -one.e) + p2; + if (tmp <= delta) { + *K += kappa; + GrisuRound(buffer, *len, delta, tmp, static_cast<uint64_t>(kPow10[kappa]) << -one.e, wp_w.f); + return; + } + } + + // kappa = 0 + for (;;) { + p2 *= 10; + delta *= 10; + char d = static_cast<char>(p2 >> -one.e); + if (d || *len) + buffer[(*len)++] = static_cast<char>('0' + d); + p2 &= one.f - 1; + kappa--; + if (p2 < delta) { + *K += kappa; + GrisuRound(buffer, *len, delta, p2, one.f, wp_w.f * kPow10[-kappa]); + return; + } + } +} + +inline void Grisu2(double value, char* buffer, int* length, int* K) { + const DiyFp v(value); + DiyFp w_m, w_p; + v.NormalizedBoundaries(&w_m, &w_p); + + const DiyFp c_mk = GetCachedPower(w_p.e, K); + const DiyFp W = v.Normalize() * c_mk; + DiyFp Wp = w_p * c_mk; + DiyFp Wm = w_m * c_mk; + Wm.f++; + Wp.f--; + DigitGen(W, Wp, Wp.f - Wm.f, buffer, length, K); +} + +inline char* WriteExponent(int K, char* buffer) { + if (K < 0) { + *buffer++ = '-'; + K = -K; + } + + if (K >= 100) { + *buffer++ = static_cast<char>('0' + static_cast<char>(K / 100)); + K %= 100; + const char* d = GetDigitsLut() + K * 2; + *buffer++ = d[0]; + *buffer++ = d[1]; + } + else if (K >= 10) { + const char* d = GetDigitsLut() + K * 2; + *buffer++ = d[0]; + *buffer++ = d[1]; + } + else + *buffer++ = static_cast<char>('0' + static_cast<char>(K)); + + return buffer; +} + +inline char* Prettify(char* buffer, int length, int k) { + const int kk = length + k; // 10^(kk-1) <= v < 10^kk + + if (length <= kk && kk <= 21) { + // 1234e7 -> 12340000000 + for (int i = length; i < kk; i++) + buffer[i] = '0'; + buffer[kk] = '.'; + buffer[kk + 1] = '0'; + return &buffer[kk + 2]; + } + else if (0 < kk && kk <= 21) { + // 1234e-2 -> 12.34 + std::memmove(&buffer[kk + 1], &buffer[kk], length - kk); + buffer[kk] = '.'; + return &buffer[length + 1]; + } + else if (-6 < kk && kk <= 0) { + // 1234e-6 -> 0.001234 + const int offset = 2 - kk; + std::memmove(&buffer[offset], &buffer[0], length); + buffer[0] = '0'; + buffer[1] = '.'; + for (int i = 2; i < offset; i++) + buffer[i] = '0'; + return &buffer[length + offset]; + } + else if (length == 1) { + // 1e30 + buffer[1] = 'e'; + return WriteExponent(kk - 1, &buffer[2]); + } + else { + // 1234e30 -> 1.234e33 + std::memmove(&buffer[2], &buffer[1], length - 1); + buffer[1] = '.'; + buffer[length + 1] = 'e'; + return WriteExponent(kk - 1, &buffer[0 + length + 2]); + } +} + +inline char* dtoa(double value, char* buffer) { + if (value == 0) { + buffer[0] = '0'; + buffer[1] = '.'; + buffer[2] = '0'; + return &buffer[3]; + } + else { + if (value < 0) { + *buffer++ = '-'; + value = -value; + } + int length, K; + Grisu2(value, buffer, &length, &K); + return Prettify(buffer, length, K); + } +} + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_DTOA_ diff --git a/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/internal/ieee754.h b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/internal/ieee754.h new file mode 100755 index 000000000..ab65cc9a8 --- /dev/null +++ b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/internal/ieee754.h @@ -0,0 +1,90 @@ +// Copyright (C) 2011 Milo Yip +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef RAPIDJSON_IEEE754_ +#define RAPIDJSON_IEEE754_ + +#include "../rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +class Double { +public: + Double() {} + Double(double d) : d(d) {} + Double(uint64_t u) : u(u) {} + + double Value() const { return d; } + uint64_t Uint64Value() const { return u; } + + double NextPositiveDouble() const { + RAPIDJSON_ASSERT(!Sign()); + return Double(u + 1).Value(); + } + + double PreviousPositiveDouble() const { + RAPIDJSON_ASSERT(!Sign()); + if (d == 0.0) + return 0.0; + else + return Double(u - 1).Value(); + } + + bool Sign() const { return (u & kSignMask) != 0; } + uint64_t Significand() const { return u & kSignificandMask; } + int Exponent() const { return ((u & kExponentMask) >> kSignificandSize) - kExponentBias; } + + bool IsNan() const { return (u & kExponentMask) == kExponentMask && Significand() != 0; } + bool IsInf() const { return (u & kExponentMask) == kExponentMask && Significand() == 0; } + bool IsNormal() const { return (u & kExponentMask) != 0 || Significand() == 0; } + + uint64_t IntegerSignificand() const { return IsNormal() ? Significand() | kHiddenBit : Significand(); } + int IntegerExponent() const { return (IsNormal() ? Exponent() : kDenormalExponent) - kSignificandSize; } + uint64_t ToBias() const { return (u & kSignMask) ? ~u + 1 : u | kSignMask; } + + static unsigned EffectiveSignificandSize(int order) { + if (order >= -1021) + return 53; + else if (order <= -1074) + return 0; + else + return order + 1074; + } + +private: + static const int kSignificandSize = 52; + static const int kExponentBias = 0x3FF; + static const int kDenormalExponent = 1 - kExponentBias; + static const uint64_t kSignMask = RAPIDJSON_UINT64_C2(0x80000000, 0x00000000); + static const uint64_t kExponentMask = RAPIDJSON_UINT64_C2(0x7FF00000, 0x00000000); + static const uint64_t kSignificandMask = RAPIDJSON_UINT64_C2(0x000FFFFF, 0xFFFFFFFF); + static const uint64_t kHiddenBit = RAPIDJSON_UINT64_C2(0x00100000, 0x00000000); + + union { + double d; + uint64_t u; + }; +}; + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_IEEE754_ diff --git a/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/internal/itoa.h b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/internal/itoa.h new file mode 100755 index 000000000..3684f0736 --- /dev/null +++ b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/internal/itoa.h @@ -0,0 +1,306 @@ +// Copyright (C) 2011 Milo Yip +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef RAPIDJSON_ITOA_ +#define RAPIDJSON_ITOA_ + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +inline const char* GetDigitsLut() { + static const char cDigitsLut[200] = { + '0','0','0','1','0','2','0','3','0','4','0','5','0','6','0','7','0','8','0','9', + '1','0','1','1','1','2','1','3','1','4','1','5','1','6','1','7','1','8','1','9', + '2','0','2','1','2','2','2','3','2','4','2','5','2','6','2','7','2','8','2','9', + '3','0','3','1','3','2','3','3','3','4','3','5','3','6','3','7','3','8','3','9', + '4','0','4','1','4','2','4','3','4','4','4','5','4','6','4','7','4','8','4','9', + '5','0','5','1','5','2','5','3','5','4','5','5','5','6','5','7','5','8','5','9', + '6','0','6','1','6','2','6','3','6','4','6','5','6','6','6','7','6','8','6','9', + '7','0','7','1','7','2','7','3','7','4','7','5','7','6','7','7','7','8','7','9', + '8','0','8','1','8','2','8','3','8','4','8','5','8','6','8','7','8','8','8','9', + '9','0','9','1','9','2','9','3','9','4','9','5','9','6','9','7','9','8','9','9' + }; + return cDigitsLut; +} + +inline char* u32toa(uint32_t value, char* buffer) { + const char* cDigitsLut = GetDigitsLut(); + + if (value < 10000) { + const uint32_t d1 = (value / 100) << 1; + const uint32_t d2 = (value % 100) << 1; + + if (value >= 1000) + *buffer++ = cDigitsLut[d1]; + if (value >= 100) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= 10) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + } + else if (value < 100000000) { + // value = bbbbcccc + const uint32_t b = value / 10000; + const uint32_t c = value % 10000; + + const uint32_t d1 = (b / 100) << 1; + const uint32_t d2 = (b % 100) << 1; + + const uint32_t d3 = (c / 100) << 1; + const uint32_t d4 = (c % 100) << 1; + + if (value >= 10000000) + *buffer++ = cDigitsLut[d1]; + if (value >= 1000000) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= 100000) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + } + else { + // value = aabbbbcccc in decimal + + const uint32_t a = value / 100000000; // 1 to 42 + value %= 100000000; + + if (a >= 10) { + const unsigned i = a << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + } + else + *buffer++ = static_cast<char>('0' + static_cast<char>(a)); + + const uint32_t b = value / 10000; // 0 to 9999 + const uint32_t c = value % 10000; // 0 to 9999 + + const uint32_t d1 = (b / 100) << 1; + const uint32_t d2 = (b % 100) << 1; + + const uint32_t d3 = (c / 100) << 1; + const uint32_t d4 = (c % 100) << 1; + + *buffer++ = cDigitsLut[d1]; + *buffer++ = cDigitsLut[d1 + 1]; + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + } + return buffer; +} + +inline char* i32toa(int32_t value, char* buffer) { + if (value < 0) { + *buffer++ = '-'; + value = -value; + } + + return u32toa(static_cast<uint32_t>(value), buffer); +} + +inline char* u64toa(uint64_t value, char* buffer) { + const char* cDigitsLut = GetDigitsLut(); + const uint64_t kTen8 = 100000000; + const uint64_t kTen9 = kTen8 * 10; + const uint64_t kTen10 = kTen8 * 100; + const uint64_t kTen11 = kTen8 * 1000; + const uint64_t kTen12 = kTen8 * 10000; + const uint64_t kTen13 = kTen8 * 100000; + const uint64_t kTen14 = kTen8 * 1000000; + const uint64_t kTen15 = kTen8 * 10000000; + const uint64_t kTen16 = kTen8 * kTen8; + + if (value < kTen8) { + uint32_t v = static_cast<uint32_t>(value); + if (v < 10000) { + const uint32_t d1 = (v / 100) << 1; + const uint32_t d2 = (v % 100) << 1; + + if (v >= 1000) + *buffer++ = cDigitsLut[d1]; + if (v >= 100) + *buffer++ = cDigitsLut[d1 + 1]; + if (v >= 10) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + } + else { + // value = bbbbcccc + const uint32_t b = v / 10000; + const uint32_t c = v % 10000; + + const uint32_t d1 = (b / 100) << 1; + const uint32_t d2 = (b % 100) << 1; + + const uint32_t d3 = (c / 100) << 1; + const uint32_t d4 = (c % 100) << 1; + + if (value >= 10000000) + *buffer++ = cDigitsLut[d1]; + if (value >= 1000000) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= 100000) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + } + } + else if (value < kTen16) { + const uint32_t v0 = static_cast<uint32_t>(value / kTen8); + const uint32_t v1 = static_cast<uint32_t>(value % kTen8); + + const uint32_t b0 = v0 / 10000; + const uint32_t c0 = v0 % 10000; + + const uint32_t d1 = (b0 / 100) << 1; + const uint32_t d2 = (b0 % 100) << 1; + + const uint32_t d3 = (c0 / 100) << 1; + const uint32_t d4 = (c0 % 100) << 1; + + const uint32_t b1 = v1 / 10000; + const uint32_t c1 = v1 % 10000; + + const uint32_t d5 = (b1 / 100) << 1; + const uint32_t d6 = (b1 % 100) << 1; + + const uint32_t d7 = (c1 / 100) << 1; + const uint32_t d8 = (c1 % 100) << 1; + + if (value >= kTen15) + *buffer++ = cDigitsLut[d1]; + if (value >= kTen14) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= kTen13) + *buffer++ = cDigitsLut[d2]; + if (value >= kTen12) + *buffer++ = cDigitsLut[d2 + 1]; + if (value >= kTen11) + *buffer++ = cDigitsLut[d3]; + if (value >= kTen10) + *buffer++ = cDigitsLut[d3 + 1]; + if (value >= kTen9) + *buffer++ = cDigitsLut[d4]; + if (value >= kTen8) + *buffer++ = cDigitsLut[d4 + 1]; + + *buffer++ = cDigitsLut[d5]; + *buffer++ = cDigitsLut[d5 + 1]; + *buffer++ = cDigitsLut[d6]; + *buffer++ = cDigitsLut[d6 + 1]; + *buffer++ = cDigitsLut[d7]; + *buffer++ = cDigitsLut[d7 + 1]; + *buffer++ = cDigitsLut[d8]; + *buffer++ = cDigitsLut[d8 + 1]; + } + else { + const uint32_t a = static_cast<uint32_t>(value / kTen16); // 1 to 1844 + value %= kTen16; + + if (a < 10) + *buffer++ = static_cast<char>('0' + static_cast<char>(a)); + else if (a < 100) { + const uint32_t i = a << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + } + else if (a < 1000) { + *buffer++ = static_cast<char>('0' + static_cast<char>(a / 100)); + + const uint32_t i = (a % 100) << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + } + else { + const uint32_t i = (a / 100) << 1; + const uint32_t j = (a % 100) << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + *buffer++ = cDigitsLut[j]; + *buffer++ = cDigitsLut[j + 1]; + } + + const uint32_t v0 = static_cast<uint32_t>(value / kTen8); + const uint32_t v1 = static_cast<uint32_t>(value % kTen8); + + const uint32_t b0 = v0 / 10000; + const uint32_t c0 = v0 % 10000; + + const uint32_t d1 = (b0 / 100) << 1; + const uint32_t d2 = (b0 % 100) << 1; + + const uint32_t d3 = (c0 / 100) << 1; + const uint32_t d4 = (c0 % 100) << 1; + + const uint32_t b1 = v1 / 10000; + const uint32_t c1 = v1 % 10000; + + const uint32_t d5 = (b1 / 100) << 1; + const uint32_t d6 = (b1 % 100) << 1; + + const uint32_t d7 = (c1 / 100) << 1; + const uint32_t d8 = (c1 % 100) << 1; + + *buffer++ = cDigitsLut[d1]; + *buffer++ = cDigitsLut[d1 + 1]; + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + *buffer++ = cDigitsLut[d5]; + *buffer++ = cDigitsLut[d5 + 1]; + *buffer++ = cDigitsLut[d6]; + *buffer++ = cDigitsLut[d6 + 1]; + *buffer++ = cDigitsLut[d7]; + *buffer++ = cDigitsLut[d7 + 1]; + *buffer++ = cDigitsLut[d8]; + *buffer++ = cDigitsLut[d8 + 1]; + } + + return buffer; +} + +inline char* i64toa(int64_t value, char* buffer) { + if (value < 0) { + *buffer++ = '-'; + value = -value; + } + + return u64toa(static_cast<uint64_t>(value), buffer); +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_ITOA_ diff --git a/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/internal/meta.h b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/internal/meta.h new file mode 100755 index 000000000..c33f607d5 --- /dev/null +++ b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/internal/meta.h @@ -0,0 +1,189 @@ +// Copyright (C) 2011 Milo Yip +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef RAPIDJSON_INTERNAL_META_H_ +#define RAPIDJSON_INTERNAL_META_H_ + +#ifndef RAPIDJSON_RAPIDJSON_H_ +#error <rapidjson.h> not yet included. Do not include this file directly. +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif +#if defined(_MSC_VER) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(6334) +#endif + +#if RAPIDJSON_HAS_CXX11_TYPETRAITS +#include <type_traits> +#endif + +//@cond RAPIDJSON_INTERNAL +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +// Helper to wrap/convert arbitrary types to void, useful for arbitrary type matching +template <typename T> struct Void { typedef void Type; }; + +/////////////////////////////////////////////////////////////////////////////// +// BoolType, TrueType, FalseType +// +template <bool Cond> struct BoolType { + static const bool Value = Cond; + typedef BoolType Type; +}; +typedef BoolType<true> TrueType; +typedef BoolType<false> FalseType; + + +/////////////////////////////////////////////////////////////////////////////// +// SelectIf, BoolExpr, NotExpr, AndExpr, OrExpr +// + +template <bool C> struct SelectIfImpl { template <typename T1, typename T2> struct Apply { typedef T1 Type; }; }; +template <> struct SelectIfImpl<false> { template <typename T1, typename T2> struct Apply { typedef T2 Type; }; }; +template <bool C, typename T1, typename T2> struct SelectIfCond : SelectIfImpl<C>::template Apply<T1,T2> {}; +template <typename C, typename T1, typename T2> struct SelectIf : SelectIfCond<C::Value, T1, T2> {}; + +template <bool Cond1, bool Cond2> struct AndExprCond : FalseType {}; +template <> struct AndExprCond<true, true> : TrueType {}; +template <bool Cond1, bool Cond2> struct OrExprCond : TrueType {}; +template <> struct OrExprCond<false, false> : FalseType {}; + +template <typename C> struct BoolExpr : SelectIf<C,TrueType,FalseType>::Type {}; +template <typename C> struct NotExpr : SelectIf<C,FalseType,TrueType>::Type {}; +template <typename C1, typename C2> struct AndExpr : AndExprCond<C1::Value, C2::Value>::Type {}; +template <typename C1, typename C2> struct OrExpr : OrExprCond<C1::Value, C2::Value>::Type {}; + + +/////////////////////////////////////////////////////////////////////////////// +// AddConst, MaybeAddConst, RemoveConst +template <typename T> struct AddConst { typedef const T Type; }; +template <bool Constify, typename T> struct MaybeAddConst : SelectIfCond<Constify, const T, T> {}; +template <typename T> struct RemoveConst { typedef T Type; }; +template <typename T> struct RemoveConst<const T> { typedef T Type; }; + + +/////////////////////////////////////////////////////////////////////////////// +// IsSame, IsConst, IsMoreConst, IsPointer +// +template <typename T, typename U> struct IsSame : FalseType {}; +template <typename T> struct IsSame<T, T> : TrueType {}; + +template <typename T> struct IsConst : FalseType {}; +template <typename T> struct IsConst<const T> : TrueType {}; + +template <typename CT, typename T> +struct IsMoreConst + : AndExpr<IsSame<typename RemoveConst<CT>::Type, typename RemoveConst<T>::Type>, + BoolType<IsConst<CT>::Value >= IsConst<T>::Value> >::Type {}; + +template <typename T> struct IsPointer : FalseType {}; +template <typename T> struct IsPointer<T*> : TrueType {}; + +/////////////////////////////////////////////////////////////////////////////// +// IsBaseOf +// +#if RAPIDJSON_HAS_CXX11_TYPETRAITS + +template <typename B, typename D> struct IsBaseOf + : BoolType< ::std::is_base_of<B,D>::value> {}; + +#else // simplified version adopted from Boost + +template<typename B, typename D> struct IsBaseOfImpl { + RAPIDJSON_STATIC_ASSERT(sizeof(B) != 0); + RAPIDJSON_STATIC_ASSERT(sizeof(D) != 0); + + typedef char (&Yes)[1]; + typedef char (&No) [2]; + + template <typename T> + static Yes Check(const D*, T); + static No Check(const B*, int); + + struct Host { + operator const B*() const; + operator const D*(); + }; + + enum { Value = (sizeof(Check(Host(), 0)) == sizeof(Yes)) }; +}; + +template <typename B, typename D> struct IsBaseOf + : OrExpr<IsSame<B, D>, BoolExpr<IsBaseOfImpl<B, D> > >::Type {}; + +#endif // RAPIDJSON_HAS_CXX11_TYPETRAITS + + +////////////////////////////////////////////////////////////////////////// +// EnableIf / DisableIf +// +template <bool Condition, typename T = void> struct EnableIfCond { typedef T Type; }; +template <typename T> struct EnableIfCond<false, T> { /* empty */ }; + +template <bool Condition, typename T = void> struct DisableIfCond { typedef T Type; }; +template <typename T> struct DisableIfCond<true, T> { /* empty */ }; + +template <typename Condition, typename T = void> +struct EnableIf : EnableIfCond<Condition::Value, T> {}; + +template <typename Condition, typename T = void> +struct DisableIf : DisableIfCond<Condition::Value, T> {}; + +// SFINAE helpers +struct SfinaeTag {}; +template <typename T> struct RemoveSfinaeTag; +template <typename T> struct RemoveSfinaeTag<SfinaeTag&(*)(T)> { typedef T Type; }; + +#define RAPIDJSON_REMOVEFPTR_(type) \ + typename ::RAPIDJSON_NAMESPACE::internal::RemoveSfinaeTag \ + < ::RAPIDJSON_NAMESPACE::internal::SfinaeTag&(*) type>::Type + +#define RAPIDJSON_ENABLEIF(cond) \ + typename ::RAPIDJSON_NAMESPACE::internal::EnableIf \ + <RAPIDJSON_REMOVEFPTR_(cond)>::Type * = NULL + +#define RAPIDJSON_DISABLEIF(cond) \ + typename ::RAPIDJSON_NAMESPACE::internal::DisableIf \ + <RAPIDJSON_REMOVEFPTR_(cond)>::Type * = NULL + +#define RAPIDJSON_ENABLEIF_RETURN(cond,returntype) \ + typename ::RAPIDJSON_NAMESPACE::internal::EnableIf \ + <RAPIDJSON_REMOVEFPTR_(cond), \ + RAPIDJSON_REMOVEFPTR_(returntype)>::Type + +#define RAPIDJSON_DISABLEIF_RETURN(cond,returntype) \ + typename ::RAPIDJSON_NAMESPACE::internal::DisableIf \ + <RAPIDJSON_REMOVEFPTR_(cond), \ + RAPIDJSON_REMOVEFPTR_(returntype)>::Type + +} // namespace internal +RAPIDJSON_NAMESPACE_END +//@endcond + +#if defined(__GNUC__) || defined(_MSC_VER) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_INTERNAL_META_H_ diff --git a/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/internal/pow10.h b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/internal/pow10.h new file mode 100755 index 000000000..91cf6478b --- /dev/null +++ b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/internal/pow10.h @@ -0,0 +1,59 @@ +// Copyright (C) 2011 Milo Yip +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef RAPIDJSON_POW10_ +#define RAPIDJSON_POW10_ + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +//! Computes integer powers of 10 in double (10.0^n). +/*! This function uses lookup table for fast and accurate results. + \param n non-negative exponent. Must <= 308. + \return 10.0^n +*/ +inline double Pow10(int n) { + static const double e[] = { // 1e-0...1e308: 309 * 8 bytes = 2472 bytes + 1e+0, + 1e+1, 1e+2, 1e+3, 1e+4, 1e+5, 1e+6, 1e+7, 1e+8, 1e+9, 1e+10, 1e+11, 1e+12, 1e+13, 1e+14, 1e+15, 1e+16, 1e+17, 1e+18, 1e+19, 1e+20, + 1e+21, 1e+22, 1e+23, 1e+24, 1e+25, 1e+26, 1e+27, 1e+28, 1e+29, 1e+30, 1e+31, 1e+32, 1e+33, 1e+34, 1e+35, 1e+36, 1e+37, 1e+38, 1e+39, 1e+40, + 1e+41, 1e+42, 1e+43, 1e+44, 1e+45, 1e+46, 1e+47, 1e+48, 1e+49, 1e+50, 1e+51, 1e+52, 1e+53, 1e+54, 1e+55, 1e+56, 1e+57, 1e+58, 1e+59, 1e+60, + 1e+61, 1e+62, 1e+63, 1e+64, 1e+65, 1e+66, 1e+67, 1e+68, 1e+69, 1e+70, 1e+71, 1e+72, 1e+73, 1e+74, 1e+75, 1e+76, 1e+77, 1e+78, 1e+79, 1e+80, + 1e+81, 1e+82, 1e+83, 1e+84, 1e+85, 1e+86, 1e+87, 1e+88, 1e+89, 1e+90, 1e+91, 1e+92, 1e+93, 1e+94, 1e+95, 1e+96, 1e+97, 1e+98, 1e+99, 1e+100, + 1e+101,1e+102,1e+103,1e+104,1e+105,1e+106,1e+107,1e+108,1e+109,1e+110,1e+111,1e+112,1e+113,1e+114,1e+115,1e+116,1e+117,1e+118,1e+119,1e+120, + 1e+121,1e+122,1e+123,1e+124,1e+125,1e+126,1e+127,1e+128,1e+129,1e+130,1e+131,1e+132,1e+133,1e+134,1e+135,1e+136,1e+137,1e+138,1e+139,1e+140, + 1e+141,1e+142,1e+143,1e+144,1e+145,1e+146,1e+147,1e+148,1e+149,1e+150,1e+151,1e+152,1e+153,1e+154,1e+155,1e+156,1e+157,1e+158,1e+159,1e+160, + 1e+161,1e+162,1e+163,1e+164,1e+165,1e+166,1e+167,1e+168,1e+169,1e+170,1e+171,1e+172,1e+173,1e+174,1e+175,1e+176,1e+177,1e+178,1e+179,1e+180, + 1e+181,1e+182,1e+183,1e+184,1e+185,1e+186,1e+187,1e+188,1e+189,1e+190,1e+191,1e+192,1e+193,1e+194,1e+195,1e+196,1e+197,1e+198,1e+199,1e+200, + 1e+201,1e+202,1e+203,1e+204,1e+205,1e+206,1e+207,1e+208,1e+209,1e+210,1e+211,1e+212,1e+213,1e+214,1e+215,1e+216,1e+217,1e+218,1e+219,1e+220, + 1e+221,1e+222,1e+223,1e+224,1e+225,1e+226,1e+227,1e+228,1e+229,1e+230,1e+231,1e+232,1e+233,1e+234,1e+235,1e+236,1e+237,1e+238,1e+239,1e+240, + 1e+241,1e+242,1e+243,1e+244,1e+245,1e+246,1e+247,1e+248,1e+249,1e+250,1e+251,1e+252,1e+253,1e+254,1e+255,1e+256,1e+257,1e+258,1e+259,1e+260, + 1e+261,1e+262,1e+263,1e+264,1e+265,1e+266,1e+267,1e+268,1e+269,1e+270,1e+271,1e+272,1e+273,1e+274,1e+275,1e+276,1e+277,1e+278,1e+279,1e+280, + 1e+281,1e+282,1e+283,1e+284,1e+285,1e+286,1e+287,1e+288,1e+289,1e+290,1e+291,1e+292,1e+293,1e+294,1e+295,1e+296,1e+297,1e+298,1e+299,1e+300, + 1e+301,1e+302,1e+303,1e+304,1e+305,1e+306,1e+307,1e+308 + }; + RAPIDJSON_ASSERT(n >= 0 && n <= 308); + return e[n]; +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_POW10_ diff --git a/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/internal/stack.h b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/internal/stack.h new file mode 100755 index 000000000..62ae7aa80 --- /dev/null +++ b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/internal/stack.h @@ -0,0 +1,183 @@ +// Copyright (C) 2011 Milo Yip +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef RAPIDJSON_INTERNAL_STACK_H_ +#define RAPIDJSON_INTERNAL_STACK_H_ + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +/////////////////////////////////////////////////////////////////////////////// +// Stack + +//! A type-unsafe stack for storing different types of data. +/*! \tparam Allocator Allocator for allocating stack memory. +*/ +template <typename Allocator> +class Stack { +public: + // Optimization note: Do not allocate memory for stack_ in constructor. + // Do it lazily when first Push() -> Expand() -> Resize(). + Stack(Allocator* allocator, size_t stackCapacity) : allocator_(allocator), ownAllocator_(0), stack_(0), stackTop_(0), stackEnd_(0), initialCapacity_(stackCapacity) { + RAPIDJSON_ASSERT(stackCapacity > 0); + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + Stack(Stack&& rhs) + : allocator_(rhs.allocator_), + ownAllocator_(rhs.ownAllocator_), + stack_(rhs.stack_), + stackTop_(rhs.stackTop_), + stackEnd_(rhs.stackEnd_), + initialCapacity_(rhs.initialCapacity_) + { + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.stack_ = 0; + rhs.stackTop_ = 0; + rhs.stackEnd_ = 0; + rhs.initialCapacity_ = 0; + } +#endif + + ~Stack() { + Destroy(); + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + Stack& operator=(Stack&& rhs) { + if (&rhs != this) + { + Destroy(); + + allocator_ = rhs.allocator_; + ownAllocator_ = rhs.ownAllocator_; + stack_ = rhs.stack_; + stackTop_ = rhs.stackTop_; + stackEnd_ = rhs.stackEnd_; + initialCapacity_ = rhs.initialCapacity_; + + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.stack_ = 0; + rhs.stackTop_ = 0; + rhs.stackEnd_ = 0; + rhs.initialCapacity_ = 0; + } + return *this; + } +#endif + + void Clear() { stackTop_ = stack_; } + + void ShrinkToFit() { + if (Empty()) { + // If the stack is empty, completely deallocate the memory. + Allocator::Free(stack_); + stack_ = 0; + stackTop_ = 0; + stackEnd_ = 0; + } + else + Resize(GetSize()); + } + + // Optimization note: try to minimize the size of this function for force inline. + // Expansion is run very infrequently, so it is moved to another (probably non-inline) function. + template<typename T> + RAPIDJSON_FORCEINLINE T* Push(size_t count = 1) { + // Expand the stack if needed + if (stackTop_ + sizeof(T) * count >= stackEnd_) + Expand<T>(count); + + T* ret = reinterpret_cast<T*>(stackTop_); + stackTop_ += sizeof(T) * count; + return ret; + } + + template<typename T> + T* Pop(size_t count) { + RAPIDJSON_ASSERT(GetSize() >= count * sizeof(T)); + stackTop_ -= count * sizeof(T); + return reinterpret_cast<T*>(stackTop_); + } + + template<typename T> + T* Top() { + RAPIDJSON_ASSERT(GetSize() >= sizeof(T)); + return reinterpret_cast<T*>(stackTop_ - sizeof(T)); + } + + template<typename T> + T* Bottom() { return (T*)stack_; } + + Allocator& GetAllocator() { return *allocator_; } + bool Empty() const { return stackTop_ == stack_; } + size_t GetSize() const { return static_cast<size_t>(stackTop_ - stack_); } + size_t GetCapacity() const { return static_cast<size_t>(stackEnd_ - stack_); } + +private: + template<typename T> + void Expand(size_t count) { + // Only expand the capacity if the current stack exists. Otherwise just create a stack with initial capacity. + size_t newCapacity; + if (stack_ == 0) { + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator()); + newCapacity = initialCapacity_; + } else { + newCapacity = GetCapacity(); + newCapacity += (newCapacity + 1) / 2; + } + size_t newSize = GetSize() + sizeof(T) * count; + if (newCapacity < newSize) + newCapacity = newSize; + + Resize(newCapacity); + } + + void Resize(size_t newCapacity) { + const size_t size = GetSize(); // Backup the current size + stack_ = (char*)allocator_->Realloc(stack_, GetCapacity(), newCapacity); + stackTop_ = stack_ + size; + stackEnd_ = stack_ + newCapacity; + } + + void Destroy() { + Allocator::Free(stack_); + RAPIDJSON_DELETE(ownAllocator_); // Only delete if it is owned by the stack + } + + // Prohibit copy constructor & assignment operator. + Stack(const Stack&); + Stack& operator=(const Stack&); + + Allocator* allocator_; + Allocator* ownAllocator_; + char *stack_; + char *stackTop_; + char *stackEnd_; + size_t initialCapacity_; +}; + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_STACK_H_ diff --git a/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/internal/strfunc.h b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/internal/strfunc.h new file mode 100755 index 000000000..734adc36d --- /dev/null +++ b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/internal/strfunc.h @@ -0,0 +1,43 @@ +// Copyright (C) 2011 Milo Yip +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef RAPIDJSON_INTERNAL_STRFUNC_H_ +#define RAPIDJSON_INTERNAL_STRFUNC_H_ + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +//! Custom strlen() which works on different character types. +/*! \tparam Ch Character type (e.g. char, wchar_t, short) + \param s Null-terminated input string. + \return Number of characters in the string. + \note This has the same semantics as strlen(), the return value is not number of Unicode codepoints. +*/ +template <typename Ch> +inline SizeType StrLen(const Ch* s) { + const Ch* p = s; + while (*p) ++p; + return SizeType(p - s); +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_INTERNAL_STRFUNC_H_ diff --git a/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/internal/strtod.h b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/internal/strtod.h new file mode 100755 index 000000000..1fc6050ee --- /dev/null +++ b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/internal/strtod.h @@ -0,0 +1,285 @@ +// Copyright (C) 2011 Milo Yip +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef RAPIDJSON_STRTOD_ +#define RAPIDJSON_STRTOD_ + +#include "../rapidjson.h" +#include "ieee754.h" +#include "biginteger.h" +#include "diyfp.h" +#include "pow10.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +inline double FastPath(double significand, int exp) { + if (exp < -308) + return 0.0; + else if (exp >= 0) + return significand * internal::Pow10(exp); + else + return significand / internal::Pow10(-exp); +} + +inline double StrtodNormalPrecision(double d, int p) { + if (p < -308) { + // Prevent expSum < -308, making Pow10(p) = 0 + d = FastPath(d, -308); + d = FastPath(d, p + 308); + } + else + d = FastPath(d, p); + return d; +} + +template <typename T> +inline T Min3(T a, T b, T c) { + T m = a; + if (m > b) m = b; + if (m > c) m = c; + return m; +} + +inline int CheckWithinHalfULP(double b, const BigInteger& d, int dExp, bool* adjustToNegative) { + const Double db(b); + const uint64_t bInt = db.IntegerSignificand(); + const int bExp = db.IntegerExponent(); + const int hExp = bExp - 1; + + int dS_Exp2 = 0, dS_Exp5 = 0, bS_Exp2 = 0, bS_Exp5 = 0, hS_Exp2 = 0, hS_Exp5 = 0; + + // Adjust for decimal exponent + if (dExp >= 0) { + dS_Exp2 += dExp; + dS_Exp5 += dExp; + } + else { + bS_Exp2 -= dExp; + bS_Exp5 -= dExp; + hS_Exp2 -= dExp; + hS_Exp5 -= dExp; + } + + // Adjust for binary exponent + if (bExp >= 0) + bS_Exp2 += bExp; + else { + dS_Exp2 -= bExp; + hS_Exp2 -= bExp; + } + + // Adjust for half ulp exponent + if (hExp >= 0) + hS_Exp2 += hExp; + else { + dS_Exp2 -= hExp; + bS_Exp2 -= hExp; + } + + // Remove common power of two factor from all three scaled values + int common_Exp2 = Min3(dS_Exp2, bS_Exp2, hS_Exp2); + dS_Exp2 -= common_Exp2; + bS_Exp2 -= common_Exp2; + hS_Exp2 -= common_Exp2; + + BigInteger dS = d; + dS.MultiplyPow5(dS_Exp5) <<= dS_Exp2; + + BigInteger bS(bInt); + bS.MultiplyPow5(bS_Exp5) <<= bS_Exp2; + + BigInteger hS(1); + hS.MultiplyPow5(hS_Exp5) <<= hS_Exp2; + + BigInteger delta(0); + *adjustToNegative = dS.Difference(bS, &delta); + + int cmp = delta.Compare(hS); + // If delta is within 1/2 ULP, check for special case when significand is power of two. + // In this case, need to compare with 1/2h in the lower bound. + if (cmp < 0 && *adjustToNegative && // within and dS < bS + db.IsNormal() && (bInt & (bInt - 1)) == 0 && // Power of 2 + db.Uint64Value() != RAPIDJSON_UINT64_C2(0x00100000, 0x00000000)) // minimum normal number must not do this + { + delta <<= 1; + return delta.Compare(hS); + } + return cmp; +} + +inline bool StrtodFast(double d, int p, double* result) { + // Use fast path for string-to-double conversion if possible + // see http://www.exploringbinary.com/fast-path-decimal-to-floating-point-conversion/ + if (p > 22 && p < 22 + 16) { + // Fast Path Cases In Disguise + d *= internal::Pow10(p - 22); + p = 22; + } + + if (p >= -22 && p <= 22 && d <= 9007199254740991.0) { // 2^53 - 1 + *result = FastPath(d, p); + return true; + } + else + return false; +} + +// Compute an approximation and see if it is within 1/2 ULP +inline bool StrtodDiyFp(const char* decimals, size_t length, size_t decimalPosition, int exp, double* result) { + uint64_t significand = 0; + size_t i = 0; // 2^64 - 1 = 18446744073709551615, 1844674407370955161 = 0x1999999999999999 + for (; i < length; i++) { + if (significand > RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) || + (significand == RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) && decimals[i] > '5')) + break; + significand = significand * 10 + (decimals[i] - '0'); + } + + if (i < length && decimals[i] >= '5') // Rounding + significand++; + + size_t remaining = length - i; + const unsigned kUlpShift = 3; + const unsigned kUlp = 1 << kUlpShift; + int error = (remaining == 0) ? 0 : kUlp / 2; + + DiyFp v(significand, 0); + v = v.Normalize(); + error <<= -v.e; + + const int dExp = (int)decimalPosition - (int)i + exp; + + int actualExp; + DiyFp cachedPower = GetCachedPower10(dExp, &actualExp); + if (actualExp != dExp) { + static const DiyFp kPow10[] = { + DiyFp(RAPIDJSON_UINT64_C2(0xa0000000, 00000000), -60), // 10^1 + DiyFp(RAPIDJSON_UINT64_C2(0xc8000000, 00000000), -57), // 10^2 + DiyFp(RAPIDJSON_UINT64_C2(0xfa000000, 00000000), -54), // 10^3 + DiyFp(RAPIDJSON_UINT64_C2(0x9c400000, 00000000), -50), // 10^4 + DiyFp(RAPIDJSON_UINT64_C2(0xc3500000, 00000000), -47), // 10^5 + DiyFp(RAPIDJSON_UINT64_C2(0xf4240000, 00000000), -44), // 10^6 + DiyFp(RAPIDJSON_UINT64_C2(0x98968000, 00000000), -40) // 10^7 + }; + int adjustment = dExp - actualExp - 1; + RAPIDJSON_ASSERT(adjustment >= 0 && adjustment < 7); + v = v * kPow10[adjustment]; + if (length + adjustment > 19) // has more digits than decimal digits in 64-bit + error += kUlp / 2; + } + + v = v * cachedPower; + + error += kUlp + (error == 0 ? 0 : 1); + + const int oldExp = v.e; + v = v.Normalize(); + error <<= oldExp - v.e; + + const unsigned effectiveSignificandSize = Double::EffectiveSignificandSize(64 + v.e); + unsigned precisionSize = 64 - effectiveSignificandSize; + if (precisionSize + kUlpShift >= 64) { + unsigned scaleExp = (precisionSize + kUlpShift) - 63; + v.f >>= scaleExp; + v.e += scaleExp; + error = (error >> scaleExp) + 1 + kUlp; + precisionSize -= scaleExp; + } + + DiyFp rounded(v.f >> precisionSize, v.e + precisionSize); + const uint64_t precisionBits = (v.f & ((uint64_t(1) << precisionSize) - 1)) * kUlp; + const uint64_t halfWay = (uint64_t(1) << (precisionSize - 1)) * kUlp; + if (precisionBits >= halfWay + error) + rounded.f++; + + *result = rounded.ToDouble(); + + return halfWay - error >= precisionBits || precisionBits >= halfWay + error; +} + +inline double StrtodBigInteger(double approx, const char* decimals, size_t length, size_t decimalPosition, int exp) { + const BigInteger dInt(decimals, length); + const int dExp = (int)decimalPosition - (int)length + exp; + Double a(approx); + for (int i = 0; i < 10; i++) { + bool adjustToNegative; + int cmp = CheckWithinHalfULP(a.Value(), dInt, dExp, &adjustToNegative); + if (cmp < 0) + return a.Value(); // within half ULP + else if (cmp == 0) { + // Round towards even + if (a.Significand() & 1) + return adjustToNegative ? a.PreviousPositiveDouble() : a.NextPositiveDouble(); + else + return a.Value(); + } + else // adjustment + a = adjustToNegative ? a.PreviousPositiveDouble() : a.NextPositiveDouble(); + } + + // This should not happen, but in case there is really a bug, break the infinite-loop + return a.Value(); +} + +inline double StrtodFullPrecision(double d, int p, const char* decimals, size_t length, size_t decimalPosition, int exp) { + RAPIDJSON_ASSERT(d >= 0.0); + RAPIDJSON_ASSERT(length >= 1); + + double result; + if (StrtodFast(d, p, &result)) + return result; + + // Trim leading zeros + while (*decimals == '0' && length > 1) { + length--; + decimals++; + decimalPosition--; + } + + // Trim trailing zeros + while (decimals[length - 1] == '0' && length > 1) { + length--; + decimalPosition--; + exp++; + } + + // Trim right-most digits + const int kMaxDecimalDigit = 780; + if ((int)length > kMaxDecimalDigit) { + exp += (int(length) - kMaxDecimalDigit); + length = kMaxDecimalDigit; + } + + // If too small, underflow to zero + if (int(length) + exp < -324) + return 0.0; + + if (StrtodDiyFp(decimals, length, decimalPosition, exp, &result)) + return result; + + // Use approximation from StrtodDiyFp and make adjustment with BigInteger comparison + return StrtodBigInteger(result, decimals, length, decimalPosition, exp); +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_STRTOD_ diff --git a/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/memorybuffer.h b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/memorybuffer.h new file mode 100755 index 000000000..95c68a387 --- /dev/null +++ b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/memorybuffer.h @@ -0,0 +1,76 @@ +// Copyright (C) 2011 Milo Yip +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef RAPIDJSON_MEMORYBUFFER_H_ +#define RAPIDJSON_MEMORYBUFFER_H_ + +#include "rapidjson.h" +#include "internal/stack.h" + +RAPIDJSON_NAMESPACE_BEGIN + +//! Represents an in-memory output byte stream. +/*! + This class is mainly for being wrapped by EncodedOutputStream or AutoUTFOutputStream. + + It is similar to FileWriteBuffer but the destination is an in-memory buffer instead of a file. + + Differences between MemoryBuffer and StringBuffer: + 1. StringBuffer has Encoding but MemoryBuffer is only a byte buffer. + 2. StringBuffer::GetString() returns a null-terminated string. MemoryBuffer::GetBuffer() returns a buffer without terminator. + + \tparam Allocator type for allocating memory buffer. + \note implements Stream concept +*/ +template <typename Allocator = CrtAllocator> +struct GenericMemoryBuffer { + typedef char Ch; // byte + + GenericMemoryBuffer(Allocator* allocator = 0, size_t capacity = kDefaultCapacity) : stack_(allocator, capacity) {} + + void Put(Ch c) { *stack_.template Push<Ch>() = c; } + void Flush() {} + + void Clear() { stack_.Clear(); } + void ShrinkToFit() { stack_.ShrinkToFit(); } + Ch* Push(size_t count) { return stack_.template Push<Ch>(count); } + void Pop(size_t count) { stack_.template Pop<Ch>(count); } + + const Ch* GetBuffer() const { + return stack_.template Bottom<Ch>(); + } + + size_t GetSize() const { return stack_.GetSize(); } + + static const size_t kDefaultCapacity = 256; + mutable internal::Stack<Allocator> stack_; +}; + +typedef GenericMemoryBuffer<> MemoryBuffer; + +//! Implement specialized version of PutN() with memset() for better performance. +template<> +inline void PutN(MemoryBuffer& memoryBuffer, char c, size_t n) { + std::memset(memoryBuffer.stack_.Push<char>(n), c, n * sizeof(c)); +} + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_MEMORYBUFFER_H_ diff --git a/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/memorystream.h b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/memorystream.h new file mode 100755 index 000000000..f994a12fc --- /dev/null +++ b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/memorystream.h @@ -0,0 +1,67 @@ +// Copyright (C) 2011 Milo Yip +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef RAPIDJSON_MEMORYSTREAM_H_ +#define RAPIDJSON_MEMORYSTREAM_H_ + +#include "rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN + +//! Represents an in-memory input byte stream. +/*! + This class is mainly for being wrapped by EncodedInputStream or AutoUTFInputStream. + + It is similar to FileReadBuffer but the source is an in-memory buffer instead of a file. + + Differences between MemoryStream and StringStream: + 1. StringStream has encoding but MemoryStream is a byte stream. + 2. MemoryStream needs size of the source buffer and the buffer don't need to be null terminated. StringStream assume null-terminated string as source. + 3. MemoryStream supports Peek4() for encoding detection. StringStream is specified with an encoding so it should not have Peek4(). + \note implements Stream concept +*/ +struct MemoryStream { + typedef char Ch; // byte + + MemoryStream(const Ch *src, size_t size) : src_(src), begin_(src), end_(src + size), size_(size) {} + + Ch Peek() const { return (src_ == end_) ? '\0' : *src_; } + Ch Take() { return (src_ == end_) ? '\0' : *src_++; } + size_t Tell() const { return static_cast<size_t>(src_ - begin_); } + + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + + // For encoding detection only. + const Ch* Peek4() const { + return Tell() + 4 <= size_ ? src_ : 0; + } + + const Ch* src_; //!< Current read position. + const Ch* begin_; //!< Original head of the string. + const Ch* end_; //!< End of stream. + size_t size_; //!< Size of the stream. +}; + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_MEMORYBUFFER_H_ diff --git a/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/msinttypes/inttypes.h b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/msinttypes/inttypes.h new file mode 100755 index 000000000..af713c9ad --- /dev/null +++ b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/msinttypes/inttypes.h @@ -0,0 +1,312 @@ +// ISO C9x compliant inttypes.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 +// +// Copyright (c) 2006-2013 Alexander Chemeris +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the product nor the names of its contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_INTTYPES_H_ // [ +#define _MSC_INTTYPES_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +#include "stdint.h" + +// miloyip: VC supports inttypes.h since VC2013 +#if _MSC_VER >= 1800 +#include <inttypes.h> +#else + +// 7.8 Format conversion of integer types + +typedef struct { + intmax_t quot; + intmax_t rem; +} imaxdiv_t; + +// 7.8.1 Macros for format specifiers + +#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [ See footnote 185 at page 198 + +// The fprintf macros for signed integers are: +#define PRId8 "d" +#define PRIi8 "i" +#define PRIdLEAST8 "d" +#define PRIiLEAST8 "i" +#define PRIdFAST8 "d" +#define PRIiFAST8 "i" + +#define PRId16 "hd" +#define PRIi16 "hi" +#define PRIdLEAST16 "hd" +#define PRIiLEAST16 "hi" +#define PRIdFAST16 "hd" +#define PRIiFAST16 "hi" + +#define PRId32 "I32d" +#define PRIi32 "I32i" +#define PRIdLEAST32 "I32d" +#define PRIiLEAST32 "I32i" +#define PRIdFAST32 "I32d" +#define PRIiFAST32 "I32i" + +#define PRId64 "I64d" +#define PRIi64 "I64i" +#define PRIdLEAST64 "I64d" +#define PRIiLEAST64 "I64i" +#define PRIdFAST64 "I64d" +#define PRIiFAST64 "I64i" + +#define PRIdMAX "I64d" +#define PRIiMAX "I64i" + +#define PRIdPTR "Id" +#define PRIiPTR "Ii" + +// The fprintf macros for unsigned integers are: +#define PRIo8 "o" +#define PRIu8 "u" +#define PRIx8 "x" +#define PRIX8 "X" +#define PRIoLEAST8 "o" +#define PRIuLEAST8 "u" +#define PRIxLEAST8 "x" +#define PRIXLEAST8 "X" +#define PRIoFAST8 "o" +#define PRIuFAST8 "u" +#define PRIxFAST8 "x" +#define PRIXFAST8 "X" + +#define PRIo16 "ho" +#define PRIu16 "hu" +#define PRIx16 "hx" +#define PRIX16 "hX" +#define PRIoLEAST16 "ho" +#define PRIuLEAST16 "hu" +#define PRIxLEAST16 "hx" +#define PRIXLEAST16 "hX" +#define PRIoFAST16 "ho" +#define PRIuFAST16 "hu" +#define PRIxFAST16 "hx" +#define PRIXFAST16 "hX" + +#define PRIo32 "I32o" +#define PRIu32 "I32u" +#define PRIx32 "I32x" +#define PRIX32 "I32X" +#define PRIoLEAST32 "I32o" +#define PRIuLEAST32 "I32u" +#define PRIxLEAST32 "I32x" +#define PRIXLEAST32 "I32X" +#define PRIoFAST32 "I32o" +#define PRIuFAST32 "I32u" +#define PRIxFAST32 "I32x" +#define PRIXFAST32 "I32X" + +#define PRIo64 "I64o" +#define PRIu64 "I64u" +#define PRIx64 "I64x" +#define PRIX64 "I64X" +#define PRIoLEAST64 "I64o" +#define PRIuLEAST64 "I64u" +#define PRIxLEAST64 "I64x" +#define PRIXLEAST64 "I64X" +#define PRIoFAST64 "I64o" +#define PRIuFAST64 "I64u" +#define PRIxFAST64 "I64x" +#define PRIXFAST64 "I64X" + +#define PRIoMAX "I64o" +#define PRIuMAX "I64u" +#define PRIxMAX "I64x" +#define PRIXMAX "I64X" + +#define PRIoPTR "Io" +#define PRIuPTR "Iu" +#define PRIxPTR "Ix" +#define PRIXPTR "IX" + +// The fscanf macros for signed integers are: +#define SCNd8 "d" +#define SCNi8 "i" +#define SCNdLEAST8 "d" +#define SCNiLEAST8 "i" +#define SCNdFAST8 "d" +#define SCNiFAST8 "i" + +#define SCNd16 "hd" +#define SCNi16 "hi" +#define SCNdLEAST16 "hd" +#define SCNiLEAST16 "hi" +#define SCNdFAST16 "hd" +#define SCNiFAST16 "hi" + +#define SCNd32 "ld" +#define SCNi32 "li" +#define SCNdLEAST32 "ld" +#define SCNiLEAST32 "li" +#define SCNdFAST32 "ld" +#define SCNiFAST32 "li" + +#define SCNd64 "I64d" +#define SCNi64 "I64i" +#define SCNdLEAST64 "I64d" +#define SCNiLEAST64 "I64i" +#define SCNdFAST64 "I64d" +#define SCNiFAST64 "I64i" + +#define SCNdMAX "I64d" +#define SCNiMAX "I64i" + +#ifdef _WIN64 // [ +# define SCNdPTR "I64d" +# define SCNiPTR "I64i" +#else // _WIN64 ][ +# define SCNdPTR "ld" +# define SCNiPTR "li" +#endif // _WIN64 ] + +// The fscanf macros for unsigned integers are: +#define SCNo8 "o" +#define SCNu8 "u" +#define SCNx8 "x" +#define SCNX8 "X" +#define SCNoLEAST8 "o" +#define SCNuLEAST8 "u" +#define SCNxLEAST8 "x" +#define SCNXLEAST8 "X" +#define SCNoFAST8 "o" +#define SCNuFAST8 "u" +#define SCNxFAST8 "x" +#define SCNXFAST8 "X" + +#define SCNo16 "ho" +#define SCNu16 "hu" +#define SCNx16 "hx" +#define SCNX16 "hX" +#define SCNoLEAST16 "ho" +#define SCNuLEAST16 "hu" +#define SCNxLEAST16 "hx" +#define SCNXLEAST16 "hX" +#define SCNoFAST16 "ho" +#define SCNuFAST16 "hu" +#define SCNxFAST16 "hx" +#define SCNXFAST16 "hX" + +#define SCNo32 "lo" +#define SCNu32 "lu" +#define SCNx32 "lx" +#define SCNX32 "lX" +#define SCNoLEAST32 "lo" +#define SCNuLEAST32 "lu" +#define SCNxLEAST32 "lx" +#define SCNXLEAST32 "lX" +#define SCNoFAST32 "lo" +#define SCNuFAST32 "lu" +#define SCNxFAST32 "lx" +#define SCNXFAST32 "lX" + +#define SCNo64 "I64o" +#define SCNu64 "I64u" +#define SCNx64 "I64x" +#define SCNX64 "I64X" +#define SCNoLEAST64 "I64o" +#define SCNuLEAST64 "I64u" +#define SCNxLEAST64 "I64x" +#define SCNXLEAST64 "I64X" +#define SCNoFAST64 "I64o" +#define SCNuFAST64 "I64u" +#define SCNxFAST64 "I64x" +#define SCNXFAST64 "I64X" + +#define SCNoMAX "I64o" +#define SCNuMAX "I64u" +#define SCNxMAX "I64x" +#define SCNXMAX "I64X" + +#ifdef _WIN64 // [ +# define SCNoPTR "I64o" +# define SCNuPTR "I64u" +# define SCNxPTR "I64x" +# define SCNXPTR "I64X" +#else // _WIN64 ][ +# define SCNoPTR "lo" +# define SCNuPTR "lu" +# define SCNxPTR "lx" +# define SCNXPTR "lX" +#endif // _WIN64 ] + +#endif // __STDC_FORMAT_MACROS ] + +// 7.8.2 Functions for greatest-width integer types + +// 7.8.2.1 The imaxabs function +#define imaxabs _abs64 + +// 7.8.2.2 The imaxdiv function + +// This is modified version of div() function from Microsoft's div.c found +// in %MSVC.NET%\crt\src\div.c +#ifdef STATIC_IMAXDIV // [ +static +#else // STATIC_IMAXDIV ][ +_inline +#endif // STATIC_IMAXDIV ] +imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom) +{ + imaxdiv_t result; + + result.quot = numer / denom; + result.rem = numer % denom; + + if (numer < 0 && result.rem > 0) { + // did division wrong; must fix up + ++result.quot; + result.rem -= denom; + } + + return result; +} + +// 7.8.2.3 The strtoimax and strtoumax functions +#define strtoimax _strtoi64 +#define strtoumax _strtoui64 + +// 7.8.2.4 The wcstoimax and wcstoumax functions +#define wcstoimax _wcstoi64 +#define wcstoumax _wcstoui64 + +#endif // _MSC_VER >= 1800 + +#endif // _MSC_INTTYPES_H_ ] diff --git a/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/msinttypes/stdint.h b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/msinttypes/stdint.h new file mode 100755 index 000000000..bbad95af1 --- /dev/null +++ b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/msinttypes/stdint.h @@ -0,0 +1,296 @@ +// ISO C9x compliant stdint.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 +// +// Copyright (c) 2006-2013 Alexander Chemeris +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the product nor the names of its contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_STDINT_H_ // [ +#define _MSC_STDINT_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +// miloyip: Originally Visual Studio 2010 uses its own stdint.h. However it generates warning with INT64_C(), so change to use this file for vs2010. +#if _MSC_VER >= 1600 // [ +#include <stdint.h> + +#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 + +#undef INT8_C +#undef INT16_C +#undef INT32_C +#undef INT64_C +#undef UINT8_C +#undef UINT16_C +#undef UINT32_C +#undef UINT64_C + +// 7.18.4.1 Macros for minimum-width integer constants + +#define INT8_C(val) val##i8 +#define INT16_C(val) val##i16 +#define INT32_C(val) val##i32 +#define INT64_C(val) val##i64 + +#define UINT8_C(val) val##ui8 +#define UINT16_C(val) val##ui16 +#define UINT32_C(val) val##ui32 +#define UINT64_C(val) val##ui64 + +// 7.18.4.2 Macros for greatest-width integer constants +// These #ifndef's are needed to prevent collisions with <boost/cstdint.hpp>. +// Check out Issue 9 for the details. +#ifndef INTMAX_C // [ +# define INTMAX_C INT64_C +#endif // INTMAX_C ] +#ifndef UINTMAX_C // [ +# define UINTMAX_C UINT64_C +#endif // UINTMAX_C ] + +#endif // __STDC_CONSTANT_MACROS ] + +#else // ] _MSC_VER >= 1700 [ + +#include <limits.h> + +// For Visual Studio 6 in C++ mode and for many Visual Studio versions when +// compiling for ARM we should wrap <wchar.h> include with 'extern "C++" {}' +// or compiler give many errors like this: +// error C2733: second C linkage of overloaded function 'wmemchr' not allowed +#ifdef __cplusplus +extern "C" { +#endif +# include <wchar.h> +#ifdef __cplusplus +} +#endif + +// Define _W64 macros to mark types changing their size, like intptr_t. +#ifndef _W64 +# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 +# define _W64 __w64 +# else +# define _W64 +# endif +#endif + + +// 7.18.1 Integer types + +// 7.18.1.1 Exact-width integer types + +// Visual Studio 6 and Embedded Visual C++ 4 doesn't +// realize that, e.g. char has the same size as __int8 +// so we give up on __intX for them. +#if (_MSC_VER < 1300) + typedef signed char int8_t; + typedef signed short int16_t; + typedef signed int int32_t; + typedef unsigned char uint8_t; + typedef unsigned short uint16_t; + typedef unsigned int uint32_t; +#else + typedef signed __int8 int8_t; + typedef signed __int16 int16_t; + typedef signed __int32 int32_t; + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; +#endif +typedef signed __int64 int64_t; +typedef unsigned __int64 uint64_t; + + +// 7.18.1.2 Minimum-width integer types +typedef int8_t int_least8_t; +typedef int16_t int_least16_t; +typedef int32_t int_least32_t; +typedef int64_t int_least64_t; +typedef uint8_t uint_least8_t; +typedef uint16_t uint_least16_t; +typedef uint32_t uint_least32_t; +typedef uint64_t uint_least64_t; + +// 7.18.1.3 Fastest minimum-width integer types +typedef int8_t int_fast8_t; +typedef int16_t int_fast16_t; +typedef int32_t int_fast32_t; +typedef int64_t int_fast64_t; +typedef uint8_t uint_fast8_t; +typedef uint16_t uint_fast16_t; +typedef uint32_t uint_fast32_t; +typedef uint64_t uint_fast64_t; + +// 7.18.1.4 Integer types capable of holding object pointers +#ifdef _WIN64 // [ + typedef signed __int64 intptr_t; + typedef unsigned __int64 uintptr_t; +#else // _WIN64 ][ + typedef _W64 signed int intptr_t; + typedef _W64 unsigned int uintptr_t; +#endif // _WIN64 ] + +// 7.18.1.5 Greatest-width integer types +typedef int64_t intmax_t; +typedef uint64_t uintmax_t; + + +// 7.18.2 Limits of specified-width integer types + +#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 + +// 7.18.2.1 Limits of exact-width integer types +#define INT8_MIN ((int8_t)_I8_MIN) +#define INT8_MAX _I8_MAX +#define INT16_MIN ((int16_t)_I16_MIN) +#define INT16_MAX _I16_MAX +#define INT32_MIN ((int32_t)_I32_MIN) +#define INT32_MAX _I32_MAX +#define INT64_MIN ((int64_t)_I64_MIN) +#define INT64_MAX _I64_MAX +#define UINT8_MAX _UI8_MAX +#define UINT16_MAX _UI16_MAX +#define UINT32_MAX _UI32_MAX +#define UINT64_MAX _UI64_MAX + +// 7.18.2.2 Limits of minimum-width integer types +#define INT_LEAST8_MIN INT8_MIN +#define INT_LEAST8_MAX INT8_MAX +#define INT_LEAST16_MIN INT16_MIN +#define INT_LEAST16_MAX INT16_MAX +#define INT_LEAST32_MIN INT32_MIN +#define INT_LEAST32_MAX INT32_MAX +#define INT_LEAST64_MIN INT64_MIN +#define INT_LEAST64_MAX INT64_MAX +#define UINT_LEAST8_MAX UINT8_MAX +#define UINT_LEAST16_MAX UINT16_MAX +#define UINT_LEAST32_MAX UINT32_MAX +#define UINT_LEAST64_MAX UINT64_MAX + +// 7.18.2.3 Limits of fastest minimum-width integer types +#define INT_FAST8_MIN INT8_MIN +#define INT_FAST8_MAX INT8_MAX +#define INT_FAST16_MIN INT16_MIN +#define INT_FAST16_MAX INT16_MAX +#define INT_FAST32_MIN INT32_MIN +#define INT_FAST32_MAX INT32_MAX +#define INT_FAST64_MIN INT64_MIN +#define INT_FAST64_MAX INT64_MAX +#define UINT_FAST8_MAX UINT8_MAX +#define UINT_FAST16_MAX UINT16_MAX +#define UINT_FAST32_MAX UINT32_MAX +#define UINT_FAST64_MAX UINT64_MAX + +// 7.18.2.4 Limits of integer types capable of holding object pointers +#ifdef _WIN64 // [ +# define INTPTR_MIN INT64_MIN +# define INTPTR_MAX INT64_MAX +# define UINTPTR_MAX UINT64_MAX +#else // _WIN64 ][ +# define INTPTR_MIN INT32_MIN +# define INTPTR_MAX INT32_MAX +# define UINTPTR_MAX UINT32_MAX +#endif // _WIN64 ] + +// 7.18.2.5 Limits of greatest-width integer types +#define INTMAX_MIN INT64_MIN +#define INTMAX_MAX INT64_MAX +#define UINTMAX_MAX UINT64_MAX + +// 7.18.3 Limits of other integer types + +#ifdef _WIN64 // [ +# define PTRDIFF_MIN _I64_MIN +# define PTRDIFF_MAX _I64_MAX +#else // _WIN64 ][ +# define PTRDIFF_MIN _I32_MIN +# define PTRDIFF_MAX _I32_MAX +#endif // _WIN64 ] + +#define SIG_ATOMIC_MIN INT_MIN +#define SIG_ATOMIC_MAX INT_MAX + +#ifndef SIZE_MAX // [ +# ifdef _WIN64 // [ +# define SIZE_MAX _UI64_MAX +# else // _WIN64 ][ +# define SIZE_MAX _UI32_MAX +# endif // _WIN64 ] +#endif // SIZE_MAX ] + +// WCHAR_MIN and WCHAR_MAX are also defined in <wchar.h> +#ifndef WCHAR_MIN // [ +# define WCHAR_MIN 0 +#endif // WCHAR_MIN ] +#ifndef WCHAR_MAX // [ +# define WCHAR_MAX _UI16_MAX +#endif // WCHAR_MAX ] + +#define WINT_MIN 0 +#define WINT_MAX _UI16_MAX + +#endif // __STDC_LIMIT_MACROS ] + + +// 7.18.4 Limits of other integer types + +#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 + +// 7.18.4.1 Macros for minimum-width integer constants + +#define INT8_C(val) val##i8 +#define INT16_C(val) val##i16 +#define INT32_C(val) val##i32 +#define INT64_C(val) val##i64 + +#define UINT8_C(val) val##ui8 +#define UINT16_C(val) val##ui16 +#define UINT32_C(val) val##ui32 +#define UINT64_C(val) val##ui64 + +// 7.18.4.2 Macros for greatest-width integer constants +// These #ifndef's are needed to prevent collisions with <boost/cstdint.hpp>. +// Check out Issue 9 for the details. +#ifndef INTMAX_C // [ +# define INTMAX_C INT64_C +#endif // INTMAX_C ] +#ifndef UINTMAX_C // [ +# define UINTMAX_C UINT64_C +#endif // UINTMAX_C ] + +#endif // __STDC_CONSTANT_MACROS ] + +#endif // _MSC_VER >= 1600 ] + +#endif // _MSC_STDINT_H_ ] diff --git a/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/prettywriter.h b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/prettywriter.h new file mode 100755 index 000000000..ce2dac5a1 --- /dev/null +++ b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/prettywriter.h @@ -0,0 +1,205 @@ +// Copyright (C) 2011 Milo Yip +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef RAPIDJSON_PRETTYWRITER_H_ +#define RAPIDJSON_PRETTYWRITER_H_ + +#include "writer.h" + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Writer with indentation and spacing. +/*! + \tparam OutputStream Type of ouptut os. + \tparam SourceEncoding Encoding of source string. + \tparam TargetEncoding Encoding of output stream. + \tparam StackAllocator Type of allocator for allocating memory of stack. +*/ +template<typename OutputStream, typename SourceEncoding = UTF8<>, typename TargetEncoding = UTF8<>, typename StackAllocator = CrtAllocator> +class PrettyWriter : public Writer<OutputStream, SourceEncoding, TargetEncoding, StackAllocator> { +public: + typedef Writer<OutputStream, SourceEncoding, TargetEncoding, StackAllocator> Base; + typedef typename Base::Ch Ch; + + //! Constructor + /*! \param os Output stream. + \param allocator User supplied allocator. If it is null, it will create a private one. + \param levelDepth Initial capacity of stack. + */ + PrettyWriter(OutputStream& os, StackAllocator* allocator = 0, size_t levelDepth = Base::kDefaultLevelDepth) : + Base(os, allocator, levelDepth), indentChar_(' '), indentCharCount_(4) {} + + //! Set custom indentation. + /*! \param indentChar Character for indentation. Must be whitespace character (' ', '\\t', '\\n', '\\r'). + \param indentCharCount Number of indent characters for each indentation level. + \note The default indentation is 4 spaces. + */ + PrettyWriter& SetIndent(Ch indentChar, unsigned indentCharCount) { + RAPIDJSON_ASSERT(indentChar == ' ' || indentChar == '\t' || indentChar == '\n' || indentChar == '\r'); + indentChar_ = indentChar; + indentCharCount_ = indentCharCount; + return *this; + } + + /*! @name Implementation of Handler + \see Handler + */ + //@{ + + bool Null() { PrettyPrefix(kNullType); return Base::WriteNull(); } + bool Bool(bool b) { PrettyPrefix(b ? kTrueType : kFalseType); return Base::WriteBool(b); } + bool Int(int i) { PrettyPrefix(kNumberType); return Base::WriteInt(i); } + bool Uint(unsigned u) { PrettyPrefix(kNumberType); return Base::WriteUint(u); } + bool Int64(int64_t i64) { PrettyPrefix(kNumberType); return Base::WriteInt64(i64); } + bool Uint64(uint64_t u64) { PrettyPrefix(kNumberType); return Base::WriteUint64(u64); } + bool Double(double d) { PrettyPrefix(kNumberType); return Base::WriteDouble(d); } + + bool String(const Ch* str, SizeType length, bool copy = false) { + (void)copy; + PrettyPrefix(kStringType); + return Base::WriteString(str, length); + } + + bool StartObject() { + PrettyPrefix(kObjectType); + new (Base::level_stack_.template Push<typename Base::Level>()) typename Base::Level(false); + return Base::WriteStartObject(); + } + + bool Key(const Ch* str, SizeType length, bool copy = false) { return String(str, length, copy); } + + bool EndObject(SizeType memberCount = 0) { + (void)memberCount; + RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level)); + RAPIDJSON_ASSERT(!Base::level_stack_.template Top<typename Base::Level>()->inArray); + bool empty = Base::level_stack_.template Pop<typename Base::Level>(1)->valueCount == 0; + + if (!empty) { + Base::os_->Put('\n'); + WriteIndent(); + } + if (!Base::WriteEndObject()) + return false; + if (Base::level_stack_.Empty()) // end of json text + Base::os_->Flush(); + return true; + } + + bool StartArray() { + PrettyPrefix(kArrayType); + new (Base::level_stack_.template Push<typename Base::Level>()) typename Base::Level(true); + return Base::WriteStartArray(); + } + + bool EndArray(SizeType memberCount = 0) { + (void)memberCount; + RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level)); + RAPIDJSON_ASSERT(Base::level_stack_.template Top<typename Base::Level>()->inArray); + bool empty = Base::level_stack_.template Pop<typename Base::Level>(1)->valueCount == 0; + + if (!empty) { + Base::os_->Put('\n'); + WriteIndent(); + } + if (!Base::WriteEndArray()) + return false; + if (Base::level_stack_.Empty()) // end of json text + Base::os_->Flush(); + return true; + } + + //@} + + /*! @name Convenience extensions */ + //@{ + + //! Simpler but slower overload. + bool String(const Ch* str) { return String(str, internal::StrLen(str)); } + bool Key(const Ch* str) { return Key(str, internal::StrLen(str)); } + + //@} +protected: + void PrettyPrefix(Type type) { + (void)type; + if (Base::level_stack_.GetSize() != 0) { // this value is not at root + typename Base::Level* level = Base::level_stack_.template Top<typename Base::Level>(); + + if (level->inArray) { + if (level->valueCount > 0) { + Base::os_->Put(','); // add comma if it is not the first element in array + Base::os_->Put('\n'); + } + else + Base::os_->Put('\n'); + WriteIndent(); + } + else { // in object + if (level->valueCount > 0) { + if (level->valueCount % 2 == 0) { + Base::os_->Put(','); + Base::os_->Put('\n'); + } + else { + Base::os_->Put(':'); + Base::os_->Put(' '); + } + } + else + Base::os_->Put('\n'); + + if (level->valueCount % 2 == 0) + WriteIndent(); + } + if (!level->inArray && level->valueCount % 2 == 0) + RAPIDJSON_ASSERT(type == kStringType); // if it's in object, then even number should be a name + level->valueCount++; + } + else { + RAPIDJSON_ASSERT(!Base::hasRoot_); // Should only has one and only one root. + Base::hasRoot_ = true; + } + } + + void WriteIndent() { + size_t count = (Base::level_stack_.GetSize() / sizeof(typename Base::Level)) * indentCharCount_; + PutN(*Base::os_, indentChar_, count); + } + + Ch indentChar_; + unsigned indentCharCount_; + +private: + // Prohibit copy constructor & assignment operator. + PrettyWriter(const PrettyWriter&); + PrettyWriter& operator=(const PrettyWriter&); +}; + +RAPIDJSON_NAMESPACE_END + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_RAPIDJSON_H_ diff --git a/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/rapidjson.h b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/rapidjson.h new file mode 100755 index 000000000..e9bfdba28 --- /dev/null +++ b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/rapidjson.h @@ -0,0 +1,628 @@ +// Copyright (C) 2011 Milo Yip +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef RAPIDJSON_RAPIDJSON_H_ +#define RAPIDJSON_RAPIDJSON_H_ + +// Copyright (c) 2011 Milo Yip (miloyip@gmail.com) +// Version 0.1 + +/*!\file rapidjson.h + \brief common definitions and configuration + + \see RAPIDJSON_CONFIG + */ + +/*! \defgroup RAPIDJSON_CONFIG RapidJSON configuration + \brief Configuration macros for library features + + Some RapidJSON features are configurable to adapt the library to a wide + variety of platforms, environments and usage scenarios. Most of the + features can be configured in terms of overriden or predefined + preprocessor macros at compile-time. + + Some additional customization is available in the \ref RAPIDJSON_ERRORS APIs. + + \note These macros should be given on the compiler command-line + (where applicable) to avoid inconsistent values when compiling + different translation units of a single application. + */ + +#include <cstdlib> // malloc(), realloc(), free(), size_t +#include <cstring> // memset(), memcpy(), memmove(), memcmp() + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_NAMESPACE_(BEGIN|END) +/*! \def RAPIDJSON_NAMESPACE + \ingroup RAPIDJSON_CONFIG + \brief provide custom rapidjson namespace + + In order to avoid symbol clashes and/or "One Definition Rule" errors + between multiple inclusions of (different versions of) RapidJSON in + a single binary, users can customize the name of the main RapidJSON + namespace. + + In case of a single nesting level, defining \c RAPIDJSON_NAMESPACE + to a custom name (e.g. \c MyRapidJSON) is sufficient. If multiple + levels are needed, both \ref RAPIDJSON_NAMESPACE_BEGIN and \ref + RAPIDJSON_NAMESPACE_END need to be defined as well: + + \code + // in some .cpp file + #define RAPIDJSON_NAMESPACE my::rapidjson + #define RAPIDJSON_NAMESPACE_BEGIN namespace my { namespace rapidjson { + #define RAPIDJSON_NAMESPACE_END } } + #include "rapidjson/..." + \endcode + + \see rapidjson + */ +/*! \def RAPIDJSON_NAMESPACE_BEGIN + \ingroup RAPIDJSON_CONFIG + \brief provide custom rapidjson namespace (opening expression) + \see RAPIDJSON_NAMESPACE +*/ +/*! \def RAPIDJSON_NAMESPACE_END + \ingroup RAPIDJSON_CONFIG + \brief provide custom rapidjson namespace (closing expression) + \see RAPIDJSON_NAMESPACE +*/ +#ifndef RAPIDJSON_NAMESPACE +#define RAPIDJSON_NAMESPACE rapidjson +#endif +#ifndef RAPIDJSON_NAMESPACE_BEGIN +#define RAPIDJSON_NAMESPACE_BEGIN namespace RAPIDJSON_NAMESPACE { +#endif +#ifndef RAPIDJSON_NAMESPACE_END +#define RAPIDJSON_NAMESPACE_END } +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_NO_INT64DEFINE + +/*! \def RAPIDJSON_NO_INT64DEFINE + \ingroup RAPIDJSON_CONFIG + \brief Use external 64-bit integer types. + + RapidJSON requires the 64-bit integer types \c int64_t and \c uint64_t types + to be available at global scope. + + If users have their own definition, define RAPIDJSON_NO_INT64DEFINE to + prevent RapidJSON from defining its own types. +*/ +#ifndef RAPIDJSON_NO_INT64DEFINE +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#ifdef _MSC_VER +#include "msinttypes/stdint.h" +#include "msinttypes/inttypes.h" +#else +// Other compilers should have this. +#include <stdint.h> +#include <inttypes.h> +#endif +//!@endcond +#ifdef RAPIDJSON_DOXYGEN_RUNNING +#define RAPIDJSON_NO_INT64DEFINE +#endif +#endif // RAPIDJSON_NO_INT64TYPEDEF + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_FORCEINLINE + +#ifndef RAPIDJSON_FORCEINLINE +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#ifdef _MSC_VER +#define RAPIDJSON_FORCEINLINE __forceinline +#elif defined(__GNUC__) && __GNUC__ >= 4 +#define RAPIDJSON_FORCEINLINE __attribute__((always_inline)) +#else +#define RAPIDJSON_FORCEINLINE +#endif +//!@endcond +#endif // RAPIDJSON_FORCEINLINE + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ENDIAN +#define RAPIDJSON_LITTLEENDIAN 0 //!< Little endian machine +#define RAPIDJSON_BIGENDIAN 1 //!< Big endian machine + +//! Endianness of the machine. +/*! + \def RAPIDJSON_ENDIAN + \ingroup RAPIDJSON_CONFIG + + GCC 4.6 provided macro for detecting endianness of the target machine. But other + compilers may not have this. User can define RAPIDJSON_ENDIAN to either + \ref RAPIDJSON_LITTLEENDIAN or \ref RAPIDJSON_BIGENDIAN. + + Default detection implemented with reference to + \li https://gcc.gnu.org/onlinedocs/gcc-4.6.0/cpp/Common-Predefined-Macros.html + \li http://www.boost.org/doc/libs/1_42_0/boost/detail/endian.hpp +*/ +#ifndef RAPIDJSON_ENDIAN +// Detect with GCC 4.6's macro +# ifdef __BYTE_ORDER__ +# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ +# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN +# else +# error Unknown machine endianess detected. User needs to define RAPIDJSON_ENDIAN. +# endif // __BYTE_ORDER__ +// Detect with GLIBC's endian.h +# elif defined(__GLIBC__) +# include <endian.h> +# if (__BYTE_ORDER == __LITTLE_ENDIAN) +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif (__BYTE_ORDER == __BIG_ENDIAN) +# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN +# else +# error Unknown machine endianess detected. User needs to define RAPIDJSON_ENDIAN. +# endif // __GLIBC__ +// Detect with _LITTLE_ENDIAN and _BIG_ENDIAN macro +# elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN) +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN) +# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN +// Detect with architecture macros +# elif defined(__sparc) || defined(__sparc__) || defined(_POWER) || defined(__powerpc__) || defined(__ppc__) || defined(__hpux) || defined(__hppa) || defined(_MIPSEB) || defined(_POWER) || defined(__s390__) +# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN +# elif defined(__i386__) || defined(__alpha__) || defined(__ia64) || defined(__ia64__) || defined(_M_IX86) || defined(_M_IA64) || defined(_M_ALPHA) || defined(__amd64) || defined(__amd64__) || defined(_M_AMD64) || defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || defined(__bfin__) +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif defined(RAPIDJSON_DOXYGEN_RUNNING) +# define RAPIDJSON_ENDIAN +# else +# error Unknown machine endianess detected. User needs to define RAPIDJSON_ENDIAN. +# endif +#endif // RAPIDJSON_ENDIAN + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_64BIT + +//! Whether using 64-bit architecture +#ifndef RAPIDJSON_64BIT +#if defined(__LP64__) || defined(_WIN64) +#define RAPIDJSON_64BIT 1 +#else +#define RAPIDJSON_64BIT 0 +#endif +#endif // RAPIDJSON_64BIT + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ALIGN + +//! Data alignment of the machine. +/*! \ingroup RAPIDJSON_CONFIG + \param x pointer to align + + Some machines require strict data alignment. Currently the default uses 4 bytes + alignment. User can customize by defining the RAPIDJSON_ALIGN function macro., +*/ +#ifndef RAPIDJSON_ALIGN +#define RAPIDJSON_ALIGN(x) ((x + 3u) & ~3u) +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_UINT64_C2 + +//! Construct a 64-bit literal by a pair of 32-bit integer. +/*! + 64-bit literal with or without ULL suffix is prone to compiler warnings. + UINT64_C() is C macro which cause compilation problems. + Use this macro to define 64-bit constants by a pair of 32-bit integer. +*/ +#ifndef RAPIDJSON_UINT64_C2 +#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32)) +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_SSE2/RAPIDJSON_SSE42/RAPIDJSON_SIMD + +/*! \def RAPIDJSON_SIMD + \ingroup RAPIDJSON_CONFIG + \brief Enable SSE2/SSE4.2 optimization. + + RapidJSON supports optimized implementations for some parsing operations + based on the SSE2 or SSE4.2 SIMD extensions on modern Intel-compatible + processors. + + To enable these optimizations, two different symbols can be defined; + \code + // Enable SSE2 optimization. + #define RAPIDJSON_SSE2 + + // Enable SSE4.2 optimization. + #define RAPIDJSON_SSE42 + \endcode + + \c RAPIDJSON_SSE42 takes precedence, if both are defined. + + If any of these symbols is defined, RapidJSON defines the macro + \c RAPIDJSON_SIMD to indicate the availability of the optimized code. +*/ +#if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) \ + || defined(RAPIDJSON_DOXYGEN_RUNNING) +#define RAPIDJSON_SIMD +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_NO_SIZETYPEDEFINE + +#ifndef RAPIDJSON_NO_SIZETYPEDEFINE +/*! \def RAPIDJSON_NO_SIZETYPEDEFINE + \ingroup RAPIDJSON_CONFIG + \brief User-provided \c SizeType definition. + + In order to avoid using 32-bit size types for indexing strings and arrays, + define this preprocessor symbol and provide the type rapidjson::SizeType + before including RapidJSON: + \code + #define RAPIDJSON_NO_SIZETYPEDEFINE + namespace rapidjson { typedef ::std::size_t SizeType; } + #include "rapidjson/..." + \endcode + + \see rapidjson::SizeType +*/ +#ifdef RAPIDJSON_DOXYGEN_RUNNING +#define RAPIDJSON_NO_SIZETYPEDEFINE +#endif +RAPIDJSON_NAMESPACE_BEGIN +//! Size type (for string lengths, array sizes, etc.) +/*! RapidJSON uses 32-bit array/string indices even on 64-bit platforms, + instead of using \c size_t. Users may override the SizeType by defining + \ref RAPIDJSON_NO_SIZETYPEDEFINE. +*/ +typedef unsigned SizeType; +RAPIDJSON_NAMESPACE_END +#endif + +// always import std::size_t to rapidjson namespace +RAPIDJSON_NAMESPACE_BEGIN +using std::size_t; +RAPIDJSON_NAMESPACE_END + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ASSERT + +//! Assertion. +/*! \ingroup RAPIDJSON_CONFIG + By default, rapidjson uses C \c assert() for internal assertions. + User can override it by defining RAPIDJSON_ASSERT(x) macro. + + \note Parsing errors are handled and can be customized by the + \ref RAPIDJSON_ERRORS APIs. +*/ +#ifndef RAPIDJSON_ASSERT +#include <cassert> +#define RAPIDJSON_ASSERT(x) assert(x) +#endif // RAPIDJSON_ASSERT + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_STATIC_ASSERT + +// Adopt from boost +#ifndef RAPIDJSON_STATIC_ASSERT +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +RAPIDJSON_NAMESPACE_BEGIN +template <bool x> struct STATIC_ASSERTION_FAILURE; +template <> struct STATIC_ASSERTION_FAILURE<true> { enum { value = 1 }; }; +template<int x> struct StaticAssertTest {}; +RAPIDJSON_NAMESPACE_END + +#define RAPIDJSON_JOIN(X, Y) RAPIDJSON_DO_JOIN(X, Y) +#define RAPIDJSON_DO_JOIN(X, Y) RAPIDJSON_DO_JOIN2(X, Y) +#define RAPIDJSON_DO_JOIN2(X, Y) X##Y + +#if defined(__GNUC__) +#define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE __attribute__((unused)) +#else +#define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE +#endif +//!@endcond + +/*! \def RAPIDJSON_STATIC_ASSERT + \brief (Internal) macro to check for conditions at compile-time + \param x compile-time condition + \hideinitializer + */ +#define RAPIDJSON_STATIC_ASSERT(x) \ + typedef ::RAPIDJSON_NAMESPACE::StaticAssertTest< \ + sizeof(::RAPIDJSON_NAMESPACE::STATIC_ASSERTION_FAILURE<bool(x) >)> \ + RAPIDJSON_JOIN(StaticAssertTypedef, __LINE__) RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE +#endif + +/////////////////////////////////////////////////////////////////////////////// +// Helpers + +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN + +#define RAPIDJSON_MULTILINEMACRO_BEGIN do { +#define RAPIDJSON_MULTILINEMACRO_END \ +} while((void)0, 0) + +// adopted from Boost +#define RAPIDJSON_VERSION_CODE(x,y,z) \ + (((x)*100000) + ((y)*100) + (z)) + +// token stringification +#define RAPIDJSON_STRINGIFY(x) RAPIDJSON_DO_STRINGIFY(x) +#define RAPIDJSON_DO_STRINGIFY(x) #x + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_DIAG_PUSH/POP, RAPIDJSON_DIAG_OFF + +#if defined(__GNUC__) +#define RAPIDJSON_GNUC \ + RAPIDJSON_VERSION_CODE(__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__) +#endif + +#if defined(__clang__) || (defined(RAPIDJSON_GNUC) && RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,2,0)) + +#define RAPIDJSON_PRAGMA(x) _Pragma(RAPIDJSON_STRINGIFY(x)) +#define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(GCC diagnostic x) +#define RAPIDJSON_DIAG_OFF(x) \ + RAPIDJSON_DIAG_PRAGMA(ignored RAPIDJSON_STRINGIFY(RAPIDJSON_JOIN(-W,x))) + +// push/pop support in Clang and GCC>=4.6 +#if defined(__clang__) || (defined(RAPIDJSON_GNUC) && RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) +#define RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_PRAGMA(push) +#define RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_PRAGMA(pop) +#else // GCC >= 4.2, < 4.6 +#define RAPIDJSON_DIAG_PUSH /* ignored */ +#define RAPIDJSON_DIAG_POP /* ignored */ +#endif + +#elif defined(_MSC_VER) + +// pragma (MSVC specific) +#define RAPIDJSON_PRAGMA(x) __pragma(x) +#define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(warning(x)) + +#define RAPIDJSON_DIAG_OFF(x) RAPIDJSON_DIAG_PRAGMA(disable: x) +#define RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_PRAGMA(push) +#define RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_PRAGMA(pop) + +#else + +#define RAPIDJSON_DIAG_OFF(x) /* ignored */ +#define RAPIDJSON_DIAG_PUSH /* ignored */ +#define RAPIDJSON_DIAG_POP /* ignored */ + +#endif // RAPIDJSON_DIAG_* + +/////////////////////////////////////////////////////////////////////////////// +// C++11 features + +#ifndef RAPIDJSON_HAS_CXX11_RVALUE_REFS +#if defined(__clang__) +#define RAPIDJSON_HAS_CXX11_RVALUE_REFS __has_feature(cxx_rvalue_references) +#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,3,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ + (defined(_MSC_VER) && _MSC_VER >= 1600) + +#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 +#else +#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0 +#endif +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + +#ifndef RAPIDJSON_HAS_CXX11_NOEXCEPT +#if defined(__clang__) +#define RAPIDJSON_HAS_CXX11_NOEXCEPT __has_feature(cxx_noexcept) +#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) +// (defined(_MSC_VER) && _MSC_VER >= ????) // not yet supported +#define RAPIDJSON_HAS_CXX11_NOEXCEPT 1 +#else +#define RAPIDJSON_HAS_CXX11_NOEXCEPT 0 +#endif +#endif +#if RAPIDJSON_HAS_CXX11_NOEXCEPT +#define RAPIDJSON_NOEXCEPT noexcept +#else +#define RAPIDJSON_NOEXCEPT /* noexcept */ +#endif // RAPIDJSON_HAS_CXX11_NOEXCEPT + +// no automatic detection, yet +#ifndef RAPIDJSON_HAS_CXX11_TYPETRAITS +#define RAPIDJSON_HAS_CXX11_TYPETRAITS 0 +#endif + +//!@endcond + +/////////////////////////////////////////////////////////////////////////////// +// new/delete + +#ifndef RAPIDJSON_NEW +///! customization point for global \c new +#define RAPIDJSON_NEW(x) new x +#endif +#ifndef RAPIDJSON_DELETE +///! customization point for global \c delete +#define RAPIDJSON_DELETE(x) delete x +#endif + +/////////////////////////////////////////////////////////////////////////////// +// Allocators and Encodings + +#include "allocators.h" +#include "encodings.h" + +/*! \namespace rapidjson + \brief main RapidJSON namespace + \see RAPIDJSON_NAMESPACE +*/ +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Stream + +/*! \class rapidjson::Stream + \brief Concept for reading and writing characters. + + For read-only stream, no need to implement PutBegin(), Put(), Flush() and PutEnd(). + + For write-only stream, only need to implement Put() and Flush(). + +\code +concept Stream { + typename Ch; //!< Character type of the stream. + + //! Read the current character from stream without moving the read cursor. + Ch Peek() const; + + //! Read the current character from stream and moving the read cursor to next character. + Ch Take(); + + //! Get the current read cursor. + //! \return Number of characters read from start. + size_t Tell(); + + //! Begin writing operation at the current read pointer. + //! \return The begin writer pointer. + Ch* PutBegin(); + + //! Write a character. + void Put(Ch c); + + //! Flush the buffer. + void Flush(); + + //! End the writing operation. + //! \param begin The begin write pointer returned by PutBegin(). + //! \return Number of characters written. + size_t PutEnd(Ch* begin); +} +\endcode +*/ + +//! Provides additional information for stream. +/*! + By using traits pattern, this type provides a default configuration for stream. + For custom stream, this type can be specialized for other configuration. + See TEST(Reader, CustomStringStream) in readertest.cpp for example. +*/ +template<typename Stream> +struct StreamTraits { + //! Whether to make local copy of stream for optimization during parsing. + /*! + By default, for safety, streams do not use local copy optimization. + Stream that can be copied fast should specialize this, like StreamTraits<StringStream>. + */ + enum { copyOptimization = 0 }; +}; + +//! Put N copies of a character to a stream. +template<typename Stream, typename Ch> +inline void PutN(Stream& stream, Ch c, size_t n) { + for (size_t i = 0; i < n; i++) + stream.Put(c); +} + +/////////////////////////////////////////////////////////////////////////////// +// StringStream + +//! Read-only string stream. +/*! \note implements Stream concept +*/ +template <typename Encoding> +struct GenericStringStream { + typedef typename Encoding::Ch Ch; + + GenericStringStream(const Ch *src) : src_(src), head_(src) {} + + Ch Peek() const { return *src_; } + Ch Take() { return *src_++; } + size_t Tell() const { return static_cast<size_t>(src_ - head_); } + + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + + const Ch* src_; //!< Current read position. + const Ch* head_; //!< Original head of the string. +}; + +template <typename Encoding> +struct StreamTraits<GenericStringStream<Encoding> > { + enum { copyOptimization = 1 }; +}; + +//! String stream with UTF8 encoding. +typedef GenericStringStream<UTF8<> > StringStream; + +/////////////////////////////////////////////////////////////////////////////// +// InsituStringStream + +//! A read-write string stream. +/*! This string stream is particularly designed for in-situ parsing. + \note implements Stream concept +*/ +template <typename Encoding> +struct GenericInsituStringStream { + typedef typename Encoding::Ch Ch; + + GenericInsituStringStream(Ch *src) : src_(src), dst_(0), head_(src) {} + + // Read + Ch Peek() { return *src_; } + Ch Take() { return *src_++; } + size_t Tell() { return static_cast<size_t>(src_ - head_); } + + // Write + void Put(Ch c) { RAPIDJSON_ASSERT(dst_ != 0); *dst_++ = c; } + + Ch* PutBegin() { return dst_ = src_; } + size_t PutEnd(Ch* begin) { return static_cast<size_t>(dst_ - begin); } + void Flush() {} + + Ch* Push(size_t count) { Ch* begin = dst_; dst_ += count; return begin; } + void Pop(size_t count) { dst_ -= count; } + + Ch* src_; + Ch* dst_; + Ch* head_; +}; + +template <typename Encoding> +struct StreamTraits<GenericInsituStringStream<Encoding> > { + enum { copyOptimization = 1 }; +}; + +//! Insitu string stream with UTF8 encoding. +typedef GenericInsituStringStream<UTF8<> > InsituStringStream; + +/////////////////////////////////////////////////////////////////////////////// +// Type + +//! Type of JSON value +enum Type { + kNullType = 0, //!< null + kFalseType = 1, //!< false + kTrueType = 2, //!< true + kObjectType = 3, //!< object + kArrayType = 4, //!< array + kStringType = 5, //!< string + kNumberType = 6 //!< number +}; + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_RAPIDJSON_H_ diff --git a/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/reader.h b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/reader.h new file mode 100755 index 000000000..08425eb9e --- /dev/null +++ b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/reader.h @@ -0,0 +1,1444 @@ +// Copyright (C) 2011 Milo Yip +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef RAPIDJSON_READER_H_ +#define RAPIDJSON_READER_H_ + +/*! \file reader.h */ + +#include "rapidjson.h" +#include "encodings.h" +#include "internal/meta.h" +#include "internal/stack.h" +#include "internal/strtod.h" + +#if defined(RAPIDJSON_SIMD) && defined(_MSC_VER) +#include <intrin.h> +#pragma intrinsic(_BitScanForward) +#endif +#ifdef RAPIDJSON_SSE42 +#include <nmmintrin.h> +#elif defined(RAPIDJSON_SSE2) +#include <emmintrin.h> +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant +RAPIDJSON_DIAG_OFF(4702) // unreachable code +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#define RAPIDJSON_NOTHING /* deliberately empty */ +#ifndef RAPIDJSON_PARSE_ERROR_EARLY_RETURN +#define RAPIDJSON_PARSE_ERROR_EARLY_RETURN(value) \ + RAPIDJSON_MULTILINEMACRO_BEGIN \ + if (HasParseError()) { return value; } \ + RAPIDJSON_MULTILINEMACRO_END +#endif +#define RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID \ + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING) +//!@endcond + +/*! \def RAPIDJSON_PARSE_ERROR_NORETURN + \ingroup RAPIDJSON_ERRORS + \brief Macro to indicate a parse error. + \param parseErrorCode \ref rapidjson::ParseErrorCode of the error + \param offset position of the error in JSON input (\c size_t) + + This macros can be used as a customization point for the internal + error handling mechanism of RapidJSON. + + A common usage model is to throw an exception instead of requiring the + caller to explicitly check the \ref rapidjson::GenericReader::Parse's + return value: + + \code + #define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode,offset) \ + throw ParseException(parseErrorCode, #parseErrorCode, offset) + + #include <stdexcept> // std::runtime_error + #include "rapidjson/error/error.h" // rapidjson::ParseResult + + struct ParseException : std::runtime_error, rapidjson::ParseResult { + ParseException(rapidjson::ParseErrorCode code, const char* msg, size_t offset) + : std::runtime_error(msg), ParseResult(code, offset) {} + }; + + #include "rapidjson/reader.h" + \endcode + + \see RAPIDJSON_PARSE_ERROR, rapidjson::GenericReader::Parse + */ +#ifndef RAPIDJSON_PARSE_ERROR_NORETURN +#define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset) \ + RAPIDJSON_MULTILINEMACRO_BEGIN \ + RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \ + SetParseError(parseErrorCode, offset); \ + RAPIDJSON_MULTILINEMACRO_END +#endif + +/*! \def RAPIDJSON_PARSE_ERROR + \ingroup RAPIDJSON_ERRORS + \brief (Internal) macro to indicate and handle a parse error. + \param parseErrorCode \ref rapidjson::ParseErrorCode of the error + \param offset position of the error in JSON input (\c size_t) + + Invokes RAPIDJSON_PARSE_ERROR_NORETURN and stops the parsing. + + \see RAPIDJSON_PARSE_ERROR_NORETURN + \hideinitializer + */ +#ifndef RAPIDJSON_PARSE_ERROR +#define RAPIDJSON_PARSE_ERROR(parseErrorCode, offset) \ + RAPIDJSON_MULTILINEMACRO_BEGIN \ + RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \ + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \ + RAPIDJSON_MULTILINEMACRO_END +#endif + +#include "error/error.h" // ParseErrorCode, ParseResult + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// ParseFlag + +/*! \def RAPIDJSON_PARSE_DEFAULT_FLAGS + \ingroup RAPIDJSON_CONFIG + \brief User-defined kParseDefaultFlags definition. + + User can define this as any \c ParseFlag combinations. +*/ +#ifndef RAPIDJSON_PARSE_DEFAULT_FLAGS +#define RAPIDJSON_PARSE_DEFAULT_FLAGS kParseNoFlags +#endif + +//! Combination of parseFlags +/*! \see Reader::Parse, Document::Parse, Document::ParseInsitu, Document::ParseStream + */ +enum ParseFlag { + kParseNoFlags = 0, //!< No flags are set. + kParseInsituFlag = 1, //!< In-situ(destructive) parsing. + kParseValidateEncodingFlag = 2, //!< Validate encoding of JSON strings. + kParseIterativeFlag = 4, //!< Iterative(constant complexity in terms of function call stack size) parsing. + kParseStopWhenDoneFlag = 8, //!< After parsing a complete JSON root from stream, stop further processing the rest of stream. When this flag is used, parser will not generate kParseErrorDocumentRootNotSingular error. + kParseFullPrecisionFlag = 16, //!< Parse number in full precision (but slower). + kParseDefaultFlags = RAPIDJSON_PARSE_DEFAULT_FLAGS //!< Default parse flags. Can be customized by defining RAPIDJSON_PARSE_DEFAULT_FLAGS +}; + +/////////////////////////////////////////////////////////////////////////////// +// Handler + +/*! \class rapidjson::Handler + \brief Concept for receiving events from GenericReader upon parsing. + The functions return true if no error occurs. If they return false, + the event publisher should terminate the process. +\code +concept Handler { + typename Ch; + + bool Null(); + bool Bool(bool b); + bool Int(int i); + bool Uint(unsigned i); + bool Int64(int64_t i); + bool Uint64(uint64_t i); + bool Double(double d); + bool String(const Ch* str, SizeType length, bool copy); + bool StartObject(); + bool Key(const Ch* str, SizeType length, bool copy); + bool EndObject(SizeType memberCount); + bool StartArray(); + bool EndArray(SizeType elementCount); +}; +\endcode +*/ +/////////////////////////////////////////////////////////////////////////////// +// BaseReaderHandler + +//! Default implementation of Handler. +/*! This can be used as base class of any reader handler. + \note implements Handler concept +*/ +template<typename Encoding = UTF8<>, typename Derived = void> +struct BaseReaderHandler { + typedef typename Encoding::Ch Ch; + + typedef typename internal::SelectIf<internal::IsSame<Derived, void>, BaseReaderHandler, Derived>::Type Override; + + bool Default() { return true; } + bool Null() { return static_cast<Override&>(*this).Default(); } + bool Bool(bool) { return static_cast<Override&>(*this).Default(); } + bool Int(int) { return static_cast<Override&>(*this).Default(); } + bool Uint(unsigned) { return static_cast<Override&>(*this).Default(); } + bool Int64(int64_t) { return static_cast<Override&>(*this).Default(); } + bool Uint64(uint64_t) { return static_cast<Override&>(*this).Default(); } + bool Double(double) { return static_cast<Override&>(*this).Default(); } + bool String(const Ch*, SizeType, bool) { return static_cast<Override&>(*this).Default(); } + bool StartObject() { return static_cast<Override&>(*this).Default(); } + bool Key(const Ch* str, SizeType len, bool copy) { return static_cast<Override&>(*this).String(str, len, copy); } + bool EndObject(SizeType) { return static_cast<Override&>(*this).Default(); } + bool StartArray() { return static_cast<Override&>(*this).Default(); } + bool EndArray(SizeType) { return static_cast<Override&>(*this).Default(); } +}; + +/////////////////////////////////////////////////////////////////////////////// +// StreamLocalCopy + +namespace internal { + +template<typename Stream, int = StreamTraits<Stream>::copyOptimization> +class StreamLocalCopy; + +//! Do copy optimization. +template<typename Stream> +class StreamLocalCopy<Stream, 1> { +public: + StreamLocalCopy(Stream& original) : s(original), original_(original) {} + ~StreamLocalCopy() { original_ = s; } + + Stream s; + +private: + StreamLocalCopy& operator=(const StreamLocalCopy&) /* = delete */; + + Stream& original_; +}; + +//! Keep reference. +template<typename Stream> +class StreamLocalCopy<Stream, 0> { +public: + StreamLocalCopy(Stream& original) : s(original) {} + + Stream& s; + +private: + StreamLocalCopy& operator=(const StreamLocalCopy&) /* = delete */; +}; + +} // namespace internal + +/////////////////////////////////////////////////////////////////////////////// +// SkipWhitespace + +//! Skip the JSON white spaces in a stream. +/*! \param is A input stream for skipping white spaces. + \note This function has SSE2/SSE4.2 specialization. +*/ +template<typename InputStream> +void SkipWhitespace(InputStream& is) { + internal::StreamLocalCopy<InputStream> copy(is); + InputStream& s(copy.s); + + while (s.Peek() == ' ' || s.Peek() == '\n' || s.Peek() == '\r' || s.Peek() == '\t') + s.Take(); +} + +#ifdef RAPIDJSON_SSE42 +//! Skip whitespace with SSE 4.2 pcmpistrm instruction, testing 16 8-byte characters at once. +inline const char *SkipWhitespace_SIMD(const char* p) { + // Fast return for single non-whitespace + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // 16-byte align to the next boundary + const char* nextAligned = reinterpret_cast<const char*>((reinterpret_cast<size_t>(p) + 15) & ~15); + while (p != nextAligned) + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // The rest of string using SIMD + static const char whitespace[16] = " \n\r\t"; + const __m128i w = _mm_loadu_si128((const __m128i *)&whitespace[0]); + + for (;; p += 16) { + const __m128i s = _mm_load_si128((const __m128i *)p); + const unsigned r = _mm_cvtsi128_si32(_mm_cmpistrm(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_BIT_MASK | _SIDD_NEGATIVE_POLARITY)); + if (r != 0) { // some of characters is non-whitespace +#ifdef _MSC_VER // Find the index of first non-whitespace + unsigned long offset; + _BitScanForward(&offset, r); + return p + offset; +#else + return p + __builtin_ffs(r) - 1; +#endif + } + } +} + +#elif defined(RAPIDJSON_SSE2) + +//! Skip whitespace with SSE2 instructions, testing 16 8-byte characters at once. +inline const char *SkipWhitespace_SIMD(const char* p) { + // Fast return for single non-whitespace + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // 16-byte align to the next boundary + const char* nextAligned = reinterpret_cast<const char*>((reinterpret_cast<size_t>(p) + 15) & ~15); + while (p != nextAligned) + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // The rest of string + static const char whitespaces[4][17] = { + " ", + "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", + "\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r", + "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"}; + + const __m128i w0 = _mm_loadu_si128((const __m128i *)&whitespaces[0][0]); + const __m128i w1 = _mm_loadu_si128((const __m128i *)&whitespaces[1][0]); + const __m128i w2 = _mm_loadu_si128((const __m128i *)&whitespaces[2][0]); + const __m128i w3 = _mm_loadu_si128((const __m128i *)&whitespaces[3][0]); + + for (;; p += 16) { + const __m128i s = _mm_load_si128((const __m128i *)p); + __m128i x = _mm_cmpeq_epi8(s, w0); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3)); + unsigned short r = (unsigned short)~_mm_movemask_epi8(x); + if (r != 0) { // some of characters may be non-whitespace +#ifdef _MSC_VER // Find the index of first non-whitespace + unsigned long offset; + _BitScanForward(&offset, r); + return p + offset; +#else + return p + __builtin_ffs(r) - 1; +#endif + } + } +} + +#endif // RAPIDJSON_SSE2 + +#ifdef RAPIDJSON_SIMD +//! Template function specialization for InsituStringStream +template<> inline void SkipWhitespace(InsituStringStream& is) { + is.src_ = const_cast<char*>(SkipWhitespace_SIMD(is.src_)); +} + +//! Template function specialization for StringStream +template<> inline void SkipWhitespace(StringStream& is) { + is.src_ = SkipWhitespace_SIMD(is.src_); +} +#endif // RAPIDJSON_SIMD + +/////////////////////////////////////////////////////////////////////////////// +// GenericReader + +//! SAX-style JSON parser. Use \ref Reader for UTF8 encoding and default allocator. +/*! GenericReader parses JSON text from a stream, and send events synchronously to an + object implementing Handler concept. + + It needs to allocate a stack for storing a single decoded string during + non-destructive parsing. + + For in-situ parsing, the decoded string is directly written to the source + text string, no temporary buffer is required. + + A GenericReader object can be reused for parsing multiple JSON text. + + \tparam SourceEncoding Encoding of the input stream. + \tparam TargetEncoding Encoding of the parse output. + \tparam StackAllocator Allocator type for stack. +*/ +template <typename SourceEncoding, typename TargetEncoding, typename StackAllocator = CrtAllocator> +class GenericReader { +public: + typedef typename SourceEncoding::Ch Ch; //!< SourceEncoding character type + + //! Constructor. + /*! \param allocator Optional allocator for allocating stack memory. (Only use for non-destructive parsing) + \param stackCapacity stack capacity in bytes for storing a single decoded string. (Only use for non-destructive parsing) + */ + GenericReader(StackAllocator* stackAllocator = 0, size_t stackCapacity = kDefaultStackCapacity) : stack_(stackAllocator, stackCapacity), parseResult_() {} + + //! Parse JSON text. + /*! \tparam parseFlags Combination of \ref ParseFlag. + \tparam InputStream Type of input stream, implementing Stream concept. + \tparam Handler Type of handler, implementing Handler concept. + \param is Input stream to be parsed. + \param handler The handler to receive events. + \return Whether the parsing is successful. + */ + template <unsigned parseFlags, typename InputStream, typename Handler> + ParseResult Parse(InputStream& is, Handler& handler) { + if (parseFlags & kParseIterativeFlag) + return IterativeParse<parseFlags>(is, handler); + + parseResult_.Clear(); + + ClearStackOnExit scope(*this); + + SkipWhitespace(is); + + if (is.Peek() == '\0') { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorDocumentEmpty, is.Tell()); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + } + else { + ParseValue<parseFlags>(is, handler); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + + if (!(parseFlags & kParseStopWhenDoneFlag)) { + SkipWhitespace(is); + + if (is.Peek() != '\0') { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorDocumentRootNotSingular, is.Tell()); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + } + } + } + + return parseResult_; + } + + //! Parse JSON text (with \ref kParseDefaultFlags) + /*! \tparam InputStream Type of input stream, implementing Stream concept + \tparam Handler Type of handler, implementing Handler concept. + \param is Input stream to be parsed. + \param handler The handler to receive events. + \return Whether the parsing is successful. + */ + template <typename InputStream, typename Handler> + ParseResult Parse(InputStream& is, Handler& handler) { + return Parse<kParseDefaultFlags>(is, handler); + } + + //! Whether a parse error has occured in the last parsing. + bool HasParseError() const { return parseResult_.IsError(); } + + //! Get the \ref ParseErrorCode of last parsing. + ParseErrorCode GetParseErrorCode() const { return parseResult_.Code(); } + + //! Get the position of last parsing error in input, 0 otherwise. + size_t GetErrorOffset() const { return parseResult_.Offset(); } + +protected: + void SetParseError(ParseErrorCode code, size_t offset) { parseResult_.Set(code, offset); } + +private: + // Prohibit copy constructor & assignment operator. + GenericReader(const GenericReader&); + GenericReader& operator=(const GenericReader&); + + void ClearStack() { stack_.Clear(); } + + // clear stack on any exit from ParseStream, e.g. due to exception + struct ClearStackOnExit { + explicit ClearStackOnExit(GenericReader& r) : r_(r) {} + ~ClearStackOnExit() { r_.ClearStack(); } + private: + GenericReader& r_; + ClearStackOnExit(const ClearStackOnExit&); + ClearStackOnExit& operator=(const ClearStackOnExit&); + }; + + // Parse object: { string : value, ... } + template<unsigned parseFlags, typename InputStream, typename Handler> + void ParseObject(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == '{'); + is.Take(); // Skip '{' + + if (!handler.StartObject()) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + + SkipWhitespace(is); + + if (is.Peek() == '}') { + is.Take(); + if (!handler.EndObject(0)) // empty object + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + } + + for (SizeType memberCount = 0;;) { + if (is.Peek() != '"') + RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissName, is.Tell()); + + ParseString<parseFlags>(is, handler, true); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + SkipWhitespace(is); + + if (is.Take() != ':') + RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissColon, is.Tell()); + + SkipWhitespace(is); + + ParseValue<parseFlags>(is, handler); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + SkipWhitespace(is); + + ++memberCount; + + switch (is.Take()) { + case ',': SkipWhitespace(is); break; + case '}': + if (!handler.EndObject(memberCount)) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + default: RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, is.Tell()); + } + } + } + + // Parse array: [ value, ... ] + template<unsigned parseFlags, typename InputStream, typename Handler> + void ParseArray(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == '['); + is.Take(); // Skip '[' + + if (!handler.StartArray()) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + + SkipWhitespace(is); + + if (is.Peek() == ']') { + is.Take(); + if (!handler.EndArray(0)) // empty array + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + } + + for (SizeType elementCount = 0;;) { + ParseValue<parseFlags>(is, handler); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + ++elementCount; + SkipWhitespace(is); + + switch (is.Take()) { + case ',': SkipWhitespace(is); break; + case ']': + if (!handler.EndArray(elementCount)) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + default: RAPIDJSON_PARSE_ERROR(kParseErrorArrayMissCommaOrSquareBracket, is.Tell()); + } + } + } + + template<unsigned parseFlags, typename InputStream, typename Handler> + void ParseNull(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == 'n'); + is.Take(); + + if (is.Take() == 'u' && is.Take() == 'l' && is.Take() == 'l') { + if (!handler.Null()) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell() - 1); + } + + template<unsigned parseFlags, typename InputStream, typename Handler> + void ParseTrue(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == 't'); + is.Take(); + + if (is.Take() == 'r' && is.Take() == 'u' && is.Take() == 'e') { + if (!handler.Bool(true)) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell() - 1); + } + + template<unsigned parseFlags, typename InputStream, typename Handler> + void ParseFalse(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == 'f'); + is.Take(); + + if (is.Take() == 'a' && is.Take() == 'l' && is.Take() == 's' && is.Take() == 'e') { + if (!handler.Bool(false)) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell() - 1); + } + + // Helper function to parse four hexidecimal digits in \uXXXX in ParseString(). + template<typename InputStream> + unsigned ParseHex4(InputStream& is) { + unsigned codepoint = 0; + for (int i = 0; i < 4; i++) { + Ch c = is.Take(); + codepoint <<= 4; + codepoint += static_cast<unsigned>(c); + if (c >= '0' && c <= '9') + codepoint -= '0'; + else if (c >= 'A' && c <= 'F') + codepoint -= 'A' - 10; + else if (c >= 'a' && c <= 'f') + codepoint -= 'a' - 10; + else { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorStringUnicodeEscapeInvalidHex, is.Tell() - 1); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(0); + } + } + return codepoint; + } + + template <typename CharType> + class StackStream { + public: + typedef CharType Ch; + + StackStream(internal::Stack<StackAllocator>& stack) : stack_(stack), length_(0) {} + RAPIDJSON_FORCEINLINE void Put(Ch c) { + *stack_.template Push<Ch>() = c; + ++length_; + } + size_t Length() const { return length_; } + Ch* Pop() { + return stack_.template Pop<Ch>(length_); + } + + private: + StackStream(const StackStream&); + StackStream& operator=(const StackStream&); + + internal::Stack<StackAllocator>& stack_; + SizeType length_; + }; + + // Parse string and generate String event. Different code paths for kParseInsituFlag. + template<unsigned parseFlags, typename InputStream, typename Handler> + void ParseString(InputStream& is, Handler& handler, bool isKey = false) { + internal::StreamLocalCopy<InputStream> copy(is); + InputStream& s(copy.s); + + bool success = false; + if (parseFlags & kParseInsituFlag) { + typename InputStream::Ch *head = s.PutBegin(); + ParseStringToStream<parseFlags, SourceEncoding, SourceEncoding>(s, s); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + size_t length = s.PutEnd(head) - 1; + RAPIDJSON_ASSERT(length <= 0xFFFFFFFF); + const typename TargetEncoding::Ch* const str = (typename TargetEncoding::Ch*)head; + success = (isKey ? handler.Key(str, SizeType(length), false) : handler.String(str, SizeType(length), false)); + } + else { + StackStream<typename TargetEncoding::Ch> stackStream(stack_); + ParseStringToStream<parseFlags, SourceEncoding, TargetEncoding>(s, stackStream); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + SizeType length = static_cast<SizeType>(stackStream.Length()) - 1; + const typename TargetEncoding::Ch* const str = stackStream.Pop(); + success = (isKey ? handler.Key(str, length, true) : handler.String(str, length, true)); + } + if (!success) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, s.Tell()); + } + + // Parse string to an output is + // This function handles the prefix/suffix double quotes, escaping, and optional encoding validation. + template<unsigned parseFlags, typename SEncoding, typename TEncoding, typename InputStream, typename OutputStream> + RAPIDJSON_FORCEINLINE void ParseStringToStream(InputStream& is, OutputStream& os) { +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + static const char escape[256] = { + Z16, Z16, 0, 0,'\"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'/', + Z16, Z16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'\\', 0, 0, 0, + 0, 0,'\b', 0, 0, 0,'\f', 0, 0, 0, 0, 0, 0, 0,'\n', 0, + 0, 0,'\r', 0,'\t', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16 + }; +#undef Z16 +//!@endcond + + RAPIDJSON_ASSERT(is.Peek() == '\"'); + is.Take(); // Skip '\"' + + for (;;) { + Ch c = is.Peek(); + if (c == '\\') { // Escape + is.Take(); + Ch e = is.Take(); + if ((sizeof(Ch) == 1 || unsigned(e) < 256) && escape[(unsigned char)e]) { + os.Put(escape[(unsigned char)e]); + } + else if (e == 'u') { // Unicode + unsigned codepoint = ParseHex4(is); + if (codepoint >= 0xD800 && codepoint <= 0xDBFF) { + // Handle UTF-16 surrogate pair + if (is.Take() != '\\' || is.Take() != 'u') + RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, is.Tell() - 2); + unsigned codepoint2 = ParseHex4(is); + if (codepoint2 < 0xDC00 || codepoint2 > 0xDFFF) + RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, is.Tell() - 2); + codepoint = (((codepoint - 0xD800) << 10) | (codepoint2 - 0xDC00)) + 0x10000; + } + TEncoding::Encode(os, codepoint); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorStringEscapeInvalid, is.Tell() - 1); + } + else if (c == '"') { // Closing double quote + is.Take(); + os.Put('\0'); // null-terminate the string + return; + } + else if (c == '\0') + RAPIDJSON_PARSE_ERROR(kParseErrorStringMissQuotationMark, is.Tell() - 1); + else if ((unsigned)c < 0x20) // RFC 4627: unescaped = %x20-21 / %x23-5B / %x5D-10FFFF + RAPIDJSON_PARSE_ERROR(kParseErrorStringEscapeInvalid, is.Tell() - 1); + else { + if (parseFlags & kParseValidateEncodingFlag ? + !Transcoder<SEncoding, TEncoding>::Validate(is, os) : + !Transcoder<SEncoding, TEncoding>::Transcode(is, os)) + RAPIDJSON_PARSE_ERROR(kParseErrorStringInvalidEncoding, is.Tell()); + } + } + } + + template<typename InputStream, bool backup> + class NumberStream {}; + + template<typename InputStream> + class NumberStream<InputStream, false> { + public: + NumberStream(GenericReader& reader, InputStream& is) : is(is) { (void)reader; } + ~NumberStream() {} + + RAPIDJSON_FORCEINLINE Ch Peek() const { return is.Peek(); } + RAPIDJSON_FORCEINLINE Ch TakePush() { return is.Take(); } + RAPIDJSON_FORCEINLINE Ch Take() { return is.Take(); } + size_t Tell() { return is.Tell(); } + size_t Length() { return 0; } + const char* Pop() { return 0; } + + protected: + NumberStream& operator=(const NumberStream&); + + InputStream& is; + }; + + template<typename InputStream> + class NumberStream<InputStream, true> : public NumberStream<InputStream, false> { + typedef NumberStream<InputStream, false> Base; + public: + NumberStream(GenericReader& reader, InputStream& is) : NumberStream<InputStream, false>(reader, is), stackStream(reader.stack_) {} + ~NumberStream() {} + + RAPIDJSON_FORCEINLINE Ch TakePush() { + stackStream.Put((char)Base::is.Peek()); + return Base::is.Take(); + } + + size_t Length() { return stackStream.Length(); } + + const char* Pop() { + stackStream.Put('\0'); + return stackStream.Pop(); + } + + private: + StackStream<char> stackStream; + }; + + template<unsigned parseFlags, typename InputStream, typename Handler> + void ParseNumber(InputStream& is, Handler& handler) { + internal::StreamLocalCopy<InputStream> copy(is); + NumberStream<InputStream, (parseFlags & kParseFullPrecisionFlag) != 0> s(*this, copy.s); + + // Parse minus + bool minus = false; + if (s.Peek() == '-') { + minus = true; + s.Take(); + } + + // Parse int: zero / ( digit1-9 *DIGIT ) + unsigned i = 0; + uint64_t i64 = 0; + bool use64bit = false; + int significandDigit = 0; + if (s.Peek() == '0') { + i = 0; + s.TakePush(); + } + else if (s.Peek() >= '1' && s.Peek() <= '9') { + i = static_cast<unsigned>(s.TakePush() - '0'); + + if (minus) + while (s.Peek() >= '0' && s.Peek() <= '9') { + if (i >= 214748364) { // 2^31 = 2147483648 + if (i != 214748364 || s.Peek() > '8') { + i64 = i; + use64bit = true; + break; + } + } + i = i * 10 + static_cast<unsigned>(s.TakePush() - '0'); + significandDigit++; + } + else + while (s.Peek() >= '0' && s.Peek() <= '9') { + if (i >= 429496729) { // 2^32 - 1 = 4294967295 + if (i != 429496729 || s.Peek() > '5') { + i64 = i; + use64bit = true; + break; + } + } + i = i * 10 + static_cast<unsigned>(s.TakePush() - '0'); + significandDigit++; + } + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); + + // Parse 64bit int + bool useDouble = false; + double d = 0.0; + if (use64bit) { + if (minus) + while (s.Peek() >= '0' && s.Peek() <= '9') { + if (i64 >= RAPIDJSON_UINT64_C2(0x0CCCCCCC, 0xCCCCCCCC)) // 2^63 = 9223372036854775808 + if (i64 != RAPIDJSON_UINT64_C2(0x0CCCCCCC, 0xCCCCCCCC) || s.Peek() > '8') { + d = i64; + useDouble = true; + break; + } + i64 = i64 * 10 + static_cast<unsigned>(s.TakePush() - '0'); + significandDigit++; + } + else + while (s.Peek() >= '0' && s.Peek() <= '9') { + if (i64 >= RAPIDJSON_UINT64_C2(0x19999999, 0x99999999)) // 2^64 - 1 = 18446744073709551615 + if (i64 != RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) || s.Peek() > '5') { + d = i64; + useDouble = true; + break; + } + i64 = i64 * 10 + static_cast<unsigned>(s.TakePush() - '0'); + significandDigit++; + } + } + + // Force double for big integer + if (useDouble) { + while (s.Peek() >= '0' && s.Peek() <= '9') { + if (d >= 1.7976931348623157e307) // DBL_MAX / 10.0 + RAPIDJSON_PARSE_ERROR(kParseErrorNumberTooBig, s.Tell()); + d = d * 10 + (s.TakePush() - '0'); + } + } + + // Parse frac = decimal-point 1*DIGIT + int expFrac = 0; + size_t decimalPosition; + if (s.Peek() == '.') { + s.Take(); + decimalPosition = s.Length(); + + if (!(s.Peek() >= '0' && s.Peek() <= '9')) + RAPIDJSON_PARSE_ERROR(kParseErrorNumberMissFraction, s.Tell()); + + if (!useDouble) { +#if RAPIDJSON_64BIT + // Use i64 to store significand in 64-bit architecture + if (!use64bit) + i64 = i; + + while (s.Peek() >= '0' && s.Peek() <= '9') { + if (i64 > RAPIDJSON_UINT64_C2(0x1FFFFF, 0xFFFFFFFF)) // 2^53 - 1 for fast path + break; + else { + i64 = i64 * 10 + static_cast<unsigned>(s.TakePush() - '0'); + --expFrac; + if (i64 != 0) + significandDigit++; + } + } + + d = (double)i64; +#else + // Use double to store significand in 32-bit architecture + d = use64bit ? (double)i64 : (double)i; +#endif + useDouble = true; + } + + while (s.Peek() >= '0' && s.Peek() <= '9') { + if (significandDigit < 17) { + d = d * 10.0 + (s.TakePush() - '0'); + --expFrac; + if (d != 0.0) + significandDigit++; + } + else + s.TakePush(); + } + } + else + decimalPosition = s.Length(); // decimal position at the end of integer. + + // Parse exp = e [ minus / plus ] 1*DIGIT + int exp = 0; + if (s.Peek() == 'e' || s.Peek() == 'E') { + if (!useDouble) { + d = use64bit ? i64 : i; + useDouble = true; + } + s.Take(); + + bool expMinus = false; + if (s.Peek() == '+') + s.Take(); + else if (s.Peek() == '-') { + s.Take(); + expMinus = true; + } + + if (s.Peek() >= '0' && s.Peek() <= '9') { + exp = s.Take() - '0'; + while (s.Peek() >= '0' && s.Peek() <= '9') { + exp = exp * 10 + (s.Take() - '0'); + if (exp > 308 && !expMinus) // exp > 308 should be rare, so it should be checked first. + RAPIDJSON_PARSE_ERROR(kParseErrorNumberTooBig, s.Tell()); + } + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorNumberMissExponent, s.Tell()); + + if (expMinus) + exp = -exp; + } + + // Finish parsing, call event according to the type of number. + bool cont = true; + size_t length = s.Length(); + const char* decimal = s.Pop(); // Pop stack no matter if it will be used or not. + + if (useDouble) { + int p = exp + expFrac; + if (parseFlags & kParseFullPrecisionFlag) + d = internal::StrtodFullPrecision(d, p, decimal, length, decimalPosition, exp); + else + d = internal::StrtodNormalPrecision(d, p); + + cont = handler.Double(minus ? -d : d); + } + else { + if (use64bit) { + if (minus) + cont = handler.Int64(-(int64_t)i64); + else + cont = handler.Uint64(i64); + } + else { + if (minus) + cont = handler.Int(-(int)i); + else + cont = handler.Uint(i); + } + } + if (!cont) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, s.Tell()); + } + + // Parse any JSON value + template<unsigned parseFlags, typename InputStream, typename Handler> + void ParseValue(InputStream& is, Handler& handler) { + switch (is.Peek()) { + case 'n': ParseNull <parseFlags>(is, handler); break; + case 't': ParseTrue <parseFlags>(is, handler); break; + case 'f': ParseFalse <parseFlags>(is, handler); break; + case '"': ParseString<parseFlags>(is, handler); break; + case '{': ParseObject<parseFlags>(is, handler); break; + case '[': ParseArray <parseFlags>(is, handler); break; + default : ParseNumber<parseFlags>(is, handler); + } + } + + // Iterative Parsing + + // States + enum IterativeParsingState { + IterativeParsingStartState = 0, + IterativeParsingFinishState, + IterativeParsingErrorState, + + // Object states + IterativeParsingObjectInitialState, + IterativeParsingMemberKeyState, + IterativeParsingKeyValueDelimiterState, + IterativeParsingMemberValueState, + IterativeParsingMemberDelimiterState, + IterativeParsingObjectFinishState, + + // Array states + IterativeParsingArrayInitialState, + IterativeParsingElementState, + IterativeParsingElementDelimiterState, + IterativeParsingArrayFinishState, + + // Single value state + IterativeParsingValueState, + + cIterativeParsingStateCount + }; + + // Tokens + enum Token { + LeftBracketToken = 0, + RightBracketToken, + + LeftCurlyBracketToken, + RightCurlyBracketToken, + + CommaToken, + ColonToken, + + StringToken, + FalseToken, + TrueToken, + NullToken, + NumberToken, + + kTokenCount + }; + + RAPIDJSON_FORCEINLINE Token Tokenize(Ch c) { + +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#define N NumberToken +#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N + // Maps from ASCII to Token + static const unsigned char tokenMap[256] = { + N16, // 00~0F + N16, // 10~1F + N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F + N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F + N16, // 40~4F + N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F + N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F + N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F + N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF + }; +#undef N +#undef N16 +//!@endcond + + if (sizeof(Ch) == 1 || unsigned(c) < 256) + return (Token)tokenMap[(unsigned char)c]; + else + return NumberToken; + } + + RAPIDJSON_FORCEINLINE IterativeParsingState Predict(IterativeParsingState state, Token token) { + // current state x one lookahead token -> new state + static const char G[cIterativeParsingStateCount][kTokenCount] = { + // Start + { + IterativeParsingArrayInitialState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingValueState, // String + IterativeParsingValueState, // False + IterativeParsingValueState, // True + IterativeParsingValueState, // Null + IterativeParsingValueState // Number + }, + // Finish(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // Error(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // ObjectInitial + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingObjectFinishState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingMemberKeyState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // MemberKey + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingKeyValueDelimiterState, // Colon + IterativeParsingErrorState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // KeyValueDelimiter + { + IterativeParsingArrayInitialState, // Left bracket(push MemberValue state) + IterativeParsingErrorState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket(push MemberValue state) + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingMemberValueState, // String + IterativeParsingMemberValueState, // False + IterativeParsingMemberValueState, // True + IterativeParsingMemberValueState, // Null + IterativeParsingMemberValueState // Number + }, + // MemberValue + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingObjectFinishState, // Right curly bracket + IterativeParsingMemberDelimiterState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingErrorState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // MemberDelimiter + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingMemberKeyState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // ObjectFinish(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // ArrayInitial + { + IterativeParsingArrayInitialState, // Left bracket(push Element state) + IterativeParsingArrayFinishState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket(push Element state) + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingElementState, // String + IterativeParsingElementState, // False + IterativeParsingElementState, // True + IterativeParsingElementState, // Null + IterativeParsingElementState // Number + }, + // Element + { + IterativeParsingErrorState, // Left bracket + IterativeParsingArrayFinishState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingErrorState, // Right curly bracket + IterativeParsingElementDelimiterState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingErrorState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // ElementDelimiter + { + IterativeParsingArrayInitialState, // Left bracket(push Element state) + IterativeParsingErrorState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket(push Element state) + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingElementState, // String + IterativeParsingElementState, // False + IterativeParsingElementState, // True + IterativeParsingElementState, // Null + IterativeParsingElementState // Number + }, + // ArrayFinish(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // Single Value (sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + } + }; // End of G + + return (IterativeParsingState)G[state][token]; + } + + // Make an advance in the token stream and state based on the candidate destination state which was returned by Transit(). + // May return a new state on state pop. + template <unsigned parseFlags, typename InputStream, typename Handler> + RAPIDJSON_FORCEINLINE IterativeParsingState Transit(IterativeParsingState src, Token token, IterativeParsingState dst, InputStream& is, Handler& handler) { + switch (dst) { + case IterativeParsingStartState: + RAPIDJSON_ASSERT(false); + return IterativeParsingErrorState; + + case IterativeParsingFinishState: + return dst; + + case IterativeParsingErrorState: + return dst; + + case IterativeParsingObjectInitialState: + case IterativeParsingArrayInitialState: + { + // Push the state(Element or MemeberValue) if we are nested in another array or value of member. + // In this way we can get the correct state on ObjectFinish or ArrayFinish by frame pop. + IterativeParsingState n = src; + if (src == IterativeParsingArrayInitialState || src == IterativeParsingElementDelimiterState) + n = IterativeParsingElementState; + else if (src == IterativeParsingKeyValueDelimiterState) + n = IterativeParsingMemberValueState; + // Push current state. + *stack_.template Push<SizeType>(1) = n; + // Initialize and push the member/element count. + *stack_.template Push<SizeType>(1) = 0; + // Call handler + bool hr = (dst == IterativeParsingObjectInitialState) ? handler.StartObject() : handler.StartArray(); + // On handler short circuits the parsing. + if (!hr) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); + return IterativeParsingErrorState; + } + else { + is.Take(); + return dst; + } + } + + case IterativeParsingMemberKeyState: + ParseString<parseFlags>(is, handler, true); + if (HasParseError()) + return IterativeParsingErrorState; + else + return dst; + + case IterativeParsingKeyValueDelimiterState: + if (token == ColonToken) { + is.Take(); + return dst; + } + else + return IterativeParsingErrorState; + + case IterativeParsingMemberValueState: + // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. + ParseValue<parseFlags>(is, handler); + if (HasParseError()) { + return IterativeParsingErrorState; + } + return dst; + + case IterativeParsingElementState: + // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. + ParseValue<parseFlags>(is, handler); + if (HasParseError()) { + return IterativeParsingErrorState; + } + return dst; + + case IterativeParsingMemberDelimiterState: + case IterativeParsingElementDelimiterState: + is.Take(); + // Update member/element count. + *stack_.template Top<SizeType>() = *stack_.template Top<SizeType>() + 1; + return dst; + + case IterativeParsingObjectFinishState: + { + // Get member count. + SizeType c = *stack_.template Pop<SizeType>(1); + // If the object is not empty, count the last member. + if (src == IterativeParsingMemberValueState) + ++c; + // Restore the state. + IterativeParsingState n = static_cast<IterativeParsingState>(*stack_.template Pop<SizeType>(1)); + // Transit to Finish state if this is the topmost scope. + if (n == IterativeParsingStartState) + n = IterativeParsingFinishState; + // Call handler + bool hr = handler.EndObject(c); + // On handler short circuits the parsing. + if (!hr) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); + return IterativeParsingErrorState; + } + else { + is.Take(); + return n; + } + } + + case IterativeParsingArrayFinishState: + { + // Get element count. + SizeType c = *stack_.template Pop<SizeType>(1); + // If the array is not empty, count the last element. + if (src == IterativeParsingElementState) + ++c; + // Restore the state. + IterativeParsingState n = static_cast<IterativeParsingState>(*stack_.template Pop<SizeType>(1)); + // Transit to Finish state if this is the topmost scope. + if (n == IterativeParsingStartState) + n = IterativeParsingFinishState; + // Call handler + bool hr = handler.EndArray(c); + // On handler short circuits the parsing. + if (!hr) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); + return IterativeParsingErrorState; + } + else { + is.Take(); + return n; + } + } + + case IterativeParsingValueState: + // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. + ParseValue<parseFlags>(is, handler); + if (HasParseError()) { + return IterativeParsingErrorState; + } + return IterativeParsingFinishState; + + default: + RAPIDJSON_ASSERT(false); + return IterativeParsingErrorState; + } + } + + template <typename InputStream> + void HandleError(IterativeParsingState src, InputStream& is) { + if (HasParseError()) { + // Error flag has been set. + return; + } + + switch (src) { + case IterativeParsingStartState: RAPIDJSON_PARSE_ERROR(kParseErrorDocumentEmpty, is.Tell()); + case IterativeParsingFinishState: RAPIDJSON_PARSE_ERROR(kParseErrorDocumentRootNotSingular, is.Tell()); + case IterativeParsingObjectInitialState: + case IterativeParsingMemberDelimiterState: RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissName, is.Tell()); + case IterativeParsingMemberKeyState: RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissColon, is.Tell()); + case IterativeParsingMemberValueState: RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, is.Tell()); + case IterativeParsingElementState: RAPIDJSON_PARSE_ERROR(kParseErrorArrayMissCommaOrSquareBracket, is.Tell()); + default: RAPIDJSON_PARSE_ERROR(kParseErrorUnspecificSyntaxError, is.Tell()); + } + } + + template <unsigned parseFlags, typename InputStream, typename Handler> + ParseResult IterativeParse(InputStream& is, Handler& handler) { + parseResult_.Clear(); + ClearStackOnExit scope(*this); + IterativeParsingState state = IterativeParsingStartState; + + SkipWhitespace(is); + while (is.Peek() != '\0') { + Token t = Tokenize(is.Peek()); + IterativeParsingState n = Predict(state, t); + IterativeParsingState d = Transit<parseFlags>(state, t, n, is, handler); + + if (d == IterativeParsingErrorState) { + HandleError(state, is); + break; + } + + state = d; + + // Do not further consume streams if a root JSON has been parsed. + if ((parseFlags & kParseStopWhenDoneFlag) && state == IterativeParsingFinishState) + break; + + SkipWhitespace(is); + } + + // Handle the end of file. + if (state != IterativeParsingFinishState) + HandleError(state, is); + + return parseResult_; + } + + static const size_t kDefaultStackCapacity = 256; //!< Default stack capacity in bytes for storing a single decoded string. + internal::Stack<StackAllocator> stack_; //!< A stack for storing decoded string temporarily during non-destructive parsing. + ParseResult parseResult_; +}; // class GenericReader + +//! Reader with UTF8 encoding and default allocator. +typedef GenericReader<UTF8<>, UTF8<> > Reader; + +RAPIDJSON_NAMESPACE_END + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_READER_H_ diff --git a/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/stringbuffer.h b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/stringbuffer.h new file mode 100755 index 000000000..009a51813 --- /dev/null +++ b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/stringbuffer.h @@ -0,0 +1,99 @@ +// Copyright (C) 2011 Milo Yip +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef RAPIDJSON_STRINGBUFFER_H_ +#define RAPIDJSON_STRINGBUFFER_H_ + +#include "rapidjson.h" + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS +#include <utility> // std::move +#endif + +#include "internal/stack.h" + +RAPIDJSON_NAMESPACE_BEGIN + +//! Represents an in-memory output stream. +/*! + \tparam Encoding Encoding of the stream. + \tparam Allocator type for allocating memory buffer. + \note implements Stream concept +*/ +template <typename Encoding, typename Allocator = CrtAllocator> +class GenericStringBuffer { +public: + typedef typename Encoding::Ch Ch; + + GenericStringBuffer(Allocator* allocator = 0, size_t capacity = kDefaultCapacity) : stack_(allocator, capacity) {} + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericStringBuffer(GenericStringBuffer&& rhs) : stack_(std::move(rhs.stack_)) {} + GenericStringBuffer& operator=(GenericStringBuffer&& rhs) { + if (&rhs != this) + stack_ = std::move(rhs.stack_); + return *this; + } +#endif + + void Put(Ch c) { *stack_.template Push<Ch>() = c; } + void Flush() {} + + void Clear() { stack_.Clear(); } + void ShrinkToFit() { + // Push and pop a null terminator. This is safe. + *stack_.template Push<Ch>() = '\0'; + stack_.ShrinkToFit(); + stack_.template Pop<Ch>(1); + } + Ch* Push(size_t count) { return stack_.template Push<Ch>(count); } + void Pop(size_t count) { stack_.template Pop<Ch>(count); } + + const Ch* GetString() const { + // Push and pop a null terminator. This is safe. + *stack_.template Push<Ch>() = '\0'; + stack_.template Pop<Ch>(1); + + return stack_.template Bottom<Ch>(); + } + + size_t GetSize() const { return stack_.GetSize(); } + + static const size_t kDefaultCapacity = 256; + mutable internal::Stack<Allocator> stack_; + +private: + // Prohibit copy constructor & assignment operator. + GenericStringBuffer(const GenericStringBuffer&); + GenericStringBuffer& operator=(const GenericStringBuffer&); +}; + +//! String buffer with UTF8 encoding +typedef GenericStringBuffer<UTF8<> > StringBuffer; + +//! Implement specialized version of PutN() with memset() for better performance. +template<> +inline void PutN(GenericStringBuffer<UTF8<> >& stream, char c, size_t n) { + std::memset(stream.stack_.Push<char>(n), c, n * sizeof(c)); +} + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_STRINGBUFFER_H_ diff --git a/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/writer.h b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/writer.h new file mode 100755 index 000000000..6daa78330 --- /dev/null +++ b/gfx/angle/src/tests/third_party/rapidjson/include/rapidjson/writer.h @@ -0,0 +1,391 @@ +// Copyright (C) 2011 Milo Yip +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef RAPIDJSON_WRITER_H_ +#define RAPIDJSON_WRITER_H_ + +#include "rapidjson.h" +#include "internal/stack.h" +#include "internal/strfunc.h" +#include "internal/dtoa.h" +#include "internal/itoa.h" +#include "stringbuffer.h" +#include <new> // placement new + +#ifdef _MSC_VER +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! JSON writer +/*! Writer implements the concept Handler. + It generates JSON text by events to an output os. + + User may programmatically calls the functions of a writer to generate JSON text. + + On the other side, a writer can also be passed to objects that generates events, + + for example Reader::Parse() and Document::Accept(). + + \tparam OutputStream Type of output stream. + \tparam SourceEncoding Encoding of source string. + \tparam TargetEncoding Encoding of output stream. + \tparam StackAllocator Type of allocator for allocating memory of stack. + \note implements Handler concept +*/ +template<typename OutputStream, typename SourceEncoding = UTF8<>, typename TargetEncoding = UTF8<>, typename StackAllocator = CrtAllocator> +class Writer { +public: + typedef typename SourceEncoding::Ch Ch; + + //! Constructor + /*! \param os Output stream. + \param stackAllocator User supplied allocator. If it is null, it will create a private one. + \param levelDepth Initial capacity of stack. + */ + explicit + Writer(OutputStream& os, StackAllocator* stackAllocator = 0, size_t levelDepth = kDefaultLevelDepth) : + os_(&os), level_stack_(stackAllocator, levelDepth * sizeof(Level)), hasRoot_(false) {} + + explicit + Writer(StackAllocator* allocator = 0, size_t levelDepth = kDefaultLevelDepth) : + os_(0), level_stack_(allocator, levelDepth * sizeof(Level)), hasRoot_(false) {} + + //! Reset the writer with a new stream. + /*! + This function reset the writer with a new stream and default settings, + in order to make a Writer object reusable for output multiple JSONs. + + \param os New output stream. + \code + Writer<OutputStream> writer(os1); + writer.StartObject(); + // ... + writer.EndObject(); + + writer.Reset(os2); + writer.StartObject(); + // ... + writer.EndObject(); + \endcode + */ + void Reset(OutputStream& os) { + os_ = &os; + hasRoot_ = false; + level_stack_.Clear(); + } + + //! Checks whether the output is a complete JSON. + /*! + A complete JSON has a complete root object or array. + */ + bool IsComplete() const { + return hasRoot_ && level_stack_.Empty(); + } + + /*!@name Implementation of Handler + \see Handler + */ + //@{ + + bool Null() { Prefix(kNullType); return WriteNull(); } + bool Bool(bool b) { Prefix(b ? kTrueType : kFalseType); return WriteBool(b); } + bool Int(int i) { Prefix(kNumberType); return WriteInt(i); } + bool Uint(unsigned u) { Prefix(kNumberType); return WriteUint(u); } + bool Int64(int64_t i64) { Prefix(kNumberType); return WriteInt64(i64); } + bool Uint64(uint64_t u64) { Prefix(kNumberType); return WriteUint64(u64); } + + //! Writes the given \c double value to the stream + /*! + \param d The value to be written. + \return Whether it is succeed. + */ + bool Double(double d) { Prefix(kNumberType); return WriteDouble(d); } + + bool String(const Ch* str, SizeType length, bool copy = false) { + (void)copy; + Prefix(kStringType); + return WriteString(str, length); + } + + bool StartObject() { + Prefix(kObjectType); + new (level_stack_.template Push<Level>()) Level(false); + return WriteStartObject(); + } + + bool Key(const Ch* str, SizeType length, bool copy = false) { return String(str, length, copy); } + + bool EndObject(SizeType memberCount = 0) { + (void)memberCount; + RAPIDJSON_ASSERT(level_stack_.GetSize() >= sizeof(Level)); + RAPIDJSON_ASSERT(!level_stack_.template Top<Level>()->inArray); + level_stack_.template Pop<Level>(1); + bool ret = WriteEndObject(); + if (level_stack_.Empty()) // end of json text + os_->Flush(); + return ret; + } + + bool StartArray() { + Prefix(kArrayType); + new (level_stack_.template Push<Level>()) Level(true); + return WriteStartArray(); + } + + bool EndArray(SizeType elementCount = 0) { + (void)elementCount; + RAPIDJSON_ASSERT(level_stack_.GetSize() >= sizeof(Level)); + RAPIDJSON_ASSERT(level_stack_.template Top<Level>()->inArray); + level_stack_.template Pop<Level>(1); + bool ret = WriteEndArray(); + if (level_stack_.Empty()) // end of json text + os_->Flush(); + return ret; + } + //@} + + /*! @name Convenience extensions */ + //@{ + + //! Simpler but slower overload. + bool String(const Ch* str) { return String(str, internal::StrLen(str)); } + bool Key(const Ch* str) { return Key(str, internal::StrLen(str)); } + + //@} + +protected: + //! Information for each nested level + struct Level { + Level(bool inArray_) : valueCount(0), inArray(inArray_) {} + size_t valueCount; //!< number of values in this level + bool inArray; //!< true if in array, otherwise in object + }; + + static const size_t kDefaultLevelDepth = 32; + + bool WriteNull() { + os_->Put('n'); os_->Put('u'); os_->Put('l'); os_->Put('l'); return true; + } + + bool WriteBool(bool b) { + if (b) { + os_->Put('t'); os_->Put('r'); os_->Put('u'); os_->Put('e'); + } + else { + os_->Put('f'); os_->Put('a'); os_->Put('l'); os_->Put('s'); os_->Put('e'); + } + return true; + } + + bool WriteInt(int i) { + char buffer[11]; + const char* end = internal::i32toa(i, buffer); + for (const char* p = buffer; p != end; ++p) + os_->Put(*p); + return true; + } + + bool WriteUint(unsigned u) { + char buffer[10]; + const char* end = internal::u32toa(u, buffer); + for (const char* p = buffer; p != end; ++p) + os_->Put(*p); + return true; + } + + bool WriteInt64(int64_t i64) { + char buffer[21]; + const char* end = internal::i64toa(i64, buffer); + for (const char* p = buffer; p != end; ++p) + os_->Put(*p); + return true; + } + + bool WriteUint64(uint64_t u64) { + char buffer[20]; + char* end = internal::u64toa(u64, buffer); + for (char* p = buffer; p != end; ++p) + os_->Put(*p); + return true; + } + + bool WriteDouble(double d) { + char buffer[25]; + char* end = internal::dtoa(d, buffer); + for (char* p = buffer; p != end; ++p) + os_->Put(*p); + return true; + } + + bool WriteString(const Ch* str, SizeType length) { + static const char hexDigits[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + static const char escape[256] = { +#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + //0 1 2 3 4 5 6 7 8 9 A B C D E F + 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'b', 't', 'n', 'u', 'f', 'r', 'u', 'u', // 00 + 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', // 10 + 0, 0, '"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 20 + Z16, Z16, // 30~4F + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'\\', 0, 0, 0, // 50 + Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16 // 60~FF +#undef Z16 + }; + + os_->Put('\"'); + GenericStringStream<SourceEncoding> is(str); + while (is.Tell() < length) { + const Ch c = is.Peek(); + if (!TargetEncoding::supportUnicode && (unsigned)c >= 0x80) { + // Unicode escaping + unsigned codepoint; + if (!SourceEncoding::Decode(is, &codepoint)) + return false; + os_->Put('\\'); + os_->Put('u'); + if (codepoint <= 0xD7FF || (codepoint >= 0xE000 && codepoint <= 0xFFFF)) { + os_->Put(hexDigits[(codepoint >> 12) & 15]); + os_->Put(hexDigits[(codepoint >> 8) & 15]); + os_->Put(hexDigits[(codepoint >> 4) & 15]); + os_->Put(hexDigits[(codepoint ) & 15]); + } + else if (codepoint >= 0x010000 && codepoint <= 0x10FFFF) { + // Surrogate pair + unsigned s = codepoint - 0x010000; + unsigned lead = (s >> 10) + 0xD800; + unsigned trail = (s & 0x3FF) + 0xDC00; + os_->Put(hexDigits[(lead >> 12) & 15]); + os_->Put(hexDigits[(lead >> 8) & 15]); + os_->Put(hexDigits[(lead >> 4) & 15]); + os_->Put(hexDigits[(lead ) & 15]); + os_->Put('\\'); + os_->Put('u'); + os_->Put(hexDigits[(trail >> 12) & 15]); + os_->Put(hexDigits[(trail >> 8) & 15]); + os_->Put(hexDigits[(trail >> 4) & 15]); + os_->Put(hexDigits[(trail ) & 15]); + } + else + return false; // invalid code point + } + else if ((sizeof(Ch) == 1 || (unsigned)c < 256) && escape[(unsigned char)c]) { + is.Take(); + os_->Put('\\'); + os_->Put(escape[(unsigned char)c]); + if (escape[(unsigned char)c] == 'u') { + os_->Put('0'); + os_->Put('0'); + os_->Put(hexDigits[(unsigned char)c >> 4]); + os_->Put(hexDigits[(unsigned char)c & 0xF]); + } + } + else + Transcoder<SourceEncoding, TargetEncoding>::Transcode(is, *os_); + } + os_->Put('\"'); + return true; + } + + bool WriteStartObject() { os_->Put('{'); return true; } + bool WriteEndObject() { os_->Put('}'); return true; } + bool WriteStartArray() { os_->Put('['); return true; } + bool WriteEndArray() { os_->Put(']'); return true; } + + void Prefix(Type type) { + (void)type; + if (level_stack_.GetSize() != 0) { // this value is not at root + Level* level = level_stack_.template Top<Level>(); + if (level->valueCount > 0) { + if (level->inArray) + os_->Put(','); // add comma if it is not the first element in array + else // in object + os_->Put((level->valueCount % 2 == 0) ? ',' : ':'); + } + if (!level->inArray && level->valueCount % 2 == 0) + RAPIDJSON_ASSERT(type == kStringType); // if it's in object, then even number should be a name + level->valueCount++; + } + else { + RAPIDJSON_ASSERT(!hasRoot_); // Should only has one and only one root. + hasRoot_ = true; + } + } + + OutputStream* os_; + internal::Stack<StackAllocator> level_stack_; + bool hasRoot_; + +private: + // Prohibit copy constructor & assignment operator. + Writer(const Writer&); + Writer& operator=(const Writer&); +}; + +// Full specialization for StringStream to prevent memory copying + +template<> +inline bool Writer<StringBuffer>::WriteInt(int i) { + char *buffer = os_->Push(11); + const char* end = internal::i32toa(i, buffer); + os_->Pop(11 - (end - buffer)); + return true; +} + +template<> +inline bool Writer<StringBuffer>::WriteUint(unsigned u) { + char *buffer = os_->Push(10); + const char* end = internal::u32toa(u, buffer); + os_->Pop(10 - (end - buffer)); + return true; +} + +template<> +inline bool Writer<StringBuffer>::WriteInt64(int64_t i64) { + char *buffer = os_->Push(21); + const char* end = internal::i64toa(i64, buffer); + os_->Pop(21 - (end - buffer)); + return true; +} + +template<> +inline bool Writer<StringBuffer>::WriteUint64(uint64_t u) { + char *buffer = os_->Push(20); + const char* end = internal::u64toa(u, buffer); + os_->Pop(20 - (end - buffer)); + return true; +} + +template<> +inline bool Writer<StringBuffer>::WriteDouble(double d) { + char *buffer = os_->Push(25); + char* end = internal::dtoa(d, buffer); + os_->Pop(25 - (end - buffer)); + return true; +} + +RAPIDJSON_NAMESPACE_END + +#ifdef _MSC_VER +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_RAPIDJSON_H_ |