summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosé Fonseca <jfonseca@vmware.com>2010-05-04 10:09:49 +0100
committerJosé Fonseca <jfonseca@vmware.com>2010-05-04 15:37:25 +0100
commit30e9ffcd3bf184a0a67be5dcab254e8049c8c578 (patch)
tree38f14db1ef3138bc10df4a14413d2123d842b417
parent4d63be67f320839d115987211d0d9b4297f6d17d (diff)
mesa/st: Fill in native program limits.
In the lack of more fine grained capabilities in Gallium, assume that if the pipe driver supports GLSL then native limits match Mesa software limits. (cherry picked from commit 40a90cd11234a09c2477f5c9984dd6d9fac3f52c)
-rw-r--r--src/mesa/state_tracker/st_extensions.c91
1 files changed, 91 insertions, 0 deletions
diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
index 79be833768..a94eaa47bd 100644
--- a/src/mesa/state_tracker/st_extensions.c
+++ b/src/mesa/state_tracker/st_extensions.c
@@ -67,6 +67,7 @@ void st_init_limits(struct st_context *st)
{
struct pipe_screen *screen = st->pipe->screen;
struct gl_constants *c = &st->ctx->Const;
+ struct gl_program_constants *pc;
c->MaxTextureLevels
= _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS),
@@ -137,6 +138,96 @@ void st_init_limits(struct st_context *st)
/* XXX separate query for early function return? */
st->ctx->Shader.EmitContReturn =
screen->get_param(screen, PIPE_CAP_TGSI_CONT_SUPPORTED);
+
+ if (screen->get_param(screen, PIPE_CAP_GLSL)) {
+ /*
+ * In the lack of more fine grained capabilities, if the pipe driver supports
+ * GLSL then assume native limits match Mesa software limits.
+ */
+
+ pc = &c->FragmentProgram;
+ pc->MaxNativeInstructions = pc->MaxInstructions;
+ pc->MaxNativeAluInstructions = pc->MaxAluInstructions;
+ pc->MaxNativeTexInstructions = pc->MaxTexInstructions;
+ pc->MaxNativeTexIndirections = pc->MaxTexIndirections;
+ pc->MaxNativeAttribs = pc->MaxAttribs;
+ pc->MaxNativeTemps = pc->MaxTemps;
+ pc->MaxNativeAddressRegs = pc->MaxAddressRegs;
+ pc->MaxNativeParameters = pc->MaxParameters;
+
+ pc = &c->VertexProgram;
+ pc->MaxNativeInstructions = pc->MaxInstructions;
+ pc->MaxNativeAluInstructions = pc->MaxAluInstructions;
+ pc->MaxNativeTexInstructions = pc->MaxTexInstructions;
+ pc->MaxNativeTexIndirections = pc->MaxTexIndirections;
+ pc->MaxNativeAttribs = pc->MaxAttribs;
+ pc->MaxNativeTemps = pc->MaxTemps;
+ pc->MaxNativeAddressRegs = pc->MaxAddressRegs;
+ pc->MaxNativeParameters = pc->MaxParameters;
+ } else if (screen->get_param(screen, PIPE_CAP_SM3)) {
+ /*
+ * Assume the hardware meets the minimum requirements
+ * for Shader Model 3.
+ *
+ * See also:
+ * - http://msdn.microsoft.com/en-us/library/bb172920(VS.85).aspx
+ * - http://msdn.microsoft.com/en-us/library/bb172963(VS.85).aspx
+ */
+
+ pc = &c->FragmentProgram;
+ pc->MaxNativeInstructions = 512; /* D3DMIN30SHADERINSTRUCTIONS */
+ pc->MaxNativeAluInstructions = pc->MaxNativeInstructions;
+ pc->MaxNativeTexInstructions = pc->MaxNativeInstructions;
+ pc->MaxNativeTexIndirections = pc->MaxNativeTexInstructions;
+ pc->MaxNativeAttribs = 10;
+ pc->MaxNativeTemps = 32;
+ pc->MaxNativeAddressRegs = 1; /* aL */
+ pc->MaxNativeParameters = 224;
+
+ pc = &c->VertexProgram;
+ pc->MaxNativeInstructions = 512; /* D3DMIN30SHADERINSTRUCTIONS */
+ pc->MaxNativeAluInstructions = pc->MaxNativeInstructions;
+ pc->MaxNativeTexInstructions = pc->MaxNativeInstructions;
+ pc->MaxNativeTexIndirections = pc->MaxNativeTexInstructions;
+ pc->MaxNativeAttribs = 16;
+ pc->MaxNativeTemps = 32;
+ pc->MaxNativeAddressRegs = 2; /* a0 and aL */
+ pc->MaxNativeParameters = 256;
+ } else {
+ /*
+ * Assume the hardware meets the minimum requirements
+ * for Shader Model 2.
+ *
+ * See also:
+ * - http://msdn.microsoft.com/en-us/library/bb172918(VS.85).aspx
+ * - http://msdn.microsoft.com/en-us/library/bb172961(VS.85).aspx
+ */
+
+ pc = &c->FragmentProgram;
+ pc->MaxNativeInstructions = 96; /* D3DPS20_MIN_NUMINSTRUCTIONSLOTS */
+ pc->MaxNativeAluInstructions = 64;
+ pc->MaxNativeTexInstructions = 32;
+ pc->MaxNativeTexIndirections = pc->MaxNativeTexInstructions;
+ pc->MaxNativeAttribs = 10; /* 2 color + 8 texture coord */
+ pc->MaxNativeTemps = 12; /* D3DPS20_MIN_NUMTEMPS */
+ pc->MaxNativeAddressRegs = 0;
+ pc->MaxNativeParameters = 16;
+
+ pc = &c->VertexProgram;
+ pc->MaxNativeInstructions = 256;
+ pc->MaxNativeAluInstructions = 256;
+ pc->MaxNativeTexInstructions = 0;
+ pc->MaxNativeTexIndirections = 0;
+ pc->MaxNativeAttribs = 16;
+ pc->MaxNativeTemps = 12; /* D3DVS20_MIN_NUMTEMPS */
+ pc->MaxNativeAddressRegs = 2; /* a0 and aL */
+ pc->MaxNativeParameters = 256;
+ }
+
+ if (!screen->get_param(screen, PIPE_CAP_MAX_VERTEX_TEXTURE_UNITS)) {
+ c->VertexProgram.MaxNativeTexInstructions = 0;
+ c->VertexProgram.MaxNativeTexIndirections = 0;
+ }
}