blob: 2cce4c01a5f4c85da2818a96639eda82e75d4a9c [file] [log] [blame]
David Neto482550a2018-03-24 05:21:07 -07001// Copyright 2018 The Clspv Authors. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15// This translation unit defines all Clspv command line option variables.
16
17#include <llvm/Support/CommandLine.h>
18
19namespace {
David Neto862b7d82018-06-14 18:48:37 -040020
David Netoc5fb5242018-07-30 13:28:31 -040021// Should the compiler try to use direct resource accesses within helper
David Neto862b7d82018-06-14 18:48:37 -040022// functions instead of passing pointers via function arguments?
David Netoc5fb5242018-07-30 13:28:31 -040023llvm::cl::opt<bool> no_direct_resource_access(
24 "no-dra", llvm::cl::init(false),
David Neto862b7d82018-06-14 18:48:37 -040025 llvm::cl::desc(
David Netoc5fb5242018-07-30 13:28:31 -040026 "No Direct Resource Access: Avoid rewriting helper functions "
27 "to access resources directly instead of by pointers "
28 "in function arguments. Affects kernel arguments of type "
29 "pointer-to-global, pointer-to-constant, image, and sampler."));
David Neto862b7d82018-06-14 18:48:37 -040030
David Neto482550a2018-03-24 05:21:07 -070031// By default, reuse the same descriptor set number for all arguments.
32// To turn that off, use -distinct-kernel-descriptor-sets
33llvm::cl::opt<bool> distinct_kernel_descriptor_sets(
34 "distinct-kernel-descriptor-sets", llvm::cl::init(false),
35 llvm::cl::desc(
David Netoc5fb5242018-07-30 13:28:31 -040036 "Each kernel uses its own descriptor set for its arguments. "
37 "Turns off direct-resource-access optimizations."));
David Neto482550a2018-03-24 05:21:07 -070038
39// TODO(dneto): As per Neil Henning suggestion, might not need this if
40// you can trace the pointer back far enough to see that it's 32-bit
41// aligned. However, even in the vstore_half case, you'll probably get
42// better performance if you can rely on SPV_KHR_16bit_storage since in
43// the alternate case you're using a (relaxed) atomic, and therefore
44// have to write through to the cache.
45llvm::cl::opt<bool> f16bit_storage(
46 "f16bit_storage", llvm::cl::init(false),
47 llvm::cl::desc("Assume the target supports SPV_KHR_16bit_storage"));
48
David Netob6e2e062018-04-25 10:32:06 -040049llvm::cl::opt<bool> hack_initializers(
50 "hack-initializers", llvm::cl::init(false),
51 llvm::cl::desc(
52 "At the start of each kernel, explicitly write the initializer "
53 "value for a compiler-generated variable containing the workgroup "
54 "size. Required by some drivers to make the get_global_size builtin "
55 "function work when used with non-constant dimension index."));
56
David Neto862b7d82018-06-14 18:48:37 -040057llvm::cl::opt<bool> hack_dis(
58 "hack-dis", llvm::cl::init(false),
59 llvm::cl::desc(
60 "Force use of a distinct image or sampler variable for each "
61 "image or sampler kernel argument. This prevents sharing "
62 "of resource variables."));
63
David Neto482550a2018-03-24 05:21:07 -070064llvm::cl::opt<bool> hack_inserts(
65 "hack-inserts", llvm::cl::init(false),
66 llvm::cl::desc(
67 "Avoid all single-index OpCompositInsert instructions "
68 "into struct types by using complete composite construction and "
69 "extractions"));
70
David Neto3a0df832018-08-03 14:35:42 -040071llvm::cl::opt<bool> hack_signed_compare_fixup(
72 "hack-scf", llvm::cl::init(false),
73 llvm::cl::desc("Rewrite signed integer comparisons to use other kinds of "
74 "instructions"));
75
David Neto482550a2018-03-24 05:21:07 -070076// Some drivers don't like to see constant composite values constructed
77// from scalar Undef values. Replace numeric scalar and vector Undef with
78// corresponding OpConstantNull. We need to keep Undef for image values,
79// for example. In the LLVM domain, image values are passed as pointer to
80// struct.
81// See https://github.com/google/clspv/issues/95
82llvm::cl::opt<bool> hack_undef(
83 "hack-undef", llvm::cl::init(false),
84 llvm::cl::desc("Use OpConstantNull instead of OpUndef for floating point, "
85 "integer, or vectors of them"));
86
87llvm::cl::opt<bool>
88 pod_ubo("pod-ubo", llvm::cl::init(false),
89 llvm::cl::desc("POD kernel arguments are in uniform buffers"));
90
David Neto85082642018-03-24 06:55:20 -070091llvm::cl::opt<bool> module_constants_in_storage_buffer(
92 "module-constants-in-storage-buffer", llvm::cl::init(false),
93 llvm::cl::desc(
94 "Module-scope __constants are collected into a single storage buffer. "
95 "The binding and initialization data are reported in the descriptor "
96 "map."));
97
David Neto482550a2018-03-24 05:21:07 -070098llvm::cl::opt<bool> show_ids("show-ids", llvm::cl::init(false),
99 llvm::cl::desc("Show SPIR-V IDs for functions"));
100
101} // namespace
102
103namespace clspv {
104namespace Option {
105
David Netoc5fb5242018-07-30 13:28:31 -0400106bool DirectResourceAccess() {
107 return !(no_direct_resource_access || distinct_kernel_descriptor_sets);
108}
David Neto482550a2018-03-24 05:21:07 -0700109bool DistinctKernelDescriptorSets() { return distinct_kernel_descriptor_sets; }
110bool F16BitStorage() { return f16bit_storage; }
David Neto862b7d82018-06-14 18:48:37 -0400111bool HackDistinctImageSampler() { return hack_dis; }
David Netob6e2e062018-04-25 10:32:06 -0400112bool HackInitializers() { return hack_initializers; }
David Neto482550a2018-03-24 05:21:07 -0700113bool HackInserts() { return hack_inserts; }
David Neto3a0df832018-08-03 14:35:42 -0400114bool HackSignedCompareFixup() { return hack_signed_compare_fixup; }
David Neto482550a2018-03-24 05:21:07 -0700115bool HackUndef() { return hack_undef; }
David Neto85082642018-03-24 06:55:20 -0700116bool ModuleConstantsInStorageBuffer() { return module_constants_in_storage_buffer; }
David Neto482550a2018-03-24 05:21:07 -0700117bool PodArgsInUniformBuffer() { return pod_ubo; }
118bool ShowIDs() { return show_ids; }
119
120} // namespace Option
121} // namespace clspv