glsl: add a shader info field to the gl_program type
authorTimothy Arceri <timothy.arceri@collabora.com>
Thu, 13 Oct 2016 04:20:38 +0000 (15:20 +1100)
committerTimothy Arceri <timothy.arceri@collabora.com>
Wed, 26 Oct 2016 03:29:36 +0000 (14:29 +1100)
And use this field as the source for shader info in the nir_shader
this will allow us to set some of these fields from GLSL directly.

It will also simplify restoring from shader cache and allow the
removal of duplicate fields from GLSL.

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/compiler/glsl/glsl_to_nir.cpp
src/mesa/main/mtypes.h
src/mesa/program/prog_to_nir.c

index b53189287929cf105e706533c4df7c89d68fedaf..934c9d14f9478aa78edb15d661b7437dd1360b08 100644 (file)
@@ -136,7 +136,8 @@ glsl_to_nir(const struct gl_shader_program *shader_prog,
 {
    struct gl_linked_shader *sh = shader_prog->_LinkedShaders[stage];
 
-   nir_shader *shader = nir_shader_create(NULL, stage, options, NULL);
+   nir_shader *shader = nir_shader_create(NULL, stage, options,
+                                          &sh->Program->info);
 
    nir_visitor v1(shader);
    nir_function_visitor v2(&v1);
index 79dd1c51df7090ab05273b09babdaf54b9682563..c9310ef3070ef533870c24626339794fba4b639b 100644 (file)
@@ -43,6 +43,7 @@
 #include "glapi/glapi.h"
 #include "math/m_matrix.h"     /* GLmatrix */
 #include "compiler/shader_enums.h"
+#include "compiler/shader_info.h"
 #include "main/formats.h"       /* MESA_FORMAT_COUNT */
 #include "compiler/glsl/list.h"
 #include "util/bitscan.h"
@@ -1919,6 +1920,8 @@ struct gl_program
 
    struct nir_shader *nir;
 
+   struct shader_info info;
+
    GLbitfield64 InputsRead;     /**< Bitmask of which input regs are read */
    GLbitfield64 DoubleInputsRead;     /**< Bitmask of which input regs are read  and are doubles */
    GLbitfield64 OutputsWritten; /**< Bitmask of which output regs are written */
index a65d4bf81823bf3a148dda9ab3ac64904455c05f..2f589ce77f3e85751f9824210df108c98b0cd4af 100644 (file)
@@ -1019,6 +1019,12 @@ prog_to_nir(const struct gl_program *prog,
    c->prog = prog;
 
    nir_builder_init_simple_shader(&c->build, NULL, stage, options);
+
+   /* Use the shader_info from gl_program rather than the one nir_builder
+    * created for us. nir_sweep should clean up the other one for us.
+    */
+   c->build.shader->info = (shader_info *) &prog->info;
+
    s = c->build.shader;
 
    if (prog->Parameters->NumParameters > 0) {