mesa/cs: Add a MESA_SHADER_COMPUTE stage and update switch statements.
authorPaul Berry <stereotype441@gmail.com>
Tue, 7 Jan 2014 04:06:05 +0000 (20:06 -0800)
committerPaul Berry <stereotype441@gmail.com>
Wed, 5 Feb 2014 17:00:34 +0000 (09:00 -0800)
This patch adds MESA_SHADER_COMPUTE to the gl_shader_stage enum.
Also, where it is trivial to do so, it adds a compute shader case to
switch statements that switch based on the type of shader.  This
avoids "unhandled switch case" compiler warnings.

Reviewed-by: Matt Turner <mattst88@gmail.com>
src/glsl/ast_to_hir.cpp
src/glsl/builtin_variables.cpp
src/glsl/standalone_scaffolding.h
src/mesa/main/context.c
src/mesa/main/mtypes.h
src/mesa/main/shaderapi.c
src/mesa/main/shaderobj.h
src/mesa/program/prog_print.c
src/mesa/program/program.h

index 8d096ad04288216f020676fe6a9c1daa143b383e..fc28703ddc37bf1f1b35b100ae40b7100787d722 100644 (file)
@@ -2155,6 +2155,12 @@ validate_explicit_location(const struct ast_type_qualifier *qual,
 
       fail = true;
       break;
+
+   case MESA_SHADER_COMPUTE:
+      _mesa_glsl_error(loc, state,
+                       "compute shader variables cannot be given "
+                       "explicit locations");
+      return;
    };
 
    if (fail) {
@@ -2337,6 +2343,9 @@ apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual,
         if (var->data.mode == ir_var_shader_in)
            var->data.invariant = true;
         break;
+      case MESA_SHADER_COMPUTE:
+         /* Invariance isn't meaningful in compute shaders. */
+         break;
       }
    }
 
index d6bc3c073169d2e5fd7fb6f9376a9a5c05dd05f5..df560fbbf655c30b45d61f5a65192b127d6d5701 100644 (file)
@@ -356,6 +356,7 @@ public:
    void generate_vs_special_vars();
    void generate_gs_special_vars();
    void generate_fs_special_vars();
+   void generate_cs_special_vars();
    void generate_varyings();
 
 private:
@@ -867,6 +868,16 @@ builtin_variable_generator::generate_fs_special_vars()
 }
 
 
+/**
+ * Generate variables which only exist in compute shaders.
+ */
+void
+builtin_variable_generator::generate_cs_special_vars()
+{
+   /* TODO: finish this. */
+}
+
+
 /**
  * Add a single "varying" variable.  The variable's type and direction (input
  * or output) are adjusted as appropriate for the type of shader being
@@ -888,6 +899,9 @@ builtin_variable_generator::add_varying(int slot, const glsl_type *type,
    case MESA_SHADER_FRAGMENT:
       add_input(slot, type, name);
       break;
+   case MESA_SHADER_COMPUTE:
+      /* Compute shaders don't have varyings. */
+      break;
    }
 }
 
@@ -975,5 +989,8 @@ _mesa_glsl_initialize_variables(exec_list *instructions,
    case MESA_SHADER_FRAGMENT:
       gen.generate_fs_special_vars();
       break;
+   case MESA_SHADER_COMPUTE:
+      gen.generate_cs_special_vars();
+      break;
    }
 }
index 327fef2df151fea6e4969b37bc779b20bc32dfa6..df783afdb44bc5baf18de60dc9d1d57760b1e3b2 100644 (file)
@@ -58,6 +58,8 @@ _mesa_shader_enum_to_shader_stage(GLenum v)
       return MESA_SHADER_FRAGMENT;
    case GL_GEOMETRY_SHADER:
       return MESA_SHADER_GEOMETRY;
+   case GL_COMPUTE_SHADER:
+      return MESA_SHADER_COMPUTE;
    default:
       assert(!"bad value in _mesa_shader_enum_to_shader_stage()");
       return MESA_SHADER_VERTEX;
index d0a14493ab5e20bddcfbe2c8cd7dfb5ef48c4974..69835a59eaf075b00d6e910cdfa1a346698f1b72 100644 (file)
@@ -498,6 +498,14 @@ init_program_limits(struct gl_context *ctx, gl_shader_stage stage,
       prog->MaxInputComponents = 16 * 4; /* old limit not to break tnl and swrast */
       prog->MaxOutputComponents = 16 * 4; /* old limit not to break tnl and swrast */
       break;
+   case MESA_SHADER_COMPUTE:
+      prog->MaxParameters = 0; /* not meaningful for compute shaders */
+      prog->MaxAttribs = 0; /* not meaningful for compute shaders */
+      prog->MaxAddressRegs = 0; /* not meaningful for compute shaders */
+      prog->MaxUniformComponents = 4 * MAX_UNIFORMS;
+      prog->MaxInputComponents = 0; /* not meaningful for compute shaders */
+      prog->MaxOutputComponents = 0; /* not meaningful for compute shaders */
+      break;
    default:
       assert(0 && "Bad shader stage in init_program_limits()");
    }
