⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 r300_vertexprog.c

📁 mesa-6.5-minigui源码
💻 C
📖 第 1 页 / 共 3 页
字号:
/**************************************************************************Copyright (C) 2005 Aapo Tahkola.All Rights Reserved.Permission is hereby granted, free of charge, to any person obtaining acopy of this software and associated documentation files (the "Software"),to deal in the Software without restriction, including without limitationon the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whomthe Software is furnished to do so, subject to the following conditions:The above copyright notice and this permission notice (including the nextparagraph) shall be included in all copies or substantial portions of theSoftware.THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALLTHE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OROTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THEUSE OR OTHER DEALINGS IN THE SOFTWARE.**************************************************************************//* * Authors: *   Aapo Tahkola <aet@rasterburn.org> */#include "glheader.h"#include "macros.h"#include "enums.h"#include "program.h"#include "nvvertexec.h"#include "r300_context.h"#include "r300_program.h"#include "program_instruction.h"#define SCALAR_FLAG (1<<31)#define FLAG_MASK (1<<31)#define OP_MASK	(0xf)  /* we are unlikely to have more than 15 */#define OPN(operator, ip, op) {#operator, OPCODE_##operator, ip, op}static struct{	char *name;	int opcode;	unsigned long ip; /* number of input operands and flags */	unsigned long op;}op_names[]={	OPN(ABS, 1, 1),	OPN(ADD, 2, 1),	OPN(ARL, 1, 1|SCALAR_FLAG),	OPN(DP3, 2, 3|SCALAR_FLAG),	OPN(DP4, 2, 3|SCALAR_FLAG),	OPN(DPH, 2, 3|SCALAR_FLAG),	OPN(DST, 2, 1),	OPN(EX2, 1|SCALAR_FLAG, 4|SCALAR_FLAG),	OPN(EXP, 1|SCALAR_FLAG, 1),	OPN(FLR, 1, 1),	OPN(FRC, 1, 1),	OPN(LG2, 1|SCALAR_FLAG, 4|SCALAR_FLAG),	OPN(LIT, 1, 1),	OPN(LOG, 1|SCALAR_FLAG, 1),	OPN(MAD, 3, 1),	OPN(MAX, 2, 1),	OPN(MIN, 2, 1),	OPN(MOV, 1, 1),	OPN(MUL, 2, 1),	OPN(POW, 2|SCALAR_FLAG, 4|SCALAR_FLAG),	OPN(RCP, 1|SCALAR_FLAG, 4|SCALAR_FLAG),	OPN(RSQ, 1|SCALAR_FLAG, 4|SCALAR_FLAG),	OPN(SGE, 2, 1),	OPN(SLT, 2, 1),	OPN(SUB, 2, 1),	OPN(SWZ, 1, 1),	OPN(XPD, 2, 1),	OPN(RCC, 0, 0), //extra	OPN(PRINT, 0, 0),	OPN(END, 0, 0),};#undef OPN	int r300VertexProgUpdateParams(GLcontext *ctx, struct r300_vertex_program *vp, float *dst){	int pi;	struct vertex_program *mesa_vp=(void *)vp;	float *dst_o=dst;        struct program_parameter_list *paramList;		if (mesa_vp->IsNVProgram) {		_mesa_init_vp_per_primitive_registers(ctx);				for (pi=0; pi < MAX_NV_VERTEX_PROGRAM_PARAMS; pi++) {			*dst++=ctx->VertexProgram.Parameters[pi][0];			*dst++=ctx->VertexProgram.Parameters[pi][1];			*dst++=ctx->VertexProgram.Parameters[pi][2];			*dst++=ctx->VertexProgram.Parameters[pi][3];		}		return dst - dst_o;	}		assert(mesa_vp->Base.Parameters);	_mesa_load_state_parameters(ctx, mesa_vp->Base.Parameters);		if(mesa_vp->Base.Parameters->NumParameters * 4 > VSF_MAX_FRAGMENT_LENGTH){		fprintf(stderr, "%s:Params exhausted\n", __FUNCTION__);		exit(-1);	}	        paramList = mesa_vp->Base.Parameters;	for(pi=0; pi < paramList->NumParameters; pi++){		switch(paramList->Parameters[pi].Type){					case PROGRAM_STATE_VAR:		case PROGRAM_NAMED_PARAM:			//fprintf(stderr, "%s", vp->Parameters->Parameters[pi].Name);		case PROGRAM_CONSTANT:			*dst++=paramList->ParameterValues[pi][0];			*dst++=paramList->ParameterValues[pi][1];			*dst++=paramList->ParameterValues[pi][2];			*dst++=paramList->ParameterValues[pi][3];		break;				default: _mesa_problem(NULL, "Bad param type in %s", __FUNCTION__);		}		}		return dst - dst_o;}		static unsigned long t_dst_mask(GLuint mask){	unsigned long flags=0;		if(mask & WRITEMASK_X) flags |= VSF_FLAG_X;	if(mask & WRITEMASK_Y) flags |= VSF_FLAG_Y;	if(mask & WRITEMASK_Z) flags |= VSF_FLAG_Z;	if(mask & WRITEMASK_W) flags |= VSF_FLAG_W;		return flags;}static unsigned long t_dst_class(enum register_file file){		switch(file){		case PROGRAM_TEMPORARY:			return VSF_OUT_CLASS_TMP;		case PROGRAM_OUTPUT:			return VSF_OUT_CLASS_RESULT;		case PROGRAM_ADDRESS:			return VSF_OUT_CLASS_ADDR;		/*			case PROGRAM_INPUT:		case PROGRAM_LOCAL_PARAM:		case PROGRAM_ENV_PARAM:		case PROGRAM_NAMED_PARAM:		case PROGRAM_STATE_VAR:		case PROGRAM_WRITE_ONLY:		case PROGRAM_ADDRESS:		*/		default:			fprintf(stderr, "problem in %s", __FUNCTION__);			exit(0);	}}static unsigned long t_dst_index(struct r300_vertex_program *vp, struct prog_dst_register *dst){	if(dst->File == PROGRAM_OUTPUT) {		if (vp->outputs[dst->Index] != -1)			return vp->outputs[dst->Index];		else {			WARN_ONCE("Unknown output %d\n", dst->Index);			return 10;		}	}else if(dst->File == PROGRAM_ADDRESS) {		assert(dst->Index == 0);	}		return dst->Index;}static unsigned long t_src_class(enum register_file file){		switch(file){		case PROGRAM_TEMPORARY:			return VSF_IN_CLASS_TMP;					case PROGRAM_INPUT:			return VSF_IN_CLASS_ATTR;					case PROGRAM_LOCAL_PARAM:		case PROGRAM_ENV_PARAM:		case PROGRAM_NAMED_PARAM:		case PROGRAM_STATE_VAR:			return VSF_IN_CLASS_PARAM;		/*			case PROGRAM_OUTPUT:		case PROGRAM_WRITE_ONLY:		case PROGRAM_ADDRESS:		*/		default:			fprintf(stderr, "problem in %s", __FUNCTION__);			exit(0);	}}static unsigned long t_swizzle(GLubyte swizzle){	switch(swizzle){		case SWIZZLE_X: return VSF_IN_COMPONENT_X;		case SWIZZLE_Y: return VSF_IN_COMPONENT_Y;		case SWIZZLE_Z: return VSF_IN_COMPONENT_Z;		case SWIZZLE_W: return VSF_IN_COMPONENT_W;		case SWIZZLE_ZERO: return VSF_IN_COMPONENT_ZERO;		case SWIZZLE_ONE: return VSF_IN_COMPONENT_ONE;		default:			fprintf(stderr, "problem in %s", __FUNCTION__);			exit(0);	}}#if 0static void vp_dump_inputs(struct r300_vertex_program *vp, char *caller){	int i;		if(vp == NULL){		fprintf(stderr, "vp null in call to %s from %s\n", __FUNCTION__, caller);		return ;	}		fprintf(stderr, "%s:<", caller);	for(i=0; i < VERT_ATTRIB_MAX; i++)		fprintf(stderr, "%d ", vp->inputs[i]);	fprintf(stderr, ">\n");	}#endifstatic unsigned long t_src_index(struct r300_vertex_program *vp, struct prog_src_register *src){	int i;	int max_reg=-1;		if(src->File == PROGRAM_INPUT){		if(vp->inputs[src->Index] != -1)			return vp->inputs[src->Index];				for(i=0; i < VERT_ATTRIB_MAX; i++)			if(vp->inputs[i] > max_reg)				max_reg=vp->inputs[i];				vp->inputs[src->Index]=max_reg+1;				//vp_dump_inputs(vp, __FUNCTION__);					return vp->inputs[src->Index];	}else{		return src->Index;	}}static unsigned long t_src(struct r300_vertex_program *vp, struct prog_src_register *src){		return MAKE_VSF_SOURCE(t_src_index(vp, src),				t_swizzle(GET_SWZ(src->Swizzle, 0)),				t_swizzle(GET_SWZ(src->Swizzle, 1)),				t_swizzle(GET_SWZ(src->Swizzle, 2)),				t_swizzle(GET_SWZ(src->Swizzle, 3)),				t_src_class(src->File),				src->NegateBase ? VSF_FLAG_ALL : VSF_FLAG_NONE) | (src->RelAddr << 4);}static unsigned long t_src_scalar(struct r300_vertex_program *vp, struct prog_src_register *src){				return MAKE_VSF_SOURCE(t_src_index(vp, src),				t_swizzle(GET_SWZ(src->Swizzle, 0)),				t_swizzle(GET_SWZ(src->Swizzle, 0)),				t_swizzle(GET_SWZ(src->Swizzle, 0)),				t_swizzle(GET_SWZ(src->Swizzle, 0)),				t_src_class(src->File),				src->NegateBase ? VSF_FLAG_ALL : VSF_FLAG_NONE);}static unsigned long t_opcode(enum prog_opcode opcode){	switch(opcode){		case OPCODE_DST: return R300_VPI_OUT_OP_DST;		case OPCODE_EX2: return R300_VPI_OUT_OP_EX2;		case OPCODE_EXP: return R300_VPI_OUT_OP_EXP;		case OPCODE_FRC: return R300_VPI_OUT_OP_FRC;		case OPCODE_LG2: return R300_VPI_OUT_OP_LG2;		case OPCODE_LOG: return R300_VPI_OUT_OP_LOG;		case OPCODE_MAX: return R300_VPI_OUT_OP_MAX;		case OPCODE_MIN: return R300_VPI_OUT_OP_MIN;		case OPCODE_MUL: return R300_VPI_OUT_OP_MUL;		case OPCODE_RCP: return R300_VPI_OUT_OP_RCP;		case OPCODE_RSQ: return R300_VPI_OUT_OP_RSQ;		case OPCODE_SGE: return R300_VPI_OUT_OP_SGE;		case OPCODE_SLT: return R300_VPI_OUT_OP_SLT;		case OPCODE_DP4: return R300_VPI_OUT_OP_DOT;				default: 			fprintf(stderr, "%s: Should not be called with opcode %d!", __FUNCTION__, opcode);	}	exit(-1);	return 0;}static unsigned long op_operands(enum prog_opcode opcode){	int i;		/* Can we trust mesas opcodes to be in order ? */	for(i=0; i < sizeof(op_names) / sizeof(*op_names); i++)		if(op_names[i].opcode == opcode)			return op_names[i].ip;		fprintf(stderr, "op %d not found in op_names\n", opcode);	exit(-1);	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -