1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCopyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgThe Weather Channel (TM) funded Tungsten Graphics to develop the 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orginitial release of the Radeon 8500 driver under the XFree86 license. 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgThis notice must be preserved. 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPermission is hereby granted, free of charge, to any person obtaining 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orga copy of this software and associated documentation files (the 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org"Software"), to deal in the Software without restriction, including 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwithout limitation the rights to use, copy, modify, merge, publish, 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdistribute, sublicense, and/or sell copies of the Software, and to 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpermit persons to whom the Software is furnished to do so, subject to 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgthe following conditions: 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgThe above copyright notice and this permission notice (including the 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnext paragraph) shall be included in all copies or substantial 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgportions of the Software. 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgIN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org**************************************************************************/ 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Authors: 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Keith Whitwell <keith@tungstengraphics.com> 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/glheader.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/mtypes.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/colormac.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/enums.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/image.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/imports.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/macros.h" 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/simple_list.h" 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast/s_context.h" 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast/s_fog.h" 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast_setup/swrast_setup.h" 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl/tnl.h" 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl/t_context.h" 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl/t_pipeline.h" 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r200_context.h" 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r200_ioctl.h" 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r200_state.h" 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r200_swtcl.h" 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r200_tcl.h" 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*********************************************************************** 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Initialization 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ***********************************************************************/ 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define EMIT_ATTR( ATTR, STYLE, F0 ) \ 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo { \ 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].attrib = (ATTR); \ 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].format = (STYLE); \ 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.swtcl.vertex_attr_count++; \ 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fmt_0 |= F0; \ 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0) 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define EMIT_PAD( N ) \ 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo { \ 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].attrib = 0; \ 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].format = EMIT_PAD; \ 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].offset = (N); \ 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.swtcl.vertex_attr_count++; \ 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0) 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200SetVertexFormat( struct gl_context *ctx ) 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT( ctx ); 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TNLcontext *tnl = TNL_CONTEXT(ctx); 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vertex_buffer *VB = &tnl->vb; 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLbitfield64 index_bitset = tnl->render_inputs_bitset; 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int fmt_0 = 0; 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int fmt_1 = 0; 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int offset = 0; 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Important: 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( VB->NdcPtr != NULL ) { 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VB->AttribPtr[VERT_ATTRIB_POS] = VB->NdcPtr; 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VB->AttribPtr[VERT_ATTRIB_POS] = VB->ClipPtr; 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert( VB->AttribPtr[VERT_ATTRIB_POS] != NULL ); 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.swtcl.vertex_attr_count = 0; 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* EMIT_ATTR's must be in order as they tell t_vertex.c how to 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * build up a hardware vertex. 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( !rmesa->swtcl.needproj || 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (index_bitset & BITFIELD64_RANGE(_TNL_ATTRIB_TEX0, _TNL_NUM_TEX)) ) { 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* need w coord for projected textures */ 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_4F, R200_VTX_XY | R200_VTX_Z0 | R200_VTX_W0 ); 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset = 4; 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_3F, R200_VTX_XY | R200_VTX_Z0 ); 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset = 3; 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index_bitset & BITFIELD64_BIT(_TNL_ATTRIB_POINTSIZE)) { 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EMIT_ATTR( _TNL_ATTRIB_POINTSIZE, EMIT_1F, R200_VTX_POINT_SIZE ); 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset += 1; 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->swtcl.coloroffset = offset; 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if MESA_LITTLE_ENDIAN 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EMIT_ATTR( _TNL_ATTRIB_COLOR0, EMIT_4UB_4F_RGBA, (R200_VTX_PK_RGBA << R200_VTX_COLOR_0_SHIFT) ); 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EMIT_ATTR( _TNL_ATTRIB_COLOR0, EMIT_4UB_4F_ABGR, (R200_VTX_PK_RGBA << R200_VTX_COLOR_0_SHIFT) ); 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset += 1; 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->swtcl.specoffset = 0; 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index_bitset & 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (BITFIELD64_BIT(_TNL_ATTRIB_COLOR1) | BITFIELD64_BIT(_TNL_ATTRIB_FOG))) { 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if MESA_LITTLE_ENDIAN 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index_bitset & BITFIELD64_BIT(_TNL_ATTRIB_COLOR1)) { 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->swtcl.specoffset = offset; 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EMIT_ATTR( _TNL_ATTRIB_COLOR1, EMIT_3UB_3F_RGB, (R200_VTX_PK_RGBA << R200_VTX_COLOR_1_SHIFT) ); 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EMIT_PAD( 3 ); 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index_bitset & BITFIELD64_BIT(_TNL_ATTRIB_FOG)) { 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EMIT_ATTR( _TNL_ATTRIB_FOG, EMIT_1UB_1F, (R200_VTX_PK_RGBA << R200_VTX_COLOR_1_SHIFT) ); 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EMIT_PAD( 1 ); 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index_bitset & BITFIELD64_BIT(_TNL_ATTRIB_FOG)) { 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EMIT_ATTR( _TNL_ATTRIB_FOG, EMIT_1UB_1F, (R200_VTX_PK_RGBA << R200_VTX_COLOR_1_SHIFT) ); 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EMIT_PAD( 1 ); 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index_bitset & BITFIELD64_BIT(_TNL_ATTRIB_COLOR1)) { 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->swtcl.specoffset = offset; 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EMIT_ATTR( _TNL_ATTRIB_COLOR1, EMIT_3UB_3F_BGR, (R200_VTX_PK_RGBA << R200_VTX_COLOR_1_SHIFT) ); 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EMIT_PAD( 3 ); 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index_bitset & BITFIELD64_RANGE(_TNL_ATTRIB_TEX0, _TNL_NUM_TEX)) { 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < ctx->Const.MaxTextureUnits; i++) { 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index_bitset & BITFIELD64_BIT(_TNL_ATTRIB_TEX(i))) { 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint sz = VB->AttribPtr[_TNL_ATTRIB_TEX0 + i]->size; 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fmt_1 |= sz << (3 * i); 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EMIT_ATTR( _TNL_ATTRIB_TEX0+i, EMIT_1F + sz - 1, 0 ); 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( (rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] & R200_FOG_USE_MASK) 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org != R200_FOG_USE_SPEC_ALPHA ) { 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, ctx ); 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] &= ~R200_FOG_USE_MASK; 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] |= R200_FOG_USE_SPEC_ALPHA; 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rmesa->radeon.tnl_index_bitset != index_bitset || 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (rmesa->hw.vtx.cmd[VTX_VTXFMT_0] != fmt_0) || 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (rmesa->hw.vtx.cmd[VTX_VTXFMT_1] != fmt_1) ) { 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_NEWPRIM(rmesa); 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, vtx ); 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vtx.cmd[VTX_VTXFMT_0] = fmt_0; 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vtx.cmd[VTX_VTXFMT_1] = fmt_1; 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.swtcl.vertex_size = 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _tnl_install_attrs( ctx, 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.swtcl.vertex_attrs, 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.swtcl.vertex_attr_count, 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL, 0 ); 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.swtcl.vertex_size /= 4; 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.tnl_index_bitset = index_bitset; 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200_predict_emit_size( r200ContextPtr rmesa ) 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (RADEON_DEBUG & RADEON_VERTS) 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "%s\n", __func__); 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int vertex_array_size = 7; 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int prim_size = 3; 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!rmesa->radeon.swtcl.emit_prediction) { 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int state_size = radeonCountStateEmitSize(&rmesa->radeon); 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rcommonEnsureCmdBufSpace(&rmesa->radeon, 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state_size + 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vertex_array_size + prim_size, 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __FUNCTION__)) 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.swtcl.emit_prediction = radeonCountStateEmitSize(&rmesa->radeon); 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.swtcl.emit_prediction = state_size; 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.swtcl.emit_prediction += vertex_array_size + prim_size 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org + rmesa->radeon.cmdbuf.cs->cdw; 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200RenderStart( struct gl_context *ctx ) 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200SetVertexFormat( ctx ); 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (RADEON_DEBUG & RADEON_VERTS) 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "%s\n", __func__); 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set vertex state for SW TCL. The primary purpose of this function is to 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * determine in advance whether or not the hardware can / should do the 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * projection divide or Mesa should do it. 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r200ChooseVertexState( struct gl_context *ctx ) 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT( ctx ); 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TNLcontext *tnl = TNL_CONTEXT(ctx); 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint vte; 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint vap; 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* We must ensure that we don't do _tnl_need_projected_coords while in a 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * rasterization fallback. As this function will be called again when we 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * leave a rasterization fallback, we can just skip it for now. 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rmesa->radeon.Fallback != 0) 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vte = rmesa->hw.vte.cmd[VTE_SE_VTE_CNTL]; 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vap = rmesa->hw.vap.cmd[VAP_SE_VAP_CNTL]; 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* HW perspective divide is a win, but tiny vertex formats are a 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * bigger one. 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((0 == (tnl->render_inputs_bitset & BITFIELD64_RANGE(_TNL_ATTRIB_TEX0, _TNL_NUM_TEX))) 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || (ctx->_TriangleCaps & (DD_TRI_LIGHT_TWOSIDE|DD_TRI_UNFILLED))) { 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->swtcl.needproj = GL_TRUE; 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vte |= R200_VTX_XY_FMT | R200_VTX_Z_FMT; 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vte &= ~R200_VTX_W0_FMT; 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tnl->render_inputs_bitset & BITFIELD64_RANGE(_TNL_ATTRIB_TEX0, _TNL_NUM_TEX)) { 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vap &= ~R200_VAP_FORCE_W_TO_ONE; 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vap |= R200_VAP_FORCE_W_TO_ONE; 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->swtcl.needproj = GL_FALSE; 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vte &= ~(R200_VTX_XY_FMT | R200_VTX_Z_FMT); 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vte |= R200_VTX_W0_FMT; 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vap &= ~R200_VAP_FORCE_W_TO_ONE; 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _tnl_need_projected_coords( ctx, rmesa->swtcl.needproj ); 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vte != rmesa->hw.vte.cmd[VTE_SE_VTE_CNTL]) { 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, vte ); 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vte.cmd[VTE_SE_VTE_CNTL] = vte; 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vap != rmesa->hw.vap.cmd[VAP_SE_VAP_CNTL]) { 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, vap ); 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vap.cmd[VAP_SE_VAP_CNTL] = vap; 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r200_swtcl_flush(struct gl_context *ctx, uint32_t current_offset) 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (RADEON_DEBUG & RADEON_VERTS) 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "%s\n", __func__); 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeonEmitState(&rmesa->radeon); 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200EmitVertexAOS( rmesa, 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.swtcl.vertex_size, 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.swtcl.bo, 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org current_offset); 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200EmitVbufPrim( rmesa, 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.swtcl.hw_primitive, 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.swtcl.numverts); 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( rmesa->radeon.swtcl.emit_prediction < rmesa->radeon.cmdbuf.cs->cdw ) 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WARN_ONCE("Rendering was %d commands larger than predicted size." 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org " We might overflow command buffer.\n", 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.cmdbuf.cs->cdw - rmesa->radeon.swtcl.emit_prediction ); 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.swtcl.emit_prediction = 0; 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**************************************************************************/ 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE GLuint reduced_hw_prim( struct gl_context *ctx, GLuint prim) 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (prim) { 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_POINTS: 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ((!(ctx->_TriangleCaps & DD_POINT_SMOOTH)) ? 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_VF_PRIM_POINT_SPRITES : R200_VF_PRIM_POINTS); 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LINES: 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fallthrough */ 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LINE_LOOP: 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fallthrough */ 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LINE_STRIP: 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return R200_VF_PRIM_LINES; 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* all others reduced to triangles */ 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return R200_VF_PRIM_TRIANGLES; 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200RasterPrimitive( struct gl_context *ctx, GLuint hwprim ); 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200RenderPrimitive( struct gl_context *ctx, GLenum prim ); 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200ResetLineStipple( struct gl_context *ctx ); 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*********************************************************************** 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Emit primitives as inline vertices * 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ***********************************************************************/ 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define HAVE_POINTS 1 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define HAVE_LINES 1 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define HAVE_LINE_STRIPS 1 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define HAVE_TRIANGLES 1 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define HAVE_TRI_STRIPS 1 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define HAVE_TRI_STRIP_1 0 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define HAVE_TRI_FANS 1 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define HAVE_QUADS 0 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define HAVE_QUAD_STRIPS 0 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define HAVE_POLYGONS 1 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define HAVE_ELTS 0 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void* r200_alloc_verts( r200ContextPtr rmesa, GLuint n, GLuint size) 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *rv; 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org do { 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200_predict_emit_size( rmesa ); 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rv = rcommonAllocDmaLowVerts( &rmesa->radeon, n, size * 4 ); 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } while(!rv); 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return rv; 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef LOCAL_VARS 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef ALLOC_VERTS 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CTX_ARG r200ContextPtr rmesa 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GET_VERTEX_DWORDS() rmesa->radeon.swtcl.vertex_size 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ALLOC_VERTS( n, size ) r200_alloc_verts(rmesa, n, size) 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define LOCAL_VARS \ 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); \ 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *r200verts = (char *)rmesa->radeon.swtcl.verts; 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VERT(x) (radeonVertex *)(r200verts + ((x) * vertsize * sizeof(int))) 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VERTEX radeonVertex 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DO_DEBUG_VERTS (1 && (R200_DEBUG & RADEON_VERTS)) 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef TAG 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TAG(x) r200_##x 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl_dd/t_dd_triemit.h" 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*********************************************************************** 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Macros for t_dd_tritmp.h to draw basic primitives * 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ***********************************************************************/ 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define QUAD( a, b, c, d ) r200_quad( rmesa, a, b, c, d ) 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TRI( a, b, c ) r200_triangle( rmesa, a, b, c ) 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define LINE( a, b ) r200_line( rmesa, a, b ) 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define POINT( a ) r200_point( rmesa, a ) 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*********************************************************************** 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Build render functions from dd templates * 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ***********************************************************************/ 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define R200_TWOSIDE_BIT 0x01 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define R200_UNFILLED_BIT 0x02 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define R200_MAX_TRIFUNC 0x04 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct { 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl_points_func points; 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl_line_func line; 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl_triangle_func triangle; 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl_quad_func quad; 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} rast_tab[R200_MAX_TRIFUNC]; 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DO_FALLBACK 0 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DO_UNFILLED (IND & R200_UNFILLED_BIT) 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DO_TWOSIDE (IND & R200_TWOSIDE_BIT) 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DO_FLAT 0 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DO_OFFSET 0 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DO_TRI 1 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DO_QUAD 1 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DO_LINE 1 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DO_POINTS 1 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DO_FULL_QUAD 1 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define HAVE_SPEC 1 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define HAVE_BACK_COLORS 0 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define HAVE_HW_FLATSHADE 1 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TAB rast_tab 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DEPTH_SCALE 1.0 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UNFILLED_TRI unfilled_tri 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UNFILLED_QUAD unfilled_quad 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VERT_X(_v) _v->v.x 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VERT_Y(_v) _v->v.y 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VERT_Z(_v) _v->v.z 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define AREA_IS_CCW( a ) (a < 0) 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GET_VERTEX(e) (rmesa->radeon.swtcl.verts + (e*rmesa->radeon.swtcl.vertex_size*sizeof(int))) 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VERT_SET_RGBA( v, c ) \ 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo { \ 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_color_t *color = (radeon_color_t *)&((v)->ui[coloroffset]); \ 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_UBYTE(color->red, (c)[0]); \ 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_UBYTE(color->green, (c)[1]); \ 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_UBYTE(color->blue, (c)[2]); \ 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_UBYTE(color->alpha, (c)[3]); \ 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0) 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VERT_COPY_RGBA( v0, v1 ) v0->ui[coloroffset] = v1->ui[coloroffset] 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VERT_SET_SPEC( v, c ) \ 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo { \ 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (specoffset) { \ 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_color_t *spec = (radeon_color_t *)&((v)->ui[specoffset]); \ 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_UBYTE(spec->red, (c)[0]); \ 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_UBYTE(spec->green, (c)[1]); \ 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_UBYTE(spec->blue, (c)[2]); \ 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0) 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VERT_COPY_SPEC( v0, v1 ) \ 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo { \ 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (specoffset) { \ 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_color_t *spec0 = (radeon_color_t *)&((v0)->ui[specoffset]); \ 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_color_t *spec1 = (radeon_color_t *)&((v1)->ui[specoffset]); \ 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org spec0->red = spec1->red; \ 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org spec0->green = spec1->green; \ 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org spec0->blue = spec1->blue; \ 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0) 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* These don't need LE32_TO_CPU() as they used to save and restore 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * colors which are already in the correct format. 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VERT_SAVE_RGBA( idx ) color[idx] = v[idx]->ui[coloroffset] 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VERT_RESTORE_RGBA( idx ) v[idx]->ui[coloroffset] = color[idx] 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VERT_SAVE_SPEC( idx ) if (specoffset) spec[idx] = v[idx]->ui[specoffset] 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VERT_RESTORE_SPEC( idx ) if (specoffset) v[idx]->ui[specoffset] = spec[idx] 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef LOCAL_VARS 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef TAG 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef INIT 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define LOCAL_VARS(n) \ 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); \ 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint color[n] = {0}, spec[n] = {0}; \ 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint coloroffset = rmesa->swtcl.coloroffset; \ 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint specoffset = rmesa->swtcl.specoffset; \ 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) color; (void) spec; (void) coloroffset; (void) specoffset; 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*********************************************************************** 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Helpers for rendering unfilled primitives * 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ***********************************************************************/ 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RASTERIZE(x) r200RasterPrimitive( ctx, reduced_hw_prim(ctx, x) ) 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RENDER_PRIMITIVE rmesa->radeon.swtcl.render_primitive 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef TAG 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TAG(x) x 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl_dd/t_dd_unfilled.h" 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef IND 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*********************************************************************** 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Generate GL render functions * 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ***********************************************************************/ 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IND (0) 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TAG(x) x 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl_dd/t_dd_tritmp.h" 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IND (R200_TWOSIDE_BIT) 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TAG(x) x##_twoside 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl_dd/t_dd_tritmp.h" 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IND (R200_UNFILLED_BIT) 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TAG(x) x##_unfilled 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl_dd/t_dd_tritmp.h" 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IND (R200_TWOSIDE_BIT|R200_UNFILLED_BIT) 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TAG(x) x##_twoside_unfilled 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl_dd/t_dd_tritmp.h" 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void init_rast_tab( void ) 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org init(); 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org init_twoside(); 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org init_unfilled(); 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org init_twoside_unfilled(); 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Render unclipped begin/end objects */ 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RENDER_POINTS( start, count ) \ 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for ( ; start < count ; start++) \ 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200_point( rmesa, VERT(start) ) 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RENDER_LINE( v0, v1 ) \ 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200_line( rmesa, VERT(v0), VERT(v1) ) 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RENDER_TRI( v0, v1, v2 ) \ 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200_triangle( rmesa, VERT(v0), VERT(v1), VERT(v2) ) 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RENDER_QUAD( v0, v1, v2, v3 ) \ 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200_quad( rmesa, VERT(v0), VERT(v1), VERT(v2), VERT(v3) ) 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INIT(x) do { \ 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200RenderPrimitive( ctx, x ); \ 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0) 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef LOCAL_VARS 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define LOCAL_VARS \ 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); \ 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint vertsize = rmesa->radeon.swtcl.vertex_size; \ 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *r200verts = (char *)rmesa->radeon.swtcl.verts; \ 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint * const elt = TNL_CONTEXT(ctx)->vb.Elts; \ 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean stipple = ctx->Line.StippleFlag; \ 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) elt; (void) stipple; 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RESET_STIPPLE if ( stipple ) r200ResetLineStipple( ctx ); 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RESET_OCCLUSION 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define PRESERVE_VB_DEFS 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ELT(x) (x) 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TAG(x) r200_##x##_verts 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl/t_vb_rendertmp.h" 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef ELT 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef TAG 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TAG(x) r200_##x##_elts 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ELT(x) elt[x] 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl/t_vb_rendertmp.h" 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Choose render functions */ 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r200ChooseRenderState( struct gl_context *ctx ) 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TNLcontext *tnl = TNL_CONTEXT(ctx); 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint index = 0; 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint flags = ctx->_TriangleCaps; 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!rmesa->radeon.TclFallback || rmesa->radeon.Fallback) 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (flags & DD_TRI_LIGHT_TWOSIDE) index |= R200_TWOSIDE_BIT; 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (flags & DD_TRI_UNFILLED) index |= R200_UNFILLED_BIT; 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index != rmesa->radeon.swtcl.RenderIndex) { 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl->Driver.Render.Points = rast_tab[index].points; 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl->Driver.Render.Line = rast_tab[index].line; 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl->Driver.Render.ClippedLine = rast_tab[index].line; 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl->Driver.Render.Triangle = rast_tab[index].triangle; 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl->Driver.Render.Quad = rast_tab[index].quad; 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index == 0) { 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl->Driver.Render.PrimTabVerts = r200_render_tab_verts; 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl->Driver.Render.PrimTabElts = r200_render_tab_elts; 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl->Driver.Render.ClippedPolygon = r200_fast_clipped_poly; 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl->Driver.Render.PrimTabVerts = _tnl_render_tab_verts; 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl->Driver.Render.PrimTabElts = _tnl_render_tab_elts; 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl->Driver.Render.ClippedPolygon = _tnl_RenderClippedPolygon; 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.swtcl.RenderIndex = index; 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* High level hooks for t_vb_render.c */ 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200RasterPrimitive( struct gl_context *ctx, GLuint hwprim ) 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_prepare_render(&rmesa->radeon); 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rmesa->radeon.NewGLState) 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ValidateState( ctx ); 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rmesa->radeon.swtcl.hw_primitive != hwprim) { 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* need to disable perspective-correct texturing for point sprites */ 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((hwprim & 0xf) == R200_VF_PRIM_POINT_SPRITES && ctx->Point.PointSprite) { 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rmesa->hw.set.cmd[SET_RE_CNTL] & R200_PERSPECTIVE_ENABLE) { 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, set ); 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.set.cmd[SET_RE_CNTL] &= ~R200_PERSPECTIVE_ENABLE; 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (!(rmesa->hw.set.cmd[SET_RE_CNTL] & R200_PERSPECTIVE_ENABLE)) { 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, set ); 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.set.cmd[SET_RE_CNTL] |= R200_PERSPECTIVE_ENABLE; 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_NEWPRIM( rmesa ); 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.swtcl.hw_primitive = hwprim; 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200RenderPrimitive( struct gl_context *ctx, GLenum prim ) 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.swtcl.render_primitive = prim; 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (prim < GL_TRIANGLES || !(ctx->_TriangleCaps & DD_TRI_UNFILLED)) 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200RasterPrimitive( ctx, reduced_hw_prim(ctx, prim) ); 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200RenderFinish( struct gl_context *ctx ) 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200ResetLineStipple( struct gl_context *ctx ) 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, lin ); 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Transition to/from hardware rasterization. */ 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char * const fallbackStrings[] = { 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "Texture mode", 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glDrawBuffer(GL_FRONT_AND_BACK)", 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glEnable(GL_STENCIL) without hw stencil buffer", 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glRenderMode(selection or feedback)", 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "R200_NO_RAST", 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "Mixing GL_CLAMP_TO_BORDER and GL_CLAMP (or GL_MIRROR_CLAMP_ATI)" 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char *getFallbackString(GLuint bit) 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i = 0; 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (bit > 1) { 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i++; 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bit >>= 1; 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return fallbackStrings[i]; 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r200Fallback( struct gl_context *ctx, GLuint bit, GLboolean mode ) 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TNLcontext *tnl = TNL_CONTEXT(ctx); 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint oldfallback = rmesa->radeon.Fallback; 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mode) { 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.Fallback |= bit; 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (oldfallback == 0) { 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_firevertices(&rmesa->radeon); 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TCL_FALLBACK( ctx, R200_TCL_FALLBACK_RASTER, GL_TRUE ); 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swsetup_Wakeup( ctx ); 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.swtcl.RenderIndex = ~0; 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (R200_DEBUG & RADEON_FALLBACKS) { 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "R200 begin rasterization fallback: 0x%x %s\n", 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bit, getFallbackString(bit)); 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.Fallback &= ~bit; 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (oldfallback == bit) { 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swrast_flush( ctx ); 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl->Driver.Render.Start = r200RenderStart; 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl->Driver.Render.PrimitiveNotify = r200RenderPrimitive; 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl->Driver.Render.Finish = r200RenderFinish; 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl->Driver.Render.BuildVertices = _tnl_build_vertices; 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl->Driver.Render.CopyPV = _tnl_copy_pv; 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl->Driver.Render.Interp = _tnl_interp; 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl->Driver.Render.ResetLineStipple = r200ResetLineStipple; 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TCL_FALLBACK( ctx, R200_TCL_FALLBACK_RASTER, GL_FALSE ); 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rmesa->radeon.TclFallback) { 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* These are already done if rmesa->radeon.TclFallback goes to 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * zero above. But not if it doesn't (R200_NO_TCL for 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * example?) 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _tnl_invalidate_vertex_state( ctx, ~0 ); 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _tnl_invalidate_vertices( ctx, ~0 ); 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.tnl_index_bitset = 0; 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ChooseVertexState( ctx ); 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ChooseRenderState( ctx ); 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (R200_DEBUG & RADEON_FALLBACKS) { 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "R200 end rasterization fallback: 0x%x %s\n", 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bit, getFallbackString(bit)); 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Cope with depth operations by drawing individual pixels as points. 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \todo 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The way the vertex state is set in this routine is hokey. It seems to 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * work, but it's very hackish. This whole routine is pretty hackish. If 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the bitmap is small enough, it seems like it would be faster to copy it 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to AGP memory and use it as a non-power-of-two texture (i.e., 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * NV_texture_rectangle). 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgr200PointsBitmap( struct gl_context *ctx, GLint px, GLint py, 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei width, GLsizei height, 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_pixelstore_attrib *unpack, 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *bitmap ) 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *rc = ctx->Current.RasterColor; 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint row, col; 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeonVertex vert; 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint orig_vte; 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint h; 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Turn off tcl. 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TCL_FALLBACK( ctx, R200_TCL_FALLBACK_BITMAP, 1 ); 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Choose tiny vertex format 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint fmt_0 = R200_VTX_XY | R200_VTX_Z0 | R200_VTX_W0 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (R200_VTX_PK_RGBA << R200_VTX_COLOR_0_SHIFT); 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint fmt_1 = 0; 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint vte = rmesa->hw.vte.cmd[VTE_SE_VTE_CNTL]; 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint vap = rmesa->hw.vap.cmd[VAP_SE_VAP_CNTL]; 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vte &= ~(R200_VTX_XY_FMT | R200_VTX_Z_FMT); 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vte |= R200_VTX_W0_FMT; 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vap &= ~R200_VAP_FORCE_W_TO_ONE; 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.swtcl.vertex_size = 5; 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( (rmesa->hw.vtx.cmd[VTX_VTXFMT_0] != fmt_0) 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || (rmesa->hw.vtx.cmd[VTX_VTXFMT_1] != fmt_1) ) { 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_NEWPRIM(rmesa); 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, vtx ); 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vtx.cmd[VTX_VTXFMT_0] = fmt_0; 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vtx.cmd[VTX_VTXFMT_1] = fmt_1; 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vte != rmesa->hw.vte.cmd[VTE_SE_VTE_CNTL]) { 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, vte ); 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vte.cmd[VTE_SE_VTE_CNTL] = vte; 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vap != rmesa->hw.vap.cmd[VAP_SE_VAP_CNTL]) { 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, vap ); 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vap.cmd[VAP_SE_VAP_CNTL] = vap; 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Ready for point primitives: 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200RenderPrimitive( ctx, GL_POINTS ); 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Turn off the hw viewport transformation: 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, vte ); 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org orig_vte = rmesa->hw.vte.cmd[VTE_SE_VTE_CNTL]; 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vte.cmd[VTE_SE_VTE_CNTL] &= ~(R200_VPORT_X_SCALE_ENA | 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_VPORT_Y_SCALE_ENA | 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_VPORT_Z_SCALE_ENA | 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_VPORT_X_OFFSET_ENA | 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_VPORT_Y_OFFSET_ENA | 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_VPORT_Z_OFFSET_ENA); 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Turn off other stuff: Stipple?, texture?, blending?, etc. 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Populate the vertex 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Incorporate FOG into RGBA 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Fog.Enabled) { 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *fc = ctx->Fog.Color; 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat color[4]; 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat f; 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Fog.FogCoordinateSource == GL_FOG_COORDINATE_EXT) 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org f = _swrast_z_to_fogfactor(ctx, ctx->Current.Attrib[VERT_ATTRIB_FOG][0]); 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org f = _swrast_z_to_fogfactor(ctx, ctx->Current.RasterDistance); 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org color[0] = f * rc[0] + (1.F - f) * fc[0]; 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org color[1] = f * rc[1] + (1.F - f) * fc[1]; 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org color[2] = f * rc[2] + (1.F - f) * fc[2]; 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org color[3] = rc[3]; 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_CHAN(vert.tv.color.red, color[0]); 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_CHAN(vert.tv.color.green, color[1]); 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_CHAN(vert.tv.color.blue, color[2]); 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_CHAN(vert.tv.color.alpha, color[3]); 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_CHAN(vert.tv.color.red, rc[0]); 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_CHAN(vert.tv.color.green, rc[1]); 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_CHAN(vert.tv.color.blue, rc[2]); 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_CHAN(vert.tv.color.alpha, rc[3]); 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vert.tv.z = ctx->Current.RasterPos[2]; 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Update window height 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org h = radeon_get_drawable(&rmesa->radeon)->h; 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Clipping handled by existing mechansims in r200_ioctl.c? 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row=0; row<height; row++) { 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *src = (const GLubyte *) 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_image_address2d(unpack, bitmap, width, height, 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_COLOR_INDEX, GL_BITMAP, row, 0 ); 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unpack->LsbFirst) { 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Lsb first */ 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte mask = 1U << (unpack->SkipPixels & 0x7); 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col=0; col<width; col++) { 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*src & mask) { 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vert.tv.x = px+col; 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vert.tv.y = h - (py+row) - 1; 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200_point( rmesa, &vert ); 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += (mask >> 7); 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask = ((mask << 1) & 0xff) | (mask >> 7); 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* get ready for next row */ 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask != 1) 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src++; 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Msb first */ 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte mask = 128U >> (unpack->SkipPixels & 0x7); 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col=0; col<width; col++) { 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*src & mask) { 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vert.tv.x = px+col; 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vert.tv.y = h - (py+row) - 1; 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200_point( rmesa, &vert ); 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += mask & 1; 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask = ((mask << 7) & 0xff) | (mask >> 1); 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* get ready for next row */ 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask != 128) 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src++; 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Fire outstanding vertices, restore state 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R200_STATECHANGE( rmesa, vte ); 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->hw.vte.cmd[VTE_SE_VTE_CNTL] = orig_vte; 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Unfallback 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TCL_FALLBACK( ctx, R200_TCL_FALLBACK_BITMAP, 0 ); 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Need to restore vertexformat? 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rmesa->radeon.TclFallback) 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ChooseVertexState( ctx ); 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Initialization. */ 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r200InitSwtcl( struct gl_context *ctx ) 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TNLcontext *tnl = TNL_CONTEXT(ctx); 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r200ContextPtr rmesa = R200_CONTEXT(ctx); 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static int firsttime = 1; 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (firsttime) { 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org init_rast_tab(); 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org firsttime = 0; 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.swtcl.emit_prediction = 0; 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl->Driver.Render.Start = r200RenderStart; 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl->Driver.Render.Finish = r200RenderFinish; 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl->Driver.Render.PrimitiveNotify = r200RenderPrimitive; 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl->Driver.Render.ResetLineStipple = r200ResetLineStipple; 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl->Driver.Render.BuildVertices = _tnl_build_vertices; 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl->Driver.Render.CopyPV = _tnl_copy_pv; 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl->Driver.Render.Interp = _tnl_interp; 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* FIXME: what are these numbers? */ 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _tnl_init_vertices( ctx, ctx->Const.MaxArrayLockSize + 12, 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 36 * sizeof(GLfloat) ); 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.swtcl.verts = (GLubyte *)tnl->clipspace.vertex_buf; 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.swtcl.RenderIndex = ~0; 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.swtcl.render_primitive = GL_TRIANGLES; 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmesa->radeon.swtcl.hw_primitive = 0; 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 947