st/mesa/glsl: add new is_arb_asm flag in gl_program
authorTimothy Arceri <timothy.arceri@collabora.com>
Wed, 9 Nov 2016 12:38:46 +0000 (23:38 +1100)
committerTimothy Arceri <timothy.arceri@collabora.com>
Fri, 6 Jan 2017 00:21:42 +0000 (11:21 +1100)
Set the flag via the _mesa_init_gl_program() and NewProgram()
helpers.

In i965 we currently check for the existance of gl_shader_program
to decide if this is an ARB assembly style program or not.

Adding a flag makes the code clearer and will help removes a
dependency on gl_shader_program in the i965 codegen functions.

Also this will allow use to skip initialising sampler units for
linked shaders, we currently memset it to zero again during linking.

Reviewed-by: Eric Anholt <eric@anholt.net>
13 files changed:
src/compiler/glsl/linker.cpp
src/compiler/glsl/standalone.cpp
src/mesa/drivers/dri/i915/i915_fragprog.c
src/mesa/drivers/dri/i965/brw_program.c
src/mesa/drivers/dri/r200/r200_vertprog.c
src/mesa/main/arbprogram.c
src/mesa/main/dd.h
src/mesa/main/ffvertex_prog.c
src/mesa/main/mtypes.h
src/mesa/main/shared.c
src/mesa/program/program.c
src/mesa/program/program.h
src/mesa/state_tracker/st_cb_program.c

index 38cbbfa680fdc21e772efd4a8c50f41c16e93bdc..327b7be80063d71fa5e0150c83c122cec03ebd49 100644 (file)
@@ -2202,7 +2202,7 @@ link_intrastage_shaders(void *mem_ctx,
    struct gl_program *gl_prog =
       ctx->Driver.NewProgram(ctx,
                              _mesa_shader_stage_to_program(shader_list[0]->Stage),
-                             prog->Name);
+                             prog->Name, false);
    if (!gl_prog) {
       prog->data->LinkStatus = false;
       _mesa_delete_linked_shader(ctx, linked);
index 69d86c705fcf0d164beb38cccda125ed6f4c7fd2..e93e9afcbfa2fb0f880333c1e017bca2ce5204d6 100644 (file)
@@ -100,12 +100,13 @@ private:
 };
 
 void
-init_gl_program(struct gl_program *prog, GLenum target)
+init_gl_program(struct gl_program *prog, GLenum target, bool is_arb_asm)
 {
    mtx_init(&prog->Mutex, mtx_plain);
 
    prog->RefCount = 1;
    prog->Format = GL_PROGRAM_FORMAT_ASCII_ARB;
+   prog->is_arb_asm = is_arb_asm;
 
    /* default mapping from samplers to texture units */
    for (int i = 0; i < MAX_SAMPLERS; i++)
@@ -113,7 +114,7 @@ init_gl_program(struct gl_program *prog, GLenum target)
 }
 
 struct gl_program *
