svga: Advertise shader limits.
authorJosé Fonseca <jfonseca@vmware.com>
Wed, 12 May 2010 13:10:50 +0000 (14:10 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Wed, 12 May 2010 13:11:28 +0000 (14:11 +0100)
src/gallium/drivers/svga/svga_screen.c

index 580340b237aaeefcfdac2d1241b14b0c57a09394..2c3c3f522020901b492b55e2442cb1f2c9cbe76f 100644 (file)
@@ -177,6 +177,57 @@ svga_get_paramf(struct pipe_screen *screen, enum pipe_cap param)
    case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
       return 0;
 
+   /*
+    * Fragment shader limits
+    */
+
+   case PIPE_CAP_MAX_FS_INSTRUCTIONS:
+   case PIPE_CAP_MAX_FS_ALU_INSTRUCTIONS:
+   case PIPE_CAP_MAX_FS_TEX_INSTRUCTIONS:
+   case PIPE_CAP_MAX_FS_TEX_INDIRECTIONS:
+      return svgascreen->use_ps30 ? 512 : 96;
+   case PIPE_CAP_MAX_FS_CONTROL_FLOW_DEPTH:
+      return SVGA3D_MAX_NESTING_LEVEL;
+   case PIPE_CAP_MAX_FS_INPUTS:
+      return 10;
+   case PIPE_CAP_MAX_FS_CONSTS:
+      return svgascreen->use_vs30 ? 224 : 16;
+   case PIPE_CAP_MAX_FS_TEMPS:
+      if (!sws->get_cap(sws, SVGA3D_DEVCAP_MAX_FRAGMENT_SHADER_TEMPS, &result))
+         return svgascreen->use_ps30 ? 32 : 12;
+      return result.u;
+   case PIPE_CAP_MAX_FS_ADDRS:
+      return svgascreen->use_ps30 ? 1 : 0;
+   case PIPE_CAP_MAX_FS_PREDS:
+      return svgascreen->use_ps30 ? 1 : 0;
+
+   /*
+    * Vertex shader limits
+    */
+   case PIPE_CAP_MAX_VS_INSTRUCTIONS:
+   case PIPE_CAP_MAX_VS_ALU_INSTRUCTIONS:
+      if (!sws->get_cap(sws, SVGA3D_DEVCAP_MAX_VERTEX_SHADER_INSTRUCTIONS, &result))
+         return svgascreen->use_vs30 ? 512 : 256;
+      return result.u;
+   case PIPE_CAP_MAX_VS_TEX_INSTRUCTIONS:
+   case PIPE_CAP_MAX_VS_TEX_INDIRECTIONS:
+      /* XXX: until we have vertex texture support */
+      return 0;
+   case PIPE_CAP_MAX_VS_CONTROL_FLOW_DEPTH:
+      return SVGA3D_MAX_NESTING_LEVEL;
+   case PIPE_CAP_MAX_VS_INPUTS:
+      return 16;
+   case PIPE_CAP_MAX_VS_CONSTS:
+      return 256;
+   case PIPE_CAP_MAX_VS_TEMPS:
+      if (!sws->get_cap(sws, SVGA3D_DEVCAP_MAX_VERTEX_SHADER_TEMPS, &result))
+         return svgascreen->use_vs30 ? 32 : 12;
+      return result.u;
+   case PIPE_CAP_MAX_VS_ADDRS:
+      return svgascreen->use_vs30 ? 1 : 0;
+   case PIPE_CAP_MAX_VS_PREDS:
+      return svgascreen->use_vs30 ? 1 : 0;
+
    default:
       return 0;
    }