QSB 手册
qsb 是QtShader Tools模块提供的一款命令行工具。它可集成glslang和SPIRV-Cross 等第三方库,可选地调用外部工具(例如fxc 或spirv-opt ),并生成.qsb 文件。此外,它还可用于检查.qsb 包的内容。
Usage: qsb [options] file
Qt Shader Baker (using QShader from Qt 6.10.0)
Options:
-?, -h, --help Displays help on commandline options.
--help-all Displays help, including generic Qt options.
-v, --version Displays version information.
-b, --batchable Also generates rewritten vertex shader for Qt
Quick scene graph batching.
--zorder-loc <location> The extra vertex input location when rewriting
for batching. Defaults to 7.
--glsl <versions> Comma separated list of GLSL versions to
generate. (for example, "100 es,120,330")
--hlsl <versions> Comma separated list of HLSL (Shader Model)
versions to generate. F.ex. 50 is 5.0, 51 is 5.1.
--msl <versions> Comma separated list of Metal Shading Language
versions to generate. F.ex. 12 is 1.2, 20 is 2.0.
--qt6 Equivalent to --glsl "100 es,120,150" --hlsl 50
--msl 12. This set is commonly used with shaders
for Qt Quick materials and effects.
--msltess Indicates that a vertex shader is going to be
used in a pipeline with tessellation. Mandatory
for vertex shaders planned to be used with
tessellation when targeting Metal (--msl).
--tess-vertex-count <count> The output vertex count from the tessellation
control stage. Mandatory for tessellation
evaluation shaders planned to be used with Metal.
The default value is 3. If it does not match the
tess.control stage, the generated MSL code will
not function as expected.
--tess-mode <mode> The tessellation mode: triangles or quads.
Mandatory for tessellation control shaders
planned to be used with Metal. The default value
is triangles. Isolines are not supported with
Metal. If it does not match the tess.evaluation
stage, the generated MSL code will not function
as expected.
--view-count <num_views> The number of views the shader is used with.
num_views must be >= 2. Mandatory when multiview
rendering is used (gl_ViewIndex). Set only for
vertex shaders that really do rely on multiview
(as the resulting asset is tied to num_views).
Can be set for fragment shaders too, to get
QSHADER_VIEW_COUNT auto-defined. (useful for
ensuring uniform buffer layouts)
-g Generate full debug info for SPIR-V and DXBC
-O Invoke spirv-opt (external tool) to optimize
SPIR-V for performance.
-o, --output <filename> Output file for the shader pack.
--orig-file <filename> Filename to be be used for dependency tracking
instead of <file>.
--qsbversion <version> QSB version to use for the output file. By
default the latest version is automatically used,
use only to bake compatibility versions. F.ex. 64
is Qt 6.4.
-c, --fxc In combination with --hlsl invokes fxc (SM
5.0/5.1) or dxc (SM 6.0+) to store DXBC or DXIL
instead of HLSL.
-t, --metallib In combination with --msl builds a Metal library
with xcrun metal(lib) and stores that instead of
the source. Suitable only when targeting macOS,
not iOS.
-T, --metallib-ios In combination with --msl builds a Metal library
with xcrun metal(lib) and stores that instead of
the source. Suitable only when targeting iOS, not
macOS.
-D, --define <name[=value]> Define macro. This argument can be specified
multiple times.
-p, --per-target Enable per-target compilation. (instead of
source->SPIRV->targets, do source->SPIRV->target
separately for each target)
-d, --dump Switches to dump mode. Input file is expected to
be a shader pack.
-x, --extract <what> Switches to extract mode. Input file is expected
to be a shader pack. Result is written to the
output specified by -o. Pass -b to choose the
batchable variant.
<what>=reflect|spirv,<version>|glsl,<version>|...
-r, --replace <what> Switches to replace mode. Replaces the specified
shader in the shader pack with the contents of a
file. This argument can be specified multiple
times. Pass -b to choose the batchable variant.
Also supports adding a shader for a
target/variant that was not present before.
<what>=<target>,<filename> where
<target>=spirv,<version>|glsl,<version>|...
-e, --erase <what> Switches to erase mode. Removes the specified
shader from the shader pack. Pass -b to choose
the batchable variant.
<what>=spirv,<version>|glsl,<version>|...
-s, --silent Enables silent mode. Only fatal errors will be
printed.
--mediump Default to medium precision for floats in
fragment shaders instead of high. GLSL ES only;
ignored for everything else, including GLSL.
--depfile <depfile> Enables generating the depfile for the input
shaders, using the #include statements.
Arguments:
file Vulkan GLSL source file to compile. The file
extension determines the shader stage, and can be
one of .vert, .tesc, .tese, .geom, .frag, .comp.
Note: Tessellation control/evaluation is not
supported with HLSL, instead use -r to inject
handcrafted hull/domain shaders. Some targets may
need special arguments to be set, e.g. MSL
tessellation will likely need --msltess,
--tess-vertex-count, --tess-mode, depending on
the stage. Geometry shaders are not supported
with Metal.操作模式
共有五种主要操作模式:
.qsb文件生成。.qsb文件检查。例如,qsb -d myshader.frag.qsb将输出反射元数据(以 JSON 格式)及包含的着色器。- 提取模式。此模式允许将现有
.qsb文件中的指定着色器写入单独的文件。例如,qsb -x spirv,100 -o myshader.spv myshader.frag.qsb会将SPIR-V二进制代码写入myshader.spv。 - 替换模式。此模式允许将
.qsb文件中一个或多个着色器的内容替换为从指定文件读取的内容。通过这种方式,可以将手工编写的着色器代码注入到.qsb包中。 - 擦除模式。此模式将从
.qsb文件中移除指定的着色器变体。
示例
以以下片段着色器为例:
#version 440
layout(location = 0) in vec2 v_texcoord;
layout(location = 0) out vec4 fragColor;
layout(binding = 1) uniform sampler2D tex;
layout(std140, binding = 0) uniform buf {
float uAlpha;
};
void main()
{
vec4 c = texture(tex, v_texcoord);
fragColor = vec4(c.rgb, uAlpha);
}执行 `qsb -o shader.frag.qsb shader.frag ` 会生成 `shader.frag.qsb`。使用 `qsb -d shader.frag.qsb ` 检查该文件,结果如下:
Stage: Fragment
QSB_VERSION: 5
Has 1 shaders:
Shader 0: SPIR-V 100 [Standard]
Reflection info: {
"combinedImageSamplers": [
{
"binding": 1,
"name": "tex",
"set": 0,
"type": "sampler2D"
}
],
"inputs": [
{
"location": 0,
"name": "v_texcoord",
"type": "vec2"
}
],
"localSize": [
0,
0,
0
],
"outputs": [
{
"location": 0,
"name": "fragColor",
"type": "vec4"
}
],
"uniformBlocks": [
{
"binding": 0,
"blockName": "buf",
"members": [
{
"name": "uAlpha",
"offset": 0,
"size": 4,
"type": "float"
}
],
"set": 0,
"size": 4,
"structName": "_27"
}
]
}
Shader 0: SPIR-V 100 [Standard]
Entry point: main
Contents:
Binary of 864 bytes默认情况下仅生成 SPIR-V,因此使用此着色器包的应用程序仅能在 Vulkan 上运行。让我们使其更具实用性:
qsb --glsl "100 es,120,150" --hlsl 50 --msl 12 -o shader.frag.qsb shader.frag这将生成一个适用于 OpenGL、Direct 3D 和 Metal 的着色器包。该着色器使用的功能较为基础,甚至 GLSL ES 100(OpenGL ES 2.0 的着色语言)也能胜任。
检查结果显示:
Stage: Fragment
QSB_VERSION: 5
Has 6 shaders:
Shader 0: GLSL 120 [Standard]
Shader 1: HLSL 50 [Standard]
Shader 2: GLSL 100 es [Standard]
Shader 3: MSL 12 [Standard]
Shader 4: SPIR-V 100 [Standard]
Shader 5: GLSL 150 [Standard]
Reflection info: {
... <same as above>
}
Shader 0: GLSL 120 [Standard]
Entry point: main
Contents:
#version 120
struct buf
{
float uAlpha;
};
uniform buf _27;
uniform sampler2D tex;
varying vec2 v_texcoord;
void main()
{
vec4 c = texture2D(tex, v_texcoord);
gl_FragData[0] = vec4(c.xyz, _27.uAlpha);
}
************************************
Shader 1: HLSL 50 [Standard]
Entry point: main
Native resource binding map:
0 -> [0, -1]
1 -> [0, 0]
Contents:
cbuffer buf : register(b0)
{
float _27_uAlpha : packoffset(c0);
};
Texture2D<float4> tex : register(t0);
SamplerState _tex_sampler : register(s0);
static float2 v_texcoord;
static float4 fragColor;
struct SPIRV_Cross_Input
{
float2 v_texcoord : TEXCOORD0;
};
struct SPIRV_Cross_Output
{
float4 fragColor : SV_Target0;
};
void frag_main()
{
float4 c = tex.Sample(_tex_sampler, v_texcoord);
fragColor = float4(c.xyz, _27_uAlpha);
}
SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
{
v_texcoord = stage_input.v_texcoord;
frag_main();
SPIRV_Cross_Output stage_output;
stage_output.fragColor = fragColor;
return stage_output;
}
************************************
...
Shader 3: MSL 12 [Standard]
Entry point: main0
Native resource binding map:
0 -> [0, -1]
1 -> [0, 0]
Contents:
#include <metal_stdlib>
#include <simd/simd.h>
using namespace metal;
struct buf
{
float uAlpha;
};
struct main0_out
{
float4 fragColor [[color(0)]];
};
struct main0_in
{
float2 v_texcoord [[user(locn0)]];
};
fragment main0_out main0(main0_in in [[stage_in]], constant buf& _27 [[buffer(0)]], texture2d<float> tex [[texture(0)]], sampler texSmplr [[sampler(0)]])
{
main0_out out = {};
float4 c = tex.sample(texSmplr, in.v_texcoord);
out.fragColor = float4(c.xyz, _27.uAlpha);
return out;
}
************************************
...该包现可被Qt Quick 用于所有受支持的图形 API:Vulkan、Direct 3D、Metal、OpenGL 和 OpenGL ES。运行时,位于Qt Quick 和Qt Quick 3D 底层的 Qt 渲染硬件接口会自动选择合适的着色器。
除了将 SPIR-V 字节码反编译回更高层次的源代码外,该系统还处理了其他问题,例如确保 SPIR-V 绑定编号与本机资源的正确映射。例如,在 HLSL 中,我们曾看到过如下代码段:
Native resource binding map:
0 -> [0, -1]
1 -> [0, 0]在内部,这允许将 SPIR-V 风格的绑定点0 映射到 HLSL 寄存器b0 ,并将1 绑定到t0 和s0 。 这有助于让渲染硬件接口(Rendering Hardware Interface)的用户透明地处理各种着色语言之间的资源绑定差异,并允许 Qt 中的所有内容都按照原始 Vulkan 风格 GLSL 源代码中指定的方式,使用 Vulkan/SPIR-V 风格的绑定点进行操作。
着色器类型
着色器的类型由输入文件的扩展名推断得出。因此,扩展名必须是以下之一:
.vert- 顶点着色器.tesc- 用于细分控制着色器.tese- 用于细分评估着色器.geom- 几何着色器.frag- 片段(像素)着色器.comp- 用于计算着色器
注意: Direct 3D(HLSL)目前不支持细分 控制着色器和细分评估着色器。
着色语言及版本
系统始终会生成 SPIR-V 1.0。此外还会生成哪些内容,取决于命令行参数--glsl 、--hlsl 和--msl 。
这些参数后均跟一个以逗号分隔的列表。该列表必须包含 GLSL 风格的版本号,并可选地带有后缀(如es ,表示 GLSL ES)。后缀与版本号之间的空格可选(不加空格有助于避免需要加引号)。
例如,Qt Quick 的内置材质(即为项目提供支持的着色器,如Image 、Text 、Rectangle )均使用--glsl "100 es,120,150" --hlsl 50 --msl 12 来准备其着色器。这使得它们与 OpenGL ES 2.0 及更高版本、OpenGL 2.1 及更高版本,以及版本 3.2 及更高的 OpenGL 核心配置上下文兼容。
如果着色器使用了在指定目标中没有等效实现的函数或结构,则 `qsb ` 将失败。出现这种情况时,需要调整目标,这也意味着应用程序的最低系统要求将被隐式调整。 以 GLSL 函数textureLod 为例,该函数仅在 OpenGL ES 3.0 及更高版本(即 GLSL ES 300 或更高版本)中可用。 当请求 GLSL300 es 而不是100 es 时,qsb 将成功,但使用该.qsb 文件的应用程序现在将需要 OpenGL ES 3.0 或更高版本,并且将与基于 OpenGL ES 2.0 的系统不兼容。
另一个明显的例子是计算着色器:.comp 着色器需要指定--glsl 310es,430 ,因为计算着色器仅在 OpenGL ES 3.1 或更高版本以及 OpenGL 4.3 或更高版本中可用。
调整 HLSL 的着色器模型版本或 Metal 着色语言版本的情况预计很少发生。通常,着色器模型 5.0(--hlsl 50 )和 MSL 1.2(--msl 12 )就已足够。
Qt Quick 场景图批处理
Qt Quick 场景图的渲染器支持几何体批处理,以减少绘制调用次数。详情请参阅场景图相关页面。这依赖于向顶点着色器的主函数(main())中注入代码。在 Qt 5.x 中,这是在运行时通过修改提供的 GLSL 顶点着色器代码来实现的。 在 Qt 6 中,此方法已不可用。取而代之的是,可通过qsb 工具构建顶点着色器的可批处理变体。这通过-b 参数来实现。当输入不是带有.vert 扩展的顶点着色器时,该参数无效。 然而,对于顶点着色器,这将导致为每个目标生成两个版本。随后,Qt Quick 会在运行时自动选择正确的变体(标准版或可批处理版)。
注意:应用程序 无需关注批处理的细节。只需确保在处理顶点着色器时指定了-b (或在使用CMake 集成时等效的BATCHABLE 关键字)。这仅适用于与ShaderEffect 或QSGMaterialShader 配合使用的Qt Quick 着色器。
以下是一个顶点着色器的示例:
#version 440
layout(location = 0) in vec4 position;
layout(location = 1) in vec2 texcoord;
layout(location = 0) out vec2 v_texcoord;
layout(std140, binding = 0) uniform buf {
mat4 mvp;
} ubuf;
void main()
{
v_texcoord = texcoord;
gl_Position = ubuf.mvp * position;
}运行qsb -b --glsl 330 -o example.vert.qsb example.vert 将得到:
Stage: Vertex
QSB_VERSION: 5
Has 4 shaders:
Shader 0: GLSL 330 [Standard]
Shader 1: GLSL 330 [Batchable]
Shader 2: SPIR-V 100 [Standard]
Shader 3: SPIR-V 100 [Batchable]
Reflection info: {
...请注意,所有目标语言和版本现在都存在两种变体:标准版和略有修改的 Batchable 版。
调用外部工具
qsb 可以调用某些外部工具。这些工具分为两类:用于对着色器字节码(SPIR-V)进行优化的工具,以及用于执行着色器编译第一阶段(从源代码转换为某种中间字节码格式)的特定平台工具。
可通过以下命令行选项启用这些功能:
-O- 调用spirv-opt作为 SPIR-V 二进制文件的后处理步骤。生成的.qsb文件将包含优化后的版本。这假设系统上已安装spirv-opt(例如来自 Vulkan SDK)且已准备好被调用。-c或--fxc- 调用fxc.exe,即 Direct 3D 着色器编译器。 生成的DXBC(DirectX 字节码)数据将存储在.qsb文件中,而非 HLSL 源代码。Qt 会在运行时自动加载该数据,因此.qsb文件的创建者可自行决定包含 HLSL 源代码还是中间格式。 只要条件允许,请优先选择后者,因为这可以避免在运行时解析 HLSL 源代码,从而在创建图形管道时可能带来显著的性能提升。其缺点是,此参数仅在qsb在 Windows 上运行时才可用。-t或--metallib—— 调用相应的 XCode Metal 工具生成 .metallib 文件,并将该文件包含在.qsb包中,而非 MSL 源代码。此选项仅在qsb在 macOS 上运行时可用。
其他选项
-D- 定义一个宏。这允许在 GLSL 源代码中使用 #ifdef 及类似语句。-g- 启用为 SPIR-V 生成完整的调试信息,从而使RenderDoc等工具在检查管道或执行顶点/片段调试时能够显示完整的源代码。当指定-c时,此选项对 Direct 3D 同样有效,因为此时fxc会被指示在生成的中间字节码中包含调试信息。--mediump- 要求在 GLSL ES 片段着色器中将浮点数默认设置为中精度。对于其他任何目标(包括(非 ES)GLSL)以及非片段着色器,此选项将被忽略。--orig-file- 指定在为 CMake 生成依赖文件(–depfiles)时,用于替代输入源文件的文件名。当传递给 qsb 的文件是一个中间生成的着色器源文件时,此选项非常有用。然而,出于依赖关系追踪的目的,通常需要使用原始文件。
细分
--msltess- 表示该顶点着色器用于包含细分阶段的管道中。对于其他类型的着色器,以及当未启用 MSL 着色器生成时,此选项无效。若未指定,该顶点着色器在 Metal 上将无法与细分功能配合使用。--tess-vertex-count <count>- 指定来自细分控制阶段的输出顶点数。对于与 Metal 配合使用的细分评估着色器,必须指定此参数。默认值为 3。如果该值与细分控制阶段不匹配,生成的 MSL 代码将无法按预期运行。--tess-mode <mode>- 此选项指定细分模式。可取以下两个值之一:triangles或quads。默认值为triangles。对于与 Metal 配合使用的细分控制着色器,必须指定此选项。该值必须与细分评估阶段匹配,否则生成的 MSL 代码将无法按预期运行。
多视图
以下是一个顶点着色器的示例。它采用与 Vulkan 兼容的 GLSL 编写,并启用了GL_EXT_multiview 扩展,从而允许合法使用gl_ViewIndex 。
#version 440
#extension GL_EXT_multiview : require
layout(location = 0) in vec4 pos;
layout(std140, binding = 0) uniform buf
{
mat4 mvp[2];
};
void main()
{
gl_Position = mvp[gl_ViewIndex] * pos;
}注意:实际上,在 传递给qsb 的源代码中无需包含 #extension GL_EXT_multiview 这一行,因为传递下文所述的--view-count 参数会自动在编译为 SPIR-V 之前将该行注入着色器源代码中。
对于 Vulkan,只要运行时支持 Vulkan 1.1,此方法即可直接使用。详情请参阅VK_KHR_multiview。
若要根据上述内容为 Direct 3D 12 生成 HLSL 顶点着色器(详情请参阅视图实例化),最低着色器模型版本为 6.1,这意味着当指定--hlsl 50 时,qsb 将失败。处理多视图顶点着色器时,请至少使用--hlsl 61 。 Direct 3D 11 不支持多视图功能。
对于 OpenGL,需要额外的元数据:
--view-count- 将上述着色器(编译为 SPIR-V 之后)转译为兼容 OpenGL 的 GLSL 源代码时,仅将gl_ViewIndex映射为gl_ViewID_OVR是不够的,还需在着色器中声明视图的数量。 向--view-count参数传递值2,会将layout(num_views = 2) in;语句注入生成的GLSL源代码中,从而使其成为有效的(OpenGL)GLSL着色器。 详情请参阅GL_OVR_multiview,并请注意,生成的 GLSL 着色器还要求运行时支持GL_OVR_multiview2,因为这是生成着色器源代码中#extension指令所必需的。
当使用此类顶点着色器针对 OpenGL (ES) 时,生成的 GLSL 版本(--glsl )必须至少为330 或300 es 。虽然qsb 或QShaderBaker 并未强制要求前者,但在实际应用中,已知 OpenGL 实现会拒绝 GLSL 版本为 150 或更小的此类着色器。 因此,在启用 GL_EXT_multiview 时对顶点着色器进行条件编译,建议传递--glsl 330,300es 。
指定--view-count 会自动生成并插入一个预处理器定义:#define QSHADER_VIEW_COUNT n ,其中n 表示视图数量。若未提供视图数量,则该定义将完全不被设置。这使得可以编写如下代码,并允许使用同一个源文件来处理所有视图数量特定的着色器变体。
layout(std140, binding = 0) uniform buf {
#if QSHADER_VIEW_COUNT >= 2
mat4 matrix[QSHADER_VIEW_COUNT];
#else
mat4 matrix;
#endif
float opacity;
};此外,只要设置的视图计数为 2 或更大,顶点着色器中就会自动生成#extension GL_EXT_multiview : require 这一行代码。这减少了在顶点着色器中为支持多视图而需要添加的额外代码行数。
设置视图计数对于其他类型着色器同样适用。例如,当顶点着色器和片段着色器共享一个统一缓冲区,且两者必须确保相同的缓冲区布局时,在两个源文件中均编写#if QSHADER_VIEW_COUNT >= 2 会非常有用。这可以通过在调用qsb 时,为两者都指定--view-count 来确保。
注意: 在非顶点阶段(例如片段着色器中)直接 依赖gl_ViewIndex 关键字,目前尚不具备可移植性,应予以避免。
使用 OpenGL 特有的 GLSL 功能
有时可能需要使用 OpenGL 和 GLSL 特有的着色语言结构,这些结构不适用于其他着色语言、中间格式和图形 API。
OpenGL ES 的外部纹理和采样器便是典型的例子。根据平台的不同,实现视频播放或显示相机取景器时,可能需要处理那些并非作为常规 2D 纹理设计的 OpenGL 纹理对象, 而是可以通过 OpenGL API 中的GL_TEXTURE_EXTERNAL_OES绑定点以及着色器中的samplerExternalOES 采样器类型,在功能集受限的情况下加以利用。 当使用Qt基于SPIR-V的着色器管道时,后者可能会成为一个潜在的致命障碍:通过qsb运行此类着色器会导致失败,因为samplerExternalOES 无法映射到SPIR-V及其他目标着色语言,因此不被视为有效类型。
为解决这一问题,qsb 提供了以下选项:将 .qsb 文件中任意给定着色器变体的内容替换为用户从文件中读取的数据,从而完全替换 qsb 生成的原始着色器源代码或字节码。
以以下片段着色器为例。请注意 `tex` 的类型。如果在 OpenGL ES 环境下运行,该类型需要改为 `samplerExternalOES ` 该怎么办?
#version 440
layout(location = 0) in vec2 texCoord;
layout(location = 0) out vec4 fragColor;
layout(std140, binding = 0) uniform buf {
float opacity;
} ubuf;
layout(binding = 1) uniform sampler2D tex;
void main()
{
fragColor = texture(tex, texCoord).rgba * ubuf.opacity;
}仅更改 samplerExternalOES 的类型并不可行,这会立即导致编译错误。
不过,有一个简单的解决方案:编写一个单独的、专为 OpenGL ES 设计的着色器版本,并将其注入到 .qsb 文件中。以下着色器仅与 GLSL ES 兼容,无法通过 qsb 运行。但是,我们知道它可以在运行时由 OpenGL ES 处理。
precision highp float;
#extension GL_OES_EGL_image_external : require
varying vec2 texCoord;
struct buf
{
float opacity;
};
uniform buf ubuf;
uniform samplerExternalOES tex;
void main()
{
gl_FragColor = texture2D(tex, texCoord).rgba * ubuf.opacity;
}我们将此着色器命名为 `shader_gles.frag`。当 `qsb --glsl 100es -o shader.frag.qsb shader.frag ` 执行完成并生成一个(半成品)`.qsb` 文件后,我们可以执行 `qsb -r glsl,100es,shader_gles.frag shader.frag.qsb ` 来更新 `shader.frag.qsb `,具体操作是将 `GLSL 100 es` 着色器替换为指定文件(`shader_gles.frag`)中的内容。此时,`shader.frag.qsb ` 即可在运行时配合 OpenGL ES 使用。
注意:请 确保着色器与应用程序之间的接口保持不变。 请务必先检查 qsb 生成的 GLSL 代码,方法是通过-d 选项打印 .qsb 文件内容,或者通过运行qsb -x glsl,100es -o gles_shader.frag shader.frag.qsb 提取 GLSL ES 100 着色器。在手动注入的版本中,结构体、结构体成员和统一变量的名称也不得有所不同。
注意: 将任意文件中的数据放入 .qsb包的功能, 也可用于注入手工编写的 hull 和 domain HLSL 着色器,从而使基于曲面细分的图形管道在 Direct 3D 环境下同样能够正常工作。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.