-new_program(struct gl_context *ctx, GLenum target, GLuint id)
+new_program(struct gl_context *ctx, GLenum target, GLuint id, bool is_arb_asm)
 {
    switch (target) {
    case GL_VERTEX_PROGRAM_ARB: /* == GL_VERTEX_PROGRAM_NV */
@@ -123,7 +124,7 @@ new_program(struct gl_context *ctx, GLenum target, GLuint id)
    case GL_FRAGMENT_PROGRAM_ARB:
    case GL_COMPUTE_PROGRAM_NV: {
       struct gl_program *prog = rzalloc(NULL, struct gl_program);
-      init_gl_program(prog, target);
+      init_gl_program(prog, target, is_arb_asm);
       return prog;
    }
    default:
index c5a8ac5532d40a1fb580a36f5860bfddfddc0210..fce649d44e3353f1b72bd3bdc956b8d6987d5e14 100644 (file)
@@ -1144,12 +1144,13 @@ i915BindProgram(struct gl_context * ctx, GLenum target, struct gl_program *prog)
 }
 
 static struct gl_program *
-i915NewProgram(struct gl_context * ctx, GLenum target, GLuint id)
+i915NewProgram(struct gl_context * ctx, GLenum target, GLuint id,
+               bool is_arb_asm)
 {
    switch (target) {
    case GL_VERTEX_PROGRAM_ARB: {
       struct gl_program *prog = rzalloc(NULL, struct gl_program);
-      return _mesa_init_gl_program(prog, target, id);
+      return _mesa_init_gl_program(prog, target, id, is_arb_asm);
    }
 
    case GL_FRAGMENT_PROGRAM_ARB:{
@@ -1158,7 +1159,8 @@ i915NewProgram(struct gl_context * ctx, GLenum target, GLuint id)
          if (prog) {
             i915_init_program(I915_CONTEXT(ctx), prog);
 
-            return _mesa_init_gl_program(&prog->FragProg, target, id);
+            return _mesa_init_gl_program(&prog->FragProg, target, id,
+                                         is_arb_asm);
          }
          else
             return NULL;
@@ -1167,7 +1169,7 @@ i915NewProgram(struct gl_context * ctx, GLenum target, GLuint id)
    default:
       /* Just fallback:
        */
-      return _mesa_new_program(ctx, target, id);
+      return _mesa_new_program(ctx, target, id, is_arb_asm);
    }
 }
 
index 80a8721102030c97acda1ea6542650321eb81780..93b29749b286fd17c6f2e4ff92b225bd098d6479 100644 (file)
@@ -136,9 +136,8 @@ get_new_program_id(struct intel_screen *screen)
    return id;
 }
 
-static struct gl_program *brwNewProgram( struct gl_context *ctx,
-                                     GLenum target,
-                                     GLuint id )
+static struct gl_program *brwNewProgram(struct gl_context *ctx, GLenum target,
+                                        GLuint id, bool is_arb_asm)
 {
    struct brw_context *brw = brw_context(ctx);
 
@@ -152,7 +151,7 @@ static struct gl_program *brwNewProgram( struct gl_context *ctx,
       if (prog) {
         prog->id = get_new_program_id(brw->screen);
 
-        return _mesa_init_gl_program(&prog->program, target, id);
+         return _mesa_init_gl_program(&prog->program, target, id, is_arb_asm);
       }
       else
         return NULL;
@@ -171,7 +170,7 @@ static struct gl_program *brwNewProgram( struct gl_context *ctx,
       if (prog) {
         prog->id = get_new_program_id(brw->screen);
 
-        return _mesa_init_gl_program(&prog->program, target, id);
+         return _mesa_init_gl_program(&prog->program, target, id, is_arb_asm);
       }
       else
         return NULL;
index ded8e2af244c9d7f94434f2589f9ffc722eff915..0a3e98428c604d4395ff93ae745f96d74b63c52b 100644 (file)
@@ -1199,17 +1199,18 @@ r200BindProgram(struct gl_context *ctx, GLenum target, struct gl_program *prog)
 }
 
 static struct gl_program *
-r200NewProgram(struct gl_context *ctx, GLenum target, GLuint id)
+r200NewProgram(struct gl_context *ctx, GLenum target, GLuint id,
+               bool is_arb_asm)
 {
    switch(target){
    case GL_VERTEX_PROGRAM_ARB: {
       struct r200_vertex_program *vp = rzalloc(NULL,
                                                struct r200_vertex_program);
-      return _mesa_init_gl_program(&vp->mesa_program, target, id);
+      return _mesa_init_gl_program(&vp->mesa_program, target, id, is_arb_asm);
    }
    case GL_FRAGMENT_PROGRAM_ARB: {
       struct gl_program *prog = rzalloc(NULL, struct gl_program);
-      return _mesa_init_gl_program(prog, target, id);
+      return _mesa_init_gl_program(prog, target, id, is_arb_asm);
    }
    default:
       _mesa_problem(ctx, "Bad target in r200NewProgram");
index 70b40b3c490af6ced870ad360c8afd5ed355c70a..2c6031096ac7d810cfd90a6367b4e169c2005efa 100644 (file)
@@ -83,7 +83,7 @@ _mesa_BindProgramARB(GLenum target, GLuint id)
       newProg = _mesa_lookup_program(ctx, id);
       if (!newProg || newProg == &_mesa_DummyProgram) {
          /* allocate a new program now */
-         newProg = ctx->Driver.NewProgram(ctx, target, id);
+         newProg = ctx->Driver.NewProgram(ctx, target, id, true);
          if (!newProg) {
             _mesa_error(ctx, GL_OUT_OF_MEMORY, "glBindProgramARB");
             return;
index 21e8260fc7842098e09aa4f1ae2ec752d615d006..7ebd084ca31c5118177157867e32c49d6970a34c 100644 (file)
@@ -474,7 +474,7 @@ struct dd_function_table {
                        struct gl_program *prog);
    /** Allocate a new program */
    struct gl_program * (*NewProgram)(struct gl_context *ctx, GLenum target,
-                                     GLuint id);
+                                     GLuint id, bool is_arb_asm);
    /** Delete a program */
    void (*DeleteProgram)(struct gl_context *ctx, struct gl_program *prog);   
    /**
index c917b41e9dcfa4e6d5f3978bbf84ad22740990bb..85f8f24d83019400a5ac5c3e17718b6ebef8c2dd 100644 (file)
@@ -1671,7 +1671,7 @@ _mesa_get_fixed_func_vertex_program(struct gl_context *ctx)
       if (0)
          printf("Build new TNL program\n");
 
-      prog = ctx->Driver.NewProgram(ctx, GL_VERTEX_PROGRAM_ARB, 0);
+      prog = ctx->Driver.NewProgram(ctx, GL_VERTEX_PROGRAM_ARB, 0, true);
       if (!prog)
          return NULL;
 
index 0301eb57f8fcc79dfe96dfcbbc145889a954e581..40a240c961c56923b089a6d3c87d7870f4a7ab22 100644 (file)
@@ -1925,6 +1925,8 @@ struct gl_program
 
    struct nir_shader *nir;
 
+   bool is_arb_asm; /** Is this an ARB assembly-style program */
+
    GLbitfield64 SecondaryOutputsWritten; /**< Subset of OutputsWritten outputs written with non-zero index. */
    GLbitfield TexturesUsed[MAX_COMBINED_TEXTURE_IMAGE_UNITS];  /**< TEXTURE_x_BIT bitmask */
    GLbitfield SamplersUsed;   /**< Bitfield of which samplers are used */
index 04e54439a841b08e04eb8bc3bfe0de1ccc4096cc..53448127389726e12dc083ec3778f607bdc16356 100644 (file)
@@ -70,9 +70,9 @@ _mesa_alloc_shared_state(struct gl_context *ctx)
    shared->Programs = _mesa_NewHashTable();
 
    shared->DefaultVertexProgram =
-      ctx->Driver.NewProgram(ctx, GL_VERTEX_PROGRAM_ARB, 0);
+      ctx->Driver.NewProgram(ctx, GL_VERTEX_PROGRAM_ARB, 0, true);
    shared->DefaultFragmentProgram =
-      ctx->Driver.NewProgram(ctx, GL_FRAGMENT_PROGRAM_ARB, 0);
+      ctx->Driver.NewProgram(ctx, GL_FRAGMENT_PROGRAM_ARB, 0, true);
 
    shared->ATIShaders = _mesa_NewHashTable();
    shared->DefaultFragmentShader = _mesa_new_ati_fragment_shader(ctx, 0);
index b728d862e54a966a252e7952d83450bbffee5916..3edeec81730a92e15c1ac2d5e0590fe056ed051a 100644 (file)
@@ -178,7 +178,8 @@ _mesa_set_program_error(struct gl_context *ctx, GLint pos, const char *string)
  * Initialize a new gl_program object.
  */
 struct gl_program *
-_mesa_init_gl_program(struct gl_program *prog, GLenum target, GLuint id)
+_mesa_init_gl_program(struct gl_program *prog, GLenum target, GLuint id,
+                      bool is_arb_asm)
 {
    GLuint i;
 
@@ -192,6 +193,7 @@ _mesa_init_gl_program(struct gl_program *prog, GLenum target, GLuint id)
    prog->RefCount = 1;
    prog->Format = GL_PROGRAM_FORMAT_ASCII_ARB;
    prog->info.stage = _mesa_program_enum_to_shader_stage(target);
+   prog->is_arb_asm = is_arb_asm;
 
    /* default mapping from samplers to texture units */
    for (i = 0; i < MAX_SAMPLERS; i++)
@@ -214,7 +216,8 @@ _mesa_init_gl_program(struct gl_program *prog, GLenum target, GLuint id)
  * \return  pointer to new program object
  */
 struct gl_program *
-_mesa_new_program(struct gl_context *ctx, GLenum target, GLuint id)
+_mesa_new_program(struct gl_context *ctx, GLenum target, GLuint id,
+                  bool is_arb_asm)
 {
    switch (target) {
    case GL_VERTEX_PROGRAM_ARB: /* == GL_VERTEX_PROGRAM_NV */
@@ -224,7 +227,7 @@ _mesa_new_program(struct gl_context *ctx, GLenum target, GLuint id)
    case GL_FRAGMENT_PROGRAM_ARB:
    case GL_COMPUTE_PROGRAM_NV: {
       struct gl_program *prog = rzalloc(NULL, struct gl_program);
-      return _mesa_init_gl_program(prog, target, id);
+      return _mesa_init_gl_program(prog, target, id, is_arb_asm);
    }
    default:
       _mesa_problem(ctx, "bad target in _mesa_new_program");
index 18122f75b742df4fc519d76bd91b00ee90b2ae5e..296fa40fbc143241fd12dee7ec49c34846b9e53a 100644 (file)
@@ -64,10 +64,12 @@ extern void
 _mesa_set_program_error(struct gl_context *ctx, GLint pos, const char *string);
 
 extern struct gl_program *
-_mesa_init_gl_program(struct gl_program *prog, GLenum target, GLuint id);
+_mesa_init_gl_program(struct gl_program *prog, GLenum target, GLuint id,
+                      bool is_arb_asm);
 
 extern struct gl_program *
-_mesa_new_program(struct gl_context *ctx, GLenum target, GLuint id);
+_mesa_new_program(struct gl_context *ctx, GLenum target, GLuint id,
+                  bool is_arb_asm);
 
 extern void
 _mesa_delete_program(struct gl_context *ctx, struct gl_program *prog);
index 77b7a26379615c35755482a663d04066198fc1c3..b104649b0364cf7a3d2ab1ddba725d2e4443d93b 100644 (file)
  * fragment program.
  */
 static struct gl_program *
-st_new_program(struct gl_context *ctx, GLenum target, GLuint id)
+st_new_program(struct gl_context *ctx, GLenum target, GLuint id,
+               bool is_arb_asm)
 {
    switch (target) {
    case GL_VERTEX_PROGRAM_ARB: {
       struct st_vertex_program *prog = rzalloc(NULL,
                                                struct st_vertex_program);
-      return _mesa_init_gl_program(&prog->Base, target, id);
+      return _mesa_init_gl_program(&prog->Base, target, id, is_arb_asm);
    }
    case GL_FRAGMENT_PROGRAM_ARB: {
       struct st_fragment_program *prog = rzalloc(NULL,
                                                  struct st_fragment_program);
-      return _mesa_init_gl_program(&prog->Base, target, id);
+      return _mesa_init_gl_program(&prog->Base, target, id, is_arb_asm);
    }
    case GL_GEOMETRY_PROGRAM_NV: {
       struct st_geometry_program *prog = rzalloc(NULL,
                                                  struct st_geometry_program);
-      return _mesa_init_gl_program(&prog->Base, target, id);
+      return _mesa_init_gl_program(&prog->Base, target, id, is_arb_asm);
    }
    case GL_TESS_CONTROL_PROGRAM_NV: {
       struct st_tessctrl_program *prog = rzalloc(NULL,
                                                  struct st_tessctrl_program);
-      return _mesa_init_gl_program(&prog->Base, target, id);
+      return _mesa_init_gl_program(&prog->Base, target, id, is_arb_asm);
    }
    case GL_TESS_EVALUATION_PROGRAM_NV: {
       struct st_tesseval_program *prog = rzalloc(NULL,
                                                  struct st_tesseval_program);
-      return _mesa_init_gl_program(&prog->Base, target, id);
+      return _mesa_init_gl_program(&prog->Base, target, id, is_arb_asm);
    }
    case GL_COMPUTE_PROGRAM_NV: {
       struct st_compute_program *prog = rzalloc(NULL,
                                                 struct st_compute_program);
-      return _mesa_init_gl_program(&prog->Base, target, id);
+      return _mesa_init_gl_program(&prog->Base, target, id, is_arb_asm);
    }
    default:
       assert(0);
@@ -290,7 +291,7 @@ static struct gl_program *
 st_new_ati_fs(struct gl_context *ctx, struct ati_fragment_shader *curProg)
 {
    struct gl_program *prog = ctx->Driver.NewProgram(ctx, GL_FRAGMENT_PROGRAM_ARB,
-         curProg->Id);
+         curProg->Id, true);
    struct st_fragment_program *stfp = (struct st_fragment_program *)prog;
    stfp->ati_fs = curProg;
    return prog;