r200_maos_arrays.c revision c10c3eab4c9d8617bb12dc5958eb9cfe06cc2e4d
1521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)/* 2521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. 3521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 4521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)The Weather Channel (TM) funded Tungsten Graphics to develop the 5521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)initial release of the Radeon 8500 driver under the XFree86 license. 6521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)This notice must be preserved. 7521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 8521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)Permission is hereby granted, free of charge, to any person obtaining 9521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)a copy of this software and associated documentation files (the 10521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)"Software"), to deal in the Software without restriction, including 11521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)without limitation the rights to use, copy, modify, merge, publish, 12521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)distribute, sublicense, and/or sell copies of the Software, and to 13521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)permit persons to whom the Software is furnished to do so, subject to 14521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)the following conditions: 15521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 16521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)The above copyright notice and this permission notice (including the 17521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)next paragraph) shall be included in all copies or substantial 18521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)portions of the Software. 19521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 20521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 21521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 22521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 23521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 24521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 25521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 26521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 28521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)**************************************************************************/ 29521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 30521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)/* 31521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) * Authors: 32521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) * Keith Whitwell <keith@tungstengraphics.com> 33521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) */ 34197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 35197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "main/glheader.h" 36197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "main/mtypes.h" 377757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "main/colormac.h" 385d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "main/imports.h" 3906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "main/macros.h" 40f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 41521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "swrast_setup/swrast_setup.h" 4251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "math/m_translate.h" 431e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "tnl/tnl.h" 441e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "tnl/t_context.h" 4551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 4676c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)#include "r200_context.h" 47f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#include "r200_ioctl.h" 48f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#include "r200_state.h" 4951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "r200_swtcl.h" 50521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "r200_maos.h" 510019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch#include "r200_tcl.h" 52521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 53f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#if defined(USE_X86_ASM) 5451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#define COPY_DWORDS( dst, src, nr ) \ 5551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)do { \ 56c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) int __tmp; \ 57521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) __asm__ __volatile__( "rep ; movsl" \ 58f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) : "=%c" (__tmp), "=D" (dst), "=S" (__tmp) \ 59f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) : "0" (nr), \ 60f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) "D" ((long)dst), \ 61f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) "S" ((long)src) ); \ 62f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)} while (0) 63f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#else 64f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#define COPY_DWORDS( dst, src, nr ) \ 65f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)do { \ 66f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) int j; \ 67f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) for ( j = 0 ; j < nr ; j++ ) \ 68f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) dst[j] = ((int *)src)[j]; \ 69f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) dst += nr; \ 70f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)} while (0) 71f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#endif 72f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 73f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)/* Emit any changed arrays to new GART memory, re-emit a packet to 74f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) * update the arrays. 75f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) */ 76f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)void r200EmitArrays( struct gl_context *ctx, GLubyte *vimap_rev ) 77f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles){ 78f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) r200ContextPtr rmesa = R200_CONTEXT( ctx ); 79f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) struct vertex_buffer *VB = &TNL_CONTEXT( ctx )->vb; 80f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) GLuint nr = 0; 81f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) GLuint vfmt0 = 0, vfmt1 = 0; 82f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) GLuint count = VB->Count; 83f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) GLuint i, emitsize; 84f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 85f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) // fprintf(stderr,"emit arrays\n"); 86f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) for ( i = 0; i < 15; i++ ) { 87f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) GLubyte attrib = vimap_rev[i]; 88f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (attrib != 255) { 89f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) switch (i) { 90197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch case 0: 91521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) emitsize = (VB->AttribPtr[attrib]->size); 92197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch switch (emitsize) { 93521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) case 4: 94197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch vfmt0 |= R200_VTX_W0; 95521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) /* fallthrough */ 96521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) case 3: 971e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) vfmt0 |= R200_VTX_Z0; 98f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) break; 99f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) case 2: 100f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) break; 101197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch default: assert(0); 102f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) } 103f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) break; 104197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch case 1: 105521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) assert(attrib == VERT_ATTRIB_WEIGHT); 106a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) emitsize = (VB->AttribPtr[attrib]->size); 107521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) vfmt0 |= emitsize << R200_VTX_WEIGHT_COUNT_SHIFT; 108521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) break; 109521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) case 2: 110521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) assert(attrib == VERT_ATTRIB_NORMAL); 111a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) emitsize = 3; 112197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch vfmt0 |= R200_VTX_N0; 113521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) break; 114197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch case 3: 115521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) /* special handling to fix up fog. Will get us into trouble with vbos...*/ 116521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) assert(attrib == VERT_ATTRIB_FOG); 11751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (!rmesa->radeon.tcl.aos[i].bo) { 118521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (ctx->VertexProgram._Enabled) 119a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) rcommon_emit_vector( ctx, 120521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) &(rmesa->radeon.tcl.aos[nr]), 121521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) (char *)VB->AttribPtr[attrib]->data, 122323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 1, 123323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) VB->AttribPtr[attrib]->stride, 124323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) count); 125d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) else 126521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) rcommon_emit_vecfog( ctx, 127521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) &(rmesa->radeon.tcl.aos[nr]), 128521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) (char *)VB->AttribPtr[attrib]->data, 129521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) VB->AttribPtr[attrib]->stride, 130e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch count); 131521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 132d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) vfmt0 |= R200_VTX_DISCRETE_FOG; 133521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) goto after_emit; 134521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) break; 135521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) case 4: 136521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) case 5: 137e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch case 6: 138521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) case 7: 139d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (VB->AttribPtr[attrib]->size == 4 && 140521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) (VB->AttribPtr[attrib]->stride != 0 || 141521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) VB->AttribPtr[attrib]->data[0][3] != 1.0)) emitsize = 4; 142521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) else emitsize = 3; 143521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (emitsize == 4) 144521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) vfmt0 |= R200_VTX_FP_RGBA << (R200_VTX_COLOR_0_SHIFT + (i - 4) * 2); 145521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) else { 14651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) vfmt0 |= R200_VTX_FP_RGB << (R200_VTX_COLOR_0_SHIFT + (i - 4) * 2); 147521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 14851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) break; 14951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) case 8: 150e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch case 9: 151e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch case 10: 152521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) case 11: 153521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) case 12: 154521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) case 13: 155197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch emitsize = VB->AttribPtr[attrib]->size; 156521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) vfmt1 |= emitsize << (R200_VTX_TEX0_COMP_CNT_SHIFT + (i - 8) * 3); 157521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) break; 1587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case 14: 159521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) emitsize = VB->AttribPtr[attrib]->size >= 2 ? VB->AttribPtr[attrib]->size : 2; 160197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch switch (emitsize) { 161521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) case 2: 162521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) vfmt0 |= R200_VTX_XY1; 16351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) /* fallthrough */ 164521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) case 3: 165a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) vfmt0 |= R200_VTX_Z1; 166521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) /* fallthrough */ 167521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) case 4: 168521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) vfmt0 |= R200_VTX_W1; 169323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) /* fallthrough */ 170e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch } 171521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) break; 172d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) default: 173521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) assert(0); 174521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) emitsize = 0; 175521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 176323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (!rmesa->radeon.tcl.aos[nr].bo) { 177521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) rcommon_emit_vector( ctx, 178521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) &(rmesa->radeon.tcl.aos[nr]), 179323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) (char *)VB->AttribPtr[attrib]->data, 180521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) emitsize, 181521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) VB->AttribPtr[attrib]->stride, 182323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) count ); 183521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 184521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)after_emit: 185323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) assert(nr < 12); 186521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) nr++; 187521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 188521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 189323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 190521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (vfmt0 != rmesa->hw.vtx.cmd[VTX_VTXFMT_0] || 191521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) vfmt1 != rmesa->hw.vtx.cmd[VTX_VTXFMT_1]) { 192521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) R200_STATECHANGE( rmesa, vtx ); 193e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch rmesa->hw.vtx.cmd[VTX_VTXFMT_0] = vfmt0; 194521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) rmesa->hw.vtx.cmd[VTX_VTXFMT_1] = vfmt1; 195521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 1961e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 197521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) rmesa->radeon.tcl.aos_count = nr; 198521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)} 199521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 200e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch