Mesa (master): i965: code clean-ups, comments, and minor refactoring

Brian Paul brianp at kemper.freedesktop.org
Sat Feb 14 00:22:42 UTC 2009


Module: Mesa
Branch: master
Commit: 2f78d4a2cd009d8d6a5f470d5738586b7f89f3d9
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=2f78d4a2cd009d8d6a5f470d5738586b7f89f3d9

Author: Brian Paul <brianp at vmware.com>
Date:   Thu Feb 12 15:35:41 2009 -0700

i965: code clean-ups, comments, and minor refactoring

---

 src/mesa/drivers/dri/i965/brw_wm.c    |   86 ++++++++++++++++++++-------------
 src/mesa/drivers/dri/i965/brw_wm_fp.c |   16 +++++--
 2 files changed, 65 insertions(+), 37 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_wm.c b/src/mesa/drivers/dri/i965/brw_wm.c
index fb1e683..4501e04 100644
--- a/src/mesa/drivers/dri/i965/brw_wm.c
+++ b/src/mesa/drivers/dri/i965/brw_wm.c
@@ -80,6 +80,53 @@ GLuint brw_wm_is_scalar_result( GLuint opcode )
 }
 
 
+/**
+ * Do GPU code generation for non-GLSL shader.  non-GLSL shaders have
+ * no flow control instructions so we can more readily do SSA-style
+ * optimizations.
+ */
+static void
+brw_wm_non_glsl_emit(struct brw_context *brw, struct brw_wm_compile *c)
+{
+   /* Augment fragment program.  Add instructions for pre- and
+    * post-fragment-program tasks such as interpolation and fogging.
+    */
+   brw_wm_pass_fp(c);
+
+   /* Translate to intermediate representation.  Build register usage
+    * chains.
+    */
+   brw_wm_pass0(c);
+
+   /* Dead code removal.
+    */
+   brw_wm_pass1(c);
+
+   /* Register allocation.
+    */
+   c->grf_limit = BRW_WM_MAX_GRF / 2;
+
+   brw_wm_pass2(c);
+
+   c->prog_data.total_grf = c->max_wm_grf;
+   if (c->last_scratch) {
+      c->prog_data.total_scratch = c->last_scratch + 0x40;
+   }
+   else {
+      c->prog_data.total_scratch = 0;
+   }
+
+   /* Emit GEN4 code.
+    */
+   brw_wm_emit(c);
+}
+
+
+/**
+ * All Mesa program -> GPU code generation goes through this function.
+ * Depending on the instructions used (i.e. flow control instructions)
+ * we'll use one of two code generators.
+ */
 static void do_wm_prog( struct brw_context *brw,
 			struct brw_fragment_program *fp, 
 			struct brw_wm_prog_key *key)
@@ -102,42 +149,17 @@ static void do_wm_prog( struct brw_context *brw,
 
    brw_init_compile(brw, &c->func);
 
+   /*
+    * Shader which use GLSL features such as flow control are handled
+    * differently from "simple" shaders.
+    */
    if (brw_wm_is_glsl(&c->fp->program)) {
       brw_wm_glsl_emit(brw, c);
    }
    else {
-      /* Augment fragment program.  Add instructions for pre- and
-       * post-fragment-program tasks such as interpolation and fogging.
-       */
-      brw_wm_pass_fp(c);
-
-      /* Translate to intermediate representation.  Build register usage
-       * chains.
-       */
-      brw_wm_pass0(c);
-
-      /* Dead code removal.
-       */
-      brw_wm_pass1(c);
-
-      /* Register allocation.
-       */
-      c->grf_limit = BRW_WM_MAX_GRF/2;
-
-      brw_wm_pass2(c);
-
-      c->prog_data.total_grf = c->max_wm_grf;
-      if (c->last_scratch) {
-         c->prog_data.total_scratch =
-            c->last_scratch + 0x40;
-      } else {
-         c->prog_data.total_scratch = 0;
-      }
-
-      /* Emit GEN4 code.
-       */
-      brw_wm_emit(c);
+      brw_wm_non_glsl_emit(brw, c);
    }
+
    if (INTEL_DEBUG & DEBUG_WM)
       fprintf(stderr, "\n");
 
@@ -307,8 +329,6 @@ static void brw_prepare_wm_prog(struct brw_context *brw)
 }
 
 
-/* See brw_wm.c:
- */
 const struct brw_tracked_state brw_wm_prog = {
    .dirty = {
       .mesa  = (_NEW_COLOR |
diff --git a/src/mesa/drivers/dri/i965/brw_wm_fp.c b/src/mesa/drivers/dri/i965/brw_wm_fp.c
index ea3f3fc..0a44f8b 100644
--- a/src/mesa/drivers/dri/i965/brw_wm_fp.c
+++ b/src/mesa/drivers/dri/i965/brw_wm_fp.c
@@ -942,6 +942,11 @@ static void print_insns( const struct prog_instruction *insn,
    }
 }
 
+
+/**
+ * Initial pass for fragment program code generation.
+ * This function is used by both the GLSL and non-GLSL paths.
+ */
 void brw_wm_pass_fp( struct brw_wm_compile *c )
 {
    struct brw_fragment_program *fp = c->fp;
@@ -958,15 +963,19 @@ void brw_wm_pass_fp( struct brw_wm_compile *c )
    c->pixel_w = src_undef();
    c->nr_fp_insns = 0;
 
-   /* Emit preamble instructions:
+   /* Emit preamble instructions.  This is where special instructions such as
+    * WM_CINTERP, WM_LINTERP, WM_PINTERP and WM_WPOSXY are emitted to
+    * compute shader inputs from varying vars.
     */
-
-
    for (insn = 0; insn < fp->program.Base.NumInstructions; insn++) {
       const struct prog_instruction *inst = &fp->program.Base.Instructions[insn];
       validate_src_regs(c, inst);
       validate_dst_regs(c, inst);
    }
+
+   /* Loop over all instructions doing assorted simplifications and
+    * transformations.
+    */
    for (insn = 0; insn < fp->program.Base.NumInstructions; insn++) {
       const struct prog_instruction *inst = &fp->program.Base.Instructions[insn];
       struct prog_instruction *out;
@@ -975,7 +984,6 @@ void brw_wm_pass_fp( struct brw_wm_compile *c )
        * necessary:
        */
 
-
       switch (inst->Opcode) {
       case OPCODE_SWZ: 
 	 out = emit_insn(c, inst);




More information about the mesa-commit mailing list