def check_compute_matches(tmp_path: pathlib2.Path, json_filename: str, is_android_1: bool, is_android_2: bool, spirvopt_options_1: str = None, spirvopt_options_2: str = None): out_dir_1 = tmp_path / 'out_1' out_dir_2 = tmp_path / 'out_2' args_1 = [ 'android' if is_android_1 else 'host', get_compute_samples_dir() + os.sep + json_filename, str(out_dir_1) ] args_2 = [ 'android' if is_android_2 else 'host', get_compute_samples_dir() + os.sep + json_filename, str(out_dir_2) ] if spirvopt_options_1: args_1.append('--spirvopt=' + spirvopt_options_1) if spirvopt_options_2: args_2.append('--spirvopt=' + spirvopt_options_2) runspv.main_helper(args_1) runspv.main_helper(args_2) assert is_success(out_dir_1) assert is_success(out_dir_2) ssbo_1 = get_ssbo_json(out_dir_1) ssbo_2 = get_ssbo_json(out_dir_2) # Check that the SSBO dictionaries are deep-equal assert ssbo_1 == ssbo_2
def test_no_serial_with_host(): # Check that --serial option cannot be passed with host target. with pytest.raises(ValueError) as value_error: runspv.main_helper( ['host', 'someshader.json', '--serial', 'ABCDEFG', 'out']) assert 'ValueError: "serial" option not compatible with "host" target' in str( value_error)
def test_error_vert_no_frag(tmp_path: pathlib2.Path): # Check for appropriate error when a vertex shader but no fragment shader is provided. json_path = make_empty_json(tmp_path) make_empty_file(tmp_path, "shader.vert.spv") with pytest.raises(ValueError) as value_error: runspv.main_helper(['host', str(json_path), str(tmp_path / 'out')]) assert 'ValueError: Vertex shader but no fragment shader found' in str( value_error)
def test_runspv_fails_if_comp_buffer_has_several_types( tmp_path: pathlib2.Path): with pytest.raises(ValueError) as value_error: runspv.main_helper([ 'host', get_compute_test('buffer-with-several-types.json'), str(tmp_path / 'out') ]) assert 'Amber only supports one type per buffer' in str(value_error)
def test_spirv_opt_fails_given_silly_argument_compute(tmp_path: pathlib2.Path): with pytest.raises(subprocess.CalledProcessError) as called_process_error: runspv.main_helper([ 'host', get_compute_samples_dir() + os.sep + 'comp-0001-findmax.json', str(tmp_path / 'out'), '--spirvopt=-ODOESNOTEXIST' ]) assert '-ODOESNOTEXIST is not a valid flag' in str( called_process_error)
def test_error_compute_and_vert(tmp_path: pathlib2.Path): # Check for appropriate error when both compute and vertex shaders are provided. json_path = make_empty_json(tmp_path) make_empty_file(tmp_path, "shader.comp.asm") make_empty_file(tmp_path, "shader.frag.spv") with pytest.raises(ValueError) as value_error: runspv.main_helper(['host', str(json_path), str(tmp_path / 'out')]) assert 'ValueError: Compute shader cannot coexist with vertex/fragment shaders' in str( value_error)
def test_error_compute_asm_and_glsl(tmp_path: pathlib2.Path): # Check for appropriate error when both .asm and .spv files are provided for a compute shader. json_path = make_empty_json(tmp_path, "shader") make_empty_file(tmp_path, "shader.comp.asm") make_empty_file(tmp_path, "shader.comp") with pytest.raises(ValueError) as value_error: runspv.main_helper(['host', str(json_path), str(tmp_path / 'out')]) assert 'ValueError: More than one of .comp, .comp.asm and .comp.spv are present' in str( value_error)
def test_spirv_opt_fails_given_silly_argument_image(tmp_path: pathlib2.Path): with pytest.raises(subprocess.CalledProcessError) as called_process_error: runspv.main_helper([ 'host', get_image_test('image_test_0001.json'), str(tmp_path / 'out'), '--spirvopt=-ODOESNOTEXIST' ]) assert '-ODOESNOTEXIST is not a valid flag' in str( called_process_error)
def test_error_frag_asm_and_spv(tmp_path: pathlib2.Path): # Check for appropriate error when both .asm and .spv files are provided for a fragment shader. json_path = make_empty_json(tmp_path) make_empty_file(tmp_path, "shader.vert.spv") make_empty_file(tmp_path, "shader.frag.asm") make_empty_file(tmp_path, "shader.frag.spv") with pytest.raises(ValueError) as value_error: runspv.main_helper(['host', str(json_path), str(tmp_path / 'out')]) assert 'ValueError: More than one of .frag, .frag.asm and .frag.spv are present' in str( value_error)
def simple_compute(tmp_path: pathlib2.Path, is_android: bool): out_dir = tmp_path / 'out' runspv.main_helper([ 'android' if is_android else 'host', get_compute_test('simple.json'), str(out_dir) ]) assert is_success(out_dir) ssbo_json = get_ssbo_json(out_dir) assert ssbo_json['ssbo'][0][0] == 42
def test_error_frag_no_vert_legacy(tmp_path: pathlib2.Path): # Check for appropriate error when a fragment shader but no vertex shader is provided. json_path = make_empty_json(tmp_path) make_empty_file(tmp_path, "shader.frag.asm") with pytest.raises(ValueError) as value_error: runspv.main_helper( ['host', str(json_path), str(tmp_path / 'out'), "--legacy-worker"]) assert 'ValueError: Fragment shader requires accompanying vertex shader when legacy worker is used' in str( value_error)
def test_no_compute_in_legacy(tmp_path: pathlib2.Path): # Check for appropriate error when legacy worker is attempted to be used with compute shader. json_path = make_empty_json(tmp_path) make_empty_file(tmp_path, "shader.comp") with pytest.raises(ValueError) as value_error: runspv.main_helper( ['host', str(json_path), str(tmp_path / 'out'), '--legacy-worker']) assert 'ValueError: Compute shaders are not supported with the legacy worker' in str( value_error)
def check_no_ssbo_skip_render(tmp_path: pathlib2.Path, is_android: bool, json_filename: str): out_dir = tmp_path / 'out' args = [ 'android' if is_android else 'host', get_compute_test(json_filename), str(out_dir), '--skip-render' ] runspv.main_helper(args) assert is_success(out_dir) # We used skip-render, so there should be no dumped SSBO. ssbo_json = out_dir / 'ssbo.json' assert not ssbo_json.exists()
def kogge_stone_compute(tmp_path: pathlib2.Path, is_android: bool): out_dir = tmp_path / 'out' runspv.main_helper([ 'android' if is_android else 'host', get_compute_samples_dir() + os.sep + 'comp-0004-koggestone.json', str(out_dir) ]) assert is_success(out_dir) ssbo_json = get_ssbo_json(out_dir) assert ssbo_json['ssbo'][0][0] == 0.0 assert ssbo_json['ssbo'][0][255] == 15.0 assert ssbo_json['ssbo'][1][0] == 0.0 assert ssbo_json['ssbo'][1][255] == 1920.0 assert ssbo_json['ssbo'][2][0] == 0
def sklansky_compute(tmp_path: pathlib2.Path, is_android: bool): out_dir = tmp_path / 'out' runspv.main_helper([ 'android' if is_android else 'host', get_compute_samples_dir() + os.sep + 'comp-0005-sklansky.json', str(out_dir) ]) assert is_success(out_dir) ssbo_json = get_ssbo_json(out_dir) assert ssbo_json['ssbo'][0][0] == 1 assert ssbo_json['ssbo'][1][0] == 0 assert ssbo_json['ssbo'][1][1] == 25 assert ssbo_json['ssbo'][1][199] == 100 assert ssbo_json['ssbo'][2][0] == 25 assert ssbo_json['ssbo'][2][199] == 24
def check_no_image_skip_render(tmp_path: pathlib2.Path, is_android: bool, is_legacy_worker: bool, json_filename: str): out_dir = tmp_path / 'out' args = [ 'android' if is_android else 'host', get_image_test(json_filename), str(out_dir), '--skip-render' ] if is_legacy_worker: args.append('--legacy-worker') runspv.main_helper(args) assert is_success(out_dir) image_file = out_dir / 'image_0.png' # We used skip-render, so there should be no image. assert not image_file.exists()
def red_image(tmp_path: pathlib2.Path, is_android: bool, is_legacy_worker: bool): out_dir = tmp_path / 'out' args = [ 'android' if is_android else 'host', get_image_test('image_test_0007.json'), str(out_dir) ] if is_legacy_worker: args.append('--legacy-worker') runspv.main_helper(args) assert is_success(out_dir) image_file = out_dir / 'image_0.png' assert image_file.exists() image = PIL.Image.open(str(image_file)).convert('RGB') r, g, b = image.getpixel((0, 0)) assert r == 255 assert g == 0 assert b == 0
def bubblesort_flag(tmp_path: pathlib2.Path, is_android: bool, is_legacy_worker: bool): out_dir = tmp_path / 'out' args = [ 'android' if is_android else 'host', get_image_test('image_test_0002.json'), str(out_dir) ] if is_legacy_worker: args.append('--legacy-worker') runspv.main_helper(args) assert is_success(out_dir) image_file = out_dir / 'image_0.png' assert image_file.exists() image = PIL.Image.open(str(image_file)).convert('RGB') r, g, b = image.getpixel((0, 0)) assert r in [24, 25, 26] assert g in [152, 153, 154] assert b in [254, 255]
def check_images_match(tmp_path: pathlib2.Path, json_filename: str, is_android_1: bool, is_android_2: bool, is_amber_1: bool, is_amber_2: bool, fuzzy_image_comparison: bool, spirvopt_options_1: str = None, spirvopt_options_2: str = None): out_dir_1 = tmp_path / 'out_1' out_dir_2 = tmp_path / 'out_2' args_1 = [ 'android' if is_android_1 else 'host', get_image_test(json_filename), str(out_dir_1) ] if not is_amber_1: args_1.append('--legacy-worker') if spirvopt_options_1: args_1.append('--spirvopt=' + spirvopt_options_1) args_2 = [ 'android' if is_android_2 else 'host', get_image_test(json_filename), str(out_dir_2) ] if not is_amber_2: args_2.append('--legacy-worker') if spirvopt_options_2: args_2.append('--spirvopt=' + spirvopt_options_2) runspv.main_helper(args_1) runspv.main_helper(args_2) assert is_success(out_dir_1) assert is_success(out_dir_2) assert images_match(out_dir_1, out_dir_2, fuzzy_image_comparison)
def red_image_no_vert(tmp_path: pathlib2.Path, is_android: bool): out_dir = tmp_path / 'out' # There should be a fragment shader... assert os.path.isfile(cmd_helpers.get_shaders_dir() + os.sep + 'testing' + os.sep + 'runspv' + os.sep + 'image' + os.sep + 'red_image_no_vert.frag') # ...but no vertex shader assert not os.path.isfile(cmd_helpers.get_shaders_dir() + os.sep + 'testing' + os.sep + 'runspv' + os.sep + 'image' + os.sep + 'red_image_no_vert.vert') args = [ 'android' if is_android else 'host', get_image_test('red_image_no_vert.json'), str(out_dir) ] runspv.main_helper(args) assert is_success(out_dir) image_file = out_dir / 'image_0.png' assert image_file.exists() image = PIL.Image.open(str(image_file)).convert('RGB') r, g, b = image.getpixel((0, 0)) assert r == 255 assert g == 0 assert b == 0
def test_error_no_shaders(tmp_path: pathlib2.Path): # Check for appropriate error when no .asm or .spv files are passed json_path = make_empty_json(tmp_path) with pytest.raises(ValueError) as value_error: runspv.main_helper(['host', str(json_path), str(tmp_path / 'out')]) assert 'ValueError: No shader files found' in str(value_error)
def test_error_bad_target(): # Check that an appropriate error is raised if a bad target (atari) is provided. with pytest.raises(ValueError) as value_error: runspv.main_helper(['atari', 'someshader.json', 'out']) assert 'ValueError: Target must be' in str(value_error)
def test_error_no_json(tmp_path: pathlib2.Path): # Check that an appropriate error is raised if the given JSON filename does not exist. with pytest.raises(ValueError) as value_error: runspv.main_helper(['host', str(tmp_path / 'someshader.json'), 'out']) assert 'ValueError: The given JSON file does not exist' in str(value_error)