mesa/st: set compiler options based on Gallium shader caps
authorLuca Barbieri <luca@luca-barbieri.com>
Mon, 6 Sep 2010 00:31:20 +0000 (02:31 +0200)
committerLuca Barbieri <luca@luca-barbieri.com>
Tue, 14 Sep 2010 04:08:03 +0000 (06:08 +0200)
This turns on if conversion and unlimited loop unrolling if control
flow is not supported.

NOTE: this will change the behavior of r300g and any other driver
that doesn't advertise control flow

src/mesa/state_tracker/st_extensions.c

index d637e6f43a0d39f4aee2faa0030803219131600e..3f91eb78d81b605507e9e4d68012991bf1945fd2 100644 (file)
@@ -162,7 +162,16 @@ void st_init_limits(struct st_context *st)
       pc->MaxNativeAddressRegs     = screen->get_shader_param(screen, i, PIPE_SHADER_CAP_MAX_ADDRS);
       pc->MaxNativeParameters      = screen->get_shader_param(screen, i, PIPE_SHADER_CAP_MAX_CONSTS);
 
+      /* 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->EmitNoCont = !screen->get_shader_param(screen, i, PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED);
+
+      if(options->EmitNoLoops)
+         options->MaxUnrollIterations = MIN2(screen->get_shader_param(screen, i, PIPE_SHADER_CAP_MAX_INSTRUCTIONS), 65536);
    }
 
    /* PIPE_CAP_MAX_FS_INPUTS specifies the number of COLORn + GENERICn inputs