r300->hw.vps.cmd[R300_VPS_CMD_0] = cmdvpu(R300_PVS_UPLOAD_POINTSIZE, 1);
/* Textures */
- ALLOC_STATE( tex.filter, always, mtu, "tex_filter", 0 );
- r300->hw.tex.filter.cmd[R300_TEX_CMD_0] = cmducs(R300_TX_FILTER_0, mtu-1);
+ ALLOC_STATE( tex.filter, variable, mtu+1, "tex_filter", 0 );
+ r300->hw.tex.filter.cmd[R300_TEX_CMD_0] = cmducs(R300_TX_FILTER_0, 0);
- ALLOC_STATE( tex.unknown1, always, mtu, "tex_unknown1", 0 );
- r300->hw.tex.unknown1.cmd[R300_TEX_CMD_0] = cmducs(R300_TX_UNK1_0, mtu-1);
+ ALLOC_STATE( tex.unknown1, variable, mtu+1, "tex_unknown1", 0 );
+ r300->hw.tex.unknown1.cmd[R300_TEX_CMD_0] = cmducs(R300_TX_UNK1_0, 0);
- ALLOC_STATE( tex.size, always, mtu, "tex_size", 0 );
- r300->hw.tex.size.cmd[R300_TEX_CMD_0] = cmducs(R300_TX_SIZE_0, mtu-1);
+ ALLOC_STATE( tex.size, variable, mtu+1, "tex_size", 0 );
+ r300->hw.tex.size.cmd[R300_TEX_CMD_0] = cmducs(R300_TX_SIZE_0, 0);
- ALLOC_STATE( tex.format, always, mtu, "tex_format", 0 );
- r300->hw.tex.format.cmd[R300_TEX_CMD_0] = cmducs(R300_TX_FORMAT_0, mtu-1);
+ ALLOC_STATE( tex.format, variable, mtu+1, "tex_format", 0 );
+ r300->hw.tex.format.cmd[R300_TEX_CMD_0] = cmducs(R300_TX_FORMAT_0, 0);
- ALLOC_STATE( tex.offset, always, mtu, "tex_offset", 0 );
- r300->hw.tex.offset.cmd[R300_TEX_CMD_0] = cmducs(R300_TX_OFFSET_0, mtu-1);
+ ALLOC_STATE( tex.offset, variable, mtu+1, "tex_offset", 0 );
+ r300->hw.tex.offset.cmd[R300_TEX_CMD_0] = cmducs(R300_TX_OFFSET_0, 0);
- ALLOC_STATE( tex.unknown4, always, mtu, "tex_unknown4", 0 );
- r300->hw.tex.unknown4.cmd[R300_TEX_CMD_0] = cmducs(R300_TX_UNK4_0, mtu-1);
+ ALLOC_STATE( tex.unknown4, variable, mtu+1, "tex_unknown4", 0 );
+ r300->hw.tex.unknown4.cmd[R300_TEX_CMD_0] = cmducs(R300_TX_UNK4_0, 0);
- ALLOC_STATE( tex.unknown5, always, mtu, "tex_unknown5", 0 );
- r300->hw.tex.unknown5.cmd[R300_TEX_CMD_0] = cmducs(R300_TX_UNK5_0, mtu-1);
+ ALLOC_STATE( tex.unknown5, variable, mtu+1, "tex_unknown5", 0 );
+ r300->hw.tex.unknown5.cmd[R300_TEX_CMD_0] = cmducs(R300_TX_UNK5_0, 0);
/* Setup the atom linked list */
assert(h < (1 << 16));
cmd =
- (drm_radeon_cmd_header_t *) r200AllocCmdBuf(rmesa, 8 * sizeof(int),
+ (drm_radeon_cmd_header_t *) r300AllocCmdBuf(rmesa, 8 * sizeof(int),
__FUNCTION__);
cmd[0].header.cmd_type = RADEON_CMD_PACKET3;
assert(!(flags & ~(RADEON_WAIT_2D | RADEON_WAIT_3D)));
cmd =
- (drm_radeon_cmd_header_t *) r200AllocCmdBuf(rmesa,
+ (drm_radeon_cmd_header_t *) r300AllocCmdBuf(rmesa,
1 * sizeof(int),
__FUNCTION__);
cmd[0].i = 0;
return ptr;
}
+extern void r300EmitBlit(r300ContextPtr rmesa,
+ GLuint color_fmt,
+ GLuint src_pitch,
+ GLuint src_offset,
+ GLuint dst_pitch,
+ GLuint dst_offset,
+ GLint srcx, GLint srcy,
+ GLint dstx, GLint dsty, GLuint w, GLuint h);
+
+extern void r300EmitWait(r300ContextPtr rmesa, GLuint flags);
+extern void r300EmitLOAD_VBPNTR(r300ContextPtr rmesa, int start);
+extern void r300EmitVertexShader(r300ContextPtr rmesa);
+extern void r300EmitPixelShader(r300ContextPtr rmesa);
#endif /* __R300_CMDBUF_H__ */
GLenum envMode;
};
-#define R300_MAX_TEXTURE_UNITS 6
+#define R300_MAX_TEXTURE_UNITS 8
struct r300_texture_state {
struct r300_texture_env_state unit[R300_MAX_TEXTURE_UNITS];
+ int tc_count; /* number of incoming texture coordinates from VAP */
};
/**
cboffset += r300->radeon.radeonScreen->fbLocation;
+ R300_STATECHANGE(r300, vir[0]);
+ ((drm_r300_cmd_header_t*)r300->hw.vir[0].cmd)->unchecked_state.count = 1;
+ r300->hw.vir[0].cmd[1] = 0x21030003;
+
+ R300_STATECHANGE(r300, vir[1]);
+ ((drm_r300_cmd_header_t*)r300->hw.vir[1].cmd)->unchecked_state.count = 1;
+ r300->hw.vir[1].cmd[1] = 0xF688F688;
+
+ R300_STATECHANGE(r300, vic);
+ r300->hw.vic.cmd[R300_VIR_CNTL_0] = 0x00000001;
+ r300->hw.vic.cmd[R300_VIR_CNTL_1] = 0x00000405;
+
+ R300_STATECHANGE(r300, vof);
+ r300->hw.vof.cmd[R300_VOF_CNTL_0] = R300_VAP_OUTPUT_VTX_FMT_0__POS_PRESENT
+ | R300_VAP_OUTPUT_VTX_FMT_0__COLOR_PRESENT;
+ r300->hw.vof.cmd[R300_VOF_CNTL_1] = 0; /* no textures */
+
+ R300_STATECHANGE(r300, txe);
+ r300->hw.txe.cmd[R300_TXE_ENABLE] = 0;
+
R300_STATECHANGE(r300, vpt);
r300->hw.vpt.cmd[R300_VPT_XSCALE] = r300PackFloat32(1.0);
r300->hw.vpt.cmd[R300_VPT_XOFFSET] = r300PackFloat32(dPriv->x);
for(i = 1; i <= 8; ++i)
r300->hw.ri.cmd[i] = R300_RS_INTERP_USED;
+ R300_STATECHANGE(r300, rc);
+ /* The second constant is needed to get glxgears display anything .. */
+ r300->hw.rc.cmd[1] = R300_RS_CNTL_0_UNKNOWN_7 | R300_RS_CNTL_0_UNKNOWN_18;
+ r300->hw.rc.cmd[2] = 0;
+
R300_STATECHANGE(r300, rr);
((drm_r300_cmd_header_t*)r300->hw.rr.cmd)->unchecked_state.count = 1;
r300->hw.rr.cmd[1] = 0x00004000;
const GLvoid * pointer);
extern void r300Flush(GLcontext * ctx);
+
+extern void r300RefillCurrentDmaRegion(r300ContextPtr rmesa);
+extern void r300ReleaseDmaRegion(r300ContextPtr rmesa,
+ struct r300_dma_region *region, const char *caller);
+extern void r300AllocDmaRegion(r300ContextPtr rmesa,
+ struct r300_dma_region *region,
+ int bytes, int alignment);
+
extern void r300InitIoctlFuncs(struct dd_function_table *functions);
#endif /* __R300_IOCTL_H__ */
#include "array_cache/acache.h"
#include "tnl/tnl.h"
+#include "radeon_reg.h"
+#include "radeon_macros.h"
#include "radeon_ioctl.h"
#include "radeon_state.h"
#include "r300_context.h"
#include "r300_state.h"
#include "r300_reg.h"
#include "r300_program.h"
+#include "r300_tex.h"
#include "r300_lib.h"
-static void inline r300_setup_routing(r300ContextPtr r300, GLcontext *ctx, GLboolean immediate)
-{
-int i, count=0,reg=0;
-GLuint dw, mask;
-TNLcontext *tnl = TNL_CONTEXT(ctx);
-struct vertex_buffer *VB = &tnl->vb;
-
-
-/* Stage 1 - input to VAP */
-
-/* Assign register number automatically, retaining it in rmesa->state.reg */
-
- /* Note: immediate vertex data includes all coordinates.
- To save bandwidth use either VBUF or state-based vertex generation */
-
-#define CONFIGURE_AOS(v, o, r, f) \
- {\
- if(immediate){ \
- r300->state.aos[count].element_size=4; \
- r300->state.aos[count].stride=4; \
- r300->state.aos[count].ncomponents=4; \
- } else { \
- r300->state.aos[count].element_size=v->size; \
- r300->state.aos[count].stride=v->size; \
- r300->state.aos[count].ncomponents=v->size; \
- } \
- r300->state.aos[count].offset=o; \
- r300->state.aos[count].reg=reg; \
- r300->state.aos[count].format=(f); \
- r300->state.vap_reg.r=reg; \
- count++; \
- reg++; \
- }
-
- /* All offsets are 0 - for use by immediate mode.
- Should change later to handle vertex buffers */
-CONFIGURE_AOS(VB->ObjPtr, 0, i_coords, AOS_FORMAT_FLOAT);
-CONFIGURE_AOS(VB->ColorPtr[0], 0, i_color[0], AOS_FORMAT_FLOAT_COLOR);
-for(i=0;i < ctx->Const.MaxTextureUnits;i++)
- if(ctx->Texture.Unit[i].Enabled)
- CONFIGURE_AOS(VB->TexCoordPtr[i], 0, i_tex[i], AOS_FORMAT_FLOAT);
-
-r300->state.aos_count=count;
-
-if(count>R300_MAX_AOS_ARRAYS){
- fprintf(stderr, "Aieee ! AOS array count exceeded !\n");
- exit(-1);
- }
-
-/* Implement AOS */
-
-
-/* setup INPUT_ROUTE */
-
-R300_STATECHANGE(r300, vir[0]);
-for(i=0;i+1<count;i+=2){
- dw=(r300->state.aos[i].ncomponents-1)
- | ((r300->state.aos[i].reg)<<8)
- | (r300->state.aos[i].format<<14)
- | (((r300->state.aos[i+1].ncomponents-1)
- | ((r300->state.aos[i+1].reg)<<8)
- | (r300->state.aos[i+1].format<<14))<<16);
-
- if(i+2==count){
- dw|=(1<<(13+16));
- }
- r300->hw.vir[0].cmd[R300_VIR_CNTL_0+(i>>1)]=dw;
- }
-if(count & 1){
- dw=(r300->state.aos[count-1].ncomponents-1)
- | (r300->state.aos[count-1].format<<14)
- | ((r300->state.aos[count-1].reg)<<8)
- | (1<<13);
- r300->hw.vir[0].cmd[R300_VIR_CNTL_0+(count>>1)]=dw;
- }
-/* Set the rest of INPUT_ROUTE_0 to 0 */
-for(i=((count+1)>>1); i<8; i++)r300->hw.vir[0].cmd[R300_VIR_CNTL_0+i]=(0x0);
-
-/* Mesa assumes that all missing components are from (0, 0, 0, 1) */
-#define ALL_COMPONENTS ((R300_INPUT_ROUTE_SELECT_X<<R300_INPUT_ROUTE_X_SHIFT) \
- | (R300_INPUT_ROUTE_SELECT_Y<<R300_INPUT_ROUTE_Y_SHIFT) \
- | (R300_INPUT_ROUTE_SELECT_Z<<R300_INPUT_ROUTE_Z_SHIFT) \
- | (R300_INPUT_ROUTE_SELECT_W<<R300_INPUT_ROUTE_W_SHIFT))
-
-#define ALL_DEFAULT ((R300_INPUT_ROUTE_SELECT_ZERO<<R300_INPUT_ROUTE_X_SHIFT) \
- | (R300_INPUT_ROUTE_SELECT_ZERO<<R300_INPUT_ROUTE_Y_SHIFT) \
- | (R300_INPUT_ROUTE_SELECT_ZERO<<R300_INPUT_ROUTE_Z_SHIFT) \
- | (R300_INPUT_ROUTE_SELECT_ONE<<R300_INPUT_ROUTE_W_SHIFT))
-
-R300_STATECHANGE(r300, vir[1]);
-
-for(i=0;i+1<count;i+=2){
- /* do i first.. */
- mask=(1<<(r300->state.aos[i].ncomponents*3))-1;
- dw=(ALL_COMPONENTS & mask)
- | (ALL_DEFAULT & ~mask)
- | R300_INPUT_ROUTE_ENABLE;
-
- /* i+1 */
- mask=(1<<(r300->state.aos[i+1].ncomponents*3))-1;
- dw|=(
- (ALL_COMPONENTS & mask)
- | (ALL_DEFAULT & ~mask)
- | R300_INPUT_ROUTE_ENABLE
- )<<16;
-
- r300->hw.vir[1].cmd[R300_VIR_CNTL_0+(i>>1)]=dw;
- }
-if(count & 1){
- mask=(1<<(r300->state.aos[count-1].ncomponents*3))-1;
- dw=(ALL_COMPONENTS & mask)
- | (ALL_DEFAULT & ~mask)
- | R300_INPUT_ROUTE_ENABLE;
- r300->hw.vir[1].cmd[R300_VIR_CNTL_0+(count>>1)]=dw;
- }
-/* Set the rest of INPUT_ROUTE_1 to 0 */
-for(i=((count+1)>>1); i<8; i++)r300->hw.vir[1].cmd[R300_VIR_CNTL_0+i]=(0x0);
-
-/* Set up input_cntl */
-
-R300_STATECHANGE(r300, vic);
-r300->hw.vic.cmd[R300_VIC_CNTL_0]=0x5555; /* Hard coded value, no idea what it means */
-
-r300->hw.vic.cmd[R300_VIC_CNTL_1]=R300_INPUT_CNTL_POS
- | R300_INPUT_CNTL_COLOR;
-
-for(i=0;i < ctx->Const.MaxTextureUnits;i++)
- if(ctx->Texture.Unit[i].Enabled)
- r300->hw.vic.cmd[R300_VIC_CNTL_1]|=(R300_INPUT_CNTL_TC0<<i);
-
-/* Stage 3: VAP output */
-R300_STATECHANGE(r300, vof);
-r300->hw.vof.cmd[R300_VOF_CNTL_0]=R300_VAP_OUTPUT_VTX_FMT_0__POS_PRESENT
- | R300_VAP_OUTPUT_VTX_FMT_0__COLOR_PRESENT;
-
-r300->hw.vof.cmd[R300_VOF_CNTL_1]=0;
-for(i=0;i < ctx->Const.MaxTextureUnits;i++)
- if(ctx->Texture.Unit[i].Enabled)
- r300->hw.vof.cmd[R300_VOF_CNTL_1]|=(4<<(3*i));
-}
-
-static inline void r300_setup_textures(r300ContextPtr r300, GLcontext *ctx)
-{
-int i;
-struct r300_tex_obj *t;
-
-R300_STATECHANGE(r300, txe);
-R300_STATECHANGE(r300, tex.filter);
-R300_STATECHANGE(r300, tex.unknown1);
-R300_STATECHANGE(r300, tex.size);
-R300_STATECHANGE(r300, tex.format);
-R300_STATECHANGE(r300, tex.offset);
-R300_STATECHANGE(r300, tex.unknown4);
-R300_STATECHANGE(r300, tex.unknown5);
-
-r300->hw.txe.cmd[R300_TXE_ENABLE]=0x0;
-
-for(i=0;i<R300_MAX_TEXTURE_UNITS;i++){
- if((t=r300->state.texture.unit[i].texobj)!=NULL){
- r300->hw.txe.cmd[R300_TXE_ENABLE]|=(1<<i);
-
- r300->hw.tex.filter.cmd[R300_TEX_CMD_0+i]=t->filter;
- r300->hw.tex.unknown1.cmd[R300_TEX_CMD_0+i]=t->pitch;
- r300->hw.tex.size.cmd[R300_TEX_CMD_0+i]=t->size;
- r300->hw.tex.format.cmd[R300_TEX_CMD_0+i]=t->format;
- r300->hw.tex.offset.cmd[R300_TEX_CMD_0+i]=r300->radeon.radeonScreen->fbLocation+t->offset;
- r300->hw.tex.unknown4.cmd[R300_TEX_CMD_0+i]=0x0;
- r300->hw.tex.unknown5.cmd[R300_TEX_CMD_0+i]=0x0;
-
- /* We don't know how to set this yet */
- r300->hw.tex.format.cmd[R300_TEX_CMD_0+i]=0x88a0c;
- }
- }
-}
/* Immediate implementation - vertex data is sent via command stream */
| R300_VTX_W0_FMT;
R300_STATECHANGE(rmesa, vte);
- r300_setup_routing(rmesa, ctx, GL_TRUE);
- r300_setup_textures(rmesa, ctx);
+ // r300_setup_routing(rmesa, ctx, GL_TRUE);
+ // r300_setup_textures(rmesa, ctx);
r300EmitState(rmesa);
fire_AOS(PASS_PREFIX end-start, type);
}
-static VERTEX_SHADER_FRAGMENT default_vector_vsf={
- length: 4,
- body: {
- f: {0.0, 0.0, 0.0, 1.0}
- }
- };
-
static GLboolean r300_run_vb_flat_render(GLcontext *ctx,
struct tnl_pipeline_stage *stage)
{
type=r300_get_primitive_type(rmesa, ctx, start, end, prim);
- #if 1
+ #if 0
fprintf(stderr,"ObjPtr: size=%d stride=%d\n",
VB->ObjPtr->size, VB->ObjPtr->stride);
fprintf(stderr,"ColorPtr[0]: size=%d stride=%d\n",
/* Update texture state - needs to be done only when actually changed..
All the time for now.. */
- r300UpdateTextureState(ctx);
-
- r300_setup_routing(rmesa, ctx, GL_TRUE);
- r300_setup_textures(rmesa, ctx);
- exit(-1);
-
/* Flush state - make sure command buffer is nice and large */
r300Flush(ctx);
-
- //fprintf(stderr, "You can enable texture drawing in %s:%s \n", __FILE__, __FUNCTION__);
- //return GL_TRUE;
if (RADEON_DEBUG == DEBUG_PRIMS)
R300_STATECHANGE(rmesa, vte);
r300EmitState(rmesa);
+// r300Flush(ctx);
+
+ assign_pipeline(rmesa, &SINGLE_TEXTURE_PIPELINE);
- SINGLE_TEXTURE_PIPELINE.vertex_shader.matrix[0].length=16;
- memcpy(SINGLE_TEXTURE_PIPELINE.vertex_shader.matrix[0].body.f, ctx->_ModelProjectMatrix.m, 16*4);
-
- SINGLE_TEXTURE_PIPELINE.vertex_shader.unknown2.length=4;
- SINGLE_TEXTURE_PIPELINE.vertex_shader.unknown2.body.f[0]=0.0;
- SINGLE_TEXTURE_PIPELINE.vertex_shader.unknown2.body.f[1]=0.0;
- SINGLE_TEXTURE_PIPELINE.vertex_shader.unknown2.body.f[2]=1.0;
- SINGLE_TEXTURE_PIPELINE.vertex_shader.unknown2.body.f[3]=0.0;
-
- /* Use actual texture offset */
-
- fprintf(stderr,"pp_border_color=%08x pp_cubic_faces=%08x format=%08x size=%08x format_x=%08x\n",
- t->pp_border_color, t->pp_cubic_faces, t->format, t->size, t->format_x);
-
- SINGLE_TEXTURE_PIPELINE.texture_unit[0].offset=rmesa->radeon.radeonScreen->fbLocation+t->offset;
- #if 0
- SINGLE_TEXTURE_PIPELINE.texture_unit[0].format=t->format;
- #endif
- SINGLE_TEXTURE_PIPELINE.texture_unit[0].size=t->size;
- SINGLE_TEXTURE_PIPELINE.texture_unit[0].filter=t->filter;
- SINGLE_TEXTURE_PIPELINE.texture_unit[0].unknown1=t->pitch; /* Unknown 1 is pitch ! */
- SINGLE_TEXTURE_PIPELINE.texture_unit[0].filter=t->filter;
-
-
- /* Program RS unit. This needs to be moved into R300 pipeline */
-reg_start(R300_RS_CNTL_0,1);
- /* R300_RS_CNTL_0(4300) */
- e32(0x00040084);
- /* RS_INST_COUNT(4304) */
- e32(0x000000c0);
-
-reg_start(R300_RS_ROUTE_0,0);
- e32(0x00024008);
-
-reg_start(R300_RS_INTERP_0,7);
- /* X_MEM0_0(4310) */
- e32(0x00d10000);
- /* X_MEM0_1(4314) */
- e32(0x00d10044);
- /* X_MEM0_2(4318) */
- e32(0x00d10084);
- /* X_MEM0_3(431c) */
- e32(0x00d100c4);
- /* X_MEM0_4(4320) */
- e32(0x00d10004);
- /* X_MEM0_5(4324) */
- e32(0x00d10004);
- /* X_MEM0_6(4328) */
- e32(0x00d10004);
- /* X_MEM0_7(432c) */
- e32(0x00d10004);
-
- reg_start(R300_RS_CNTL_0,0);
- e32(0x00040084);
+ rmesa->state.vertex_shader.matrix[0].length=16;
+ memcpy(rmesa->state.vertex_shader.matrix[0].body.f, ctx->_ModelProjectMatrix.m, 16*4);
+ rmesa->state.vertex_shader.unknown2.length=4;
+ rmesa->state.vertex_shader.unknown2.body.f[0]=0.0;
+ rmesa->state.vertex_shader.unknown2.body.f[1]=0.0;
+ rmesa->state.vertex_shader.unknown2.body.f[2]=1.0;
+ rmesa->state.vertex_shader.unknown2.body.f[3]=0.0;
+
/* Magic register - note it is right after 20b0 */
reg_start(0x20b4,0);
e32(0x0000000c);
- program_pipeline(PASS_PREFIX &SINGLE_TEXTURE_PIPELINE);
-
+// program_pipeline(PASS_PREFIX &SINGLE_TEXTURE_PIPELINE);
+
+ r300EmitVertexShader(rmesa);
+ r300EmitPixelShader(rmesa);
+
/* We need LOAD_VBPNTR to setup AOS_ATTR fields.. the offsets are irrelevant */
r300EmitLOAD_VBPNTR(rmesa, 0);
reg_start(0x4f18,0);
e32(0x00000003);
-// exit(-1);
fprintf(stderr, "\n");
+ //exit(-1);
return GL_FALSE;
}
r300UpdateWindow(ctx);
}
+/* Routing and texture-related */
+
+void r300_setup_routing(GLcontext *ctx, GLboolean immediate)
+{
+ int i, count=0,reg=0;
+ GLuint dw, mask;
+ TNLcontext *tnl = TNL_CONTEXT(ctx);
+ struct vertex_buffer *VB = &tnl->vb;
+ r300ContextPtr r300 = R300_CONTEXT(ctx);
+
+
+ /* Stage 1 - input to VAP */
+
+ /* Assign register number automatically, retaining it in rmesa->state.reg */
+
+ /* Note: immediate vertex data includes all coordinates.
+ To save bandwidth use either VBUF or state-based vertex generation */
+
+ #define CONFIGURE_AOS(v, o, r, f) \
+ {\
+ if(immediate){ \
+ r300->state.aos[count].element_size=4; \
+ r300->state.aos[count].stride=4; \
+ r300->state.aos[count].ncomponents=4; \
+ } else { \
+ r300->state.aos[count].element_size=v->size; \
+ r300->state.aos[count].stride=v->size; \
+ r300->state.aos[count].ncomponents=v->size; \
+ } \
+ r300->state.aos[count].offset=o; \
+ r300->state.aos[count].reg=reg; \
+ r300->state.aos[count].format=(f); \
+ r300->state.vap_reg.r=reg; \
+ count++; \
+ reg++; \
+ }
+
+ /* All offsets are 0 - for use by immediate mode.
+ Should change later to handle vertex buffers */
+ CONFIGURE_AOS(VB->ObjPtr, 0, i_coords, AOS_FORMAT_FLOAT);
+ CONFIGURE_AOS(VB->ColorPtr[0], 0, i_color[0], AOS_FORMAT_FLOAT_COLOR);
+ for(i=0;i < ctx->Const.MaxTextureUnits;i++)
+ if(ctx->Texture.Unit[i].Enabled)
+ CONFIGURE_AOS(VB->TexCoordPtr[i], 0, i_tex[i], AOS_FORMAT_FLOAT);
+
+ r300->state.aos_count=count;
+
+ if (RADEON_DEBUG & DEBUG_STATE)
+ fprintf(stderr, "aos_count=%d\n", count);
+
+ if(count>R300_MAX_AOS_ARRAYS){
+ fprintf(stderr, "Aieee ! AOS array count exceeded !\n");
+ exit(-1);
+ }
+
+ /* Implement AOS */
+
+ /* setup INPUT_ROUTE */
+ R300_STATECHANGE(r300, vir[0]);
+ for(i=0;i+1<count;i+=2){
+ dw=(r300->state.aos[i].ncomponents-1)
+ | ((r300->state.aos[i].reg)<<8)
+ | (r300->state.aos[i].format<<14)
+ | (((r300->state.aos[i+1].ncomponents-1)
+ | ((r300->state.aos[i+1].reg)<<8)
+ | (r300->state.aos[i+1].format<<14))<<16);
+
+ if(i+2==count){
+ dw|=(1<<(13+16));
+ }
+ r300->hw.vir[0].cmd[R300_VIR_CNTL_0+(i>>1)]=dw;
+ }
+ if(count & 1){
+ dw=(r300->state.aos[count-1].ncomponents-1)
+ | (r300->state.aos[count-1].format<<14)
+ | ((r300->state.aos[count-1].reg)<<8)
+ | (1<<13);
+ r300->hw.vir[0].cmd[R300_VIR_CNTL_0+(count>>1)]=dw;
+ //fprintf(stderr, "vir0 dw=%08x\n", dw);
+ }
+ /* Set the rest of INPUT_ROUTE_0 to 0 */
+ //for(i=((count+1)>>1); i<8; i++)r300->hw.vir[0].cmd[R300_VIR_CNTL_0+i]=(0x0);
+ ((drm_r300_cmd_header_t*)r300->hw.vir[0].cmd)->unchecked_state.count = (count+1)>>1;
+
+
+ /* Mesa assumes that all missing components are from (0, 0, 0, 1) */
+ #define ALL_COMPONENTS ((R300_INPUT_ROUTE_SELECT_X<<R300_INPUT_ROUTE_X_SHIFT) \
+ | (R300_INPUT_ROUTE_SELECT_Y<<R300_INPUT_ROUTE_Y_SHIFT) \
+ | (R300_INPUT_ROUTE_SELECT_Z<<R300_INPUT_ROUTE_Z_SHIFT) \
+ | (R300_INPUT_ROUTE_SELECT_W<<R300_INPUT_ROUTE_W_SHIFT))
+
+ #define ALL_DEFAULT ((R300_INPUT_ROUTE_SELECT_ZERO<<R300_INPUT_ROUTE_X_SHIFT) \
+ | (R300_INPUT_ROUTE_SELECT_ZERO<<R300_INPUT_ROUTE_Y_SHIFT) \
+ | (R300_INPUT_ROUTE_SELECT_ZERO<<R300_INPUT_ROUTE_Z_SHIFT) \
+ | (R300_INPUT_ROUTE_SELECT_ONE<<R300_INPUT_ROUTE_W_SHIFT))
+
+ R300_STATECHANGE(r300, vir[1]);
+
+ for(i=0;i+1<count;i+=2){
+ /* do i first.. */
+ mask=(1<<(r300->state.aos[i].ncomponents*3))-1;
+ dw=(ALL_COMPONENTS & mask)
+ | (ALL_DEFAULT & ~mask)
+ | R300_INPUT_ROUTE_ENABLE;
+
+ /* i+1 */
+ mask=(1<<(r300->state.aos[i+1].ncomponents*3))-1;
+ dw|=(
+ (ALL_COMPONENTS & mask)
+ | (ALL_DEFAULT & ~mask)
+ | R300_INPUT_ROUTE_ENABLE
+ )<<16;
+
+ r300->hw.vir[1].cmd[R300_VIR_CNTL_0+(i>>1)]=dw;
+ }
+ if(count & 1){
+ mask=(1<<(r300->state.aos[count-1].ncomponents*3))-1;
+ dw=(ALL_COMPONENTS & mask)
+ | (ALL_DEFAULT & ~mask)
+ | R300_INPUT_ROUTE_ENABLE;
+ r300->hw.vir[1].cmd[R300_VIR_CNTL_0+(count>>1)]=dw;
+ //fprintf(stderr, "vir1 dw=%08x\n", dw);
+ }
+ /* Set the rest of INPUT_ROUTE_1 to 0 */
+ //for(i=((count+1)>>1); i<8; i++)r300->hw.vir[1].cmd[R300_VIR_CNTL_0+i]=0x0;
+ ((drm_r300_cmd_header_t*)r300->hw.vir[1].cmd)->unchecked_state.count = (count+1)>>1;
+
+ /* Set up input_cntl */
+
+ R300_STATECHANGE(r300, vic);
+ r300->hw.vic.cmd[R300_VIC_CNTL_0]=0x5555; /* Hard coded value, no idea what it means */
+
+ r300->hw.vic.cmd[R300_VIC_CNTL_1]=R300_INPUT_CNTL_POS
+ | R300_INPUT_CNTL_COLOR;
+
+ for(i=0;i < ctx->Const.MaxTextureUnits;i++)
+ if(ctx->Texture.Unit[i].Enabled)
+ r300->hw.vic.cmd[R300_VIC_CNTL_1]|=(R300_INPUT_CNTL_TC0<<i);
+
+ /* Stage 3: VAP output */
+ R300_STATECHANGE(r300, vof);
+ r300->hw.vof.cmd[R300_VOF_CNTL_0]=R300_VAP_OUTPUT_VTX_FMT_0__POS_PRESENT
+ | R300_VAP_OUTPUT_VTX_FMT_0__COLOR_PRESENT;
+
+ r300->hw.vof.cmd[R300_VOF_CNTL_1]=0;
+ for(i=0;i < ctx->Const.MaxTextureUnits;i++)
+ if(ctx->Texture.Unit[i].Enabled)
+ r300->hw.vof.cmd[R300_VOF_CNTL_1]|=(4<<(3*i));
+
+}
+
+static r300TexObj default_tex_obj={
+ filter:R300_TX_MAG_FILTER_LINEAR | R300_TX_MIN_FILTER_LINEAR,
+ pitch: 0x8000,
+ size: (0xff << R300_TX_WIDTHMASK_SHIFT)
+ | (0xff << R300_TX_HEIGHTMASK_SHIFT)
+ | (0x8 << R300_TX_SIZE_SHIFT),
+ format: 0x88a0c,
+ offset: 0x0,
+ unknown4: 0x0,
+ unknown5: 0x0
+ };
+
+void r300_setup_textures(GLcontext *ctx)
+{
+ int i, mtu;
+ struct r300_tex_obj *t;
+ r300ContextPtr r300 = R300_CONTEXT(ctx);
+ int max_texture_unit=-1; /* -1 translates into no setup costs for fields */
+
+ R300_STATECHANGE(r300, txe);
+ R300_STATECHANGE(r300, tex.filter);
+ R300_STATECHANGE(r300, tex.unknown1);
+ R300_STATECHANGE(r300, tex.size);
+ R300_STATECHANGE(r300, tex.format);
+ R300_STATECHANGE(r300, tex.offset);
+ R300_STATECHANGE(r300, tex.unknown4);
+ R300_STATECHANGE(r300, tex.unknown5);
+
+ r300->state.texture.tc_count=0;
+
+ r300->hw.txe.cmd[R300_TXE_ENABLE]=0x0;
+
+ mtu = r300->radeon.glCtx->Const.MaxTextureUnits;
+ if (RADEON_DEBUG & DEBUG_STATE)
+ fprintf(stderr, "mtu=%d\n", mtu);
+
+ if(mtu>R300_MAX_TEXTURE_UNITS){
+ fprintf(stderr, "Aiiee ! mtu=%d is greater than R300_MAX_TEXTURE_UNITS=%d\n",
+ mtu, R300_MAX_TEXTURE_UNITS);
+ exit(-1);
+ }
+ for(i=0;i<mtu;i++){
+ if(ctx->Texture.Unit[i].Enabled!=NULL){
+ t=r300->state.texture.unit[i].texobj;
+ r300->state.texture.tc_count++;
+ if(t==NULL){
+ fprintf(stderr, "Texture unit %d enabled, but corresponding texobj is NULL, using default object.\n", i);
+ //exit(-1);
+ t=&default_tex_obj;
+ }
+ if (RADEON_DEBUG & DEBUG_STATE)
+ fprintf(stderr, "Activating texture unit %d\n", i);
+ max_texture_unit=i;
+ r300->hw.txe.cmd[R300_TXE_ENABLE]|=(1<<i);
+
+ r300->hw.tex.filter.cmd[R300_TEX_VALUE_0+i]=t->filter;
+ r300->hw.tex.unknown1.cmd[R300_TEX_VALUE_0+i]=t->pitch;
+ r300->hw.tex.size.cmd[R300_TEX_VALUE_0+i]=t->size;
+ r300->hw.tex.format.cmd[R300_TEX_VALUE_0+i]=t->format;
+ r300->hw.tex.offset.cmd[R300_TEX_VALUE_0+i]=r300->radeon.radeonScreen->fbLocation+t->offset;
+ r300->hw.tex.unknown4.cmd[R300_TEX_VALUE_0+i]=0x0;
+ r300->hw.tex.unknown5.cmd[R300_TEX_VALUE_0+i]=0x0;
+
+ /* We don't know how to set this yet */
+ r300->hw.tex.format.cmd[R300_TEX_VALUE_0+i]=0x88a0c;
+
+ } else {
+ /* Fill in with 0's */
+ #if 0 /* No need.. */
+ r300->hw.tex.filter.cmd[R300_TEX_VALUE_0+i]=0x0;
+ r300->hw.tex.unknown1.cmd[R300_TEX_VALUE_0+i]=0x0;
+ r300->hw.tex.size.cmd[R300_TEX_VALUE_0+i]=0x0;
+ r300->hw.tex.format.cmd[R300_TEX_VALUE_0+i]=0x0;
+ r300->hw.tex.offset.cmd[R300_TEX_VALUE_0+i]=r300->radeon.radeonScreen->fbLocation;
+ r300->hw.tex.unknown4.cmd[R300_TEX_VALUE_0+i]=0x0;
+ r300->hw.tex.unknown5.cmd[R300_TEX_VALUE_0+i]=0x0;
+ #endif
+ }
+
+ }
+ ((drm_r300_cmd_header_t*)r300->hw.tex.filter.cmd)->unchecked_state.count = max_texture_unit+1;
+ ((drm_r300_cmd_header_t*)r300->hw.tex.unknown1.cmd)->unchecked_state.count = max_texture_unit+1;
+ ((drm_r300_cmd_header_t*)r300->hw.tex.size.cmd)->unchecked_state.count = max_texture_unit+1;
+ ((drm_r300_cmd_header_t*)r300->hw.tex.format.cmd)->unchecked_state.count = max_texture_unit+1;
+ ((drm_r300_cmd_header_t*)r300->hw.tex.offset.cmd)->unchecked_state.count = max_texture_unit+1;
+ ((drm_r300_cmd_header_t*)r300->hw.tex.unknown4.cmd)->unchecked_state.count = max_texture_unit+1;
+ ((drm_r300_cmd_header_t*)r300->hw.tex.unknown5.cmd)->unchecked_state.count = max_texture_unit+1;
+
+ if (RADEON_DEBUG & DEBUG_STATE)
+ fprintf(stderr, "TX_ENABLE: %08x max_texture_unit=%d\n", r300->hw.txe.cmd[R300_TXE_ENABLE], max_texture_unit);
+}
+
+void r300_setup_rs_unit(GLcontext *ctx)
+{
+ r300ContextPtr r300 = R300_CONTEXT(ctx);
+ int i;
+
+ /* This needs to be rewritten - it is a hack at best */
+
+ R300_STATECHANGE(r300, ri);
+ R300_STATECHANGE(r300, rc);
+ R300_STATECHANGE(r300, rr);
+
+ for(i = 1; i <= 8; ++i)
+ r300->hw.ri.cmd[i] = 0x00d10000;
+ r300->hw.ri.cmd[R300_RI_INTERP_1] |= R300_RS_INTERP_1_UNKNOWN;
+ r300->hw.ri.cmd[R300_RI_INTERP_2] |= R300_RS_INTERP_2_UNKNOWN;
+ r300->hw.ri.cmd[R300_RI_INTERP_3] |= R300_RS_INTERP_3_UNKNOWN;
+
+ for(i = 1; i <= 8; ++i)
+ r300->hw.rr.cmd[i] = 0;
+ /* textures enabled ? */
+ if(r300->state.texture.tc_count>0){
+
+ /* This code only really works with one set of texture coordinates */
+
+ /* The second constant is needed to get glxgears display anything .. */
+ r300->hw.rc.cmd[1] = R300_RS_CNTL_0_UNKNOWN_7
+ | R300_RS_CNTL_0_UNKNOWN_18
+ | (r300->state.texture.tc_count<<R300_RS_CNTL_TC_CNT_SHIFT);
+ r300->hw.rc.cmd[2] = 0xc0;
+
+
+ ((drm_r300_cmd_header_t*)r300->hw.rr.cmd)->unchecked_state.count = 1;
+ r300->hw.rr.cmd[R300_RR_ROUTE_0] = 0x24008;
+
+ } else {
+
+ /* The second constant is needed to get glxgears display anything .. */
+ r300->hw.rc.cmd[1] = R300_RS_CNTL_0_UNKNOWN_7 | R300_RS_CNTL_0_UNKNOWN_18;
+ r300->hw.rc.cmd[2] = 0;
+
+ ((drm_r300_cmd_header_t*)r300->hw.rr.cmd)->unchecked_state.count = 1;
+ r300->hw.rr.cmd[R300_RR_ROUTE_0] = 0x4000;
+
+ }
+}
/**
* Called by Mesa after an internal state update.
r300DepthFunc(ctx, ctx->Depth.Func);
r300UpdateCulling(ctx);
+
+ r300_setup_routing(ctx, GL_TRUE);
+
+ r300UpdateTextureState(ctx);
+ r300_setup_textures(ctx);
+ r300_setup_rs_unit(ctx);
//BEGIN: TODO
r300->hw.unk2080.cmd[1] = 0x0030045A;
r300->hw.unk2140.cmd[1] = 0x00000000;
+ #if 0 /* Done in setup routing */
((drm_r300_cmd_header_t*)r300->hw.vir[0].cmd)->unchecked_state.count = 1;
r300->hw.vir[0].cmd[1] = 0x21030003;
r300->hw.vic.cmd[R300_VIR_CNTL_0] = 0x00000001;
r300->hw.vic.cmd[R300_VIR_CNTL_1] = 0x00000405;
-
+ #endif
+
r300->hw.unk21DC.cmd[1] = 0xAAAAAAAA;
r300->hw.unk221C.cmd[1] = R300_221C_NORMAL;
else
r300->hw.unk2288.cmd[1] = R300_2288_RV350;
+ #if 0
r300->hw.vof.cmd[R300_VOF_CNTL_0] = R300_VAP_OUTPUT_VTX_FMT_0__POS_PRESENT
| R300_VAP_OUTPUT_VTX_FMT_0__COLOR_PRESENT;
r300->hw.vof.cmd[R300_VOF_CNTL_1] = 0; /* no textures */
-
+ #endif
+
r300->hw.pvs.cmd[R300_PVS_CNTL_1] = 0;
r300->hw.pvs.cmd[R300_PVS_CNTL_2] = 0;
r300->hw.pvs.cmd[R300_PVS_CNTL_3] = 0;
r300->hw.gb_misc.cmd[R300_GB_MISC_SELECT] = 0x00000000;
r300->hw.gb_misc.cmd[R300_GB_MISC_AA_CONFIG] = 0x00000000; /* No antialiasing */
- r300->hw.txe.cmd[R300_TXE_ENABLE] = 0;
+ //r300->hw.txe.cmd[R300_TXE_ENABLE] = 0;
r300->hw.unk4200.cmd[1] = r300PackFloat32(0.0);
r300->hw.unk4200.cmd[2] = r300PackFloat32(0.0);
r300->hw.unk42C0.cmd[1] = 0x4B7FFFFF;
r300->hw.unk42C0.cmd[2] = 0x00000000;
- /* The second constant is needed to get glxgears display anything .. */
- r300->hw.rc.cmd[1] = R300_RS_CNTL_0_UNKNOWN_7 | R300_RS_CNTL_0_UNKNOWN_18;
- r300->hw.rc.cmd[2] = 0;
-
- for(i = 1; i <= 8; ++i)
- r300->hw.ri.cmd[i] = 0x00d10000;
- r300->hw.ri.cmd[R300_RI_INTERP_1] |= R300_RS_INTERP_1_UNKNOWN;
- r300->hw.ri.cmd[R300_RI_INTERP_2] |= R300_RS_INTERP_2_UNKNOWN;
- r300->hw.ri.cmd[R300_RI_INTERP_3] |= R300_RS_INTERP_3_UNKNOWN;
-
- ((drm_r300_cmd_header_t*)r300->hw.rr.cmd)->unchecked_state.count = 1;
- for(i = 1; i <= 8; ++i)
- r300->hw.rr.cmd[i] = 0;
- r300->hw.rr.cmd[R300_RR_ROUTE_0] = 0x4000;
r300->hw.unk43A4.cmd[1] = 0x0000001C;
r300->hw.unk43A4.cmd[2] = 0x2DA49525;
r300->hw.vps.cmd[R300_VPS_POINTSIZE] = r300PackFloat32(1.0);
r300->hw.vps.cmd[R300_VPS_ZERO_3] = 0;
- /* Initialize texture units */
- for(i=0;i<r300->radeon.glCtx->Const.MaxTextureUnits;i++){
- r300->hw.tex.filter.cmd[R300_TEX_VALUE_0+i]=0x0;
- r300->hw.tex.unknown1.cmd[R300_TEX_VALUE_0+i]=0x0;
- r300->hw.tex.size.cmd[R300_TEX_VALUE_0+i]=0x0;
- r300->hw.tex.format.cmd[R300_TEX_VALUE_0+i]=0x0;
- r300->hw.tex.offset.cmd[R300_TEX_VALUE_0+i]=0x0;
- r300->hw.tex.unknown4.cmd[R300_TEX_VALUE_0+i]=0x0;
- r300->hw.tex.unknown5.cmd[R300_TEX_VALUE_0+i]=0x0;
- }
//END: TODO
r300->hw.all_dirty = GL_TRUE;
*/
void r300InitState(r300ContextPtr r300)
{
+ GLcontext *ctx = r300->radeon.glCtx;
+ GLuint depth_fmt;
+
radeonInitState(&r300->radeon);
- r300->state.depth.scale = 1.0 / (GLfloat) 0xffff;
+ switch (ctx->Visual.depthBits) {
+ case 16:
+ r300->state.depth.scale = 1.0 / (GLfloat) 0xffff;
+ depth_fmt = R200_DEPTH_FORMAT_16BIT_INT_Z;
+ //r300->state.stencil.clear = 0x00000000;
+ break;
+ case 24:
+ r300->state.depth.scale = 1.0 / (GLfloat) 0xffffff;
+ depth_fmt = R200_DEPTH_FORMAT_24BIT_INT_Z;
+ //r300->state.stencil.clear = 0xff000000;
+ break;
+ default:
+ fprintf(stderr, "Error: Unsupported depth %d... exiting\n",
+ ctx->Visual.depthBits);
+ exit(-1);
+ }
+
+ memset(&(r300->state.texture), 0, sizeof(r300->state.texture));
r300ResetHwState(r300);
}
extern void r300InitTextureFuncs(struct dd_function_table *functions);
+extern void r300UpdateTextureState(GLcontext * ctx);
+
#endif
#endif /* __r300_TEX_H__ */