ir_to_mesa: Add _mesa_associate_uniform_storage
authorIan Romanick <ian.d.romanick@intel.com>
Tue, 18 Oct 2011 22:07:45 +0000 (15:07 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Mon, 7 Nov 2011 21:33:16 +0000 (13:33 -0800)
Connects all of the gl_program_parameter structures with the correct
gl_uniform_storage structures.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Tested-by: Tom Stellard <thomas.stellard@amd.com>
src/mesa/program/ir_to_mesa.cpp
src/mesa/program/ir_to_mesa.h

index 3c2eb5707493c228442dbcc5c0f8d09b0a5c476b..1bdfa2e10b74d88f5f6a4eacbde0f70de5bd36d4 100644 (file)
@@ -2698,6 +2698,77 @@ _mesa_generate_parameters_list_for_uniforms(struct gl_shader_program
    }
 }
 
+void
+_mesa_associate_uniform_storage(struct gl_context *ctx,
+                               struct gl_shader_program *shader_program,
+                               struct gl_program_parameter_list *params)
+{
+   /* After adding each uniform to the parameter list, connect the storage for
+    * the parameter with the tracking structure used by the API for the
+    * uniform.
+    */
+   unsigned last_location = unsigned(~0);
+   for (unsigned i = 0; i < params->NumParameters; i++) {
+      if (params->Parameters[i].Type != PROGRAM_UNIFORM)
+        continue;
+
+      unsigned location;
+      const bool found =
+        shader_program->UniformHash->get(location, params->Parameters[i].Name);
+      assert(found);
+
+      if (!found)
+        continue;
+
+      if (location != last_location) {
+        struct gl_uniform_storage *storage =
+           &shader_program->UniformStorage[location];
+        enum gl_uniform_driver_format format = uniform_native;
+
+        unsigned columns = 0;
+        switch (storage->type->base_type) {
+        case GLSL_TYPE_UINT:
+           assert(ctx->Const.NativeIntegers);
+           format = uniform_native;
+           columns = 1;
+           break;
+        case GLSL_TYPE_INT:
+           format =
+              (ctx->Const.NativeIntegers) ? uniform_native : uniform_int_float;
+           columns = 1;
+           break;
+        case GLSL_TYPE_FLOAT:
+           format = uniform_native;
+           columns = storage->type->matrix_columns;
+           break;
+        case GLSL_TYPE_BOOL:
+           if (ctx->Const.NativeIntegers) {
+              format = (ctx->Const.UniformBooleanTrue == 1)
+                 ? uniform_bool_int_0_1 : uniform_bool_int_0_not0;
+           } else {
+              format = uniform_bool_float;
+           }
+           columns = 1;
+           break;
+        case GLSL_TYPE_SAMPLER:
+           format = uniform_native;
+           columns = 1;
+           break;
+        default:
+           assert(!"Should not get here.");
+           break;
+        }
+
+        _mesa_uniform_attach_driver_storage(storage,
+                                            4 * sizeof(float) * columns,
+                                            4 * sizeof(float),
+                                            format,
+                                            &params->ParameterValues[i]);
+        last_location = location;
+      }
+   }
+}
+
 static void
 set_uniform_initializer(struct gl_context *ctx, void *mem_ctx,
                        struct gl_shader_program *shader_program,
index d046b0fcf9bd19bfd82cf94b651b8aba02fb32fa..2891682ba7a223ae30e7914b78c6f8e44f5ee87b 100644 (file)
@@ -45,4 +45,9 @@ _mesa_generate_parameters_list_for_uniforms(struct gl_shader_program
                                            struct gl_shader *sh,
                                            struct gl_program_parameter_list
                                            *params);
+void
+_mesa_associate_uniform_storage(struct gl_context *ctx,
+                               struct gl_shader_program *shader_program,
+                               struct gl_program_parameter_list *params);
+
 #endif