<div dir="ltr"><br><br><div class="gmail_quote"><div dir="ltr">On Tue, Nov 13, 2018 at 9:49 AM Karol Herbst <<a href="mailto:kherbst@redhat.com">kherbst@redhat.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">With OpenCL some system values match the address bits, but in GLSL we also<br>
have some system values being 64 bit.<br>
<br>
With this it is possible to adjust the builder functions so that depending<br>
on the bit_sizes the correct bit_size is used or an additional argument is<br>
added in case of multiple possible values.<br>
<br>
Also this allows for further validation<br>
<br>
Signed-off-by: Karol Herbst <<a href="mailto:kherbst@redhat.com" target="_blank">kherbst@redhat.com</a>><br>
---<br>
src/compiler/nir/nir.h | 3 +++<br>
src/compiler/nir/nir_intrinsics.py | 15 ++++++++++-----<br>
src/compiler/nir/nir_intrinsics_c.py | 6 +++++-<br>
src/nouveau/meson.build | 25 +++++++++++++++++++++++++<br>
4 files changed, 43 insertions(+), 6 deletions(-)<br>
create mode 100644 src/nouveau/meson.build<br>
<br>
diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h<br>
index be4f64464f9..3855eb0b582 100644<br>
--- a/src/compiler/nir/nir.h<br>
+++ b/src/compiler/nir/nir.h<br>
@@ -1283,6 +1283,9 @@ typedef struct {<br>
<br>
/** semantic flags for calls to this intrinsic */<br>
nir_intrinsic_semantic_flag flags;<br>
+<br>
+ /** bitfield of legal bit sizes */<br>
+ unsigned bit_sizes : 7;<br>
} nir_intrinsic_info;<br>
<br>
extern const nir_intrinsic_info nir_intrinsic_infos[nir_num_intrinsics];<br>
diff --git a/src/compiler/nir/nir_intrinsics.py b/src/compiler/nir/nir_intrinsics.py<br>
index ec3049ca06d..9ada44aad8a 100644<br>
--- a/src/compiler/nir/nir_intrinsics.py<br>
+++ b/src/compiler/nir/nir_intrinsics.py<br>
@@ -32,7 +32,7 @@ class Intrinsic(object):<br>
NOTE: this must be kept in sync with nir_intrinsic_info.<br>
"""<br>
def __init__(self, name, src_components, dest_components,<br>
- indices, flags, sysval):<br>
+ indices, flags, sysval, bit_sizes):<br>
"""Parameters:<br>
<br>
- name: the intrinsic name<br>
@@ -45,6 +45,7 @@ class Intrinsic(object):<br>
- indices: list of constant indicies<br>
- flags: list of semantic flags<br>
- sysval: is this a system-value intrinsic<br>
+ - bit_sizes: allowed dest bit_sizes<br>
"""<br>
assert isinstance(name, str)<br>
assert isinstance(src_components, list)<br>
@@ -58,6 +59,8 @@ class Intrinsic(object):<br>
if flags:<br>
assert isinstance(flags[0], str)<br>
assert isinstance(sysval, bool)<br>
+ if bit_sizes:<br>
+ assert isinstance(bit_sizes[0], int)<br>
<br>
<a href="http://self.name" rel="noreferrer" target="_blank">self.name</a> = name<br>
self.num_srcs = len(src_components)<br>
@@ -68,6 +71,7 @@ class Intrinsic(object):<br>
self.indices = indices<br>
self.flags = flags<br>
self.sysval = sysval<br>
+ self.bit_sizes = bit_sizes<br>
<br>
#<br>
# Possible indices:<br>
@@ -120,10 +124,10 @@ CAN_REORDER = "NIR_INTRINSIC_CAN_REORDER"<br>
INTR_OPCODES = {}<br>
<br>
def intrinsic(name, src_comp=[], dest_comp=-1, indices=[],<br>
- flags=[], sysval=False):<br>
+ flags=[], sysval=False, bit_sizes=[]):<br>
assert name not in INTR_OPCODES<br>
INTR_OPCODES[name] = Intrinsic(name, src_comp, dest_comp,<br>
- indices, flags, sysval)<br>
+ indices, flags, sysval, bit_sizes)<br>
<br>
intrinsic("nop", flags=[CAN_ELIMINATE])<br>
<br>
@@ -446,9 +450,10 @@ intrinsic("shared_atomic_fmin", src_comp=[1, 1], dest_comp=1, indices=[BASE])<br>
intrinsic("shared_atomic_fmax", src_comp=[1, 1], dest_comp=1, indices=[BASE])<br>
intrinsic("shared_atomic_fcomp_swap", src_comp=[1, 1, 1], dest_comp=1, indices=[BASE])<br>
<br>
-def system_value(name, dest_comp, indices=[]):<br>
+def system_value(name, dest_comp, indices=[], bit_sizes=[32]):<br>
intrinsic("load_" + name, [], dest_comp, indices,<br>
- flags=[CAN_ELIMINATE, CAN_REORDER], sysval=True)<br>
+ flags=[CAN_ELIMINATE, CAN_REORDER], sysval=True,<br>
+ bit_sizes=bit_sizes)<br>
<br>
system_value("frag_coord", 4)<br>
system_value("front_face", 1)<br>
diff --git a/src/compiler/nir/nir_intrinsics_c.py b/src/compiler/nir/nir_intrinsics_c.py<br>
index ac45b94d496..d0f1c29fa39 100644<br>
--- a/src/compiler/nir/nir_intrinsics_c.py<br>
+++ b/src/compiler/nir/nir_intrinsics_c.py<br>
@@ -1,3 +1,5 @@<br>
+from functools import reduce<br>
+import operator<br>
<br>
template = """\<br>
/* Copyright (C) 2018 Red Hat<br>
@@ -45,6 +47,7 @@ const nir_intrinsic_info nir_intrinsic_infos[nir_num_intrinsics] = {<br>
},<br>
% endif<br>
.flags = ${"0" if len(opcode.flags) == 0 else " | ".join(opcode.flags)},<br>
+ .bit_sizes = ${reduce(operator.or_, opcode.bit_sizes, 0)},<br></blockquote><div><br></div><div>If we're going to go to all the effort to add these bit sizes to nir_intrinsic_infos, we should make nir_validate validate them.</div><div><br></div><div>Also, I'm not sure this line does what you want if bit_sizes = []. We could choose the 0 means anything goes convention or, since it's a bitfield, we could do 0x78 when it's allowed to be anything. Or we could just change the default in python to [8, 16, 32, 64]. In any case, we should do something sensible.</div><div><br></div><div>--Jason<br></div><div> <br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
},<br>
% endfor<br>
};<br>
@@ -54,6 +57,7 @@ from nir_intrinsics import INTR_OPCODES<br>
from mako.template import Template<br>
import argparse<br>
import os<br>
+import functools<br>
<br>
def main():<br>
parser = argparse.ArgumentParser()<br>
@@ -64,7 +68,7 @@ def main():<br>
<br>
path = os.path.join(args.outdir, 'nir_intrinsics.c')<br>
with open(path, 'wb') as f:<br>
- f.write(Template(template, output_encoding='utf-8').render(INTR_OPCODES=INTR_OPCODES))<br>
+ f.write(Template(template, output_encoding='utf-8').render(INTR_OPCODES=INTR_OPCODES, reduce=reduce, operator=operator))<br>
<br>
if __name__ == '__main__':<br>
main()<br>
diff --git a/src/nouveau/meson.build b/src/nouveau/meson.build<br>
new file mode 100644<br>
index 00000000000..5c265f207ab<br>
--- /dev/null<br>
+++ b/src/nouveau/meson.build<br>
@@ -0,0 +1,25 @@<br>
+# Copyright © 2018 Red Hat Corp.<br>
+<br>
+# Permission is hereby granted, free of charge, to any person obtaining a copy<br>
+# of this software and associated documentation files (the "Software"), to deal<br>
+# in the Software without restriction, including without limitation the rights<br>
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell<br>
+# copies of the Software, and to permit persons to whom the Software is<br>
+# furnished to do so, subject to the following conditions:<br>
+<br>
+# The above copyright notice and this permission notice shall be included in<br>
+# all copies or substantial portions of the Software.<br>
+<br>
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br>
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br>
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE<br>
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br>
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,<br>
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE<br>
+# SOFTWARE.<br>
+<br>
+inc_nouveau = include_directories('.')<br>
+<br>
+if with_nouveau_vk<br>
+ subdir('vulkan')<br>
+endif<br></blockquote><div><br></div><div>This hunk seems to be misplaced. :-)<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
-- <br>
2.19.1<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org" target="_blank">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</blockquote></div></div>