This increases the size of gl_program but in future a union can be used to offset this increase in memory use. Combining the two reduces code and make it easier to follow.
Cc: Miklós Máté <mtm...@gmail.com> --- NOTE: compile tested only. src/mesa/drivers/common/driverfuncs.c | 3 - src/mesa/drivers/dri/r200/r200_context.h | 2 +- src/mesa/drivers/dri/r200/r200_fragshader.c | 86 ++++++------- src/mesa/drivers/dri/r200/r200_state_init.c | 2 +- src/mesa/drivers/dri/r200/r200_vertprog.c | 1 + src/mesa/main/atifragshader.c | 193 +++++++++++++--------------- src/mesa/main/atifragshader.h | 4 +- src/mesa/main/dd.h | 6 +- src/mesa/main/mtypes.h | 57 ++++---- src/mesa/main/shared.c | 2 +- src/mesa/main/state.c | 4 +- src/mesa/main/state.h | 2 +- src/mesa/program/program.c | 3 +- src/mesa/state_tracker/st_atifs_to_tgsi.c | 28 ++-- src/mesa/state_tracker/st_atifs_to_tgsi.h | 2 - src/mesa/state_tracker/st_atom_constbuf.c | 9 +- src/mesa/state_tracker/st_atom_shader.c | 8 +- src/mesa/state_tracker/st_cb_program.c | 20 +-- src/mesa/state_tracker/st_program.c | 7 +- src/mesa/state_tracker/st_program.h | 1 - src/mesa/swrast/s_atifragshader.c | 18 +-- 21 files changed, 206 insertions(+), 252 deletions(-) diff --git a/src/mesa/drivers/common/driverfuncs.c b/src/mesa/drivers/common/driverfuncs.c index ddb4bb6d6a..a8b4d9857f 100644 --- a/src/mesa/drivers/common/driverfuncs.c +++ b/src/mesa/drivers/common/driverfuncs.c @@ -110,23 +110,20 @@ _mesa_init_driver_functions(struct dd_function_table *driver) driver->AllocTextureImageBuffer = _swrast_alloc_texture_image_buffer; driver->FreeTextureImageBuffer = _swrast_free_texture_image_buffer; driver->MapTextureImage = _swrast_map_teximage; driver->UnmapTextureImage = _swrast_unmap_teximage; driver->DrawTex = _mesa_meta_DrawTex; /* Vertex/fragment programs */ driver->NewProgram = _mesa_new_program; driver->DeleteProgram = _mesa_delete_program; - /* ATI_fragment_shader */ - driver->NewATIfs = NULL; - /* simple state commands */ driver->AlphaFunc = NULL; driver->BlendColor = NULL; driver->BlendEquationSeparate = NULL; driver->BlendFuncSeparate = NULL; driver->ClipPlane = NULL; driver->ColorMask = NULL; driver->ColorMaterial = NULL; driver->CullFace = NULL; driver->DrawBuffer = NULL; diff --git a/src/mesa/drivers/dri/r200/r200_context.h b/src/mesa/drivers/dri/r200/r200_context.h index f9ba6835e8..e164c5d186 100644 --- a/src/mesa/drivers/dri/r200/r200_context.h +++ b/src/mesa/drivers/dri/r200/r200_context.h @@ -606,21 +606,21 @@ struct r200_context { /* r200_tcl.c */ struct r200_tcl_info tcl; /* r200_swtcl.c */ struct r200_swtcl_info swtcl; GLboolean using_hyperz; - struct ati_fragment_shader *afs_loaded; + struct gl_program *afs_loaded; }; static inline r200ContextPtr R200_CONTEXT(struct gl_context *ctx) { return (r200ContextPtr) ctx; } diff --git a/src/mesa/drivers/dri/r200/r200_fragshader.c b/src/mesa/drivers/dri/r200/r200_fragshader.c index ca772f1c87..1eb9c7e4ec 100644 --- a/src/mesa/drivers/dri/r200/r200_fragshader.c +++ b/src/mesa/drivers/dri/r200/r200_fragshader.c @@ -118,38 +118,38 @@ static GLuint dstmask_table[8] = R200_TXC_OUTPUT_MASK_B, R200_TXC_OUTPUT_MASK_RB, R200_TXC_OUTPUT_MASK_GB, R200_TXC_OUTPUT_MASK_RGB }; static void r200UpdateFSArith( struct gl_context *ctx ) { r200ContextPtr rmesa = R200_CONTEXT(ctx); GLuint *afs_cmd; - const struct ati_fragment_shader *shader = ctx->ATIFragmentShader.Current; + const struct gl_program *shader = ctx->ATIFragmentShader.Current; GLuint pass; R200_STATECHANGE( rmesa, afs[0] ); R200_STATECHANGE( rmesa, afs[1] ); - if (shader->NumPasses < 2) { + if (shader->ati.NumPasses < 2) { afs_cmd = (GLuint *) rmesa->hw.afs[1].cmd; } else { afs_cmd = (GLuint *) rmesa->hw.afs[0].cmd; } - for (pass = 0; pass < shader->NumPasses; pass++) { + for (pass = 0; pass < shader->ati.NumPasses; pass++) { GLuint opnum = 0; GLuint pc; - for (pc = 0; pc < shader->numArithInstr[pass]; pc++) { + for (pc = 0; pc < shader->ati.numArithInstr[pass]; pc++) { GLuint optype; - struct atifs_instruction *inst = &shader->Instructions[pass][pc]; + struct atifs_instruction *inst = &shader->ati.Instructions[pass][pc]; SET_INST(opnum, 0) = 0; SET_INST_2(opnum, 0) = 0; SET_INST(opnum, 1) = 0; SET_INST_2(opnum, 1) = 0; for (optype = 0; optype < 2; optype++) { GLuint tfactor = 0; if (inst->Opcode[optype]) { @@ -274,22 +274,22 @@ static void r200UpdateFSArith( struct gl_context *ctx ) GLuint dstmod = inst->DstReg[optype].dstMod; dstmod &= ~GL_SATURATE_BIT_ATI; SET_INST_2(opnum, optype) |= (dstreg + 1) << R200_TXC_OUTPUT_REG_SHIFT; SET_INST_2(opnum, optype) |= dstmask_table[dstmask]; /* fglrx does clamp the last instructions to 0_1 it seems */ /* this won't necessarily catch the last instruction which writes to reg0 */ - if (sat || (pc == (shader->numArithInstr[pass] - 1) && - ((pass == 1) || (shader->NumPasses == 1)))) + if (sat || (pc == (shader->ati.numArithInstr[pass] - 1) && + ((pass == 1) || (shader->ati.NumPasses == 1)))) SET_INST_2(opnum, optype) |= R200_TXC_CLAMP_0_1; else /*should we clamp or not? spec is vague, I would suppose yes but fglrx doesn't */ SET_INST_2(opnum, optype) |= R200_TXC_CLAMP_8_8; /* SET_INST_2(opnum, optype) |= R200_TXC_CLAMP_WRAP;*/ switch(dstmod) { case GL_2X_BIT_ATI: SET_INST_2(opnum, optype) |= R200_TXC_SCALE_2X; break; case GL_4X_BIT_ATI: @@ -317,172 +317,172 @@ static void r200UpdateFSArith( struct gl_context *ctx ) SET_INST(opnum, 1), SET_INST_2(opnum, 1));*/ opnum++; } afs_cmd = (GLuint *) rmesa->hw.afs[1].cmd; } rmesa->afs_loaded = ctx->ATIFragmentShader.Current; } static void r200UpdateFSRouting( struct gl_context *ctx ) { r200ContextPtr rmesa = R200_CONTEXT(ctx); - const struct ati_fragment_shader *shader = ctx->ATIFragmentShader.Current; + const struct gl_program *shader = ctx->ATIFragmentShader.Current; GLuint reg; R200_STATECHANGE( rmesa, ctx ); R200_STATECHANGE( rmesa, cst ); for (reg = 0; reg < R200_MAX_TEXTURE_UNITS; reg++) { - if (shader->swizzlerq & (1 << (2 * reg))) + if (shader->ati.swizzlerq & (1 << (2 * reg))) /* r coord */ set_re_cntl_d3d( ctx, reg, 1); /* q coord */ else set_re_cntl_d3d( ctx, reg, 0); } rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~(R200_MULTI_PASS_ENABLE | R200_TEX_BLEND_ENABLE_MASK | R200_TEX_ENABLE_MASK); rmesa->hw.cst.cmd[CST_PP_CNTL_X] &= ~(R200_PPX_PFS_INST_ENABLE_MASK | R200_PPX_TEX_ENABLE_MASK | R200_PPX_OUTPUT_REG_MASK); /* first pass registers use slots 8 - 15 but single pass shaders use slots 0 - 7 */ - if (shader->NumPasses < 2) { - rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= shader->numArithInstr[0] == 8 ? + if (shader->ati.NumPasses < 2) { + rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= shader->ati.numArithInstr[0] == 8 ? 0xff << (R200_TEX_BLEND_0_ENABLE_SHIFT - 1) : - (0xff >> (8 - shader->numArithInstr[0])) << R200_TEX_BLEND_0_ENABLE_SHIFT; + (0xff >> (8 - shader->ati.numArithInstr[0])) << R200_TEX_BLEND_0_ENABLE_SHIFT; } else { rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= R200_MULTI_PASS_ENABLE; - rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= shader->numArithInstr[1] == 8 ? + rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= shader->ati.numArithInstr[1] == 8 ? 0xff << (R200_TEX_BLEND_0_ENABLE_SHIFT - 1) : - (0xff >> (8 - shader->numArithInstr[1])) << R200_TEX_BLEND_0_ENABLE_SHIFT; + (0xff >> (8 - shader->ati.numArithInstr[1])) << R200_TEX_BLEND_0_ENABLE_SHIFT; rmesa->hw.cst.cmd[CST_PP_CNTL_X] |= - (0xff >> (8 - shader->numArithInstr[0])) << R200_PPX_FPS_INST0_ENABLE_SHIFT; + (0xff >> (8 - shader->ati.numArithInstr[0])) << R200_PPX_FPS_INST0_ENABLE_SHIFT; } - if (shader->NumPasses < 2) { + if (shader->ati.NumPasses < 2) { for (reg = 0; reg < R200_MAX_TEXTURE_UNITS; reg++) { struct gl_texture_object *texObj = ctx->Texture.Unit[reg]._Current; R200_STATECHANGE( rmesa, tex[reg] ); rmesa->hw.tex[reg].cmd[TEX_PP_TXMULTI_CTL] = 0; - if (shader->SetupInst[0][reg].Opcode) { + if (shader->ati.SetupInst[0][reg].Opcode) { GLuint txformat = rmesa->hw.tex[reg].cmd[TEX_PP_TXFORMAT] & ~(R200_TXFORMAT_ST_ROUTE_MASK | R200_TXFORMAT_LOOKUP_DISABLE); GLuint txformat_x = rmesa->hw.tex[reg].cmd[TEX_PP_TXFORMAT_X] & ~R200_TEXCOORD_MASK; - txformat |= (shader->SetupInst[0][reg].src - GL_TEXTURE0_ARB) + txformat |= (shader->ati.SetupInst[0][reg].src - GL_TEXTURE0_ARB) << R200_TXFORMAT_ST_ROUTE_SHIFT; /* fix up texcoords for proj/non-proj 2d (3d and cube are not defined when using projection so don't have to worry there). When passing coords, need R200_TEXCOORD_VOLUME, otherwise loose a coord */ /* FIXME: someone might rely on default tex coords r/q, which we unfortunately don't provide (we have the same problem without shaders) */ - if (shader->SetupInst[0][reg].Opcode == ATI_FRAGMENT_SHADER_PASS_OP) { + if (shader->ati.SetupInst[0][reg].Opcode == ATI_FRAGMENT_SHADER_PASS_OP) { txformat |= R200_TXFORMAT_LOOKUP_DISABLE; - if (shader->SetupInst[0][reg].swizzle == GL_SWIZZLE_STR_ATI || - shader->SetupInst[0][reg].swizzle == GL_SWIZZLE_STQ_ATI) { + if (shader->ati.SetupInst[0][reg].swizzle == GL_SWIZZLE_STR_ATI || + shader->ati.SetupInst[0][reg].swizzle == GL_SWIZZLE_STQ_ATI) { txformat_x |= R200_TEXCOORD_VOLUME; } else { txformat_x |= R200_TEXCOORD_PROJ; } rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= R200_TEX_0_ENABLE << reg; } else if (texObj && texObj->Target == GL_TEXTURE_3D) { txformat_x |= R200_TEXCOORD_VOLUME; } else if (texObj && texObj->Target == GL_TEXTURE_CUBE_MAP) { txformat_x |= R200_TEXCOORD_CUBIC_ENV; } - else if (shader->SetupInst[0][reg].swizzle == GL_SWIZZLE_STR_ATI || - shader->SetupInst[0][reg].swizzle == GL_SWIZZLE_STQ_ATI) { + else if (shader->ati.SetupInst[0][reg].swizzle == GL_SWIZZLE_STR_ATI || + shader->ati.SetupInst[0][reg].swizzle == GL_SWIZZLE_STQ_ATI) { txformat_x |= R200_TEXCOORD_NONPROJ; } else { txformat_x |= R200_TEXCOORD_PROJ; } rmesa->hw.tex[reg].cmd[TEX_PP_TXFORMAT] = txformat; rmesa->hw.tex[reg].cmd[TEX_PP_TXFORMAT_X] = txformat_x; /* enabling texturing when unit isn't correctly configured may not be safe */ if (texObj) rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= R200_TEX_0_ENABLE << reg; } } } else { /* setup 1st pass */ for (reg = 0; reg < R200_MAX_TEXTURE_UNITS; reg++) { struct gl_texture_object *texObj = ctx->Texture.Unit[reg]._Current; R200_STATECHANGE( rmesa, tex[reg] ); GLuint txformat_multi = 0; - if (shader->SetupInst[0][reg].Opcode) { - txformat_multi |= (shader->SetupInst[0][reg].src - GL_TEXTURE0_ARB) + if (shader->ati.SetupInst[0][reg].Opcode) { + txformat_multi |= (shader->ati.SetupInst[0][reg].src - GL_TEXTURE0_ARB) << R200_PASS1_ST_ROUTE_SHIFT; - if (shader->SetupInst[0][reg].Opcode == ATI_FRAGMENT_SHADER_PASS_OP) { + if (shader->ati.SetupInst[0][reg].Opcode == ATI_FRAGMENT_SHADER_PASS_OP) { txformat_multi |= R200_PASS1_TXFORMAT_LOOKUP_DISABLE; - if (shader->SetupInst[0][reg].swizzle == GL_SWIZZLE_STR_ATI || - shader->SetupInst[0][reg].swizzle == GL_SWIZZLE_STQ_ATI) { + if (shader->ati.SetupInst[0][reg].swizzle == GL_SWIZZLE_STR_ATI || + shader->ati.SetupInst[0][reg].swizzle == GL_SWIZZLE_STQ_ATI) { txformat_multi |= R200_PASS1_TEXCOORD_VOLUME; } else { txformat_multi |= R200_PASS1_TEXCOORD_PROJ; } rmesa->hw.cst.cmd[CST_PP_CNTL_X] |= R200_PPX_TEX_0_ENABLE << reg; } else if (texObj && texObj->Target == GL_TEXTURE_3D) { txformat_multi |= R200_PASS1_TEXCOORD_VOLUME; } else if (texObj && texObj->Target == GL_TEXTURE_CUBE_MAP) { txformat_multi |= R200_PASS1_TEXCOORD_CUBIC_ENV; } - else if (shader->SetupInst[0][reg].swizzle == GL_SWIZZLE_STR_ATI || - shader->SetupInst[0][reg].swizzle == GL_SWIZZLE_STQ_ATI) { + else if (shader->ati.SetupInst[0][reg].swizzle == GL_SWIZZLE_STR_ATI || + shader->ati.SetupInst[0][reg].swizzle == GL_SWIZZLE_STQ_ATI) { txformat_multi |= R200_PASS1_TEXCOORD_NONPROJ; } else { txformat_multi |= R200_PASS1_TEXCOORD_PROJ; } if (texObj) rmesa->hw.cst.cmd[CST_PP_CNTL_X] |= R200_PPX_TEX_0_ENABLE << reg; } rmesa->hw.tex[reg].cmd[TEX_PP_TXMULTI_CTL] = txformat_multi; } /* setup 2nd pass */ for (reg=0; reg < R200_MAX_TEXTURE_UNITS; reg++) { struct gl_texture_object *texObj = ctx->Texture.Unit[reg]._Current; - if (shader->SetupInst[1][reg].Opcode) { - GLuint coord = shader->SetupInst[1][reg].src; + if (shader->ati.SetupInst[1][reg].Opcode) { + GLuint coord = shader->ati.SetupInst[1][reg].src; GLuint txformat = rmesa->hw.tex[reg].cmd[TEX_PP_TXFORMAT] & ~(R200_TXFORMAT_ST_ROUTE_MASK | R200_TXFORMAT_LOOKUP_DISABLE); GLuint txformat_x = rmesa->hw.tex[reg].cmd[TEX_PP_TXFORMAT_X] & ~R200_TEXCOORD_MASK; R200_STATECHANGE( rmesa, tex[reg] ); - if (shader->SetupInst[1][reg].Opcode == ATI_FRAGMENT_SHADER_PASS_OP) { + if (shader->ati.SetupInst[1][reg].Opcode == ATI_FRAGMENT_SHADER_PASS_OP) { txformat |= R200_TXFORMAT_LOOKUP_DISABLE; txformat_x |= R200_TEXCOORD_VOLUME; - if (shader->SetupInst[1][reg].swizzle == GL_SWIZZLE_STR_ATI || - shader->SetupInst[1][reg].swizzle == GL_SWIZZLE_STQ_ATI) { + if (shader->ati.SetupInst[1][reg].swizzle == GL_SWIZZLE_STR_ATI || + shader->ati.SetupInst[1][reg].swizzle == GL_SWIZZLE_STQ_ATI) { txformat_x |= R200_TEXCOORD_VOLUME; } else { txformat_x |= R200_TEXCOORD_PROJ; } rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= R200_TEX_0_ENABLE << reg; } else if (texObj && texObj->Target == GL_TEXTURE_3D) { txformat_x |= R200_TEXCOORD_VOLUME; } else if (texObj && texObj->Target == GL_TEXTURE_CUBE_MAP) { txformat_x |= R200_TEXCOORD_CUBIC_ENV; } - else if (shader->SetupInst[1][reg].swizzle == GL_SWIZZLE_STR_ATI || - shader->SetupInst[1][reg].swizzle == GL_SWIZZLE_STQ_ATI) { + else if (shader->ati.SetupInst[1][reg].swizzle == GL_SWIZZLE_STR_ATI || + shader->ati.SetupInst[1][reg].swizzle == GL_SWIZZLE_STQ_ATI) { txformat_x |= R200_TEXCOORD_NONPROJ; } else { txformat_x |= R200_TEXCOORD_PROJ; } if (coord >= GL_REG_0_ATI) { GLuint txformat_multi = rmesa->hw.tex[reg].cmd[TEX_PP_TXMULTI_CTL]; txformat_multi |= (coord - GL_REG_0_ATI + 2) << R200_PASS2_COORDS_REG_SHIFT; rmesa->hw.tex[reg].cmd[TEX_PP_TXMULTI_CTL] = txformat_multi; rmesa->hw.cst.cmd[CST_PP_CNTL_X] |= 1 << @@ -495,33 +495,33 @@ static void r200UpdateFSRouting( struct gl_context *ctx ) { if (texObj) rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= R200_TEX_0_ENABLE << reg; } } } } static void r200UpdateFSConstants( struct gl_context *ctx ) { r200ContextPtr rmesa = R200_CONTEXT(ctx); - const struct ati_fragment_shader *shader = ctx->ATIFragmentShader.Current; + const struct gl_program *shader = ctx->ATIFragmentShader.Current; GLuint i; /* update constants */ R200_STATECHANGE(rmesa, atf); for (i = 0; i < 8; i++) { GLubyte con_byte[4]; - if ((shader->LocalConstDef >> i) & 1) { - CLAMPED_FLOAT_TO_UBYTE(con_byte[0], shader->Constants[i][0]); - CLAMPED_FLOAT_TO_UBYTE(con_byte[1], shader->Constants[i][1]); - CLAMPED_FLOAT_TO_UBYTE(con_byte[2], shader->Constants[i][2]); - CLAMPED_FLOAT_TO_UBYTE(con_byte[3], shader->Constants[i][3]); + if ((shader->ati.LocalConstDef >> i) & 1) { + CLAMPED_FLOAT_TO_UBYTE(con_byte[0], shader->ati.Constants[i][0]); + CLAMPED_FLOAT_TO_UBYTE(con_byte[1], shader->ati.Constants[i][1]); + CLAMPED_FLOAT_TO_UBYTE(con_byte[2], shader->ati.Constants[i][2]); + CLAMPED_FLOAT_TO_UBYTE(con_byte[3], shader->ati.Constants[i][3]); } else { CLAMPED_FLOAT_TO_UBYTE(con_byte[0], ctx->ATIFragmentShader.GlobalConstants[i][0]); CLAMPED_FLOAT_TO_UBYTE(con_byte[1], ctx->ATIFragmentShader.GlobalConstants[i][1]); CLAMPED_FLOAT_TO_UBYTE(con_byte[2], ctx->ATIFragmentShader.GlobalConstants[i][2]); CLAMPED_FLOAT_TO_UBYTE(con_byte[3], ctx->ATIFragmentShader.GlobalConstants[i][3]); } rmesa->hw.atf.cmd[ATF_TFACTOR_0 + i] = radeonPackColor ( 4, con_byte[0], con_byte[1], con_byte[2], con_byte[3] ); } diff --git a/src/mesa/drivers/dri/r200/r200_state_init.c b/src/mesa/drivers/dri/r200/r200_state_init.c index 4b589cd8b8..48ac7f4fd1 100644 --- a/src/mesa/drivers/dri/r200/r200_state_init.c +++ b/src/mesa/drivers/dri/r200/r200_state_init.c @@ -248,21 +248,21 @@ static int check_##NM( struct gl_context *ctx, struct radeon_state_atom *atom ) return (!rmesa->radeon.TclFallback && _mesa_arb_vertex_program_enabled(ctx) && (FLAG)) ? atom->cmd_size + (ADD) : 0; \ } CHECK( always, GL_TRUE, 0 ) CHECK( always_add4, GL_TRUE, 4 ) CHECK( never, GL_FALSE, 0 ) CHECK( tex_any, ctx->Texture._MaxEnabledTexImageUnit != -1, 0 ) CHECK( tf, (ctx->Texture._MaxEnabledTexImageUnit != -1 && !_mesa_ati_fragment_shader_enabled(ctx)), 0 ); CHECK( pix_zero, !_mesa_ati_fragment_shader_enabled(ctx), 0 ) CHECK( texenv, (rmesa->state.envneeded & (1 << (atom->idx)) && !_mesa_ati_fragment_shader_enabled(ctx)), 0 ) -CHECK( afs_pass1, (_mesa_ati_fragment_shader_enabled(ctx) && (ctx->ATIFragmentShader.Current->NumPasses > 1)), 0 ) +CHECK( afs_pass1, (_mesa_ati_fragment_shader_enabled(ctx) && (ctx->ATIFragmentShader.Current->ati.NumPasses > 1)), 0 ) CHECK( afs, _mesa_ati_fragment_shader_enabled(ctx), 0 ) CHECK( tex_cube, rmesa->state.texture.unit[atom->idx].unitneeded & TEXTURE_CUBE_BIT, 3 + 3*5 - CUBE_STATE_SIZE ) CHECK( tex_cube_cs, rmesa->state.texture.unit[atom->idx].unitneeded & TEXTURE_CUBE_BIT, 2 + 4*5 - CUBE_STATE_SIZE ) TCL_CHECK( tcl_fog_add4, ctx->Fog.Enabled, 4 ) TCL_CHECK( tcl, GL_TRUE, 0 ) TCL_CHECK( tcl_add8, GL_TRUE, 8 ) TCL_CHECK( tcl_add4, GL_TRUE, 4 ) TCL_CHECK( tcl_tex_add4, rmesa->state.texture.unit[atom->idx].unitneeded, 4 ) TCL_CHECK( tcl_lighting_add4, ctx->Light.Enabled, 4 ) TCL_CHECK( tcl_lighting_add6, ctx->Light.Enabled, 6 ) diff --git a/src/mesa/drivers/dri/r200/r200_vertprog.c b/src/mesa/drivers/dri/r200/r200_vertprog.c index bb8550332b..1340fd0a3c 100644 --- a/src/mesa/drivers/dri/r200/r200_vertprog.c +++ b/src/mesa/drivers/dri/r200/r200_vertprog.c @@ -1186,20 +1186,21 @@ void r200SetupVertexProg( struct gl_context *ctx ) { static struct gl_program * r200NewProgram(struct gl_context *ctx, GLenum target, GLuint id, bool is_arb_asm) { switch(target){ case GL_VERTEX_PROGRAM_ARB: { struct r200_vertex_program *vp = rzalloc(NULL, struct r200_vertex_program); return _mesa_init_gl_program(&vp->mesa_program, target, id, is_arb_asm); } + case GL_FRAGMENT_SHADER_ATI: case GL_FRAGMENT_PROGRAM_ARB: { struct gl_program *prog = rzalloc(NULL, struct gl_program); return _mesa_init_gl_program(prog, target, id, is_arb_asm); } default: _mesa_problem(ctx, "Bad target in r200NewProgram"); return NULL; } } diff --git a/src/mesa/main/atifragshader.c b/src/mesa/main/atifragshader.c index 49ddb6e5af..b0b2f93d65 100644 --- a/src/mesa/main/atifragshader.c +++ b/src/mesa/main/atifragshader.c @@ -27,78 +27,71 @@ #include "main/imports.h" #include "main/macros.h" #include "main/enums.h" #include "main/mtypes.h" #include "main/dispatch.h" #include "main/atifragshader.h" #include "program/program.h" #define MESA_DEBUG_ATI_FS 0 -static struct ati_fragment_shader DummyShader; +static struct gl_program DummyShader; /** * Allocate and initialize a new ATI fragment shader object. */ -struct ati_fragment_shader * +struct gl_program * _mesa_new_ati_fragment_shader(struct gl_context *ctx, GLuint id) { - struct ati_fragment_shader *s = CALLOC_STRUCT(ati_fragment_shader); - (void) ctx; - if (s) { - s->Id = id; - s->RefCount = 1; - } - return s; + return ctx->Driver.NewProgram(ctx, GL_FRAGMENT_SHADER_ATI, id, true); } /** * Delete the given ati fragment shader */ void -_mesa_delete_ati_fragment_shader(struct gl_context *ctx, struct ati_fragment_shader *s) +_mesa_delete_ati_fragment_shader(struct gl_context *ctx, struct gl_program *s) { GLuint i; if (s == &DummyShader) return; for (i = 0; i < MAX_NUM_PASSES_ATI; i++) { - free(s->Instructions[i]); - free(s->SetupInst[i]); + free(s->ati.Instructions[i]); + free(s->ati.SetupInst[i]); } - _mesa_reference_program(ctx, &s->Program, NULL); - free(s); + ctx->Driver.DeleteProgram(ctx, s); } static void -new_arith_inst(struct ati_fragment_shader *prog) +new_arith_inst(struct gl_program *prog) { /* set "default" instruction as not all may get defined. there is no specified way to express a nop with ati fragment shaders we use GL_NONE as the op enum and just set some params to 0 - so nothing to do here */ - prog->numArithInstr[prog->cur_pass >> 1]++; + prog->ati.numArithInstr[prog->ati.cur_pass >> 1]++; } static void -new_tex_inst(struct ati_fragment_shader *prog) +new_tex_inst(struct gl_program *prog) { } -static void match_pair_inst(struct ati_fragment_shader *curProg, GLuint optype) +static void match_pair_inst(struct gl_program *curProg, GLuint optype) { - if (optype == curProg->last_optype) { - curProg->last_optype = 1; + if (optype == curProg->ati.last_optype) { + curProg->ati.last_optype = 1; } } #if MESA_DEBUG_ATI_FS static char * create_dst_mod_str(GLuint mod) { static char ret_str[1024]; memset(ret_str, 0, 1024); @@ -152,21 +145,21 @@ static void debug_op(GLint optype, GLuint arg_count, GLenum op, GLuint dst, _mesa_enum_to_string(arg2Rep), arg2Mod); if (arg_count>2) fprintf(stderr, ", %s, %s, %d", _mesa_enum_to_string(arg3), _mesa_enum_to_string(arg3Rep), arg3Mod); fprintf(stderr,")\n"); } #endif -static int check_arith_arg(struct ati_fragment_shader *curProg, +static int check_arith_arg(struct gl_program *curProg, GLuint optype, GLuint arg, GLuint argRep) { GET_CURRENT_CONTEXT(ctx); if (((arg < GL_CON_0_ATI) || (arg > GL_CON_7_ATI)) && ((arg < GL_REG_0_ATI) || (arg > GL_REG_5_ATI)) && (arg != GL_ZERO) && (arg != GL_ONE) && (arg != GL_PRIMARY_COLOR_ARB) && (arg != GL_SECONDARY_INTERPOLATOR_ATI)) { _mesa_error(ctx, GL_INVALID_ENUM, "C/AFragmentOpATI(arg)"); return 0; @@ -174,23 +167,23 @@ static int check_arith_arg(struct ati_fragment_shader *curProg, if ((arg == GL_SECONDARY_INTERPOLATOR_ATI) && (((optype == 0) && (argRep == GL_ALPHA)) || ((optype == 1) && ((arg == GL_ALPHA) || (argRep == GL_NONE))))) { _mesa_error(ctx, GL_INVALID_OPERATION, "C/AFragmentOpATI(sec_interp)"); return 0; } if ((arg == GL_SECONDARY_INTERPOLATOR_ATI) && (((optype == 0) && (argRep == GL_ALPHA)) || ((optype == 1) && ((arg == GL_ALPHA) || (argRep == GL_NONE))))) { _mesa_error(ctx, GL_INVALID_OPERATION, "C/AFragmentOpATI(sec_interp)"); return 0; } - if ((curProg->cur_pass == 1) && + if ((curProg->ati.cur_pass == 1) && ((arg == GL_PRIMARY_COLOR_ARB) || (arg == GL_SECONDARY_INTERPOLATOR_ATI))) { - curProg->interpinp1 = GL_TRUE; + curProg->ati.interpinp1 = GL_TRUE; } return 1; } GLuint GLAPIENTRY _mesa_GenFragmentShadersATI(GLuint range) { GLuint first; GLuint i; GET_CURRENT_CONTEXT(ctx); @@ -214,22 +207,22 @@ _mesa_GenFragmentShadersATI(GLuint range) _mesa_HashUnlockMutex(ctx->Shared->ATIShaders); return first; } void GLAPIENTRY _mesa_BindFragmentShaderATI(GLuint id) { GET_CURRENT_CONTEXT(ctx); - struct ati_fragment_shader *curProg = ctx->ATIFragmentShader.Current; - struct ati_fragment_shader *newProg; + struct gl_program *curProg = ctx->ATIFragmentShader.Current; + struct gl_program *newProg; if (ctx->ATIFragmentShader.Compiling) { _mesa_error(ctx, GL_INVALID_OPERATION, "glBindFragmentShaderATI(insideShader)"); return; } FLUSH_VERTICES(ctx, _NEW_PROGRAM); if (curProg->Id == id) { return; @@ -241,21 +234,21 @@ _mesa_BindFragmentShaderATI(GLuint id) if (curProg->RefCount <= 0) { _mesa_HashRemove(ctx->Shared->ATIShaders, id); } } /* find new shader */ if (id == 0) { newProg = ctx->Shared->DefaultFragmentShader; } else { - newProg = (struct ati_fragment_shader *) + newProg = (struct gl_program *) _mesa_HashLookup(ctx->Shared->ATIShaders, id); if (!newProg || newProg == &DummyShader) { /* allocate a new program now */ newProg = _mesa_new_ati_fragment_shader(ctx, id); if (!newProg) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "glBindFragmentShaderATI"); return; } _mesa_HashInsert(ctx->Shared->ATIShaders, id, newProg); } @@ -274,21 +267,21 @@ void GLAPIENTRY _mesa_DeleteFragmentShaderATI(GLuint id) { GET_CURRENT_CONTEXT(ctx); if (ctx->ATIFragmentShader.Compiling) { _mesa_error(ctx, GL_INVALID_OPERATION, "glDeleteFragmentShaderATI(insideShader)"); return; } if (id != 0) { - struct ati_fragment_shader *prog = (struct ati_fragment_shader *) + struct gl_program *prog = (struct gl_program *) _mesa_HashLookup(ctx->Shared->ATIShaders, id); if (prog == &DummyShader) { _mesa_HashRemove(ctx->Shared->ATIShaders, id); } else if (prog) { if (ctx->ATIFragmentShader.Current && ctx->ATIFragmentShader.Current->Id == id) { FLUSH_VERTICES(ctx, _NEW_PROGRAM); _mesa_BindFragmentShaderATI(0); } @@ -316,310 +309,302 @@ _mesa_BeginFragmentShaderATI(void) _mesa_error(ctx, GL_INVALID_OPERATION, "glBeginFragmentShaderATI(insideShader)"); return; } FLUSH_VERTICES(ctx, _NEW_PROGRAM); /* if the shader was already defined free instructions and get new ones (or, could use the same mem but would need to reinitialize) */ /* no idea if it's allowed to redefine a shader */ for (i = 0; i < MAX_NUM_PASSES_ATI; i++) { - free(ctx->ATIFragmentShader.Current->Instructions[i]); - free(ctx->ATIFragmentShader.Current->SetupInst[i]); + free(ctx->ATIFragmentShader.Current->ati.Instructions[i]); + free(ctx->ATIFragmentShader.Current->ati.SetupInst[i]); } - _mesa_reference_program(ctx, &ctx->ATIFragmentShader.Current->Program, NULL); - /* malloc the instructions here - not sure if the best place but its a start */ for (i = 0; i < MAX_NUM_PASSES_ATI; i++) { - ctx->ATIFragmentShader.Current->Instructions[i] = + ctx->ATIFragmentShader.Current->ati.Instructions[i] = calloc(sizeof(struct atifs_instruction), MAX_NUM_INSTRUCTIONS_PER_PASS_ATI); - ctx->ATIFragmentShader.Current->SetupInst[i] = + ctx->ATIFragmentShader.Current->ati.SetupInst[i] = calloc(sizeof(struct atifs_setupinst), MAX_NUM_FRAGMENT_REGISTERS_ATI); } /* can't rely on calloc for initialization as it's possible to redefine a shader (?) */ - ctx->ATIFragmentShader.Current->LocalConstDef = 0; - ctx->ATIFragmentShader.Current->numArithInstr[0] = 0; - ctx->ATIFragmentShader.Current->numArithInstr[1] = 0; - ctx->ATIFragmentShader.Current->regsAssigned[0] = 0; - ctx->ATIFragmentShader.Current->regsAssigned[1] = 0; - ctx->ATIFragmentShader.Current->NumPasses = 0; - ctx->ATIFragmentShader.Current->cur_pass = 0; - ctx->ATIFragmentShader.Current->last_optype = 0; - ctx->ATIFragmentShader.Current->interpinp1 = GL_FALSE; - ctx->ATIFragmentShader.Current->isValid = GL_FALSE; - ctx->ATIFragmentShader.Current->swizzlerq = 0; + ctx->ATIFragmentShader.Current->ati.LocalConstDef = 0; + ctx->ATIFragmentShader.Current->ati.numArithInstr[0] = 0; + ctx->ATIFragmentShader.Current->ati.numArithInstr[1] = 0; + ctx->ATIFragmentShader.Current->ati.regsAssigned[0] = 0; + ctx->ATIFragmentShader.Current->ati.regsAssigned[1] = 0; + ctx->ATIFragmentShader.Current->ati.NumPasses = 0; + ctx->ATIFragmentShader.Current->ati.cur_pass = 0; + ctx->ATIFragmentShader.Current->ati.last_optype = 0; + ctx->ATIFragmentShader.Current->ati.interpinp1 = GL_FALSE; + ctx->ATIFragmentShader.Current->ati.isValid = GL_FALSE; + ctx->ATIFragmentShader.Current->ati.swizzlerq = 0; ctx->ATIFragmentShader.Compiling = 1; #if MESA_DEBUG_ATI_FS _mesa_debug(ctx, "%s %u\n", __func__, ctx->ATIFragmentShader.Current->Id); #endif } void GLAPIENTRY _mesa_EndFragmentShaderATI(void) { GET_CURRENT_CONTEXT(ctx); - struct ati_fragment_shader *curProg = ctx->ATIFragmentShader.Current; + struct gl_program *curProg = ctx->ATIFragmentShader.Current; #if MESA_DEBUG_ATI_FS GLint i, j; #endif if (!ctx->ATIFragmentShader.Compiling) { _mesa_error(ctx, GL_INVALID_OPERATION, "glEndFragmentShaderATI(outsideShader)"); return; } - if (curProg->interpinp1 && (ctx->ATIFragmentShader.Current->cur_pass > 1)) { + if (curProg->ati.interpinp1 && (ctx->ATIFragmentShader.Current->ati.cur_pass > 1)) { _mesa_error(ctx, GL_INVALID_OPERATION, "glEndFragmentShaderATI(interpinfirstpass)"); /* according to spec, DON'T return here */ } match_pair_inst(curProg, 0); ctx->ATIFragmentShader.Compiling = 0; - ctx->ATIFragmentShader.Current->isValid = GL_TRUE; - if ((ctx->ATIFragmentShader.Current->cur_pass == 0) || - (ctx->ATIFragmentShader.Current->cur_pass == 2)) { + ctx->ATIFragmentShader.Current->ati.isValid = GL_TRUE; + if ((ctx->ATIFragmentShader.Current->ati.cur_pass == 0) || + (ctx->ATIFragmentShader.Current->ati.cur_pass == 2)) { _mesa_error(ctx, GL_INVALID_OPERATION, "glEndFragmentShaderATI(noarithinst)"); } - if (ctx->ATIFragmentShader.Current->cur_pass > 1) - ctx->ATIFragmentShader.Current->NumPasses = 2; + if (ctx->ATIFragmentShader.Current->ati.cur_pass > 1) + ctx->ATIFragmentShader.Current->ati.NumPasses = 2; else - ctx->ATIFragmentShader.Current->NumPasses = 1; + ctx->ATIFragmentShader.Current->ati.NumPasses = 1; - ctx->ATIFragmentShader.Current->cur_pass = 0; + ctx->ATIFragmentShader.Current->ati.cur_pass = 0; #if MESA_DEBUG_ATI_FS for (j = 0; j < MAX_NUM_PASSES_ATI; j++) { for (i = 0; i < MAX_NUM_FRAGMENT_REGISTERS_ATI; i++) { - GLuint op = curProg->SetupInst[j][i].Opcode; + GLuint op = curProg->ati.SetupInst[j][i].Opcode; const char *op_enum = op > 5 ? _mesa_enum_to_string(op) : "0"; - GLuint src = curProg->SetupInst[j][i].src; - GLuint swizzle = curProg->SetupInst[j][i].swizzle; + GLuint src = curProg->ati.SetupInst[j][i].src; + GLuint swizzle = curProg->ati.SetupInst[j][i].swizzle; fprintf(stderr, "%2d %04X %s %d %04X\n", i, op, op_enum, src, swizzle); } - for (i = 0; i < curProg->numArithInstr[j]; i++) { - GLuint op0 = curProg->Instructions[j][i].Opcode[0]; - GLuint op1 = curProg->Instructions[j][i].Opcode[1]; + for (i = 0; i < curProg->ati.numArithInstr[j]; i++) { + GLuint op0 = curProg->ati.Instructions[j][i].Opcode[0]; + GLuint op1 = curProg->ati.Instructions[j][i].Opcode[1]; const char *op0_enum = op0 > 5 ? _mesa_enum_to_string(op0) : "0"; const char *op1_enum = op1 > 5 ? _mesa_enum_to_string(op1) : "0"; - GLuint count0 = curProg->Instructions[j][i].ArgCount[0]; - GLuint count1 = curProg->Instructions[j][i].ArgCount[1]; + GLuint count0 = curProg->ati.Instructions[j][i].ArgCount[0]; + GLuint count1 = curProg->ati.Instructions[j][i].ArgCount[1]; fprintf(stderr, "%2d %04X %s %d %04X %s %d\n", i, op0, op0_enum, count0, op1, op1_enum, count1); } } #endif - if (ctx->Driver.NewATIfs) { - struct gl_program *prog = ctx->Driver.NewATIfs(ctx, - ctx->ATIFragmentShader.Current); - _mesa_reference_program(ctx, &ctx->ATIFragmentShader.Current->Program, prog); - } - if (!ctx->Driver.ProgramStringNotify(ctx, GL_FRAGMENT_SHADER_ATI, - curProg->Program)) { - ctx->ATIFragmentShader.Current->isValid = GL_FALSE; + curProg)) { + ctx->ATIFragmentShader.Current->ati.isValid = GL_FALSE; /* XXX is this the right error? */ _mesa_error(ctx, GL_INVALID_OPERATION, "glEndFragmentShaderATI(driver rejected shader)"); } } void GLAPIENTRY _mesa_PassTexCoordATI(GLuint dst, GLuint coord, GLenum swizzle) { GET_CURRENT_CONTEXT(ctx); - struct ati_fragment_shader *curProg = ctx->ATIFragmentShader.Current; + struct gl_program *curProg = ctx->ATIFragmentShader.Current; struct atifs_setupinst *curI; if (!ctx->ATIFragmentShader.Compiling) { _mesa_error(ctx, GL_INVALID_OPERATION, "glPassTexCoordATI(outsideShader)"); return; } - if (curProg->cur_pass == 1) { + if (curProg->ati.cur_pass == 1) { match_pair_inst(curProg, 0); - curProg->cur_pass = 2; + curProg->ati.cur_pass = 2; } - if ((curProg->cur_pass > 2) || - ((1 << (dst - GL_REG_0_ATI)) & curProg->regsAssigned[curProg->cur_pass >> 1])) { + if ((curProg->ati.cur_pass > 2) || + ((1 << (dst - GL_REG_0_ATI)) & curProg->ati.regsAssigned[curProg->ati.cur_pass >> 1])) { _mesa_error(ctx, GL_INVALID_OPERATION, "glPassTexCoord(pass)"); return; } if ((dst < GL_REG_0_ATI) || (dst > GL_REG_5_ATI) || ((dst - GL_REG_0_ATI) >= ctx->Const.MaxTextureUnits)) { _mesa_error(ctx, GL_INVALID_ENUM, "glPassTexCoordATI(dst)"); return; } if (((coord < GL_REG_0_ATI) || (coord > GL_REG_5_ATI)) && ((coord < GL_TEXTURE0_ARB) || (coord > GL_TEXTURE7_ARB) || ((coord - GL_TEXTURE0_ARB) >= ctx->Const.MaxTextureUnits))) { _mesa_error(ctx, GL_INVALID_ENUM, "glPassTexCoordATI(coord)"); return; } - if ((curProg->cur_pass == 0) && (coord >= GL_REG_0_ATI)) { + if ((curProg->ati.cur_pass == 0) && (coord >= GL_REG_0_ATI)) { _mesa_error(ctx, GL_INVALID_OPERATION, "glPassTexCoordATI(coord)"); return; } if (!(swizzle >= GL_SWIZZLE_STR_ATI) && (swizzle <= GL_SWIZZLE_STQ_DQ_ATI)) { _mesa_error(ctx, GL_INVALID_ENUM, "glPassTexCoordATI(swizzle)"); return; } if ((swizzle & 1) && (coord >= GL_REG_0_ATI)) { _mesa_error(ctx, GL_INVALID_OPERATION, "glPassTexCoordATI(swizzle)"); return; } if (coord <= GL_TEXTURE7_ARB) { GLuint tmp = coord - GL_TEXTURE0_ARB; - if ((((curProg->swizzlerq >> (tmp * 2)) & 3) != 0) && - (((swizzle & 1) + 1) != ((curProg->swizzlerq >> (tmp * 2)) & 3))) { + if ((((curProg->ati.swizzlerq >> (tmp * 2)) & 3) != 0) && + (((swizzle & 1) + 1) != ((curProg->ati.swizzlerq >> (tmp * 2)) & 3))) { _mesa_error(ctx, GL_INVALID_OPERATION, "glPassTexCoordATI(swizzle)"); return; } else { - curProg->swizzlerq |= (((swizzle & 1) + 1) << (tmp * 2)); + curProg->ati.swizzlerq |= (((swizzle & 1) + 1) << (tmp * 2)); } } - curProg->regsAssigned[curProg->cur_pass >> 1] |= 1 << (dst - GL_REG_0_ATI); + curProg->ati.regsAssigned[curProg->ati.cur_pass >> 1] |= 1 << (dst - GL_REG_0_ATI); new_tex_inst(curProg); /* add the instructions */ - curI = &curProg->SetupInst[curProg->cur_pass >> 1][dst - GL_REG_0_ATI]; + curI = &curProg->ati.SetupInst[curProg->ati.cur_pass >> 1][dst - GL_REG_0_ATI]; curI->Opcode = ATI_FRAGMENT_SHADER_PASS_OP; curI->src = coord; curI->swizzle = swizzle; #if MESA_DEBUG_ATI_FS _mesa_debug(ctx, "%s(%s, %s, %s)\n", __func__, _mesa_enum_to_string(dst), _mesa_enum_to_string(coord), _mesa_enum_to_string(swizzle)); #endif } void GLAPIENTRY _mesa_SampleMapATI(GLuint dst, GLuint interp, GLenum swizzle) { GET_CURRENT_CONTEXT(ctx); - struct ati_fragment_shader *curProg = ctx->ATIFragmentShader.Current; + struct gl_program *curProg = ctx->ATIFragmentShader.Current; struct atifs_setupinst *curI; if (!ctx->ATIFragmentShader.Compiling) { _mesa_error(ctx, GL_INVALID_OPERATION, "glSampleMapATI(outsideShader)"); return; } - if (curProg->cur_pass == 1) { + if (curProg->ati.cur_pass == 1) { match_pair_inst(curProg, 0); - curProg->cur_pass = 2; + curProg->ati.cur_pass = 2; } - if ((curProg->cur_pass > 2) || - ((1 << (dst - GL_REG_0_ATI)) & curProg->regsAssigned[curProg->cur_pass >> 1])) { + if ((curProg->ati.cur_pass > 2) || + ((1 << (dst - GL_REG_0_ATI)) & curProg->ati.regsAssigned[curProg->ati.cur_pass >> 1])) { _mesa_error(ctx, GL_INVALID_OPERATION, "glSampleMapATI(pass)"); return; } if ((dst < GL_REG_0_ATI) || (dst > GL_REG_5_ATI) || ((dst - GL_REG_0_ATI) >= ctx->Const.MaxTextureUnits)) { _mesa_error(ctx, GL_INVALID_ENUM, "glSampleMapATI(dst)"); return; } if (((interp < GL_REG_0_ATI) || (interp > GL_REG_5_ATI)) && ((interp < GL_TEXTURE0_ARB) || (interp > GL_TEXTURE7_ARB) || ((interp - GL_TEXTURE0_ARB) >= ctx->Const.MaxTextureUnits))) { /* is this texture5 or texture7? spec is a bit unclear there */ _mesa_error(ctx, GL_INVALID_ENUM, "glSampleMapATI(interp)"); return; } - if ((curProg->cur_pass == 0) && (interp >= GL_REG_0_ATI)) { + if ((curProg->ati.cur_pass == 0) && (interp >= GL_REG_0_ATI)) { _mesa_error(ctx, GL_INVALID_OPERATION, "glSampleMapATI(interp)"); return; } if (!(swizzle >= GL_SWIZZLE_STR_ATI) && (swizzle <= GL_SWIZZLE_STQ_DQ_ATI)) { _mesa_error(ctx, GL_INVALID_ENUM, "glSampleMapATI(swizzle)"); return; } if ((swizzle & 1) && (interp >= GL_REG_0_ATI)) { _mesa_error(ctx, GL_INVALID_OPERATION, "glSampleMapATI(swizzle)"); return; } if (interp <= GL_TEXTURE7_ARB) { GLuint tmp = interp - GL_TEXTURE0_ARB; - if ((((curProg->swizzlerq >> (tmp * 2)) & 3) != 0) && - (((swizzle & 1) + 1) != ((curProg->swizzlerq >> (tmp * 2)) & 3))) { + if ((((curProg->ati.swizzlerq >> (tmp * 2)) & 3) != 0) && + (((swizzle & 1) + 1) != ((curProg->ati.swizzlerq >> (tmp * 2)) & 3))) { _mesa_error(ctx, GL_INVALID_OPERATION, "glSampleMapATI(swizzle)"); return; } else { - curProg->swizzlerq |= (((swizzle & 1) + 1) << (tmp * 2)); + curProg->ati.swizzlerq |= (((swizzle & 1) + 1) << (tmp * 2)); } } - curProg->regsAssigned[curProg->cur_pass >> 1] |= 1 << (dst - GL_REG_0_ATI); + curProg->ati.regsAssigned[curProg->ati.cur_pass >> 1] |= 1 << (dst - GL_REG_0_ATI); new_tex_inst(curProg); /* add the instructions */ - curI = &curProg->SetupInst[curProg->cur_pass >> 1][dst - GL_REG_0_ATI]; + curI = &curProg->ati.SetupInst[curProg->ati.cur_pass >> 1][dst - GL_REG_0_ATI]; curI->Opcode = ATI_FRAGMENT_SHADER_SAMPLE_OP; curI->src = interp; curI->swizzle = swizzle; #if MESA_DEBUG_ATI_FS _mesa_debug(ctx, "%s(%s, %s, %s)\n", __func__, _mesa_enum_to_string(dst), _mesa_enum_to_string(interp), _mesa_enum_to_string(swizzle)); #endif } static void _mesa_FragmentOpXATI(GLint optype, GLuint arg_count, GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod) { GET_CURRENT_CONTEXT(ctx); - struct ati_fragment_shader *curProg = ctx->ATIFragmentShader.Current; + struct gl_program *curProg = ctx->ATIFragmentShader.Current; GLint ci; struct atifs_instruction *curI; GLuint modtemp = dstMod & ~GL_SATURATE_BIT_ATI; if (!ctx->ATIFragmentShader.Compiling) { _mesa_error(ctx, GL_INVALID_OPERATION, "C/AFragmentOpATI(outsideShader)"); return; } - if (curProg->cur_pass==0) - curProg->cur_pass=1; + if (curProg->ati.cur_pass==0) + curProg->ati.cur_pass=1; - else if (curProg->cur_pass==2) - curProg->cur_pass=3; + else if (curProg->ati.cur_pass==2) + curProg->ati.cur_pass=3; /* decide whether this is a new instruction or not ... all color instructions are new, and alpha instructions might also be new if there was no preceding color inst */ - if ((optype == 0) || (curProg->last_optype == optype)) { - if (curProg->numArithInstr[curProg->cur_pass >> 1] > 7) { + if ((optype == 0) || (curProg->ati.last_optype == optype)) { + if (curProg->ati.numArithInstr[curProg->ati.cur_pass >> 1] > 7) { _mesa_error(ctx, GL_INVALID_OPERATION, "C/AFragmentOpATI(instrCount)"); return; } /* easier to do that here slight side effect invalid instr will still be inserted as nops */ match_pair_inst(curProg, optype); new_arith_inst(curProg); } - curProg->last_optype = optype; - ci = curProg->numArithInstr[curProg->cur_pass >> 1] - 1; + curProg->ati.last_optype = optype; + ci = curProg->ati.numArithInstr[curProg->ati.cur_pass >> 1] - 1; /* add the instructions */ - curI = &curProg->Instructions[curProg->cur_pass >> 1][ci]; + curI = &curProg->ati.Instructions[curProg->ati.cur_pass >> 1][ci]; /* error checking */ if ((dst < GL_REG_0_ATI) || (dst > GL_REG_5_ATI)) { _mesa_error(ctx, GL_INVALID_ENUM, "C/AFragmentOpATI(dst)"); return; } if ((modtemp != GL_NONE) && (modtemp != GL_2X_BIT_ATI) && (modtemp != GL_4X_BIT_ATI) && (modtemp != GL_8X_BIT_ATI) && (modtemp != GL_HALF_BIT_ATI) && !(modtemp != GL_QUARTER_BIT_ATI) && (modtemp != GL_EIGHTH_BIT_ATI)) { @@ -765,19 +750,19 @@ _mesa_SetFragmentShaderConstantATI(GLuint dst, const GLfloat * value) GET_CURRENT_CONTEXT(ctx); if ((dst < GL_CON_0_ATI) || (dst > GL_CON_7_ATI)) { /* spec says nothing about what should happen here but we can't just segfault...*/ _mesa_error(ctx, GL_INVALID_ENUM, "glSetFragmentShaderConstantATI(dst)"); return; } dstindex = dst - GL_CON_0_ATI; if (ctx->ATIFragmentShader.Compiling) { - struct ati_fragment_shader *curProg = ctx->ATIFragmentShader.Current; - COPY_4V(curProg->Constants[dstindex], value); - curProg->LocalConstDef |= 1 << dstindex; + struct gl_program *curProg = ctx->ATIFragmentShader.Current; + COPY_4V(curProg->ati.Constants[dstindex], value); + curProg->ati.LocalConstDef |= 1 << dstindex; } else { FLUSH_VERTICES(ctx, _NEW_PROGRAM); COPY_4V(ctx->ATIFragmentShader.GlobalConstants[dstindex], value); } } diff --git a/src/mesa/main/atifragshader.h b/src/mesa/main/atifragshader.h index 0e32795da3..492e6db705 100644 --- a/src/mesa/main/atifragshader.h +++ b/src/mesa/main/atifragshader.h @@ -55,26 +55,26 @@ struct atifs_instruction /* different from arithmetic shader instruction */ struct atifs_setupinst { GLenum Opcode; GLuint src; GLenum swizzle; }; -extern struct ati_fragment_shader * +extern struct gl_program * _mesa_new_ati_fragment_shader(struct gl_context *ctx, GLuint id); extern void _mesa_delete_ati_fragment_shader(struct gl_context *ctx, - struct ati_fragment_shader *s); + struct gl_program *s); extern GLuint GLAPIENTRY _mesa_GenFragmentShadersATI(GLuint range); extern void GLAPIENTRY _mesa_BindFragmentShaderATI(GLuint id); extern void GLAPIENTRY _mesa_DeleteFragmentShaderATI(GLuint id); extern void GLAPIENTRY _mesa_BeginFragmentShaderATI(void); diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h index da03b2e8b9..1d77145942 100644 --- a/src/mesa/main/dd.h +++ b/src/mesa/main/dd.h @@ -452,25 +452,21 @@ struct dd_function_table { /** * \name Vertex/fragment program functions */ /*@{*/ /** Allocate a new program */ struct gl_program * (*NewProgram)(struct gl_context *ctx, GLenum target, GLuint id, bool is_arb_asm); /** Delete a program */ void (*DeleteProgram)(struct gl_context *ctx, struct gl_program *prog); - /** - * Allocate a program to associate with the new ATI fragment shader (optional) - */ - struct gl_program * (*NewATIfs)(struct gl_context *ctx, - struct ati_fragment_shader *curProg); + /** * Notify driver that a program string (and GPU code) has been specified * or modified. Return GL_TRUE or GL_FALSE to indicate if the program is * supported by the driver. */ GLboolean (*ProgramStringNotify)(struct gl_context *ctx, GLenum target, struct gl_program *prog); /** * Notify driver that the sampler uniforms for the current program have diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 6b5c5bbb36..7c357b07ee 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -2058,20 +2058,27 @@ typedef enum PROGRAM_UNDEFINED, /**< Invalid/TBD value */ PROGRAM_IMMEDIATE, /**< Immediate value, used by TGSI */ PROGRAM_BUFFER, /**< for shader buffers, compile-time only */ PROGRAM_MEMORY, /**< for shared, global and local memory */ PROGRAM_IMAGE, /**< for shader images, compile-time only */ PROGRAM_HW_ATOMIC, /**< for hw atomic counters, compile-time only */ PROGRAM_FILE_MAX } gl_register_file; +/** + * ATI_fragment_shader runtime state + */ +struct atifs_instruction; +struct atifs_setupinst; + + /** * Base class for any kind of program object */ struct gl_program { /** FIXME: This must be first until we split shader_info from nir_shader */ struct shader_info info; GLuint Id; GLint RefCount; @@ -2236,20 +2243,37 @@ struct gl_program GLuint NumNativeAluInstructions; GLuint NumNativeTexInstructions; GLuint NumNativeTexIndirections; /*@}*/ /** Used by ARB assembly-style programs. Can only be true for vertex * programs. */ GLboolean IsPositionInvariant; } arb; + + /** ATI fragment shader fields */ + struct { + struct atifs_instruction *Instructions[2]; + struct atifs_setupinst *SetupInst[2]; + GLfloat Constants[8][4]; + /** Indicates which constants have been set */ + GLbitfield LocalConstDef; + GLubyte numArithInstr[2]; + GLubyte regsAssigned[2]; + GLubyte NumPasses; /**< 1 or 2 */ + GLubyte cur_pass; + GLubyte last_optype; + GLboolean interpinp1; + GLboolean isValid; + GLuint swizzlerq; + } ati; }; }; /** * State common to vertex and fragment programs. */ struct gl_program_state { GLint ErrorPos; /* GL_PROGRAM_ERROR_POSITION_ARB/NV */ @@ -2352,58 +2376,29 @@ struct gl_fragment_program_state */ struct gl_compute_program_state { /** Currently enabled and valid program (including internal programs * and compiled shader programs). */ struct gl_program *_Current; }; -/** - * ATI_fragment_shader runtime state - */ - -struct atifs_instruction; -struct atifs_setupinst; - -/** - * ATI fragment shader - */ -struct ati_fragment_shader -{ - GLuint Id; - GLint RefCount; - struct atifs_instruction *Instructions[2]; - struct atifs_setupinst *SetupInst[2]; - GLfloat Constants[8][4]; - GLbitfield LocalConstDef; /**< Indicates which constants have been set */ - GLubyte numArithInstr[2]; - GLubyte regsAssigned[2]; - GLubyte NumPasses; /**< 1 or 2 */ - GLubyte cur_pass; - GLubyte last_optype; - GLboolean interpinp1; - GLboolean isValid; - GLuint swizzlerq; - struct gl_program *Program; -}; - /** * Context state for GL_ATI_fragment_shader */ struct gl_ati_fragment_shader_state { GLboolean Enabled; GLboolean Compiling; GLfloat GlobalConstants[8][4]; - struct ati_fragment_shader *Current; + struct gl_program *Current; }; /** * Shader subroutine function definition */ struct gl_subroutine_function { char *name; int index; int num_compat_types; @@ -3250,21 +3245,21 @@ struct gl_shared_state * \name Vertex/geometry/fragment programs */ /*@{*/ struct _mesa_HashTable *Programs; /**< All vertex/fragment programs */ struct gl_program *DefaultVertexProgram; struct gl_program *DefaultFragmentProgram; /*@}*/ /* GL_ATI_fragment_shader */ struct _mesa_HashTable *ATIShaders; - struct ati_fragment_shader *DefaultFragmentShader; + struct gl_program *DefaultFragmentShader; struct _mesa_HashTable *BufferObjects; /** Table of both gl_shader and gl_shader_program objects */ struct _mesa_HashTable *ShaderObjects; /* GL_EXT_framebuffer_object */ struct _mesa_HashTable *RenderBuffers; struct _mesa_HashTable *FrameBuffers; diff --git a/src/mesa/main/shared.c b/src/mesa/main/shared.c index e3417a4df3..94148e5122 100644 --- a/src/mesa/main/shared.c +++ b/src/mesa/main/shared.c @@ -196,21 +196,21 @@ delete_program_cb(GLuint id, void *data, void *userData) } /** * Callback for deleting an ATI fragment shader object. * Called by _mesa_HashDeleteAll(). */ static void delete_fragshader_cb(GLuint id, void *data, void *userData) { - struct ati_fragment_shader *shader = (struct ati_fragment_shader *) data; + struct gl_program *shader = (struct gl_program *) data; struct gl_context *ctx = (struct gl_context *) userData; _mesa_delete_ati_fragment_shader(ctx, shader); } /** * Callback for deleting a buffer object. Called by _mesa_HashDeleteAll(). */ static void delete_bufferobj_cb(GLuint id, void *data, void *userData) diff --git a/src/mesa/main/state.c b/src/mesa/main/state.c index 7aec98e578..508cb57e7a 100644 --- a/src/mesa/main/state.c +++ b/src/mesa/main/state.c @@ -115,24 +115,24 @@ update_program(struct gl_context *ctx) NULL); } else if (_mesa_arb_fragment_program_enabled(ctx)) { /* Use user-defined fragment program */ _mesa_reference_program(ctx, &ctx->FragmentProgram._Current, ctx->FragmentProgram.Current); _mesa_reference_program(ctx, &ctx->FragmentProgram._TexEnvProgram, NULL); } else if (_mesa_ati_fragment_shader_enabled(ctx) && - ctx->ATIFragmentShader.Current->Program) { + ctx->ATIFragmentShader.Current) { /* Use the enabled ATI fragment shader's associated program */ _mesa_reference_program(ctx, &ctx->FragmentProgram._Current, - ctx->ATIFragmentShader.Current->Program); + ctx->ATIFragmentShader.Current); _mesa_reference_program(ctx, &ctx->FragmentProgram._TexEnvProgram, NULL); } else if (ctx->FragmentProgram._MaintainTexEnvProgram) { /* Use fragment program generated from fixed-function state */ struct gl_shader_program *f = _mesa_get_fixed_func_fragment_program(ctx); _mesa_reference_program(ctx, &ctx->FragmentProgram._Current, f->_LinkedShaders[MESA_SHADER_FRAGMENT]->Program); _mesa_reference_program(ctx, &ctx->FragmentProgram._TexEnvProgram, diff --git a/src/mesa/main/state.h b/src/mesa/main/state.h index b719f39296..beee001381 100644 --- a/src/mesa/main/state.h +++ b/src/mesa/main/state.h @@ -104,14 +104,14 @@ static inline bool _mesa_arb_fragment_program_enabled(const struct gl_context *ctx) { return ctx->FragmentProgram.Enabled && ctx->FragmentProgram.Current->arb.Instructions; } static inline bool _mesa_ati_fragment_shader_enabled(const struct gl_context *ctx) { return ctx->ATIFragmentShader.Enabled && - ctx->ATIFragmentShader.Current->Instructions[0]; + ctx->ATIFragmentShader.Current->ati.Instructions[0]; } #endif diff --git a/src/mesa/program/program.c b/src/mesa/program/program.c index faf5b7fa28..7f88cbed54 100644 --- a/src/mesa/program/program.c +++ b/src/mesa/program/program.c @@ -147,21 +147,21 @@ _mesa_update_default_objects_program(struct gl_context *ctx) ctx->Shared->DefaultFragmentProgram); assert(ctx->FragmentProgram.Current); /* XXX probably move this stuff */ if (ctx->ATIFragmentShader.Current) { ctx->ATIFragmentShader.Current->RefCount--; if (ctx->ATIFragmentShader.Current->RefCount <= 0) { free(ctx->ATIFragmentShader.Current); } } - ctx->ATIFragmentShader.Current = (struct ati_fragment_shader *) ctx->Shared->DefaultFragmentShader; + ctx->ATIFragmentShader.Current = ctx->Shared->DefaultFragmentShader; assert(ctx->ATIFragmentShader.Current); ctx->ATIFragmentShader.Current->RefCount++; } /** * Set the vertex/fragment program error state (position and error string). * This is generally called from within the parsers. */ void @@ -229,20 +229,21 @@ _mesa_init_gl_program(struct gl_program *prog, GLenum target, GLuint id, struct gl_program * _mesa_new_program(struct gl_context *ctx, GLenum target, GLuint id, bool is_arb_asm) { switch (target) { case GL_VERTEX_PROGRAM_ARB: /* == GL_VERTEX_PROGRAM_NV */ case GL_GEOMETRY_PROGRAM_NV: case GL_TESS_CONTROL_PROGRAM_NV: case GL_TESS_EVALUATION_PROGRAM_NV: case GL_FRAGMENT_PROGRAM_ARB: + case GL_FRAGMENT_SHADER_ATI: case GL_COMPUTE_PROGRAM_NV: { struct gl_program *prog = rzalloc(NULL, struct gl_program); return _mesa_init_gl_program(prog, target, id, is_arb_asm); } default: _mesa_problem(ctx, "bad target in _mesa_new_program"); return NULL; } } diff --git a/src/mesa/state_tracker/st_atifs_to_tgsi.c b/src/mesa/state_tracker/st_atifs_to_tgsi.c index 8affbdc8d1..0bd082e6ff 100644 --- a/src/mesa/state_tracker/st_atifs_to_tgsi.c +++ b/src/mesa/state_tracker/st_atifs_to_tgsi.c @@ -30,21 +30,21 @@ #include "tgsi/tgsi_transform.h" #include "st_program.h" #include "st_atifs_to_tgsi.h" /** * Intermediate state used during shader translation. */ struct st_translate { struct ureg_program *ureg; - struct ati_fragment_shader *atifs; + struct gl_program *atifs; struct ureg_dst temps[MAX_PROGRAM_TEMPS]; struct ureg_src *constants; struct ureg_dst outputs[PIPE_MAX_SHADER_OUTPUTS]; struct ureg_src inputs[PIPE_MAX_SHADER_INPUTS]; struct ureg_src samplers[PIPE_MAX_SAMPLERS]; const ubyte *inputMapping; const ubyte *outputMapping; @@ -414,21 +414,20 @@ finalize_shader(struct st_translate *t, unsigned numPasses) ureg_insn(t->ureg, TGSI_OPCODE_END, dst, 0, src, 0, 0); } /** * Called when a new variant is needed, we need to translate * the ATI fragment shader to TGSI */ enum pipe_error st_translate_atifs_program( struct ureg_program *ureg, - struct ati_fragment_shader *atifs, struct gl_program *program, GLuint numInputs, const ubyte inputMapping[], const ubyte inputSemanticName[], const ubyte inputSemanticIndex[], const ubyte interpMode[], GLuint numOutputs, const ubyte outputMapping[], const ubyte outputSemanticName[], const ubyte outputSemanticIndex[]) @@ -437,21 +436,20 @@ st_translate_atifs_program( unsigned pass, i, r; struct st_translate translate, *t; t = &translate; memset(t, 0, sizeof *t); t->inputMapping = inputMapping; t->outputMapping = outputMapping; t->ureg = ureg; - t->atifs = atifs; /* * Declare input attributes. */ for (i = 0; i < numInputs; i++) { t->inputs[i] = ureg_DECL_fs_input(ureg, inputSemanticName[i], inputSemanticIndex[i], interpMode[i]); } @@ -500,90 +498,86 @@ st_translate_atifs_program( /* the texture target is still unknown, it will be fixed in the draw call */ ureg_DECL_sampler_view(ureg, i, TGSI_TEXTURE_2D, TGSI_RETURN_TYPE_FLOAT, TGSI_RETURN_TYPE_FLOAT, TGSI_RETURN_TYPE_FLOAT, TGSI_RETURN_TYPE_FLOAT); } } /* emit instructions */ - for (pass = 0; pass < atifs->NumPasses; pass++) { + for (pass = 0; pass < program->ati.NumPasses; pass++) { t->current_pass = pass; for (r = 0; r < MAX_NUM_FRAGMENT_REGISTERS_ATI; r++) { - struct atifs_setupinst *texinst = &atifs->SetupInst[pass][r]; + struct atifs_setupinst *texinst = &program->ati.SetupInst[pass][r]; compile_setupinst(t, r, texinst); } - for (i = 0; i < atifs->numArithInstr[pass]; i++) { - struct atifs_instruction *inst = &atifs->Instructions[pass][i]; + for (i = 0; i < program->ati.numArithInstr[pass]; i++) { + struct atifs_instruction *inst = &program->ati.Instructions[pass][i]; compile_instruction(t, inst); } } - finalize_shader(t, atifs->NumPasses); + finalize_shader(t, program->ati.NumPasses); out: free(t->constants); if (t->error) { debug_printf("%s: translate error flag set\n", __func__); } return ret; } /** * Called in ProgramStringNotify, we need to fill the metadata of the * gl_program attached to the ati_fragment_shader */ void st_init_atifs_prog(struct gl_context *ctx, struct gl_program *prog) { - /* we know this is st_fragment_program, because of st_new_ati_fs() */ - struct st_fragment_program *stfp = (struct st_fragment_program *) prog; - struct ati_fragment_shader *atifs = stfp->ati_fs; - unsigned pass, i, r, optype, arg; static const gl_state_index fog_params_state[STATE_LENGTH] = {STATE_INTERNAL, STATE_FOG_PARAMS_OPTIMIZED, 0, 0, 0}; static const gl_state_index fog_color[STATE_LENGTH] = {STATE_FOG_COLOR, 0, 0, 0, 0}; prog->info.inputs_read = 0; prog->info.outputs_written = BITFIELD64_BIT(FRAG_RESULT_COLOR); prog->SamplersUsed = 0; prog->Parameters = _mesa_new_parameter_list(); /* fill in inputs_read, SamplersUsed, TexturesUsed */ - for (pass = 0; pass < atifs->NumPasses; pass++) { + for (pass = 0; pass < prog->ati.NumPasses; pass++) { for (r = 0; r < MAX_NUM_FRAGMENT_REGISTERS_ATI; r++) { - struct atifs_setupinst *texinst = &atifs->SetupInst[pass][r]; + struct atifs_setupinst *texinst = &prog->ati.SetupInst[pass][r]; GLuint pass_tex = texinst->src; if (texinst->Opcode == ATI_FRAGMENT_SHADER_SAMPLE_OP) { /* mark which texcoords are used */ prog->info.inputs_read |= BITFIELD64_BIT(VARYING_SLOT_TEX0 + pass_tex - GL_TEXTURE0_ARB); /* by default there is 1:1 mapping between samplers and textures */ prog->SamplersUsed |= (1 << r); /* the target is unknown here, it will be fixed in the draw call */ prog->TexturesUsed[r] = TEXTURE_2D_BIT; } else if (texinst->Opcode == ATI_FRAGMENT_SHADER_PASS_OP) { if (pass_tex >= GL_TEXTURE0_ARB && pass_tex <= GL_TEXTURE7_ARB) { prog->info.inputs_read |= BITFIELD64_BIT(VARYING_SLOT_TEX0 + pass_tex - GL_TEXTURE0_ARB); } } } } - for (pass = 0; pass < atifs->NumPasses; pass++) { - for (i = 0; i < atifs->numArithInstr[pass]; i++) { - struct atifs_instruction *inst = &atifs->Instructions[pass][i]; + for (pass = 0; pass < prog->ati.NumPasses; pass++) { + for (i = 0; i < prog->ati.numArithInstr[pass]; i++) { + struct atifs_instruction *inst = &prog->ati.Instructions[pass][i]; for (optype = 0; optype < 2; optype++) { /* color, alpha */ if (inst->Opcode[optype]) { for (arg = 0; arg < inst->ArgCount[optype]; arg++) { GLint index = inst->SrcReg[optype][arg].Index; if (index == GL_PRIMARY_COLOR_EXT) { prog->info.inputs_read |= BITFIELD64_BIT(VARYING_SLOT_COL0); } else if (index == GL_SECONDARY_INTERPOLATOR_ATI) { /* note: ATI_fragment_shader.txt never specifies what * GL_SECONDARY_INTERPOLATOR_ATI is, swrast uses diff --git a/src/mesa/state_tracker/st_atifs_to_tgsi.h b/src/mesa/state_tracker/st_atifs_to_tgsi.h index ce547911cf..f532c654f6 100644 --- a/src/mesa/state_tracker/st_atifs_to_tgsi.h +++ b/src/mesa/state_tracker/st_atifs_to_tgsi.h @@ -27,27 +27,25 @@ #include "pipe/p_defines.h" #if defined __cplusplus extern "C" { #endif struct gl_context; struct gl_program; struct ureg_program; struct tgsi_token; -struct ati_fragment_shader; struct st_fp_variant_key; enum pipe_error st_translate_atifs_program( struct ureg_program *ureg, - struct ati_fragment_shader *atifs, struct gl_program *program, GLuint numInputs, const ubyte inputMapping[], const ubyte inputSemanticName[], const ubyte inputSemanticIndex[], const ubyte interpMode[], GLuint numOutputs, const ubyte outputMapping[], const ubyte outputSemanticName[], const ubyte outputSemanticIndex[]); diff --git a/src/mesa/state_tracker/st_atom_constbuf.c b/src/mesa/state_tracker/st_atom_constbuf.c index 497d33fc34..910370b785 100644 --- a/src/mesa/state_tracker/st_atom_constbuf.c +++ b/src/mesa/state_tracker/st_atom_constbuf.c @@ -59,28 +59,29 @@ void st_upload_constants(struct st_context *st, struct gl_program *prog) enum pipe_shader_type shader_type = pipe_shader_type_from_mesa(stage); assert(shader_type == PIPE_SHADER_VERTEX || shader_type == PIPE_SHADER_FRAGMENT || shader_type == PIPE_SHADER_GEOMETRY || shader_type == PIPE_SHADER_TESS_CTRL || shader_type == PIPE_SHADER_TESS_EVAL || shader_type == PIPE_SHADER_COMPUTE); /* update the ATI constants before rendering */ - if (shader_type == PIPE_SHADER_FRAGMENT && st->fp->ati_fs) { - struct ati_fragment_shader *ati_fs = st->fp->ati_fs; + if (shader_type == PIPE_SHADER_FRAGMENT && + st->fp->Base.Target == GL_FRAGMENT_SHADER_ATI) { + struct gl_program *ati_fs = &st->fp->Base; unsigned c; for (c = 0; c < MAX_NUM_FRAGMENT_CONSTANTS_ATI; c++) { - if (ati_fs->LocalConstDef & (1 << c)) + if (ati_fs->ati.LocalConstDef & (1 << c)) memcpy(params->ParameterValues[c], - ati_fs->Constants[c], sizeof(GLfloat) * 4); + ati_fs->ati.Constants[c], sizeof(GLfloat) * 4); else memcpy(params->ParameterValues[c], st->ctx->ATIFragmentShader.GlobalConstants[c], sizeof(GLfloat) * 4); } } /* Make all bindless samplers/images bound texture/image units resident in * the context. */ st_make_bound_samplers_resident(st, prog); diff --git a/src/mesa/state_tracker/st_atom_shader.c b/src/mesa/state_tracker/st_atom_shader.c index c6faa3f07f..1b1205cfb2 100644 --- a/src/mesa/state_tracker/st_atom_shader.c +++ b/src/mesa/state_tracker/st_atom_shader.c @@ -94,26 +94,28 @@ get_texture_target(struct gl_context *ctx, const unsigned unit) * Mesa fragment program into a gallium fragment program and binding it. */ void st_update_fp( struct st_context *st ) { struct st_fragment_program *stfp; struct st_fp_variant_key key; assert(st->ctx->FragmentProgram._Current); stfp = st_fragment_program(st->ctx->FragmentProgram._Current); - assert(stfp->Base.Target == GL_FRAGMENT_PROGRAM_ARB); + assert(stfp->Base.Target == GL_FRAGMENT_PROGRAM_ARB || + stfp->Base.Target == GL_FRAGMENT_SHADER_ATI); void *shader; if (st->shader_has_one_variant[MESA_SHADER_FRAGMENT] && - !stfp->ati_fs && /* ATI_fragment_shader always has multiple variants */ + /* ATI_fragment_shader always has multiple variants */ + stfp->Base.Target != GL_FRAGMENT_SHADER_ATI && !stfp->Base.ExternalSamplersUsed && /* external samplers need variants */ stfp->variants && !stfp->variants->key.drawpixels && !stfp->variants->key.bitmap) { shader = stfp->variants->driver_shader; } else { memset(&key, 0, sizeof(key)); key.st = st->has_shareable_shaders ? NULL : st; /* _NEW_FRAG_CLAMP */ @@ -121,21 +123,21 @@ st_update_fp( struct st_context *st ) st->ctx->Color._ClampFragmentColor; /* _NEW_MULTISAMPLE | _NEW_BUFFERS */ key.persample_shading = st->force_persample_in_shader && _mesa_is_multisample_enabled(st->ctx) && st->ctx->Multisample.SampleShading && st->ctx->Multisample.MinSampleShadingValue * _mesa_geometric_samples(st->ctx->DrawBuffer) > 1; - if (stfp->ati_fs) { + if (stfp->Base.Target == GL_FRAGMENT_SHADER_ATI) { key.fog = st->ctx->Fog._PackedEnabledMode; for (unsigned u = 0; u < MAX_NUM_FRAGMENT_REGISTERS_ATI; u++) { key.texture_targets[u] = get_texture_target(st->ctx, u); } } key.external = st_get_external_sampler_key(st, &stfp->Base); shader = st_get_fp_variant(st, stfp, &key)->driver_shader; diff --git a/src/mesa/state_tracker/st_cb_program.c b/src/mesa/state_tracker/st_cb_program.c index 555fc5d5ad..062812c939 100644 --- a/src/mesa/state_tracker/st_cb_program.c +++ b/src/mesa/state_tracker/st_cb_program.c @@ -56,20 +56,21 @@ static struct gl_program * st_new_program(struct gl_context *ctx, GLenum target, GLuint id, bool is_arb_asm) { switch (target) { case GL_VERTEX_PROGRAM_ARB: { struct st_vertex_program *prog = rzalloc(NULL, struct st_vertex_program); return _mesa_init_gl_program(&prog->Base, target, id, is_arb_asm); } + case GL_FRAGMENT_SHADER_ATI: case GL_FRAGMENT_PROGRAM_ARB: { struct st_fragment_program *prog = rzalloc(NULL, struct st_fragment_program); return _mesa_init_gl_program(&prog->Base, target, id, is_arb_asm); } case GL_TESS_CONTROL_PROGRAM_NV: case GL_TESS_EVALUATION_PROGRAM_NV: case GL_GEOMETRY_PROGRAM_NV: { struct st_common_program *prog = rzalloc(NULL, struct st_common_program); @@ -111,20 +112,21 @@ st_delete_program(struct gl_context *ctx, struct gl_program *prog) { struct st_common_program *p = st_common_program(prog); st_release_basic_variants(st, p->Base.Target, &p->variants, &p->tgsi); if (p->glsl_to_tgsi) free_glsl_to_tgsi_visitor(p->glsl_to_tgsi); } break; + case GL_FRAGMENT_SHADER_ATI: case GL_FRAGMENT_PROGRAM_ARB: { struct st_fragment_program *stfp = (struct st_fragment_program *) prog; st_release_fp_variants(st, stfp); if (stfp->glsl_to_tgsi) free_glsl_to_tgsi_visitor(stfp->glsl_to_tgsi); } @@ -225,57 +227,41 @@ st_program_string_notify( struct gl_context *ctx, if (!st_translate_compute_program(st, stcp)) return false; if (st->cp == stcp) st->dirty |= stcp->affected_states; } else if (target == GL_FRAGMENT_SHADER_ATI) { assert(prog); struct st_fragment_program *stfp = (struct st_fragment_program *) prog; - assert(stfp->ati_fs); - assert(stfp->ati_fs->Program == prog); + assert(stfp->Base.Target == GL_FRAGMENT_SHADER_ATI); st_init_atifs_prog(ctx, prog); st_release_fp_variants(st, stfp); if (!st_translate_fragment_program(st, stfp)) return false; if (st->fp == stfp) st->dirty |= stfp->affected_states; } if (ST_DEBUG & DEBUG_PRECOMPILE || st->shader_has_one_variant[stage]) st_precompile_shader_variant(st, prog); return GL_TRUE; } -/** - * Called via ctx->Driver.NewATIfs() - * Called in glEndFragmentShaderATI() - */ -static struct gl_program * -st_new_ati_fs(struct gl_context *ctx, struct ati_fragment_shader *curProg) -{ - struct gl_program *prog = ctx->Driver.NewProgram(ctx, GL_FRAGMENT_PROGRAM_ARB, - curProg->Id, true); - struct st_fragment_program *stfp = (struct st_fragment_program *)prog; - stfp->ati_fs = curProg; - return prog; -} - /** * Plug in the program and shader-related device driver functions. */ void st_init_program_functions(struct dd_function_table *functions) { functions->NewProgram = st_new_program; functions->DeleteProgram = st_delete_program; functions->ProgramStringNotify = st_program_string_notify; - functions->NewATIfs = st_new_ati_fs; functions->LinkShader = st_link_shader; } diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c index e3649a8b7c..cdadd88ed0 100644 --- a/src/mesa/state_tracker/st_program.c +++ b/src/mesa/state_tracker/st_program.c @@ -662,21 +662,21 @@ st_translate_fragment_program(struct st_context *st, /* This determines which states will be updated when the assembly * shader is bound. * * fragment.position and glDrawPixels always use constants. */ stfp->affected_states = ST_NEW_FS_STATE | ST_NEW_SAMPLE_SHADING | ST_NEW_FS_CONSTANTS; - if (stfp->ati_fs) { + if (stfp->Base.Target == GL_FRAGMENT_SHADER_ATI) { /* Just set them for ATI_fs unconditionally. */ stfp->affected_states |= ST_NEW_FS_SAMPLER_VIEWS | ST_NEW_FS_SAMPLERS; } else { /* ARB_fp */ if (stfp->Base.SamplersUsed) stfp->affected_states |= ST_NEW_FS_SAMPLER_VIEWS | ST_NEW_FS_SAMPLERS; } } @@ -941,23 +941,22 @@ st_translate_fragment_program(struct st_context *st, input_semantic_name, input_semantic_index, interpMode, /* outputs */ fs_num_outputs, outputMapping, fs_output_semantic_name, fs_output_semantic_index); free_glsl_to_tgsi_visitor(stfp->glsl_to_tgsi); - } else if (stfp->ati_fs) + } else if (stfp->Base.Target == GL_FRAGMENT_SHADER_ATI) st_translate_atifs_program(ureg, - stfp->ati_fs, &stfp->Base, /* inputs */ fs_num_inputs, inputMapping, input_semantic_name, input_semantic_index, interpMode, /* outputs */ fs_num_outputs, outputMapping, @@ -1091,21 +1090,21 @@ st_create_fp_variant(struct st_context *st, variant->key = *key; return variant; } tgsi.tokens = stfp->tgsi.tokens; assert(!(key->bitmap && key->drawpixels)); /* Fix texture targets and add fog for ATI_fs */ - if (stfp->ati_fs) { + if (stfp->Base.Target == GL_FRAGMENT_SHADER_ATI) { const struct tgsi_token *tokens = st_fixup_atifs(tgsi.tokens, key); if (tokens) tgsi.tokens = tokens; else fprintf(stderr, "mesa: cannot post-process ATI_fs\n"); } /* Emulate features. */ if (key->clamp_color || key->persample_shading) { diff --git a/src/mesa/state_tracker/st_program.h b/src/mesa/state_tracker/st_program.h index 6049fba517..b834a1f368 100644 --- a/src/mesa/state_tracker/st_program.h +++ b/src/mesa/state_tracker/st_program.h @@ -136,21 +136,20 @@ struct st_fp_variant /** * Derived from Mesa gl_program: */ struct st_fragment_program { struct gl_program Base; struct pipe_shader_state tgsi; struct glsl_to_tgsi_visitor* glsl_to_tgsi; - struct ati_fragment_shader *ati_fs; uint64_t affected_states; /**< ST_NEW_* flags to mark dirty when binding */ /* used when bypassing glsl_to_tgsi: */ struct gl_shader_program *shader_program; struct st_fp_variant *variants; /** SHA1 hash of linked tgsi shader program, used for on-disk cache */ unsigned char sha1[20]; }; diff --git a/src/mesa/swrast/s_atifragshader.c b/src/mesa/swrast/s_atifragshader.c index 414a4144e2..21d480fee4 100644 --- a/src/mesa/swrast/s_atifragshader.c +++ b/src/mesa/swrast/s_atifragshader.c @@ -292,62 +292,62 @@ do { \ /** * Execute the given fragment shader. * NOTE: we do everything in single-precision floating point * \param ctx - rendering context * \param shader - the shader to execute * \param machine - virtual machine state * \param span - the SWspan we're operating on * \param column - which pixel [i] we're operating on in the span */ static void -execute_shader(struct gl_context *ctx, const struct ati_fragment_shader *shader, +execute_shader(struct gl_context *ctx, const struct gl_program *shader, struct atifs_machine *machine, const SWspan *span, GLuint column) { GLuint pc; struct atifs_instruction *inst; struct atifs_setupinst *texinst; GLint optype; GLuint i; GLint j, pass; GLint dstreg; GLfloat src[2][3][4]; GLfloat zeros[4] = { 0.0, 0.0, 0.0, 0.0 }; GLfloat ones[4] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat dst[2][4], *dstp; - for (pass = 0; pass < shader->NumPasses; pass++) { + for (pass = 0; pass < shader->ati.NumPasses; pass++) { if (pass > 0) finish_pass(machine); for (j = 0; j < MAX_NUM_FRAGMENT_REGISTERS_ATI; j++) { - texinst = &shader->SetupInst[pass][j]; + texinst = &shader->ati.SetupInst[pass][j]; if (texinst->Opcode == ATI_FRAGMENT_SHADER_PASS_OP) handle_pass_op(machine, texinst, span, column, j); else if (texinst->Opcode == ATI_FRAGMENT_SHADER_SAMPLE_OP) handle_sample_op(ctx, machine, texinst, span, column, j); } - for (pc = 0; pc < shader->numArithInstr[pass]; pc++) { - inst = &shader->Instructions[pass][pc]; + for (pc = 0; pc < shader->ati.numArithInstr[pass]; pc++) { + inst = &shader->ati.Instructions[pass][pc]; /* setup the source registers for color and alpha ops */ for (optype = 0; optype < 2; optype++) { for (i = 0; i < inst->ArgCount[optype]; i++) { GLint index = inst->SrcReg[optype][i].Index; if (index >= GL_REG_0_ATI && index <= GL_REG_5_ATI) SETUP_SRC_REG(optype, i, machine->Registers[index - GL_REG_0_ATI]); else if (index >= GL_CON_0_ATI && index <= GL_CON_7_ATI) { - if (shader->LocalConstDef & (1 << (index - GL_CON_0_ATI))) { + if (shader->ati.LocalConstDef & (1 << (index - GL_CON_0_ATI))) { SETUP_SRC_REG(optype, i, - shader->Constants[index - GL_CON_0_ATI]); + shader->ati.Constants[index - GL_CON_0_ATI]); } else { SETUP_SRC_REG(optype, i, ctx->ATIFragmentShader.GlobalConstants[index - GL_CON_0_ATI]); } } else if (index == GL_ONE) SETUP_SRC_REG(optype, i, ones); else if (index == GL_ZERO) SETUP_SRC_REG(optype, i, zeros); else if (index == GL_PRIMARY_COLOR_EXT) @@ -537,21 +537,21 @@ execute_shader(struct gl_context *ctx, const struct ati_fragment_shader *shader, } } } /** * Init fragment shader virtual machine state. */ static void init_machine(struct gl_context * ctx, struct atifs_machine *machine, - const struct ati_fragment_shader *shader, + const struct gl_program *shader, const SWspan *span, GLuint col) { GLfloat (*inputs)[4] = machine->Inputs; GLint i, j; for (i = 0; i < 6; i++) { for (j = 0; j < 4; j++) machine->Registers[i][j] = 0.0; } @@ -560,21 +560,21 @@ init_machine(struct gl_context * ctx, struct atifs_machine *machine, } /** * Execute the current ATI shader program, operating on the given span. */ void _swrast_exec_fragment_shader(struct gl_context * ctx, SWspan *span) { - const struct ati_fragment_shader *shader = ctx->ATIFragmentShader.Current; + const struct gl_program *shader = ctx->ATIFragmentShader.Current; struct atifs_machine machine; GLuint i; /* incoming colors should be floats */ assert(span->array->ChanType == GL_FLOAT); for (i = 0; i < span->end; i++) { if (span->array->mask[i]) { init_machine(ctx, &machine, shader, span, i); -- 2.14.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev