1#!/usr/bin/env python2
2
3# Copyright (c) 2019 The Khronos Group Inc.
4# Use of this source code is governed by an MIT-style license that can be
5# found in the LICENSE.txt file.
6
7"""
8  Generator for tex-2d* and tex-3d* tests.
9  This file needs to be run in its folder.
10"""
11
12import os
13import os.path
14import sys
15
16_LICENSE = """<!--
17Copyright (c) 2019 The Khronos Group Inc.
18Use of this source code is governed by an MIT-style license that can be
19found in the LICENSE.txt file.
20-->
21
22"""
23
24_DO_NOT_EDIT_WARNING = """<!--
25
26This file is auto-generated from py/tex_image_test_generator.py
27DO NOT EDIT!
28
29-->
30
31"""
32
33_ELEMENT_TYPES = [
34  'canvas',
35  'canvas-sub-rectangle',
36  'image',
37  'image-data',
38  'svg-image',
39  'video',
40  'webgl-canvas',
41  'image-bitmap-from-image-data',
42  'image-bitmap-from-image',
43  'image-bitmap-from-video',
44  'image-bitmap-from-canvas',
45  'image-bitmap-from-blob',
46  'image-bitmap-from-image-bitmap'
47]
48
49_FORMATS_TYPES_WEBGL1 = [
50  {'internal_format': 'RGB', 'format': 'RGB', 'type': 'UNSIGNED_BYTE' },
51  {'internal_format': 'RGB', 'format': 'RGB', 'type': 'UNSIGNED_SHORT_5_6_5' },
52  {'internal_format': 'RGBA', 'format': 'RGBA', 'type': 'UNSIGNED_BYTE' },
53  {'internal_format': 'RGBA', 'format': 'RGBA', 'type': 'UNSIGNED_SHORT_4_4_4_4' },
54  {'internal_format': 'RGBA', 'format': 'RGBA', 'type': 'UNSIGNED_SHORT_5_5_5_1' },
55  {'internal_format': 'LUMINANCE',       'format': 'LUMINANCE',       'type': 'UNSIGNED_BYTE' },
56  {'internal_format': 'ALPHA',           'format': 'ALPHA',           'type': 'UNSIGNED_BYTE' },
57  {'internal_format': 'LUMINANCE_ALPHA', 'format': 'LUMINANCE_ALPHA', 'type': 'UNSIGNED_BYTE' },
58]
59
60_FORMATS_TYPES_WEBGL2 = [
61  {'internal_format': 'R8', 'format': 'RED', 'type': 'UNSIGNED_BYTE' },
62  {'internal_format': 'R16F', 'format': 'RED', 'type': 'HALF_FLOAT' },
63  {'internal_format': 'R16F', 'format': 'RED', 'type': 'FLOAT' },
64  {'internal_format': 'R32F', 'format': 'RED', 'type': 'FLOAT' },
65  {'internal_format': 'R8UI', 'format': 'RED_INTEGER', 'type': 'UNSIGNED_BYTE' },
66  {'internal_format': 'RG8', 'format': 'RG', 'type': 'UNSIGNED_BYTE' },
67  {'internal_format': 'RG16F', 'format': 'RG', 'type': 'HALF_FLOAT' },
68  {'internal_format': 'RG16F', 'format': 'RG', 'type': 'FLOAT' },
69  {'internal_format': 'RG32F', 'format': 'RG', 'type': 'FLOAT' },
70  {'internal_format': 'RG8UI', 'format': 'RG_INTEGER', 'type': 'UNSIGNED_BYTE' },
71  {'internal_format': 'RGB8', 'format': 'RGB', 'type': 'UNSIGNED_BYTE' },
72  {'internal_format': 'SRGB8', 'format': 'RGB', 'type': 'UNSIGNED_BYTE' },
73  {'internal_format': 'RGB565', 'format': 'RGB', 'type': 'UNSIGNED_BYTE' },
74  {'internal_format': 'RGB565', 'format': 'RGB', 'type': 'UNSIGNED_SHORT_5_6_5' },
75  {'internal_format': 'R11F_G11F_B10F', 'format': 'RGB', 'type': 'UNSIGNED_INT_10F_11F_11F_REV' },
76  {'internal_format': 'R11F_G11F_B10F', 'format': 'RGB', 'type': 'HALF_FLOAT' },
77  {'internal_format': 'R11F_G11F_B10F', 'format': 'RGB', 'type': 'FLOAT' },
78  {'internal_format': 'RGB9_E5', 'format': 'RGB', 'type': 'HALF_FLOAT' },
79  {'internal_format': 'RGB9_E5', 'format': 'RGB', 'type': 'FLOAT' },
80  {'internal_format': 'RGB16F', 'format': 'RGB', 'type': 'HALF_FLOAT' },
81  {'internal_format': 'RGB16F', 'format': 'RGB', 'type': 'FLOAT' },
82  {'internal_format': 'RGB32F', 'format': 'RGB', 'type': 'FLOAT' },
83  {'internal_format': 'RGB8UI', 'format': 'RGB_INTEGER', 'type': 'UNSIGNED_BYTE' },
84  {'internal_format': 'RGBA8', 'format': 'RGBA', 'type': 'UNSIGNED_BYTE' },
85  {'internal_format': 'SRGB8_ALPHA8', 'format': 'RGBA', 'type': 'UNSIGNED_BYTE' },
86  {'internal_format': 'RGB5_A1', 'format': 'RGBA', 'type': 'UNSIGNED_BYTE' },
87  {'internal_format': 'RGB5_A1', 'format': 'RGBA', 'type': 'UNSIGNED_SHORT_5_5_5_1' },
88  {'internal_format': 'RGB10_A2', 'format': 'RGBA', 'type': 'UNSIGNED_INT_2_10_10_10_REV' },
89  {'internal_format': 'RGBA4', 'format': 'RGBA', 'type': 'UNSIGNED_BYTE' },
90  {'internal_format': 'RGBA4', 'format': 'RGBA', 'type': 'UNSIGNED_SHORT_4_4_4_4' },
91  {'internal_format': 'RGBA16F', 'format': 'RGBA', 'type': 'HALF_FLOAT' },
92  {'internal_format': 'RGBA16F', 'format': 'RGBA', 'type': 'FLOAT' },
93  {'internal_format': 'RGBA32F', 'format': 'RGBA', 'type': 'FLOAT' },
94  {'internal_format': 'RGBA8UI', 'format': 'RGBA_INTEGER', 'type': 'UNSIGNED_BYTE' },
95]
96
97def GenerateFilename(dimension, element_type, internal_format, format, type):
98  """Generate test filename."""
99  filename = ("tex-" + dimension + "d-" +
100              internal_format + "-" + format + "-" + type + ".html")
101  return filename.lower()
102
103def WriteTest(filename, dimension, element_type, internal_format, format, type, default_context_version):
104  """Write one test."""
105  file = open(filename, "wb")
106  file.write(_LICENSE)
107  file.write(_DO_NOT_EDIT_WARNING)
108  code = """
109<!DOCTYPE html>
110<html>
111<head>
112<meta charset="utf-8">
113<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
114<script src="../../../js/js-test-pre.js"></script>
115<script src="../../../js/webgl-test-utils.js"></script>
116<script src="../../../js/tests/tex-image-and-sub-image-utils.js"></script>"""
117  if element_type == 'image-bitmap-from-image-data' or element_type == 'image-bitmap-from-image' or \
118     element_type == 'image-bitmap-from-video' or element_type == 'image-bitmap-from-canvas' or \
119     element_type == 'image-bitmap-from-blob' or element_type == 'image-bitmap-from-image-bitmap':
120    code += """
121<script src="../../../js/tests/tex-image-and-sub-image-with-image-bitmap-utils.js"></script>"""
122  code += """
123<script src="../../../js/tests/tex-image-and-sub-image-%(dimension)sd-with-%(element_type)s.js"></script>
124</head>
125<body>"""
126  if element_type == 'image-data':
127    code += """
128<canvas id="texcanvas" width="2" height="2"></canvas>"""
129  code += """
130<canvas id="example" width="32" height="32"></canvas>"""
131  code += """
132<div id="description"></div>
133<div id="console"></div>
134<script>
135"use strict";
136function testPrologue(gl) {
137    return true;
138}
139
140generateTest("%(internal_format)s", "%(format)s", "%(type)s", testPrologue, "../../../resources/", %(default_context_version)s)();
141</script>
142</body>
143</html>
144"""
145  file.write(code % {
146    'dimension': dimension,
147    'element_type': element_type,
148    'internal_format': internal_format,
149    'format': format,
150    'type': type,
151    'default_context_version': default_context_version,
152  })
153  file.close()
154
155def GenerateTests(test_dir, test_cases, dimension, default_context_version):
156  test_dir_template = test_dir + '/%s'
157  for element_type in _ELEMENT_TYPES:
158    os.chdir(test_dir_template % element_type.replace('-', '_'))
159    if dimension == '3':
160      # Assume we write 2D tests first.
161      index_file = open("00_test_list.txt", "ab")
162    else:
163      index_file = open("00_test_list.txt", "wb")
164    for tex_info in test_cases:
165      internal_format = tex_info['internal_format']
166      format = tex_info['format']
167      type = tex_info['type']
168      filename = GenerateFilename(dimension, element_type, internal_format, format, type)
169      index_file.write(filename)
170      index_file.write('\n')
171      WriteTest(filename, dimension, element_type, internal_format, format, type, default_context_version)
172    index_file.close();
173
174def main(argv):
175  """This is the main function."""
176  py_dir = os.path.dirname(os.path.realpath(__file__))
177  GenerateTests(os.path.realpath(py_dir + '/../conformance/textures'), _FORMATS_TYPES_WEBGL1, '2', '1')
178  GenerateTests(os.path.realpath(py_dir + '/../conformance2/textures'), _FORMATS_TYPES_WEBGL2, '2', '2')
179  GenerateTests(os.path.realpath(py_dir + '/../conformance2/textures'), _FORMATS_TYPES_WEBGL2, '3', '2')
180
181if __name__ == '__main__':
182  sys.exit(main(sys.argv[1:]))
183