Skip to content

Commit 8be7a4c

Browse files
null77Commit Bot
authored and
Commit Bot
committed
Re-land "Vulkan: SwiftShader integration."
Re-land fixes Win7 configs and placement of the SwiftShader module for ASAN/TSAN configs. Adds a new EGL extension for picking SwiftShader when using the Vulkan back-end. Also cleans up ICD enabling code RendererVk. Also includes a change to a buffer size necessary to support SwiftShader's minimum limits. Bug: angleproject:3876 Bug: b/140251624 Change-Id: I5e16057ac4de07bbdbbd248542b1b9103133294f Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1810065 Commit-Queue: Jamie Madill <[email protected]> Reviewed-by: Geoff Lang <[email protected]>
1 parent 3414820 commit 8be7a4c

19 files changed

+296
-53
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
/third_party/rapidjson/src
4545
/third_party/spirv-headers/src
4646
/third_party/spirv-tools/src
47+
/third_party/SwiftShader
4748
/third_party/vulkan-headers/src
4849
/third_party/vulkan-loader/src
4950
/third_party/vulkan-tools/src

BUILD.gn

+64-6
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ declare_args() {
2929
# Don't build extra (test, samples etc) for Windows UWP. We don't have
3030
# infrastructure (e.g. windowing helper functions) in place to run them.
3131
angle_build_all = !angle_is_winuwp
32+
33+
# Currently SwiftShader's Vulkan front-end doesn't build on Android.
34+
angle_swiftshader = !is_android
3235
}
3336

