summaryrefslogtreecommitdiffstats
path: root/src/glsl
diff options
context:
space:
mode:
authorJason Ekstrand <jason.ekstrand@intel.com>2015-10-27 21:34:56 -0700
committerJason Ekstrand <jason.ekstrand@intel.com>2015-12-23 13:49:56 -0800
commit98291b8f2cad24d6467cf35e00135e4b015cb1f2 (patch)
tree84d56367ddc342ea5c0fba415b379641883cbbd7 /src/glsl
parent86772c24885be27a7fa9473c471a8eaff54b2ee9 (diff)
downloadexternal_mesa3d-98291b8f2cad24d6467cf35e00135e4b015cb1f2.zip
external_mesa3d-98291b8f2cad24d6467cf35e00135e4b015cb1f2.tar.gz
external_mesa3d-98291b8f2cad24d6467cf35e00135e4b015cb1f2.tar.bz2
nir: Add a helper for creating a "bare" nir_function_impl
This is useful if you want to clone a single function_impl if, for instance, you wanted to do function inlining.
Diffstat (limited to 'src/glsl')
-rw-r--r--src/glsl/nir/nir.c29
-rw-r--r--src/glsl/nir/nir.h2
2 files changed, 21 insertions, 10 deletions
diff --git a/src/glsl/nir/nir.c b/src/glsl/nir/nir.c
index 94bb760..b1a5330 100644
--- a/src/glsl/nir/nir.c
+++ b/src/glsl/nir/nir.c
@@ -268,16 +268,11 @@ cf_init(nir_cf_node *node, nir_cf_node_type type)
}
nir_function_impl *
-nir_function_impl_create(nir_function_overload *overload)
+nir_function_impl_create_bare(nir_shader *shader)
{
- assert(overload->impl == NULL);
-
- void *mem_ctx = ralloc_parent(overload);
+ nir_function_impl *impl = ralloc(shader, nir_function_impl);
- nir_function_impl *impl = ralloc(mem_ctx, nir_function_impl);
-
- overload->impl = impl;
- impl->overload = overload;
+ impl->overload = NULL;
cf_init(&impl->cf_node, nir_cf_node_function);
@@ -292,8 +287,8 @@ nir_function_impl_create(nir_function_overload *overload)
impl->valid_metadata = nir_metadata_none;
/* create start & end blocks */
- nir_block *start_block = nir_block_create(mem_ctx);
- nir_block *end_block = nir_block_create(mem_ctx);
+ nir_block *start_block = nir_block_create(shader);
+ nir_block *end_block = nir_block_create(shader);
start_block->cf_node.parent = &impl->cf_node;
end_block->cf_node.parent = &impl->cf_node;
impl->end_block = end_block;
@@ -305,6 +300,20 @@ nir_function_impl_create(nir_function_overload *overload)
return impl;
}
+nir_function_impl *
+nir_function_impl_create(nir_function_overload *overload)
+{
+ assert(overload->impl == NULL);
+
+ nir_function_impl *impl =
+ nir_function_impl_create_bare(overload->function->shader);
+
+ overload->impl = impl;
+ impl->overload = overload;
+
+ return impl;
+}
+
nir_block *
nir_block_create(nir_shader *shader)
{
diff --git a/src/glsl/nir/nir.h b/src/glsl/nir/nir.h
index 0cf5f80..2ae83b4 100644
--- a/src/glsl/nir/nir.h
+++ b/src/glsl/nir/nir.h
@@ -1696,6 +1696,8 @@ nir_function *nir_function_create(nir_shader *shader, const char *name);
nir_function_overload *nir_function_overload_create(nir_function *func);
nir_function_impl *nir_function_impl_create(nir_function_overload *func);
+/** creates a function_impl that isn't tied to any particular overload */
+nir_function_impl *nir_function_impl_create_bare(nir_shader *shader);
nir_block *nir_block_create(nir_shader *shader);
nir_if *nir_if_create(nir_shader *shader);