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

Author: Vadim Girlin <vadimgir...@gmail.com>
Date:   Tue Apr 23 10:34:00 2013 +0400

r600g/sb: use source bytecode in case of optimization errors

---

 src/gallium/drivers/r600/r600_pipe.c       |    1 +
 src/gallium/drivers/r600/r600_pipe.h       |    1 +
 src/gallium/drivers/r600/sb/sb_bc.h        |    1 +
 src/gallium/drivers/r600/sb/sb_context.cpp |    1 +
 src/gallium/drivers/r600/sb/sb_core.cpp    |   32 ++++++++++++++++++---------
 5 files changed, 25 insertions(+), 11 deletions(-)

diff --git a/src/gallium/drivers/r600/r600_pipe.c 
b/src/gallium/drivers/r600/r600_pipe.c
index 8f6d59b..4991fb2 100644
--- a/src/gallium/drivers/r600/r600_pipe.c
+++ b/src/gallium/drivers/r600/r600_pipe.c
@@ -72,6 +72,7 @@ static const struct debug_named_value debug_options[] = {
        { "sbdry", DBG_SB_DRY_RUN, "Don't use optimized bytecode (just print 
the dumps)" },
        { "sbstat", DBG_SB_STAT, "Print optimization statistics for shaders" },
        { "sbdump", DBG_SB_DUMP, "Print IR dumps after some optimization 
passes" },
+       { "sbnofallback", DBG_SB_NO_FALLBACK, "Abort on errors instead of 
fallback" },
 
        DEBUG_NAMED_VALUE_END /* must be last */
 };
diff --git a/src/gallium/drivers/r600/r600_pipe.h 
b/src/gallium/drivers/r600/r600_pipe.h
index 322989a..61e2022 100644
--- a/src/gallium/drivers/r600/r600_pipe.h
+++ b/src/gallium/drivers/r600/r600_pipe.h
@@ -263,6 +263,7 @@ typedef boolean (*r600g_dma_blit_t)(struct pipe_context 
*ctx,
 #define DBG_SB_DRY_RUN (1 << 23)
 #define DBG_SB_STAT            (1 << 24)
 #define DBG_SB_DUMP            (1 << 25)
+#define DBG_SB_NO_FALLBACK     (1 << 26)
 
 struct r600_tiling_info {
        unsigned num_channels;
diff --git a/src/gallium/drivers/r600/sb/sb_bc.h 
b/src/gallium/drivers/r600/sb/sb_bc.h
index be68f9f..459dcac 100644
--- a/src/gallium/drivers/r600/sb/sb_bc.h
+++ b/src/gallium/drivers/r600/sb/sb_bc.h
@@ -478,6 +478,7 @@ public:
        static unsigned dump_stat;
 
        static unsigned dry_run;
+       static unsigned no_fallback;
 
        static unsigned dskip_start;
        static unsigned dskip_end;
diff --git a/src/gallium/drivers/r600/sb/sb_context.cpp 
b/src/gallium/drivers/r600/sb/sb_context.cpp
index 7a25982..0346313 100644
--- a/src/gallium/drivers/r600/sb/sb_context.cpp
+++ b/src/gallium/drivers/r600/sb/sb_context.cpp
@@ -31,6 +31,7 @@ namespace r600_sb {
 unsigned sb_context::dump_pass = 0;
 unsigned sb_context::dump_stat = 0;
 unsigned sb_context::dry_run = 0;
+unsigned sb_context::no_fallback = 0;
 
 unsigned sb_context::dskip_start = 0;
 unsigned sb_context::dskip_end = 0;
diff --git a/src/gallium/drivers/r600/sb/sb_core.cpp 
b/src/gallium/drivers/r600/sb/sb_core.cpp
index aec838d..bc200a4 100644
--- a/src/gallium/drivers/r600/sb/sb_core.cpp
+++ b/src/gallium/drivers/r600/sb/sb_core.cpp
@@ -65,6 +65,7 @@ sb_context *r600_sb_context_create(struct r600_context *rctx) 
{
        sb_context::dump_pass = df & DBG_SB_DUMP;
        sb_context::dump_stat = df & DBG_SB_STAT;
        sb_context::dry_run = df & DBG_SB_DRY_RUN;
+       sb_context::no_fallback = df & DBG_SB_NO_FALLBACK;
 
        sb_context::dskip_start = debug_get_num_option("R600_SB_DSKIP_START", 
0);
        sb_context::dskip_end = debug_get_num_option("R600_SB_DSKIP_END", 0);
@@ -96,6 +97,15 @@ int r600_sb_bytecode_process(struct r600_context *rctx,
                time_start = os_time_get_nano();
        }
 
+       SB_DUMP_STAT( cerr << "\nsb: shader " << shader_id << "\n"; );
+
+       bc_parser parser(*ctx, bc, pshader, dump_source_bytecode, optimize);
+
+       if ((r = parser.parse())) {
+               assert(0);
+               return r;
+       }
+
        /* skip some shaders (use shaders from default backend)
         * dskip_start - range start, dskip_end - range_end,
         * e.g. start = 5, end = 6 means shaders 5 & 6
@@ -116,15 +126,6 @@ int r600_sb_bytecode_process(struct r600_context *rctx,
                }
        }
 
-       SB_DUMP_STAT( cerr << "\nsb: shader " << shader_id << "\n"; );
-
-       bc_parser parser(*ctx, bc, pshader, dump_source_bytecode, optimize);
-
-       if ((r = parser.parse())) {
-               assert(0);
-               return r;
-       }
-
        shader *sh = parser.get_shader();
        SB_DUMP_PASS( cerr << "\n\n###### after parse\n"; sh->dump_ir(); );
 
@@ -136,8 +137,17 @@ int r600_sb_bytecode_process(struct r600_context *rctx,
 #define SB_RUN_PASS(n, dump) \
        do { \
                r = n(*sh).run(); \
+               if (r) { \
+                       cerr << "sb: error (" << r << ") in the " << #n << " 
pass.\n"; \
+                       if (sb_context::no_fallback) \
+                               return r; \
+                       cerr << "sb: using unoptimized bytecode...\n"; \
+                       delete sh; \
+                       return 0; \
+               } \
                if (dump) { \
-                       SB_DUMP_PASS( cerr << "\n\n###### after " << #n << 
"\n"; sh->dump_ir();); \
+                       SB_DUMP_PASS( cerr << "\n\n###### after " << #n << 
"\n"; \
+                               sh->dump_ir();); \
                } \
                assert(!r); \
        } while (0)
@@ -175,7 +185,7 @@ int r600_sb_bytecode_process(struct r600_context *rctx,
        // container nodes in the correct locations for code placement
        sh->create_bbs();
 
-       SB_RUN_PASS(gcm,                                0);
+       SB_RUN_PASS(gcm,                                1);
 
        sh->compute_interferences = true;
        SB_RUN_PASS(liveness,                   0);

_______________________________________________
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to