blob: def346fc11d0e21478d5b33ca44e1cc9445dde33 [file] [log] [blame] [edit]
# Copyright (c) 2012 The Chromium OS 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 os, re
from autotest_lib.client.bin import test, utils
from autotest_lib.client.common_lib import error
from autotest_lib.client.cros import cros_ui
from autotest_lib.client.cros.graphics import graphics_utils
class graphics_GLAPICheck(test.test):
"""
Verify correctness of OpenGL/GLES and X11 versions/extensions.
"""
version = 1
preserve_srcdir = True
error_message = ""
GSC = None
def setup(self):
os.chdir(self.srcdir)
utils.make('clean')
utils.make('all')
def __check_extensions(self, info, ext_entries):
info_split = info.split()
comply = True
for extension in ext_entries:
match = extension in info_split
if not match:
self.error_message += " " + extension
comply = False
return comply
def __check_gl_extensions_1x(self, info):
extensions = [
'GL_ARB_vertex_buffer_object',
'GL_ARB_shader_objects',
'GL_ARB_texture_non_power_of_two',
'GL_ARB_point_sprite',
'GL_EXT_framebuffer_object',
'GLX_EXT_texture_from_pixmap'
]
return self.__check_extensions(info, extensions)
def __check_gl_extensions_2x(self, info):
extensions = [
'GL_EXT_framebuffer_object',
'GLX_EXT_texture_from_pixmap'
]
return self.__check_extensions(info, extensions)
def __check_gles_extensions(self, info):
extensions = [
'GL_OES_EGL_image',
'EGL_KHR_image'
]
extensions2 = [
'GL_OES_EGL_image',
'EGL_KHR_image_base',
'EGL_KHR_image_pixmap'
]
return (self.__check_extensions(info, extensions) or
self.__check_extensions(info, extensions2))
def __check_gl(self, result):
version = re.findall(r"GL_VERSION = ([0-9]+).([0-9]+).+", result)
if version:
version_major = int(version[0][0])
version_minor = int(version[0][1])
version_info = (" GL_VERSION = %d.%d" %
(version_major, version_minor))
if version_major == 1:
if version_minor < 4:
self.error_message = version_info
return False
return self.__check_gl_extensions_1x(result)
elif version_major >= 2:
return self.__check_gl_extensions_2x(result)
else:
self.error_message = version_info
return False
# No GL version info found.
self.error_message = " missing GL version info"
return False
def __check_gles(self, result):
version = re.findall(r"GLES_VERSION = OpenGL ES.* ([0-9]+).([0-9]+)",
result)
if version:
# GLES version has to be 2.0 or above.
version_major = int(version[0][0])
version_minor = int(version[0][1])
version_info = (" GLES_VERSION = %d.%d" %
(version_major, version_minor))
if version_major < 2:
self.error_message = version_info
return False;
# EGL version has to be 1.3 or above.
version = re.findall(r"EGL_VERSION = ([0-9]+).([0-9]+)", result)
if version:
version_major = int(version[0][0])
version_minor = int(version[0][1])
version_info = ("EGL_VERSION = %d.%d" %
(version_major, version_minor))
if (version_major == 1 and version_minor >= 3 or
version_major > 1):
return self.__check_gles_extensions(result)
else:
self.error_message = version_info
return False
# No EGL version info found.
self.error_message = " missing EGL version info"
return False
# No GLES version info found.
self.error_message = " missing GLES version info"
return False
def __check_x_extensions(self, result):
extensions = [
'DAMAGE',
'Composite'
]
return self.__check_extensions(result, extensions)
def __run_x_cmd(self, cmd):
cmd = cros_ui.xcommand(cmd)
result = utils.system_output(cmd, retain_output=True,
ignore_status=True)
return result
def initialize(self):
self.GSC = graphics_utils.GraphicsStateChecker()
def cleanup(self):
if self.GSC:
self.GSC.finalize()
def run_once(self):
test_done = False
cmd_gl = os.path.join(self.bindir, 'gl_APICheck')
cmd_gles = os.path.join(self.bindir, 'gles_APICheck')
exist_gl = os.path.isfile(cmd_gl)
exist_gles = os.path.isfile(cmd_gles)
if not exist_gl and not exist_gles:
raise error.TestFail('Found neither gl_APICheck nor gles_APICheck. '
'Test setup error.')
elif exist_gl and exist_gles:
raise error.TestFail('Found both gl_APICheck and gles_APICheck. '
'Test setup error.')
elif exist_gl:
self.error_message = ""
result = self.__run_x_cmd(cmd_gl)
errors = re.findall(r"ERROR: ", result)
run_through = re.findall(r"SUCCEED: run to the end", result)
if not errors and run_through:
check_result = self.__check_gl(result)
if not check_result:
raise error.TestFail('GL API insufficient:' +
self.error_message)
else:
raise error.TestFail('gl_APICheck error: ' + result)
else:
self.error_message = ""
# TODO(zmo@): smarter mechanism with GLES & EGL library names.
result = self.__run_x_cmd(cmd_gles + ' libGLESv2.so libEGL.so')
errors = re.findall(r"ERROR: ", result)
run_through = re.findall(r"SUCCEED: run to the end", result)
if not errors and run_through:
check_result = self.__check_gles(result)
if not check_result:
raise error.TestFail('GLES API insufficient:' +
self.error_message)
else:
raise error.TestFail('gles_APICheck error: ' + result)
# Check X11 extensions.
self.error_message = ""
check_result = self.__check_x_extensions(result)
if not check_result:
raise error.TestFail('X extensions insufficient:' +
self.error_message)