Mesa (glsl2): glsl2: Add support for redeclaring layout of gl_FragCoord for ARB_fcc.

Eric Anholt anholt at kemper.freedesktop.org
Wed Jul 28 22:01:09 UTC 2010


Module: Mesa
Branch: glsl2
Commit: 4a962170d7cf4243d6ae156fca20a6167388925d
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=4a962170d7cf4243d6ae156fca20a6167388925d

Author: Eric Anholt <eric at anholt.net>
Date:   Wed Jul 28 14:41:51 2010 -0700

glsl2: Add support for redeclaring layout of gl_FragCoord for ARB_fcc.

Fixes:
glsl-arb-fragment-coord-conventions

---

 src/glsl/ast_to_hir.cpp         |   15 +++++++++++++--
 src/glsl/ir.h                   |    4 ++++
 src/glsl/ir_clone.cpp           |    2 ++
 src/mesa/program/ir_to_mesa.cpp |    7 ++++++-
 4 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
index d82cf33..8e8690c 100644
--- a/src/glsl/ast_to_hir.cpp
+++ b/src/glsl/ast_to_hir.cpp
@@ -50,6 +50,7 @@
  */
 
 #include "main/imports.h"
+#include "main/extensions.h"
 #include "glsl_symbol_table.h"
 #include "glsl_parser_extras.h"
 #include "ast.h"
@@ -1542,8 +1543,8 @@ apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual,
    else
       var->interpolation = ir_var_smooth;
 
-   /* FINISHME: Apply the fragment coord convetion layout qualifiers.
-    */
+   var->pixel_center_integer = qual->pixel_center_integer;
+   var->origin_upper_left = qual->origin_upper_left;
    if ((qual->origin_upper_left || qual->pixel_center_integer)
        && (strcmp(var->name, "gl_FragCoord") != 0)) {
       const char *const qual_string = (qual->origin_upper_left)
@@ -1932,6 +1933,16 @@ ast_declarator_list::hir(exec_list *instructions,
 	    earlier->type = var->type;
 	    delete var;
 	    var = NULL;
+	 } else if (state->extensions->ARB_fragment_coord_conventions &&
+		    (earlier != NULL) &&
+		    (strcmp(var->name, "gl_FragCoord") == 0) &&
+		    earlier->type == var->type &&
+		    earlier->mode == var->mode) {
+	    /* Allow redeclaration of gl_FragCoord for ARB_fcc layout
+	     * qualifiers.
+	     */
+	    earlier->origin_upper_left = var->origin_upper_left;
+	    earlier->pixel_center_integer = var->pixel_center_integer;
 	 } else {
 	    YYLTYPE loc = this->get_location();
 
diff --git a/src/glsl/ir.h b/src/glsl/ir.h
index 7e83631..202685d 100644
--- a/src/glsl/ir.h
+++ b/src/glsl/ir.h
@@ -238,6 +238,10 @@ public:
     */
    unsigned array_lvalue:1;
 
+   /* ARB_fragment_coord_conventions */
+   unsigned origin_upper_left:1;
+   unsigned pixel_center_integer:1;
+
    /**
     * Storage location of the base of this variable
     *
diff --git a/src/glsl/ir_clone.cpp b/src/glsl/ir_clone.cpp
index c49a732..f97080d 100644
--- a/src/glsl/ir_clone.cpp
+++ b/src/glsl/ir_clone.cpp
@@ -52,6 +52,8 @@ ir_variable::clone(struct hash_table *ht) const
    var->array_lvalue = this->array_lvalue;
    var->location = this->location;
    var->warn_extension = this->warn_extension;
+   var->origin_upper_left = this->origin_upper_left;
+   var->pixel_center_integer = this->pixel_center_integer;
 
    if (this->constant_value)
       var->constant_value = this->constant_value->clone(ht);
diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp
index c53381e..a3019cc 100644
--- a/src/mesa/program/ir_to_mesa.cpp
+++ b/src/mesa/program/ir_to_mesa.cpp
@@ -557,7 +557,12 @@ ir_to_mesa_visitor::find_variable_storage(ir_variable *var)
 void
 ir_to_mesa_visitor::visit(ir_variable *ir)
 {
-   (void)ir;
+   if (strcmp(ir->name, "gl_FragCoord") == 0) {
+      struct gl_fragment_program *fp = (struct gl_fragment_program *)this->prog;
+
+      fp->OriginUpperLeft = ir->origin_upper_left;
+      fp->PixelCenterInteger = ir->pixel_center_integer;
+   }
 }
 
 void




More information about the mesa-commit mailing list