index f591033231dcbeb04da947ac092a11d89886201d..b793227f0762e4c84b052501c8888910d68c1f5c 100644 (file)
@@ -406,9 +406,10 @@ typedef enum
    MESA_SHADER_VERTEX = 0,
    MESA_SHADER_GEOMETRY = 1,
    MESA_SHADER_FRAGMENT = 2,
+   MESA_SHADER_COMPUTE = 3,
 } gl_shader_stage;
 
-#define MESA_SHADER_STAGES (MESA_SHADER_FRAGMENT + 1)
+#define MESA_SHADER_STAGES (MESA_SHADER_COMPUTE + 1)
 
 
 /**
index 61ac0e35ac755e5826a7c9dbbd47f07e1d8e5d7a..519b200198100b1461acad2179e9d6beb774a2c8 100644 (file)
@@ -188,6 +188,8 @@ _mesa_validate_shader_target(const struct gl_context *ctx, GLenum type)
       return ctx == NULL || ctx->Extensions.ARB_vertex_shader;
    case GL_GEOMETRY_SHADER_ARB:
       return ctx == NULL || _mesa_has_geometry_shaders(ctx);
+   case GL_COMPUTE_SHADER:
+      return ctx == NULL || ctx->Extensions.ARB_compute_shader;
    default:
       return false;
    }
@@ -966,6 +968,9 @@ use_shader_program(struct gl_context *ctx, GLenum type,
       case GL_GEOMETRY_SHADER_ARB:
         /* Empty for now. */
         break;
+      case GL_COMPUTE_SHADER:
+         /* Empty for now. */
+         break;
       case GL_FRAGMENT_SHADER:
         if (*target == ctx->Shader._CurrentFragmentProgram) {
            _mesa_reference_shader_program(ctx,
index 517557088b8af5051f5dfe037ec8b2cd73342024..fae8be827c52872d472a71f7b6e00fa825f5ff32 100644 (file)
@@ -111,6 +111,8 @@ _mesa_shader_enum_to_shader_stage(GLenum v)
       return MESA_SHADER_FRAGMENT;
    case GL_GEOMETRY_SHADER:
       return MESA_SHADER_GEOMETRY;
+   case GL_COMPUTE_SHADER:
+      return MESA_SHADER_COMPUTE;
    default:
       ASSERT(0 && "bad value in _mesa_shader_enum_to_shader_stage()");
       return MESA_SHADER_VERTEX;
index 02ba01eca7b4ff35e929ac452f13f574f81538ec..4a5c1c1fb11ef562bdfee4a377dccd73230d23fb 100644 (file)
@@ -1021,6 +1021,9 @@ _mesa_write_shader_to_file(const struct gl_shader *shader)
    case MESA_SHADER_GEOMETRY:
       type = "geom";
       break;
+   case MESA_SHADER_COMPUTE:
+      type = "comp";
+      break;
    }
 
    _mesa_snprintf(filename, sizeof(filename), "shader_%u.%s", shader->Name, type);
index 71b0a4af26d63d4dad90c98f3cbb50f417fbad74..4351e05331ac1d634d62eb0ffe02c51ec585cf68 100644 (file)
@@ -202,6 +202,8 @@ _mesa_program_enum_to_shader_stage(GLenum v)
       return MESA_SHADER_FRAGMENT;
    case GL_GEOMETRY_PROGRAM_NV:
       return MESA_SHADER_GEOMETRY;
+   case GL_COMPUTE_PROGRAM_NV:
+      return MESA_SHADER_COMPUTE;
    default:
       ASSERT(0);
       return ~0;
@@ -219,6 +221,8 @@ _mesa_shader_stage_to_program(unsigned stage)
       return GL_FRAGMENT_PROGRAM_ARB;
    case MESA_SHADER_GEOMETRY:
       return GL_GEOMETRY_PROGRAM_NV;
+   case MESA_SHADER_COMPUTE:
+      return GL_COMPUTE_PROGRAM_NV;
    }
 
    assert(!"Unexpected shader stage in _mesa_shader_stage_to_program");