# 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 logging import os import re from autotest_lib.client.bin import test, utils from autotest_lib.client.common_lib import error 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 = graphics_utils.xcommand(cmd) result = utils.system_output(cmd, retain_output=True, ignore_status=True) return result def __check_wflinfo(self): # TODO(ihf): Extend this function once gl(es)_APICheck code has # been upstreamed to waffle. version_major, version_minor = graphics_utils.get_gles_version() if version_major: version_info = ('GLES_VERSION = %d.%d' % (version_major, version_minor)) logging.info(version_info) # GLES version has to be 2.0 or above. if version_major < 2: self.error_message = ' %s' % version_info return False version_major, version_minor = graphics_utils.get_egl_version() if version_major: version_info = ('EGL_VERSION = %d.%d' % (version_major, version_minor)) logging.info(version_info) # EGL version has to be 1.3 or above. if (version_major == 1 and version_minor >= 3 or version_major > 1): logging.warning('Please add missing extension check. ' 'Details crbug.com/413079') # return self.__check_gles_extensions(wflinfo + eglinfo) return True 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 initialize(self): self.GSC = graphics_utils.GraphicsStateChecker() def cleanup(self): if self.GSC: self.GSC.finalize() def run_once(self): if utils.is_freon(): if not self.__check_wflinfo(): raise error.TestFail('Failed: GLES API insufficient:' + self.error_message) return # TODO(ihf): Remove this once all boards are switched to freon. 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( 'Failed: Found neither gl_APICheck nor gles_APICheck. ' 'Test setup error.') elif exist_gl and exist_gles: raise error.TestFail( 'Failed: 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('Failed: GL API insufficient:' + self.error_message) else: raise error.TestFail('Failed: 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('Failed: GLES API insufficient:' + self.error_message) else: raise error.TestFail('Failed: gles_APICheck error: ' + result) # Check X11 extensions. self.error_message = '' check_result = self.__check_x_extensions(result) if not check_result: raise error.TestFail('Failed: X extensions insufficient:' + self.error_message)