OSDN Git Service

nir: Add a helper for creating a "bare" nir_function_impl
authorJason Ekstrand <jason.ekstrand@intel.com>
Wed, 28 Oct 2015 04:34:56 +0000 (21:34 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Wed, 23 Dec 2015 21:49:56 +0000 (13:49 -0800)
This is useful if you want to clone a single function_impl if, for
instance, you wanted to do function inlining.

src/glsl/nir/nir.c
src/glsl/nir/nir.h

index 94bb760..b1a5330 100644 (file)
@@ -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)
 {
index 0cf5f80..2ae83b4 100644 (file)
@@ -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);