diff options
Diffstat (limited to 'src/mesa')
| -rw-r--r-- | src/mesa/drivers/dri/r300/r300_context.c | 20 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/r300/r300_fragprog_common.c | 13 | 
2 files changed, 28 insertions, 5 deletions
| diff --git a/src/mesa/drivers/dri/r300/r300_context.c b/src/mesa/drivers/dri/r300/r300_context.c index 2ea1b826de..9df3897e65 100644 --- a/src/mesa/drivers/dri/r300/r300_context.c +++ b/src/mesa/drivers/dri/r300/r300_context.c @@ -374,11 +374,21 @@ static void r300InitConstValues(GLcontext *ctx, radeonScreenPtr screen)  	if (screen->chip_family >= CHIP_FAMILY_RV515) {  		ctx->Const.FragmentProgram.MaxNativeTemps = R500_PFS_NUM_TEMP_REGS;  		ctx->Const.FragmentProgram.MaxNativeAttribs = 11;	/* copy i915... */ -		ctx->Const.FragmentProgram.MaxNativeParameters = R500_PFS_NUM_CONST_REGS; -		ctx->Const.FragmentProgram.MaxNativeAluInstructions = R500_PFS_MAX_INST; -		ctx->Const.FragmentProgram.MaxNativeTexInstructions = R500_PFS_MAX_INST; -		ctx->Const.FragmentProgram.MaxNativeInstructions = R500_PFS_MAX_INST; -		ctx->Const.FragmentProgram.MaxNativeTexIndirections = R500_PFS_MAX_INST; + +		/* The hardware limits are higher than this, +		 * but the non-KMS DRM interface artificially limits us +		 * to this many instructions. +		 * +		 * We could of course work around it in the KMS path, +		 * but it would be a mess, so it seems wiser +		 * to leave it as is. Going forward, the Gallium driver +		 * will not be subject to these limitations. +		 */ +		ctx->Const.FragmentProgram.MaxNativeParameters = 255; +		ctx->Const.FragmentProgram.MaxNativeAluInstructions = 255; +		ctx->Const.FragmentProgram.MaxNativeTexInstructions = 255; +		ctx->Const.FragmentProgram.MaxNativeInstructions = 255; +		ctx->Const.FragmentProgram.MaxNativeTexIndirections = 255;  		ctx->Const.FragmentProgram.MaxNativeAddressRegs = 0;  	} else {  		ctx->Const.FragmentProgram.MaxNativeTemps = R300_PFS_NUM_TEMP_REGS; diff --git a/src/mesa/drivers/dri/r300/r300_fragprog_common.c b/src/mesa/drivers/dri/r300/r300_fragprog_common.c index 0bdc90b4a8..70c9252894 100644 --- a/src/mesa/drivers/dri/r300/r300_fragprog_common.c +++ b/src/mesa/drivers/dri/r300/r300_fragprog_common.c @@ -239,6 +239,19 @@ static void translate_fragment_program(GLcontext *ctx, struct r300_fragment_prog  	rewriteFog(&compiler, fp);  	r3xx_compile_fragment_program(&compiler); + +	if (compiler.is_r500) { +		/* We need to support the non-KMS DRM interface, which +		 * artificially limits the number of instructions and +		 * constants which are available to us. +		 * +		 * See also the comment in r300_context.c where we +		 * set the MAX_NATIVE_xxx values. +		 */ +		if (fp->code.code.r500.inst_end >= 255 || fp->code.constants.Count > 255) +			rc_error(&compiler.Base, "Program is too big (upgrade to r300g to avoid this limitation).\n"); +	} +  	fp->error = compiler.Base.Error;  	fp->InputsRead = compiler.Base.Program.InputsRead; | 
