[Mesa-dev] [PATCH 15/25] i965/fs: Revisit GLSL IR atomic counter intrinsic translation.

Francisco Jerez currojerez at riseup.net
Tue May 5 14:48:22 PDT 2015


Rewrite the GLSL IR atomic counter intrinsics translation code making
use of the recently introduced surface builder.  This will allow the
removal of some of the functionality duplicated in the visitor and
surface builder.

v2: Drop VEC4 suport.
---
 src/mesa/drivers/dri/i965/brw_fs.h           |  3 +-
 src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 44 +++++++++++++++++++---------
 2 files changed, 32 insertions(+), 15 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h
index ffb2e5b..c75ba2b 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.h
+++ b/src/mesa/drivers/dri/i965/brw_fs.h
@@ -59,6 +59,7 @@ namespace {
 
 namespace brw {
    class fs_live_variables;
+   class fs_builder;
 }
 
 /**
@@ -442,7 +443,7 @@ public:
    void dump_instruction(backend_instruction *inst);
    void dump_instruction(backend_instruction *inst, FILE *file);
 
-   void visit_atomic_counter_intrinsic(ir_call *ir);
+   void visit_atomic_counter_intrinsic(const brw::fs_builder &bld, ir_call *ir);
 
    const void *const key;
    const struct brw_sampler_prog_key_data *key_tex;
diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
index 20620c1..9b4d6d8 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
@@ -42,11 +42,13 @@
 #include "brw_cs.h"
 #include "brw_vec4.h"
 #include "brw_fs.h"
+#include "brw_fs_surface_builder.h"
 #include "main/uniforms.h"
 #include "glsl/glsl_types.h"
 #include "glsl/ir_optimization.h"
 #include "program/sampler.h"
 
+using namespace brw;
 
 fs_reg *
 fs_visitor::emit_vs_system_value(int location)
@@ -3161,31 +3163,38 @@ fs_visitor::visit(ir_loop_jump *ir)
 }
 
 void
-fs_visitor::visit_atomic_counter_intrinsic(ir_call *ir)
+fs_visitor::visit_atomic_counter_intrinsic(const fs_builder &bld, ir_call *ir)
 {
+   using namespace surface_access;
    ir_dereference *deref = static_cast<ir_dereference *>(
       ir->actual_parameters.get_head());
    ir_variable *location = deref->variable_referenced();
-   unsigned surf_index = (stage_prog_data->binding_table.abo_start +
-                          location->data.binding);
+   const fs_reg surface(stage_prog_data->binding_table.abo_start +
+                        location->data.binding);
    deref->accept(this);
    const fs_reg offset = this->result;
 
    /* Emit the appropriate machine instruction */
    const char *callee = ir->callee->function_name();
-   ir->return_deref->accept(this);
-   fs_reg dst = this->result;
+   fs_reg tmp;
 
-   if (!strcmp("__intrinsic_atomic_read", callee)) {
-      emit_untyped_surface_read(surf_index, dst, offset);
+   if (!strcmp("__intrinsic_atomic_read", callee))
+      tmp = surface_access::emit_untyped_read(bld, surface, offset, 1, 1);
 
-   } else if (!strcmp("__intrinsic_atomic_increment", callee)) {
-      emit_untyped_atomic(BRW_AOP_INC, surf_index, dst, offset,
-                          fs_reg(), fs_reg());
+   else if (!strcmp("__intrinsic_atomic_increment", callee))
+      tmp = surface_access::emit_untyped_atomic(
+         bld, surface, offset, fs_reg(), fs_reg(),
+         1, 1, BRW_AOP_INC);
 
-   } else if (!strcmp("__intrinsic_atomic_predecrement", callee)) {
-      emit_untyped_atomic(BRW_AOP_PREDEC, surf_index, dst, offset,
-                          fs_reg(), fs_reg());
+   else if (!strcmp("__intrinsic_atomic_predecrement", callee))
+      tmp = surface_access::emit_untyped_atomic(
+         bld, surface, offset, fs_reg(), fs_reg(),
+         1, 1, BRW_AOP_PREDEC);
+
+   /* Assign the result. */
+   if (ir->return_deref) {
+      ir->return_deref->accept(this);
+      bld.MOV(this->result, tmp);
    }
 }
 
@@ -3193,11 +3202,18 @@ void
 fs_visitor::visit(ir_call *ir)
 {
    const char *callee = ir->callee->function_name();
+   const bool uses_kill = (stage == MESA_SHADER_FRAGMENT &&
+                           ((brw_wm_prog_data *)prog_data)->uses_kill);
+   fs_builder bld(devinfo, mem_ctx, alloc, instructions, dispatch_width,
+                  stage, uses_kill);
+
+   bld.set_annotation(current_annotation);
+   bld.set_base_ir(base_ir);
 
    if (!strcmp("__intrinsic_atomic_read", callee) ||
        !strcmp("__intrinsic_atomic_increment", callee) ||
        !strcmp("__intrinsic_atomic_predecrement", callee)) {
-      visit_atomic_counter_intrinsic(ir);
+      visit_atomic_counter_intrinsic(bld, ir);
    } else {
       unreachable("Unsupported intrinsic.");
    }
-- 
2.3.5



More information about the mesa-dev mailing list