diff options
Diffstat (limited to 'src/mesa/drivers/dri/r300/r300_state.c')
-rw-r--r-- | src/mesa/drivers/dri/r300/r300_state.c | 329 |
1 files changed, 329 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/r300/r300_state.c b/src/mesa/drivers/dri/r300/r300_state.c new file mode 100644 index 0000000000..e1cb31da40 --- /dev/null +++ b/src/mesa/drivers/dri/r300/r300_state.c @@ -0,0 +1,329 @@ +/* +Copyright (C) The Weather Channel, Inc. 2002. +Copyright (C) 2004 Nicolai Haehnle. +All Rights Reserved. + +The Weather Channel (TM) funded Tungsten Graphics to develop the +initial release of the Radeon 8500 driver under the XFree86 license. +This notice must be preserved. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice (including the +next paragraph) shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +**************************************************************************/ + +/* + * Authors: + * Nicolai Haehnle <prefect_@gmx.net> + */ + +#include "glheader.h" +#include "state.h" +#include "imports.h" +#include "macros.h" +#include "context.h" +#include "dd.h" +#include "simple_list.h" + +#include "api_arrayelt.h" +#include "swrast/swrast.h" +#include "swrast_setup/swrast_setup.h" +#include "array_cache/acache.h" +#include "tnl/tnl.h" + +#include "radeon_ioctl.h" +#include "r300_context.h" +#include "r300_ioctl.h" +#include "r300_state.h" +#include "r300_reg.h" +#include "r300_program.h" + + +/** + * Called by Mesa after an internal state update. + */ +static void r300InvalidateState(GLcontext * ctx, GLuint new_state) +{ + r300ContextPtr r300 = R300_CONTEXT(ctx); + + _swrast_InvalidateState(ctx, new_state); + _swsetup_InvalidateState(ctx, new_state); + _ac_InvalidateState(ctx, new_state); + _tnl_InvalidateState(ctx, new_state); + _ae_invalidate_state(ctx, new_state); + + /* Go inefficiency! */ + r300ResetHwState(r300); +} + + +/** + * Completely recalculates hardware state based on the Mesa state. + */ +void r300ResetHwState(r300ContextPtr r300) +{ + int i; + + if (RADEON_DEBUG & DEBUG_STATE) + fprintf(stderr, "%s\n", __FUNCTION__); + + { + __DRIdrawablePrivate *dPriv = r300->radeon.dri.drawable; + GLfloat xoffset = dPriv ? (GLfloat) dPriv->x : 0; + GLfloat yoffset = dPriv ? (GLfloat) dPriv->y + dPriv->h : 0; + const GLfloat *v = r300->radeon.glCtx->Viewport._WindowMap.m; + + r300->hw.vpt.cmd[R300_VPT_XSCALE] = + r300PackFloat32(v[MAT_SX]); + r300->hw.vpt.cmd[R300_VPT_XOFFSET] = + r300PackFloat32(v[MAT_TX] + xoffset); + r300->hw.vpt.cmd[R300_VPT_YSCALE] = + r300PackFloat32(-v[MAT_SY]); + r300->hw.vpt.cmd[R300_VPT_YOFFSET] = + r300PackFloat32(-v[MAT_TY] + yoffset); + r300->hw.vpt.cmd[R300_VPT_YSCALE] = + r300PackFloat32(v[MAT_SZ]); + r300->hw.vpt.cmd[R300_VPT_YOFFSET] = + r300PackFloat32(v[MAT_TZ]); + } + +//BEGIN: TODO + r300->hw.unk2080.cmd[1] = 0x0030045A; + + r300->hw.ovf.cmd[R300_OVF_FMT_0] = 0x00000003; + r300->hw.ovf.cmd[R300_OVF_FMT_1] = 0x00000000; + + r300->hw.unk20B0.cmd[1] = 0x0000040A; + r300->hw.unk20B0.cmd[2] = 0x00000008; + + r300->hw.unk2134.cmd[1] = 0x00FFFFFF; + r300->hw.unk2134.cmd[2] = 0x00000000; + + r300->hw.unk2140.cmd[1] = 0x00000000; + + ((drm_r300_cmd_header_t*)r300->hw.vir[0].cmd)->unchecked_state.count = 1; + r300->hw.vir[0].cmd[1] = 0x21030003; + + ((drm_r300_cmd_header_t*)r300->hw.vir[1].cmd)->unchecked_state.count = 1; + r300->hw.vir[1].cmd[1] = 0xF688F688; + + r300->hw.vic.cmd[R300_VIR_CNTL_0] = 0x00000001; + r300->hw.vic.cmd[R300_VIR_CNTL_1] = 0x00000405; + + r300->hw.unk21DC.cmd[1] = 0xAAAAAAAA; + + r300->hw.unk221C.cmd[1] = R300_221C_NORMAL; + + r300->hw.unk2220.cmd[1] = r300PackFloat32(1.0); + r300->hw.unk2220.cmd[2] = r300PackFloat32(1.0); + r300->hw.unk2220.cmd[3] = r300PackFloat32(1.0); + r300->hw.unk2220.cmd[4] = r300PackFloat32(1.0); + + if (GET_CHIP(r300->radeon.radeonScreen) == RADEON_CHIP_R300) + r300->hw.unk2288.cmd[1] = R300_2288_R300; + else + r300->hw.unk2288.cmd[1] = R300_2288_RV350; + + r300->hw.pvs.cmd[R300_PVS_CNTL_1] = 0; + r300->hw.pvs.cmd[R300_PVS_CNTL_2] = 0; + r300->hw.pvs.cmd[R300_PVS_CNTL_3] = 0; + + r300->hw.unk4008.cmd[1] = 0x00000007; + + r300->hw.unk4010.cmd[1] = 0x66666666; + r300->hw.unk4010.cmd[2] = 0x06666666; + if (GET_CHIP(r300->radeon.radeonScreen) == RADEON_CHIP_R300) + r300->hw.unk4010.cmd[3] = 0x00000017; + else + r300->hw.unk4010.cmd[3] = 0x00000011; + r300->hw.unk4010.cmd[4] = 0x00000000; + r300->hw.unk4010.cmd[5] = 0x00000000; + + r300->hw.txe.cmd[R300_TXE_ENABLE] = 0; + + r300->hw.unk4200.cmd[1] = r300PackFloat32(0.0); + r300->hw.unk4200.cmd[2] = r300PackFloat32(0.0); + r300->hw.unk4200.cmd[3] = r300PackFloat32(1.0); + r300->hw.unk4200.cmd[4] = r300PackFloat32(1.0); + + r300->hw.unk4214.cmd[1] = 0x00050005; + + r300->hw.unk4230.cmd[1] = 0x01800000; + r300->hw.unk4230.cmd[2] = 0x00020006; + r300->hw.unk4230.cmd[3] = r300PackFloat32(1.0 / 192.0); + + r300->hw.unk4260.cmd[1] = 0; + r300->hw.unk4260.cmd[2] = r300PackFloat32(0.0); + r300->hw.unk4260.cmd[3] = r300PackFloat32(1.0); + + r300->hw.unk4274.cmd[1] = 0x00000002; + r300->hw.unk4274.cmd[2] = 0x0003AAAA; + r300->hw.unk4274.cmd[3] = 0x00000000; + r300->hw.unk4274.cmd[4] = 0x00000000; + + r300->hw.unk4288.cmd[1] = 0x00000000; + r300->hw.unk4288.cmd[2] = 0x00000001; + r300->hw.unk4288.cmd[3] = 0x00000000; + r300->hw.unk4288.cmd[4] = 0x00000000; + r300->hw.unk4288.cmd[5] = 0x00000000; + + r300->hw.unk42A0.cmd[1] = 0x00000000; + + r300->hw.unk42B4.cmd[1] = 0x00000000; + r300->hw.unk42B4.cmd[2] = 0x00000000; + + r300->hw.unk42C0.cmd[1] = 0x4B7FFFFF; + r300->hw.unk42C0.cmd[2] = 0x00000000; + + r300->hw.rc.cmd[1] = R300_RS_CNTL_0_UNKNOWN_7; + r300->hw.rc.cmd[2] = 0; + + for(i = 1; i <= 8; ++i) + r300->hw.ri.cmd[i] = 0; + + ((drm_r300_cmd_header_t*)r300->hw.rr.cmd)->unchecked_state.count = 1; + for(i = 1; i <= 8; ++i) + r300->hw.rr.cmd[1] = 0; + + r300->hw.unk43A4.cmd[1] = 0x0000001C; + r300->hw.unk43A4.cmd[2] = 0x2DA49525; + + r300->hw.unk43E0.cmd[1] = 0x00000000; + r300->hw.unk43E0.cmd[2] = 0x03FFFFFF; + r300->hw.unk43E0.cmd[3] = 0x00FFFFFF; + + r300->hw.fp.cmd[R300_FP_CNTL0] = 0; + r300->hw.fp.cmd[R300_FP_CNTL1] = 0; + r300->hw.fp.cmd[R300_FP_CNTL2] = 0; + r300->hw.fp.cmd[R300_FP_NODE0] = 0; + r300->hw.fp.cmd[R300_FP_NODE1] = 0; + r300->hw.fp.cmd[R300_FP_NODE2] = 0; + r300->hw.fp.cmd[R300_FP_NODE3] = 0; + + r300->hw.unk46A4.cmd[1] = 0x00001B01; + r300->hw.unk46A4.cmd[2] = 0x00001B0F; + r300->hw.unk46A4.cmd[3] = 0x00001B0F; + r300->hw.unk46A4.cmd[4] = 0x00001B0F; + r300->hw.unk46A4.cmd[5] = 0x00000001; + + for(i = 1; i <= 64; ++i) { + /* create NOP instructions */ + r300->hw.fpi[0].cmd[i] = FP_INSTRC(MAD, FP_ARGC(SRC0C_XYZ), FP_ARGC(ONE), FP_ARGC(ZERO)); + r300->hw.fpi[1].cmd[i] = FP_SELC(0,XYZ,NO,FP_TMP(0),0,0); + r300->hw.fpi[2].cmd[i] = FP_INSTRA(MAD, FP_ARGA(SRC0A), FP_ARGA(ONE), FP_ARGA(ZERO)); + r300->hw.fpi[3].cmd[i] = FP_SELA(0,W,NO,FP_TMP(0),0,0); + } + + r300->hw.unk4BC0.cmd[1] = 0; + + r300->hw.unk4BC8.cmd[1] = 0; + r300->hw.unk4BC8.cmd[2] = 0; + r300->hw.unk4BC8.cmd[3] = 0; + + r300->hw.at.cmd[R300_AT_ALPHA_TEST] = 0; + + r300->hw.unk4BD8.cmd[1] = 0; + + r300->hw.unk4E00.cmd[1] = 0; + + r300->hw.bld.cmd[R300_BLD_CBLEND] = 0; + r300->hw.bld.cmd[R300_BLD_ABLEND] = 0; + + r300->hw.cmk.cmd[R300_CMK_COLORMASK] = 0xF; + + r300->hw.unk4E10.cmd[1] = 0; + r300->hw.unk4E10.cmd[2] = 0; + r300->hw.unk4E10.cmd[3] = 0; + + r300->hw.cb.cmd[R300_CB_OFFSET] = + r300->radeon.radeonScreen->backOffset + + r300->radeon.radeonScreen->fbLocation; + r300->hw.cb.cmd[R300_CB_PITCH] = r300->radeon.radeonScreen->backPitch + | R300_COLOR_UNKNOWN_22_23; + + r300->hw.unk4E50.cmd[1] = 0; + r300->hw.unk4E50.cmd[2] = 0; + r300->hw.unk4E50.cmd[3] = 0; + r300->hw.unk4E50.cmd[4] = 0; + r300->hw.unk4E50.cmd[5] = 0; + r300->hw.unk4E50.cmd[6] = 0; + r300->hw.unk4E50.cmd[7] = 0; + r300->hw.unk4E50.cmd[8] = 0; + r300->hw.unk4E50.cmd[9] = 0; + + r300->hw.unk4E88.cmd[1] = 0; + + r300->hw.zc.cmd[R300_ZC_CNTL_0] = 0; + r300->hw.zc.cmd[R300_ZC_CNTL_1] = 0; + + r300->hw.unk4F08.cmd[1] = 0x00FFFF00; + r300->hw.unk4F08.cmd[2] = 0x00000002; + r300->hw.unk4F08.cmd[3] = 0x00000000; + r300->hw.unk4F08.cmd[4] = 0x00000003; + r300->hw.unk4F08.cmd[5] = 0x00000000; + + r300->hw.zb.cmd[R300_ZB_OFFSET] = + r300->radeon.radeonScreen->depthOffset + + r300->radeon.radeonScreen->fbLocation; + r300->hw.zb.cmd[R300_ZB_PITCH] = r300->radeon.radeonScreen->depthPitch; + + r300->hw.unk4F28.cmd[1] = 0; + + r300->hw.unk4F30.cmd[1] = 0; + r300->hw.unk4F30.cmd[2] = 0; + + r300->hw.unk4F44.cmd[1] = 0; + + r300->hw.unk4F54.cmd[1] = 0; + + ((drm_r300_cmd_header_t*)r300->hw.vpi.cmd)->vpu.count = 0; + for(i = 1; i < R300_VPI_CMDSIZE; i += 4) { + /* MOV t0, t0 */ + r300->hw.vpi.cmd[i+0] = VP_OUT(ADD,TMP,0,XYZW); + r300->hw.vpi.cmd[i+1] = VP_IN(TMP,0); + r300->hw.vpi.cmd[i+2] = VP_ZERO(); + r300->hw.vpi.cmd[i+3] = VP_ZERO(); + } + + ((drm_r300_cmd_header_t*)r300->hw.vpp.cmd)->vpu.count = 0; + for(i = 1; i < R300_VPP_CMDSIZE; ++i) + r300->hw.vpp.cmd[i] = 0; +//END: TODO + + r300->hw.all_dirty = GL_TRUE; +} + + +/** + * Calculate initial hardware state and register state functions. + * Assumes that the command buffer and state atoms have been + * initialized already. + */ +void r300InitState(r300ContextPtr r300) +{ + struct dd_function_table* functions; + + r300ResetHwState(r300); + + /* Setup state functions */ + functions = &r300->radeon.glCtx->Driver; + functions->UpdateState = r300InvalidateState; +} + |