nir: Store some geometry shader data in nir_shader.
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 18 Aug 2015 09:07:47 +0000 (02:07 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Fri, 11 Sep 2015 07:05:09 +0000 (00:05 -0700)
This makes it possible for NIR shaders to know the number of output
vertices and the number of invocations.  Drivers could also access
these directly without going through gl_program.

We should probably add InputType and OutputType here too, but currently
those are stored as GL_* enums, and I wanted to avoid using those in
NIR, as I suspect Vulkan/SPIR-V will use different enums.  (We should
probably make our own.)

We could add VerticesIn, but it's easily computable from the input
topology, so I'm not sure whether it's worth it.  It's also currently
not stored in gl_shader (only gl_shader_program), which would require
changes to the glsl_to_nir interface or require us to store it there.

This is a bit of duplication of data...ideally, we would factor these
substructs out of gl_program, gl_shader_program, and nir_shader, creating
a gl_geometry_info class...but it would need to go in a new place (in
src/glsl?) that isn't mtypes.h nor nir.h.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
src/glsl/nir/glsl_to_nir.cpp
src/glsl/nir/nir.c
src/glsl/nir/nir.h

index 944f7462911020415dbe1cfcd3e2c593812d8b56..c13f953d914c2328a99e5eeba871d6b1b3da9fcb 100644 (file)
@@ -140,6 +140,9 @@ glsl_to_nir(struct gl_shader *sh, const nir_shader_compiler_options *options)
 
    nir_lower_outputs_to_temporaries(shader);
 
+   shader->gs.vertices_out = sh->Geom.VerticesOut;
+   shader->gs.invocations = sh->Geom.Invocations;
+
    return shader;
 }
 
index ab06ea2bc19353234a1128ed24f5aad57f31c125..1dc7e12445f8aa93c70af41756265c696bab910c 100644 (file)
@@ -54,6 +54,9 @@ nir_shader_create(void *mem_ctx,
 
    shader->stage = stage;
 
+   shader->gs.vertices_out = 0;
+   shader->gs.invocations = 0;
+
    return shader;
 }
 
index a93ff11f01b2a0ba8b305f47ca029a797f85e77e..f9c829570c5b2c1debe246c7cdb1472a85585ea5 100644 (file)
@@ -1479,6 +1479,14 @@ typedef struct nir_shader {
 
    /** The shader stage, such as MESA_SHADER_VERTEX. */
    gl_shader_stage stage;
+
+   struct {
+      /** The maximum number of vertices the geometry shader might write. */
+      unsigned vertices_out;
+
+      /** 1 .. MAX_GEOMETRY_SHADER_INVOCATIONS */
+      unsigned invocations;
+   } gs;
 } nir_shader;
 
 #define nir_foreach_overload(shader, overload)                        \