From 2d4ff6a8cf83ca3a829021482b08b95bea7aa31a Mon Sep 17 00:00:00 2001 From: Aapo Tahkola Date: Mon, 9 Jan 2006 22:53:38 +0000 Subject: Missing patch from Ben Skeggs: Lots of changes, and fixes for some badness on my behalf. 1. Disposable data used during fp compile is now per-context, rather than per-program to save memory. 2. Track usage of INPUT/TEMP registers from Mesa program, free them when no longer required so the hw temps can be re-used. 3. Changed LAST_NODE to OUTPUT_COLOR (see r300_reg.h) 4. Implemented remaining ARB_f_p instructions, with the exception of the trig/LIT opcodes. 5. Treat ZERO/ONE swizzles the same way as other native swizzles. 6. emit_arith changes, basically a complete re-write. Should produce cleaner instructions, but no real functional changes. internal reg -> hw reg routines shared with emit_tex. A bit messy still. --- src/mesa/drivers/dri/r300/r300_context.h | 47 +++++++++++++++++++++++++------- 1 file changed, 37 insertions(+), 10 deletions(-) (limited to 'src/mesa/drivers/dri/r300/r300_context.h') diff --git a/src/mesa/drivers/dri/r300/r300_context.h b/src/mesa/drivers/dri/r300/r300_context.h index 8eaff49ae3..bfa48d07c8 100644 --- a/src/mesa/drivers/dri/r300/r300_context.h +++ b/src/mesa/drivers/dri/r300/r300_context.h @@ -85,7 +85,6 @@ typedef struct r300_context *r300ContextPtr; typedef GLuint uint32_t; typedef GLubyte uint8_t; -struct r300_fragment_program; /* We should probably change types within vertex_shader and pixel_shader structure later on */ @@ -613,12 +612,46 @@ struct r300_vertex_program { #define PFS_MAX_TEX_INDIRECT 4 #define PFS_NUM_TEMP_REGS 32 #define PFS_NUM_CONST_REGS 32 + +/* Tracking data for Mesa registers */ +struct reg_acc { + int reg; /* Assigned hw temp */ + unsigned int refcount; /* Number of uses by mesa program */ +}; + +struct r300_pfs_compile_state { + int v_pos, s_pos; /* highest ALU slots used */ + + /* Track some information gathered during opcode + * construction. + * + * NOTE: Data is only set by the code, and isn't used yet. + */ + struct { + int vsrc[3]; + int ssrc[3]; + int umask; + } slot[PFS_MAX_ALU_INST]; + + /* Used to map Mesa's inputs/temps onto hardware temps */ + int temp_in_use; + struct reg_acc temps[PFS_NUM_TEMP_REGS]; + struct reg_acc inputs[32]; /* don't actually need 32... */ + + /* Track usage of hardware temps, for register allocation, + * indirection detection, etc. */ + int hwreg_in_use; + GLuint used_in_node; + GLuint dest_in_node; +}; + struct r300_fragment_program { struct fragment_program mesa_program; GLcontext *ctx; GLboolean translated; GLboolean error; + struct r300_pfs_compile_state *cs; struct { int length; @@ -633,14 +666,13 @@ struct r300_fragment_program { GLuint inst3; } inst[PFS_MAX_ALU_INST]; } alu; - int v_pos; - int s_pos; struct { int tex_offset; int tex_end; int alu_offset; int alu_end; + int flags; } node[4]; int cur_node; int first_node_has_tex; @@ -661,14 +693,7 @@ struct r300_fragment_program { } param[PFS_NUM_CONST_REGS]; int param_nr; GLboolean params_uptodate; - - GLuint temps[PFS_NUM_TEMP_REGS]; - int temp_in_use; - GLuint used_in_node; - GLuint dest_in_node; - GLuint inputs[32]; /* don't actually need 32... */ - int hwreg_in_use; int max_temp_idx; }; @@ -794,6 +819,8 @@ struct r300_state { struct r300_vertex_shader_state vertex_shader; #if USE_ARB_F_P == 0 struct r300_pixel_shader_state pixel_shader; +#else + struct r300_pfs_compile_state pfs_compile; #endif struct r300_dma_region aos[R300_MAX_AOS_ARRAYS]; int aos_count; -- cgit v1.2.3