gallium: add PIPE_SHADER_CAP_SUBROUTINES
authorMarek Olšák <maraeo@gmail.com>
Sun, 14 Nov 2010 14:34:59 +0000 (15:34 +0100)
committerMarek Olšák <maraeo@gmail.com>
Mon, 22 Nov 2010 11:41:22 +0000 (12:41 +0100)
This fixes piglit/glsl-vs-main-return and glsl-fs-main-return for the drivers
which don't support RET (i915g, r300g, r600g, svga).

ir_to_mesa does not currently generate subroutines, but it's a matter of time
till it's added. It would then break all the drivers which don't implement
them, so this CAP makes sense.

Signed-off-by: Marek Olšák <maraeo@gmail.com>
src/gallium/auxiliary/tgsi/tgsi_exec.h
src/gallium/drivers/i915/i915_screen.c
src/gallium/drivers/i965/brw_screen.c
src/gallium/drivers/nv50/nv50_screen.c
src/gallium/drivers/nvfx/nvfx_screen.c
src/gallium/drivers/r300/r300_screen.c
src/gallium/drivers/r600/r600_pipe.c
src/gallium/drivers/svga/svga_screen.c
src/gallium/include/pipe/p_defines.h
src/mesa/state_tracker/st_extensions.c

index 7b0777860138c7ec9f7ece665b9b69670049d497..b5ebbfbfaabaa9b65fdf43fb21c103d9c53af90f 100644 (file)
@@ -388,6 +388,8 @@ tgsi_exec_get_shader_param(enum pipe_shader_cap param)
    case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
    case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
       return 1;
+   case PIPE_SHADER_CAP_SUBROUTINES:
+      return 1;
    default:
       return 0;
    }
index 07183253649e9ea2517b3ad3b5b21b907e4af42c..a3c51138008cef66f9be6f53bd44ff960cb2bfbc 100644 (file)
@@ -189,6 +189,8 @@ i915_get_shader_param(struct pipe_screen *screen, unsigned shader, enum pipe_sha
       case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
       case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
          return 1;
+      case PIPE_SHADER_CAP_SUBROUTINES:
+         return 0;
       default:
          assert(0);
          return 0;
index 57160ebb2973555fcd76a85c5645b04f92d6d380..29486f5b815b27001b14d3f9bc5864580026618f 100644 (file)
@@ -240,6 +240,8 @@ brw_get_shader_param(struct pipe_screen *screen, unsigned shader, enum pipe_shad
       case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
       case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
           return 1;
+      case PIPE_SHADER_CAP_SUBROUTINES:
+          return 1;
       default:
          assert(0);
          return 0;
index 51eab3a0b039889a61c2463a3b38ef6849d3cdfe..49522b74d5b9f7c016b646f94a6ccd2751ab6df0 100644 (file)
@@ -176,6 +176,8 @@ nv50_screen_get_shader_param(struct pipe_screen *pscreen, unsigned shader,
        case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
        case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
                return 1;
+       case PIPE_SHADER_CAP_SUBROUTINES:
+               return 0;
        default:
                return 0;
        }
index d7553e9f399984fd7d4e681b4dc0871da99a5384..92e1d330907572d3dd23c3667acb7af7082adb34 100644 (file)
@@ -123,6 +123,8 @@ nvfx_screen_get_shader_param(struct pipe_screen *pscreen, unsigned shader, enum
                case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
                case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
                        return 0;
+               case PIPE_SHADER_CAP_SUBROUTINES:
+                       return screen->use_nv4x ? 1 : 0;
                default:
                        break;
                }
@@ -161,6 +163,8 @@ nvfx_screen_get_shader_param(struct pipe_screen *pscreen, unsigned shader, enum
                        return 0;
                case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
                        return 1;
+               case PIPE_SHADER_CAP_SUBROUTINES:
+                       return 1;
                default:
                        break;
                }
index 759d0e669686f3f7b685575f40ece2351be12387..5332866188fbf50e2287a64e1512e39d8ddcfbab 100644 (file)
@@ -214,6 +214,8 @@ static int r300_get_shader_param(struct pipe_screen *pscreen, unsigned shader, e
         case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
         case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
             return 0;
+        case PIPE_SHADER_CAP_SUBROUTINES:
+            return 0;
         }
         break;
     case PIPE_SHADER_VERTEX:
@@ -251,6 +253,8 @@ static int r300_get_shader_param(struct pipe_screen *pscreen, unsigned shader, e
             return 0;
         case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
             return 1;
+        case PIPE_SHADER_CAP_SUBROUTINES:
+            return 0;
         default:
             break;
         }
index d7bd4db48eafe800f4592188a067c2c3c06d0df3..cb8dd444740ee367b8e287c1942e6c6d605acdac 100644 (file)
@@ -375,6 +375,8 @@ static int r600_get_shader_param(struct pipe_screen* pscreen, unsigned shader, e
        case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
        case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
                return 1;
+       case PIPE_SHADER_CAP_SUBROUTINES:
+               return 0;
        default:
                return 0;
        }
index af99c41901058ec6b926ec22707385e5e2d0dc4f..666b498d1450e8c9c668e56802a596c64cc89570 100644 (file)
@@ -237,6 +237,8 @@ static int svga_get_shader_param(struct pipe_screen *screen, unsigned shader, en
       case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
       case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
          return 0;
+      case PIPE_SHADER_CAP_SUBROUTINES:
+         return 0;
       }
       break;
    case PIPE_SHADER_VERTEX:
@@ -276,6 +278,8 @@ static int svga_get_shader_param(struct pipe_screen *screen, unsigned shader, en
          return 0;
       case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
          return 1;
+      case PIPE_SHADER_CAP_SUBROUTINES:
+         return 0;
       default:
          break;
       }
index 6cca301ccc4244ba0442d6f3abc72245c0708599..dacabed891ab45c2507b01f98bb3ad897582ea2e 100644 (file)
@@ -489,6 +489,7 @@ enum pipe_shader_cap
    PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR,
    PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR,
    PIPE_SHADER_CAP_INDIRECT_CONST_ADDR,
+   PIPE_SHADER_CAP_SUBROUTINES, /* BGNSUB, ENDSUB, CAL, RET */
 };
 
 /**
index 62f84ed6b4070b2506c7d8417caca3691f0252da..8c3fa0eef45fc18c4013f633f62a17c373768a8f 100644 (file)
@@ -169,9 +169,9 @@ void st_init_limits(struct st_context *st)
 
       /* TODO: make these more fine-grained if anyone needs it */
       options->EmitNoIfs = !screen->get_shader_param(screen, i, PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH);
-      options->EmitNoFunctions = !screen->get_shader_param(screen, i, PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH);
       options->EmitNoLoops = !screen->get_shader_param(screen, i, PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH);
-      options->EmitNoMainReturn = !screen->get_shader_param(screen, i, PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH);
+      options->EmitNoFunctions = !screen->get_shader_param(screen, i, PIPE_SHADER_CAP_SUBROUTINES);
+      options->EmitNoMainReturn = !screen->get_shader_param(screen, i, PIPE_SHADER_CAP_SUBROUTINES);
 
       options->EmitNoCont = !screen->get_shader_param(screen, i, PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED);