Пример #1
0
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
Пример #2
0
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)
Пример #3
0
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)
Пример #4
0
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)
Пример #5
0
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)
Пример #6
0
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)
Пример #7
0
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)
Пример #8
0
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)
Пример #9
0
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)
Пример #10
0
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
Пример #11
0
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)
Пример #12
0
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)
Пример #13
0
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()
Пример #14
0
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
Пример #15
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
Пример #16
0
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()
Пример #17
0
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
Пример #18
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]
Пример #19
0
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)
Пример #20
0
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
Пример #21
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)
Пример #22
0
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)
Пример #23
0
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)