3437
if (!build_with_chromium && angle_build_all) {
@@ -548,23 +551,73 @@ if (angle_enable_vulkan) {
548551
defines = [
549552
"ANGLE_VK_LAYERS_DIR=\"$angle_data_dir\"",
550553
"ANGLE_VK_MOCK_ICD_JSON=\"$angle_data_dir/VkICD_mock_icd.json\"",
554+
"ANGLE_VK_SWIFTSHADER_ICD_JSON=\"swiftshader/libvk_swiftshader_icd.json\"",
551555
]
552556
if (is_android) {
553557
libs = [ "vulkan" ]
554558
}
555559
}
556560

561+
if (angle_swiftshader) {
562+
copy("angle_swiftshader_icd_rename") {
563+
sources = [
564+
"$swiftshader_dir/src/Vulkan/vk_swiftshader_icd.json",
565+
]
566+
outputs = [
567+
"$root_gen_dir/angle/libvk_swiftshader_icd.json",
568+
]
569+
}
570+
571+
action("angle_swiftshader_icd") {
572+
deps = [
573+
":angle_swiftshader_icd_rename",
574+
]
575+
script = "scripts/generate_vulkan_layers_json.py"
576+
sources = [
577+
"third_party/vulkan-headers/src/include/vulkan/vulkan_core.h",
578+
]
579+
580+
# Must be listed after vulkan_core.h. git cl format sorts them if they
581+
# are in one list. So split up the sources manually.
582+
sources += [ "$root_gen_dir/angle/libvk_swiftshader_icd.json" ]
583+
584+
outputs = [
585+
"$root_out_dir/swiftshader/libvk_swiftshader_icd.json",
586+
]
587+
data = outputs
588+
589+
_raw_sws_in = rebase_path("$root_gen_dir/angle", root_build_dir)
590+
_raw_sws_out = rebase_path("$root_out_dir/swiftshader", root_build_dir)
591+
592+
_sws_output = ""
593+
if (is_win) {
594+
_sws_output += "vk_swiftshader.dll"
595+
} else if (is_mac) {
596+
_sws_output += "libvk_swiftshader.dylib"
597+
} else {
598+
_sws_output += "libvk_swiftshader.so"
599+
}
600+
601+
args = [
602+
"--icd",
603+
"--replacement",
604+
_sws_output,
605+
_raw_sws_in,
606+
_raw_sws_out,
607+
] + rebase_path(sources, root_build_dir)
608+
}
609+
}
610+
557611
# Use this target to include everything ANGLE needs for Vulkan.
558612
group("angle_vulkan") {
559613
public_deps = [
560614
"$angle_root/third_party/vulkan-headers:vulkan_headers",
561615
]
562616
public_configs = [ ":vulkan_config" ]
617+
deps = []
563618
data_deps = []
564619
if (!is_android && !is_fuchsia) {
565-
deps = [
566-
"$angle_root/third_party/vulkan-loader:libvulkan",
567-
]
620+
deps += [ "$angle_root/third_party/vulkan-loader:libvulkan" ]
568621
data_deps += [ "$angle_root/third_party/vulkan-tools:VkICD_mock_icd" ]
569622
public_configs +=
570623
[ "$angle_root/third_party/vulkan-loader:vulkan_loader_config" ]
@@ -579,16 +632,21 @@ if (angle_enable_vulkan) {
579632

580633
if (angle_enable_vulkan_validation_layers) {
581634
if (is_fuchsia) {
582-
deps = [
583-
"//third_party/fuchsia-sdk:vulkan_validation",
584-
]
635+
deps += [ "//third_party/fuchsia-sdk:vulkan_validation" ]
585636
} else {
586637
data_deps += [ "$angle_root/third_party/vulkan-validation-layers:vulkan_validation_layers" ]
587638
if (!is_android) {
588639
data_deps += [ "$angle_root/third_party/vulkan-validation-layers:vulkan_gen_json_files" ]
589640
}
590641
}
591642
}
643+
644+
if (angle_swiftshader) {
645+
deps += [
646+
":angle_swiftshader_icd",
647+
"$swiftshader_dir/src/Vulkan:swiftshader_libvulkan",
648+
]
649+
}
592650
}
593651
}
594652

DEPS

+6
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
vars = {
66
'android_git': 'https://android.googlesource.com',
77
'chromium_git': 'https://chromium.googlesource.com',
8+
'swiftshader_git': 'https://swiftshader.googlesource.com',
89

910
# This variable is set on the Chrome infra for compatiblity with gclient.
1011
'angle_root': '.',
@@ -160,6 +161,11 @@ deps = {
160161
'condition': 'not build_with_chromium',
161162
},
162163

164+
'{angle_root}/third_party/SwiftShader': {
165+
'url': '{swiftshader_git}/SwiftShader@2ef66b69cea535329784f437c3780e473e6a4e29',
166+
'condition': 'not build_with_chromium',
167+
},
168+
163169
'{angle_root}/third_party/vulkan-headers/src': {
164170
'url': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Headers@{vulkan_headers_revision}',
165171
},

build_overrides/swiftshader.gni

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# Copyright 2019 The ANGLE Project Authors. All rights reserved.
2+
# Use of this source code is governed by a BSD-style license that can be
3+
# found in the LICENSE file.
4+
5+
# We are building SwiftShader in ANGLE
6+
swiftshader_standalone = false
7+
8+
# Path to SwiftShader
9+
swiftshader_dir = "//third_party/SwiftShader"
10+
11+
# Paths to SwiftShader dependencies
12+
swiftshader_spirv_tools_dir = "//third_party/spirv-tools/src"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
Name
2+
3+
ANGLE_platform_angle_device_type_swiftshader
4+
5+
Name Strings
6+
7+
EGL_ANGLE_platform_angle_device_type_swiftshader
8+
9+
Contributors
10+
11+
Jamie Madill, Google
12+
13+
Contacts
14+
15+
Jamie Madill, Google (jmadill 'at' google 'dot' com)
16+
17+
Status
18+
19+
Draft
20+
21+
Version
22+
23+
Version 1, 2019-08-24
24+
25+
Number
26+
27+
EGL Extension XXX
28+
29+
Extension Type
30+
31+
EGL client extension
32+
33+
Dependencies
34+
35+
Requires EGL_ANGLE_platform_angle_vulkan.
36+
37+
Overview
38+
39+
This extension enables choosing the SwiftShader Vulkan implementation
40+
when it is available.
41+
42+
New Types
43+
44+
None
45+
46+
New Procedures and Functions
47+
48+
None
49+
50+
New Tokens
51+
52+
Accepted as values for the EGL_PLATFORM_ANGLE_TYPE_ANGLE attribute:
53+
54+
EGL_PLATFORM_ANGLE_DEVICE_TYPE_SWIFTSHADER_ANGLE 0x3487
55+
56+
Additions to the EGL Specification
57+
58+
None.
59+
60+
New Behavior
61+
62+
When calling eglGetPlatformDisplay:
63+
64+
To request a SwiftShader-backed Vulkan implementation with ANGLE, the value
65+
of EGL_PLATFORM_ANGLE_TYPE_ANGLE should be EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE
66+
and the value of EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE should be
67+
EGL_PLATFORM_ANGLE_DEVICE_TYPE_SWIFTSHADER_ANGLE.
68+
69+
If EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE is
70+
EGL_PLATFORM_ANGLE_DEVICE_TYPE_SWIFTSHADER_ANGLE and
71+
EGL_PLATFORM_ANGLE_TYPE_ANGLE is not
72+
EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE then an EGL_BAD_ATTRIBUTE
73+
error is generated and EGL_NO_DISPLAY is returned.
74+
75+
Issues
76+
77+
None
78+
79+
Revision History
80+
81+
Version 1, 2019-08-29 (Jamie Madill)
82+
- Initial draft

gni/angle.gni

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import("//build/config/sanitizers/sanitizers.gni")
77
import("//build/config/ui.gni") # import the use_x11 variable
88
import("//build_overrides/angle.gni")
99
import("//build_overrides/build.gni")
10+
import("//build_overrides/swiftshader.gni")
1011
import("//testing/test.gni")
1112
if (is_android) {
1213
import("//build/config/android/config.gni")

include/EGL/eglext_angle.h

+5
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,11 @@
8282
#define EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE 0x3450
8383
#endif /* EGL_ANGLE_platform_angle_vulkan */
8484

85+
#ifndef EGL_ANGLE_platform_angle_device_type_swiftshader
86+
#define EGL_ANGLE_platform_angle_device_type_swiftshader
87+
#define EGL_PLATFORM_ANGLE_DEVICE_TYPE_SWIFTSHADER_ANGLE 0x3487
88+
#endif /* EGL_ANGLE_platform_angle_device_type_swiftshader */
89+
8590
#ifndef EGL_ANGLE_platform_angle_context_virtualization
8691
#define EGL_ANGLE_platform_angle_context_virtualization 1
8792
#define EGL_PLATFORM_ANGLE_CONTEXT_VIRTUALIZATION_ANGLE 0x3481

scripts/generate_vulkan_layers_json.py

+16-10
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ def main():
2828
parser.add_argument('target_dir')
2929
parser.add_argument('version_header', help='path to vulkan_core.h')
3030
parser.add_argument('json_files', nargs='*')
31+
parser.add_argument('--replacement', help='replacement for the library', default=None)
3132
args = parser.parse_args()
3233

3334
source_dir = args.source_dir
@@ -46,7 +47,8 @@ def main():
4647
os.makedirs(target_dir)
4748

4849
# Copy the *.json files from source dir to target dir
49-
if (set(glob_slash(os.path.join(source_dir, '*.json'))) != set(json_files)):
50+
if (set(glob_slash(os.path.join(source_dir, '*.json'))) !=
51+
set(json_files)) and data_key != 'ICD':
5052
print(glob.glob(os.path.join(source_dir, '*.json')))
5153
print('.json list in gn file is out-of-date', file=sys.stderr)
5254
return 1
@@ -64,7 +66,10 @@ def main():
6466
# The standard validation layer has no library path.
6567
if 'library_path' in data[data_key]:
6668
prev_name = os.path.basename(data[data_key]['library_path'])
67-
data[data_key]['library_path'] = prev_name
69+
if args.replacement:
70+
data[data_key]['library_path'] = args.replacement
71+
else:
72+
data[data_key]['library_path'] = prev_name
6873

6974
target_fname = os.path.join(target_dir, os.path.basename(json_fname))
7075
with open(target_fname, 'wb') as outfile:
@@ -73,14 +78,15 @@ def main():
7378
# Get the Vulkan version from the vulkan_core.h file
7479
vk_header_filename = args.version_header
7580
vk_version = None
76-
with open(vk_header_filename) as vk_header_file:
77-
for line in vk_header_file:
78-
if line.startswith('#define VK_HEADER_VERSION'):
79-
vk_version = line.split()[-1]
80-
break
81-
if not vk_version:
82-
print('failed to extract vk_version', file=sys.stderr)
83-
return 1
81+
if data_key != 'ICD':
82+
with open(vk_header_filename) as vk_header_file:
83+
for line in vk_header_file:
84+
if line.startswith('#define VK_HEADER_VERSION'):
85+
vk_version = line.split()[-1]
86+
break
87+
if not vk_version:
88+
print('failed to extract vk_version', file=sys.stderr)
89+
return 1
8490

8591
# Set json file prefix and suffix for generating files, default to Linux.
8692
relative_path_prefix = '../lib'

src/libANGLE/Caps.cpp

+19-18
Original file line numberDiff line numberDiff line change
@@ -1247,24 +1247,25 @@ std::vector<std::string> ClientExtensions::getStrings() const
12471247
std::vector<std::string> extensionStrings;
12481248

12491249
// clang-format off
1250-
// | Extension name | Supported flag | Output vector |
1251-
InsertExtensionString("EGL_EXT_client_extensions", clientExtensions, &extensionStrings);
1252-
InsertExtensionString("EGL_EXT_platform_base", platformBase, &extensionStrings);
1253-
InsertExtensionString("EGL_EXT_platform_device", platformDevice, &extensionStrings);
1254-
InsertExtensionString("EGL_ANGLE_platform_angle", platformANGLE, &extensionStrings);
1255-
InsertExtensionString("EGL_ANGLE_platform_angle_d3d", platformANGLED3D, &extensionStrings);
1256-
InsertExtensionString("EGL_ANGLE_platform_angle_opengl", platformANGLEOpenGL, &extensionStrings);
1257-
InsertExtensionString("EGL_ANGLE_platform_angle_null", platformANGLENULL, &extensionStrings);
1258-
InsertExtensionString("EGL_ANGLE_platform_angle_vulkan", platformANGLEVulkan, &extensionStrings);
1259-
InsertExtensionString("EGL_ANGLE_platform_angle_context_virtualization", platformANGLEContextVirtualization, &extensionStrings);
1260-
InsertExtensionString("EGL_ANGLE_device_creation", deviceCreation, &extensionStrings);
1261-
InsertExtensionString("EGL_ANGLE_device_creation_d3d11", deviceCreationD3D11, &extensionStrings);
1262-
InsertExtensionString("EGL_ANGLE_x11_visual", x11Visual, &extensionStrings);
1263-
InsertExtensionString("EGL_ANGLE_experimental_present_path", experimentalPresentPath, &extensionStrings);
1264-
InsertExtensionString("EGL_KHR_client_get_all_proc_addresses", clientGetAllProcAddresses, &extensionStrings);
1265-
InsertExtensionString("EGL_KHR_debug", debug, &extensionStrings);
1266-
InsertExtensionString("EGL_ANGLE_explicit_context", explicitContext, &extensionStrings);
1267-
InsertExtensionString("EGL_ANGLE_feature_control", featureControlANGLE, &extensionStrings);
1250+
// | Extension name | Supported flag | Output vector |
1251+
InsertExtensionString("EGL_EXT_client_extensions", clientExtensions, &extensionStrings);
1252+
InsertExtensionString("EGL_EXT_platform_base", platformBase, &extensionStrings);
1253+
InsertExtensionString("EGL_EXT_platform_device", platformDevice, &extensionStrings);
1254+
InsertExtensionString("EGL_ANGLE_platform_angle", platformANGLE, &extensionStrings);
1255+
InsertExtensionString("EGL_ANGLE_platform_angle_d3d", platformANGLED3D, &extensionStrings);
1256+
InsertExtensionString("EGL_ANGLE_platform_angle_device_type_swiftshader", platformANGLEDeviceTypeSwiftShader, &extensionStrings);
1257+
InsertExtensionString("EGL_ANGLE_platform_angle_opengl", platformANGLEOpenGL, &extensionStrings);
1258+
InsertExtensionString("EGL_ANGLE_platform_angle_null", platformANGLENULL, &extensionStrings);
1259+
InsertExtensionString("EGL_ANGLE_platform_angle_vulkan", platformANGLEVulkan, &extensionStrings);
1260+
InsertExtensionString("EGL_ANGLE_platform_angle_context_virtualization", platformANGLEContextVirtualization, &extensionStrings);
1261+
InsertExtensionString("EGL_ANGLE_device_creation", deviceCreation, &extensionStrings);
1262+
InsertExtensionString("EGL_ANGLE_device_creation_d3d11", deviceCreationD3D11, &extensionStrings);
1263+
InsertExtensionString("EGL_ANGLE_x11_visual", x11Visual, &extensionStrings);
1264+
InsertExtensionString("EGL_ANGLE_experimental_present_path", experimentalPresentPath, &extensionStrings);
1265+
InsertExtensionString("EGL_KHR_client_get_all_proc_addresses", clientGetAllProcAddresses, &extensionStrings);
1266+
InsertExtensionString("EGL_KHR_debug", debug, &extensionStrings);
1267+
InsertExtensionString("EGL_ANGLE_explicit_context", explicitContext, &extensionStrings);
1268+
InsertExtensionString("EGL_ANGLE_feature_control", featureControlANGLE, &extensionStrings);
12681269
// clang-format on
12691270

12701271
return extensionStrings;

src/libANGLE/Caps.h

+3
Original file line numberDiff line numberDiff line change
@@ -1002,6 +1002,9 @@ struct ClientExtensions
10021002

10031003
// EGL_ANGLE_feature_control
10041004
bool featureControlANGLE = false;
1005+
1006+
// EGL_ANGLE_platform_angle_device_type_swiftshader
1007+
bool platformANGLEDeviceTypeSwiftShader = false;
10051008
};
10061009

10071010
} // namespace egl

src/libANGLE/Display.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -1241,7 +1241,8 @@ static ClientExtensions GenerateClientExtensions()
12411241
#endif
12421242

12431243
#if defined(ANGLE_ENABLE_VULKAN)
1244-
extensions.platformANGLEVulkan = true;
1244+
extensions.platformANGLEVulkan = true;
1245+
extensions.platformANGLEDeviceTypeSwiftShader = true;
12451246
#endif
12461247

12471248
#if defined(ANGLE_USE_X11)

src/libANGLE/renderer/vulkan/ProgramVk.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1534,7 +1534,7 @@ angle::Result ProgramVk::updateTransformFeedbackDescriptorSet(ContextVk *context
15341534

15351535
void ProgramVk::updateTransformFeedbackDescriptorSetImpl(ContextVk *contextVk)
15361536
{
1537-
const gl::State &glState = contextVk->getState();
1537+
const gl::State &glState = contextVk->getState();
15381538
gl::TransformFeedback *transformFeedback = glState.getCurrentTransformFeedback();
15391539

15401540
if (!hasTransformFeedbackOutput())

0 commit comments

Comments
 (0)