i965/fs: Allocate a common IR builder object in fs_visitor.
authorFrancisco Jerez <currojerez@riseup.net>
Wed, 3 Jun 2015 16:59:44 +0000 (19:59 +0300)
committerFrancisco Jerez <currojerez@riseup.net>
Tue, 9 Jun 2015 12:18:31 +0000 (15:18 +0300)
v2: Call fs_builder::at_end() to point the builder at the end of the
    program explicitly.

Reviewed-by: Matt Turner <mattst88@gmail.com>
src/mesa/drivers/dri/i965/brw_fs.cpp
src/mesa/drivers/dri/i965/brw_fs.h
src/mesa/drivers/dri/i965/brw_fs_visitor.cpp

index 902f239e3df5bda108b5318d2a39f53a1c085eb0..9fca9914f2c7956a853b845ab500b63a2d781156 100644 (file)
@@ -3989,6 +3989,17 @@ fs_visitor::calculate_register_pressure()
 void
 fs_visitor::optimize()
 {
+   /* bld is the common builder object pointing at the end of the program we
+    * used to translate it into i965 IR.  For the optimization and lowering
+    * passes coming next, any code added after the end of the program without
+    * having explicitly called fs_builder::at() clearly points at a mistake.
+    * Ideally optimization passes wouldn't be part of the visitor so they
+    * wouldn't have access to bld at all, but they do, so just in case some
+    * pass forgets to ask for a location explicitly set it to NULL here to
+    * make it trip.
+    */
+   bld = bld.at(NULL, NULL);
+
    split_virtual_grfs();
 
    move_uniform_array_access_to_pull_constants();
index 3bdf0a25f37959f9b9594d27cd4f8c8fda02bbf2..bdda9d0558b8aba84955eeb834a448900b07efdd 100644 (file)
@@ -29,6 +29,7 @@
 
 #include "brw_shader.h"
 #include "brw_ir_fs.h"
+#include "brw_fs_builder.h"
 
 extern "C" {
 
@@ -453,6 +454,7 @@ public:
    const unsigned dispatch_width; /**< 8 or 16 */
 
    unsigned promoted_constants;
+   brw::fs_builder bld;
 };
 
 /**
index 8b9fedea0ab8bfe158d427bf7b2117a346a4a71d..69c04524fea81a395776c6ffc9ee4eaefa63468d 100644 (file)
@@ -47,6 +47,7 @@
 #include "glsl/ir_optimization.h"
 #include "program/sampler.h"
 
+using namespace brw;
 
 fs_reg *
 fs_visitor::emit_vs_system_value(int location)
@@ -2045,7 +2046,8 @@ fs_visitor::fs_visitor(struct brw_context *brw,
      reg_null_d(retype(brw_null_vec(dispatch_width), BRW_REGISTER_TYPE_D)),
      reg_null_ud(retype(brw_null_vec(dispatch_width), BRW_REGISTER_TYPE_UD)),
      key(key), prog_data(prog_data),
-     dispatch_width(dispatch_width), promoted_constants(0)
+     dispatch_width(dispatch_width), promoted_constants(0),
+     bld(fs_builder(this, dispatch_width).at_end())
 {
    this->mem_ctx = mem_ctx;