OSDN Git Service

mesa: checkpoint: handle uniform vars in _slang_gen_var_decl()
authorBrian Paul <brian.paul@tungstengraphics.com>
Mon, 15 Dec 2008 23:44:55 +0000 (16:44 -0700)
committerBrian Paul <brian.paul@tungstengraphics.com>
Mon, 15 Dec 2008 23:44:55 +0000 (16:44 -0700)
This allows uniform declarations with scalar/array initializers.
The code is rough though, and will be cleaned up.

src/mesa/shader/slang/slang_codegen.c

index b807d2c..e1515c7 100644 (file)
@@ -2717,6 +2717,8 @@ static slang_ir_node *
 _slang_gen_var_decl(slang_assemble_ctx *A, slang_variable *var,
                     slang_operation *initializer)
 {
+   const char *varName = (const char *) var->a_name;
+   const GLenum datatype = _slang_gltype_from_specifier(&var->type.specifier);
    slang_ir_node *varDecl, *n;
    slang_ir_storage *store;
 
@@ -2736,29 +2738,24 @@ _slang_gen_var_decl(slang_assemble_ctx *A, slang_variable *var,
 
    assert(store == varDecl->Store);
 
-   /* determine GPU storage file */
-   /* XXX if the variable is const, use PROGRAM_CONSTANT */
+   /* determine GPU register file for simple cases */
    if (is_sampler_type(&var->type)) {
       store->File = PROGRAM_SAMPLER;
    }
+   else if (var->type.qualifier == SLANG_QUAL_UNIFORM) {
+      store->File = PROGRAM_UNIFORM;
+   }
    else {
       store->File = PROGRAM_TEMPORARY;
    }
 
    store->Size = _slang_sizeof_type_specifier(&varDecl->Var->type.specifier);
-
    if (store->Size <= 0) {
       slang_info_log_error(A->log, "invalid declaration for '%s'",
                            (char*) var->a_name);
       return NULL;
    }
 
-#if 0
-   printf("%s var %p %s  store=%p index=%d size=%d\n",
-          __FUNCTION__, (void *) var, (char *) var->a_name,
-          (void *) store, store->Index, store->Size);
-#endif
-
    if (var->type.array_len > 0) {
       /* the type is an array, ex: float[4] x; */
       GLint sz = (store->Size + 3) & ~3;
@@ -2778,7 +2775,6 @@ _slang_gen_var_decl(slang_assemble_ctx *A, slang_variable *var,
 
    /* if there's an initializer, generate IR for the expression */
    if (initializer) {
-      const char *varName = (const char *) var->a_name;
       slang_ir_node *varRef, *init;
 
       if (var->type.qualifier == SLANG_QUAL_CONST) {
@@ -2804,14 +2800,39 @@ _slang_gen_var_decl(slang_assemble_ctx *A, slang_variable *var,
       /* constant-folding, etc here */
       _slang_simplify(initializer, &A->space, A->atoms); 
 
-      if ((var->type.qualifier == SLANG_QUAL_CONST ||
-           var->type.qualifier == SLANG_QUAL_UNIFORM) &&
-          initializer->type == SLANG_OPER_CALL &&
-          initializer->array_constructor) {
-         printf("Constant array initializer\n");
-         make_constant_array(A, var, initializer);
-         n = varRef;
-         return n;
+      /* look for simple constant-valued variables and uniforms */
+      if (var->type.qualifier == SLANG_QUAL_CONST ||
+          var->type.qualifier == SLANG_QUAL_UNIFORM) {
+
+         if (initializer->type == SLANG_OPER_CALL &&
+             initializer->array_constructor) {
+            /* array initializer */
+            make_constant_array(A, var, initializer);
+            return varRef;
+         }
+         else if (initializer->type == SLANG_OPER_LITERAL_FLOAT ||
+                  initializer->type == SLANG_OPER_LITERAL_INT) {
+            /* simple float/vector initializer */
+            if (store->File == PROGRAM_UNIFORM) {
+               store->Index = _mesa_add_uniform(A->program->Parameters,
+                                                varName,
+                                                store->Size, datatype,
+                                                initializer->literal);
+               /* XXX fix store->Swizzle here */
+               return varRef;
+            }
+#if 0
+            else {
+               store->File = PROGRAM_CONSTANT;
+               store->Index = _mesa_add_named_constant(A->program->Parameters,
+                                                       varName,
+                                                       initializer->literal,
+                                                       store->Size);
+               /* XXX fix swizzle here */
+               return varRef;
+            }
+#endif
+         }
       }
 
       /* IR for initializer */
@@ -2834,6 +2855,19 @@ _slang_gen_var_decl(slang_assemble_ctx *A, slang_variable *var,
       n = varDecl;
    }
 
+   if (store->File == PROGRAM_UNIFORM && store->Index < 0) {
+      /* */
+      store->Index = _mesa_add_uniform(A->program->Parameters, varName,
+                                       store->Size, datatype, NULL);
+      store->Swizzle = _slang_var_swizzle(store->Size, 0);
+   }
+
+#if 0
+   printf("%s var %p %s  store=%p index=%d size=%d\n",
+          __FUNCTION__, (void *) var, (char *) varName,
+          (void *) store, store->Index, store->Size);
+#endif
+
    return n;
 }
 
@@ -4024,6 +4058,12 @@ _slang_codegen_global_variable(slang_assemble_ctx *A, slang_variable *var,
             }
          }
          else {
+            /* non-struct uniform */
+#if 01
+            if (!_slang_gen_var_decl(A, var, var->initializer))
+               return GL_FALSE;
+            store = var->store;
+#else
             GLint uniformLoc;
             const GLfloat *initialValues = NULL;
 #if 0
@@ -4052,6 +4092,7 @@ _slang_codegen_global_variable(slang_assemble_ctx *A, slang_variable *var,
                                            totalSize, datatype, initialValues);
             store = _slang_new_ir_storage_swz(PROGRAM_UNIFORM, uniformLoc,
                                               totalSize, swizzle);
+#endif
          }
       }
       else {