📄 r300_cmdbuf.c
字号:
ALLOC_STATE( unk4230, always, 4, "unk4230", 0 ); r300->hw.unk4230.cmd[0] = cmdpacket0(0x4230, 3); ALLOC_STATE( lcntl, always, 2, "lcntl", 0 ); r300->hw.lcntl.cmd[0] = cmdpacket0(R300_RE_LINE_CNT, 1); ALLOC_STATE( unk4260, always, 4, "unk4260", 0 ); r300->hw.unk4260.cmd[0] = cmdpacket0(0x4260, 3); ALLOC_STATE( unk4274, always, 5, "unk4274", 0 ); r300->hw.unk4274.cmd[0] = cmdpacket0(0x4274, 4); ALLOC_STATE( unk4288, always, 6, "unk4288", 0 ); r300->hw.unk4288.cmd[0] = cmdpacket0(0x4288, 5); ALLOC_STATE( unk42A0, always, 2, "unk42A0", 0 ); r300->hw.unk42A0.cmd[0] = cmdpacket0(0x42A0, 1); ALLOC_STATE( zbs, always, R300_ZBS_CMDSIZE, "zbs", 0 ); r300->hw.zbs.cmd[R300_ZBS_CMD_0] = cmdpacket0(R300_RE_ZBIAS_T_FACTOR, 4); ALLOC_STATE( unk42B4, always, 2, "unk42B4", 0 ); r300->hw.unk42B4.cmd[0] = cmdpacket0(0x42B4, 1); ALLOC_STATE( cul, always, R300_CUL_CMDSIZE, "cul", 0 ); r300->hw.cul.cmd[R300_CUL_CMD_0] = cmdpacket0(R300_RE_CULL_CNTL, 1); ALLOC_STATE( unk42C0, always, 3, "unk42C0", 0 ); r300->hw.unk42C0.cmd[0] = cmdpacket0(0x42C0, 2); ALLOC_STATE( rc, always, R300_RC_CMDSIZE, "rc", 0 ); r300->hw.rc.cmd[R300_RC_CMD_0] = cmdpacket0(R300_RS_CNTL_0, 2); ALLOC_STATE( ri, always, R300_RI_CMDSIZE, "ri", 0 ); r300->hw.ri.cmd[R300_RI_CMD_0] = cmdpacket0(R300_RS_INTERP_0, 8); ALLOC_STATE( rr, variable, R300_RR_CMDSIZE, "rr", 0 ); r300->hw.rr.cmd[R300_RR_CMD_0] = cmdpacket0(R300_RS_ROUTE_0, 1); ALLOC_STATE( unk43A4, always, 3, "unk43A4", 0 ); r300->hw.unk43A4.cmd[0] = cmdpacket0(0x43A4, 2); ALLOC_STATE( unk43E8, always, 2, "unk43E8", 0 ); r300->hw.unk43E8.cmd[0] = cmdpacket0(0x43E8, 1); ALLOC_STATE( fp, always, R300_FP_CMDSIZE, "fp", 0 ); r300->hw.fp.cmd[R300_FP_CMD_0] = cmdpacket0(R300_PFS_CNTL_0, 3); r300->hw.fp.cmd[R300_FP_CMD_1] = cmdpacket0(R300_PFS_NODE_0, 4); ALLOC_STATE( fpt, variable, R300_FPT_CMDSIZE, "fpt", 0 ); r300->hw.fpt.cmd[R300_FPT_CMD_0] = cmdpacket0(R300_PFS_TEXI_0, 0); ALLOC_STATE( unk46A4, always, 6, "unk46A4", 0 ); r300->hw.unk46A4.cmd[0] = cmdpacket0(0x46A4, 5); ALLOC_STATE( fpi[0], variable, R300_FPI_CMDSIZE, "fpi/0", 0 ); r300->hw.fpi[0].cmd[R300_FPI_CMD_0] = cmdpacket0(R300_PFS_INSTR0_0, 1); ALLOC_STATE( fpi[1], variable, R300_FPI_CMDSIZE, "fpi/1", 1 ); r300->hw.fpi[1].cmd[R300_FPI_CMD_0] = cmdpacket0(R300_PFS_INSTR1_0, 1); ALLOC_STATE( fpi[2], variable, R300_FPI_CMDSIZE, "fpi/2", 2 ); r300->hw.fpi[2].cmd[R300_FPI_CMD_0] = cmdpacket0(R300_PFS_INSTR2_0, 1); ALLOC_STATE( fpi[3], variable, R300_FPI_CMDSIZE, "fpi/3", 3 ); r300->hw.fpi[3].cmd[R300_FPI_CMD_0] = cmdpacket0(R300_PFS_INSTR3_0, 1); ALLOC_STATE( unk4BC0, always, 2, "unk4BC0", 0 ); r300->hw.unk4BC0.cmd[0] = cmdpacket0(0x4BC0, 1); ALLOC_STATE( unk4BC8, always, 4, "unk4BC8", 0 ); r300->hw.unk4BC8.cmd[0] = cmdpacket0(0x4BC8, 3); ALLOC_STATE( at, always, R300_AT_CMDSIZE, "at", 0 ); r300->hw.at.cmd[R300_AT_CMD_0] = cmdpacket0(R300_PP_ALPHA_TEST, 2); ALLOC_STATE( unk4BD8, always, 2, "unk4BD8", 0 ); r300->hw.unk4BD8.cmd[0] = cmdpacket0(0x4BD8, 1); ALLOC_STATE( fpp, variable, R300_FPP_CMDSIZE, "fpp", 0 ); r300->hw.fpp.cmd[R300_FPP_CMD_0] = cmdpacket0(R300_PFS_PARAM_0_X, 0); ALLOC_STATE( unk4E00, always, 2, "unk4E00", 0 ); r300->hw.unk4E00.cmd[0] = cmdpacket0(0x4E00, 1); ALLOC_STATE( bld, always, R300_BLD_CMDSIZE, "bld", 0 ); r300->hw.bld.cmd[R300_BLD_CMD_0] = cmdpacket0(R300_RB3D_CBLEND, 2); ALLOC_STATE( cmk, always, R300_CMK_CMDSIZE, "cmk", 0 ); r300->hw.cmk.cmd[R300_CMK_CMD_0] = cmdpacket0(R300_RB3D_COLORMASK, 1); ALLOC_STATE( unk4E10, always, 4, "unk4E10", 0 ); r300->hw.unk4E10.cmd[0] = cmdpacket0(0x4E10, 3); ALLOC_STATE( cb, always, R300_CB_CMDSIZE, "cb", 0 ); r300->hw.cb.cmd[R300_CB_CMD_0] = cmdpacket0(R300_RB3D_COLOROFFSET0, 1); r300->hw.cb.cmd[R300_CB_CMD_1] = cmdpacket0(R300_RB3D_COLORPITCH0, 1); ALLOC_STATE( unk4E50, always, 10, "unk4E50", 0 ); r300->hw.unk4E50.cmd[0] = cmdpacket0(0x4E50, 9); ALLOC_STATE( unk4E88, always, 2, "unk4E88", 0 ); r300->hw.unk4E88.cmd[0] = cmdpacket0(0x4E88, 1); ALLOC_STATE( unk4EA0, always, 3, "unk4EA0 R350 only", 0 ); r300->hw.unk4EA0.cmd[0] = cmdpacket0(0x4EA0, 2); ALLOC_STATE( zs, always, R300_ZS_CMDSIZE, "zstencil", 0 ); r300->hw.zs.cmd[R300_ZS_CMD_0] = cmdpacket0(R300_RB3D_ZSTENCIL_CNTL_0, 3); ALLOC_STATE( unk4F10, always, 5, "unk4F10", 0 ); r300->hw.unk4F10.cmd[0] = cmdpacket0(0x4F10, 4); ALLOC_STATE( zb, always, R300_ZB_CMDSIZE, "zb", 0 ); r300->hw.zb.cmd[R300_ZB_CMD_0] = cmdpacket0(R300_RB3D_DEPTHOFFSET, 2); ALLOC_STATE( unk4F28, always, 2, "unk4F28", 0 ); r300->hw.unk4F28.cmd[0] = cmdpacket0(0x4F28, 1); ALLOC_STATE( unk4F30, always, 3, "unk4F30", 0 ); r300->hw.unk4F30.cmd[0] = cmdpacket0(0x4F30, 2); ALLOC_STATE( unk4F44, always, 2, "unk4F44", 0 ); r300->hw.unk4F44.cmd[0] = cmdpacket0(0x4F44, 1); ALLOC_STATE( unk4F54, always, 2, "unk4F54", 0 ); r300->hw.unk4F54.cmd[0] = cmdpacket0(0x4F54, 1); ALLOC_STATE( vpi, vpu, R300_VPI_CMDSIZE, "vpi", 0 ); r300->hw.vpi.cmd[R300_VPI_CMD_0] = cmdvpu(R300_PVS_UPLOAD_PROGRAM, 0); ALLOC_STATE( vpp, vpu, R300_VPP_CMDSIZE, "vpp", 0 ); r300->hw.vpp.cmd[R300_VPP_CMD_0] = cmdvpu(R300_PVS_UPLOAD_PARAMETERS, 0); ALLOC_STATE( vps, vpu, R300_VPS_CMDSIZE, "vps", 0 ); r300->hw.vps.cmd[R300_VPS_CMD_0] = cmdvpu(R300_PVS_UPLOAD_POINTSIZE, 1); /* Textures */ ALLOC_STATE( tex.filter, variable, mtu+1, "tex_filter", 0 ); r300->hw.tex.filter.cmd[R300_TEX_CMD_0] = cmdpacket0(R300_TX_FILTER_0, 0); ALLOC_STATE( tex.unknown1, variable, mtu+1, "tex_unknown1", 0 ); r300->hw.tex.unknown1.cmd[R300_TEX_CMD_0] = cmdpacket0(R300_TX_FILTER1_0, 0); ALLOC_STATE( tex.size, variable, mtu+1, "tex_size", 0 ); r300->hw.tex.size.cmd[R300_TEX_CMD_0] = cmdpacket0(R300_TX_SIZE_0, 0); ALLOC_STATE( tex.format, variable, mtu+1, "tex_format", 0 ); r300->hw.tex.format.cmd[R300_TEX_CMD_0] = cmdpacket0(R300_TX_FORMAT_0, 0); ALLOC_STATE( tex.pitch, variable, mtu+1, "tex_pitch", 0 ); r300->hw.tex.pitch.cmd[R300_TEX_CMD_0] = cmdpacket0(R300_TX_PITCH_0, 0); ALLOC_STATE( tex.offset, variable, mtu+1, "tex_offset", 0 ); r300->hw.tex.offset.cmd[R300_TEX_CMD_0] = cmdpacket0(R300_TX_OFFSET_0, 0); ALLOC_STATE( tex.unknown4, variable, mtu+1, "tex_unknown4", 0 ); r300->hw.tex.unknown4.cmd[R300_TEX_CMD_0] = cmdpacket0(R300_TX_CHROMA_KEY_0, 0); ALLOC_STATE( tex.border_color, variable, mtu+1, "tex_border_color", 0 ); r300->hw.tex.border_color.cmd[R300_TEX_CMD_0] = cmdpacket0(R300_TX_BORDER_COLOR_0, 0); /* Setup the atom linked list */ make_empty_list(&r300->hw.atomlist); r300->hw.atomlist.name = "atom-list"; insert_at_tail(&r300->hw.atomlist, &r300->hw.vpt); insert_at_tail(&r300->hw.atomlist, &r300->hw.unk2080); insert_at_tail(&r300->hw.atomlist, &r300->hw.vte); insert_at_tail(&r300->hw.atomlist, &r300->hw.unk2134); insert_at_tail(&r300->hw.atomlist, &r300->hw.unk2140); insert_at_tail(&r300->hw.atomlist, &r300->hw.vir[0]); insert_at_tail(&r300->hw.atomlist, &r300->hw.vir[1]); insert_at_tail(&r300->hw.atomlist, &r300->hw.vic); insert_at_tail(&r300->hw.atomlist, &r300->hw.unk21DC); insert_at_tail(&r300->hw.atomlist, &r300->hw.unk221C); insert_at_tail(&r300->hw.atomlist, &r300->hw.unk2220); insert_at_tail(&r300->hw.atomlist, &r300->hw.unk2288); insert_at_tail(&r300->hw.atomlist, &r300->hw.vof); insert_at_tail(&r300->hw.atomlist, &r300->hw.pvs); insert_at_tail(&r300->hw.atomlist, &r300->hw.gb_enable); insert_at_tail(&r300->hw.atomlist, &r300->hw.gb_misc); insert_at_tail(&r300->hw.atomlist, &r300->hw.txe); insert_at_tail(&r300->hw.atomlist, &r300->hw.unk4200); insert_at_tail(&r300->hw.atomlist, &r300->hw.unk4214); insert_at_tail(&r300->hw.atomlist, &r300->hw.ps); insert_at_tail(&r300->hw.atomlist, &r300->hw.unk4230); insert_at_tail(&r300->hw.atomlist, &r300->hw.lcntl); insert_at_tail(&r300->hw.atomlist, &r300->hw.unk4260); insert_at_tail(&r300->hw.atomlist, &r300->hw.unk4274); insert_at_tail(&r300->hw.atomlist, &r300->hw.unk4288); insert_at_tail(&r300->hw.atomlist, &r300->hw.unk42A0); insert_at_tail(&r300->hw.atomlist, &r300->hw.zbs); insert_at_tail(&r300->hw.atomlist, &r300->hw.unk42B4); insert_at_tail(&r300->hw.atomlist, &r300->hw.cul); insert_at_tail(&r300->hw.atomlist, &r300->hw.unk42C0); insert_at_tail(&r300->hw.atomlist, &r300->hw.rc); insert_at_tail(&r300->hw.atomlist, &r300->hw.ri); insert_at_tail(&r300->hw.atomlist, &r300->hw.rr); insert_at_tail(&r300->hw.atomlist, &r300->hw.unk43A4); insert_at_tail(&r300->hw.atomlist, &r300->hw.unk43E8); insert_at_tail(&r300->hw.atomlist, &r300->hw.fp); insert_at_tail(&r300->hw.atomlist, &r300->hw.fpt); insert_at_tail(&r300->hw.atomlist, &r300->hw.unk46A4); insert_at_tail(&r300->hw.atomlist, &r300->hw.fpi[0]); insert_at_tail(&r300->hw.atomlist, &r300->hw.fpi[1]); insert_at_tail(&r300->hw.atomlist, &r300->hw.fpi[2]); insert_at_tail(&r300->hw.atomlist, &r300->hw.fpi[3]); insert_at_tail(&r300->hw.atomlist, &r300->hw.unk4BC0); insert_at_tail(&r300->hw.atomlist, &r300->hw.unk4BC8); insert_at_tail(&r300->hw.atomlist, &r300->hw.at); insert_at_tail(&r300->hw.atomlist, &r300->hw.unk4BD8); insert_at_tail(&r300->hw.atomlist, &r300->hw.fpp); insert_at_tail(&r300->hw.atomlist, &r300->hw.unk4E00); insert_at_tail(&r300->hw.atomlist, &r300->hw.bld); insert_at_tail(&r300->hw.atomlist, &r300->hw.cmk); insert_at_tail(&r300->hw.atomlist, &r300->hw.unk4E10); insert_at_tail(&r300->hw.atomlist, &r300->hw.cb); insert_at_tail(&r300->hw.atomlist, &r300->hw.unk4E50); insert_at_tail(&r300->hw.atomlist, &r300->hw.unk4E88); insert_at_tail(&r300->hw.atomlist, &r300->hw.unk4EA0); insert_at_tail(&r300->hw.atomlist, &r300->hw.zs); insert_at_tail(&r300->hw.atomlist, &r300->hw.unk4F10); insert_at_tail(&r300->hw.atomlist, &r300->hw.zb); insert_at_tail(&r300->hw.atomlist, &r300->hw.unk4F28); insert_at_tail(&r300->hw.atomlist, &r300->hw.unk4F30); insert_at_tail(&r300->hw.atomlist, &r300->hw.unk4F44); insert_at_tail(&r300->hw.atomlist, &r300->hw.unk4F54); insert_at_tail(&r300->hw.atomlist, &r300->hw.vpi); insert_at_tail(&r300->hw.atomlist, &r300->hw.vpp); insert_at_tail(&r300->hw.atomlist, &r300->hw.vps); insert_at_tail(&r300->hw.atomlist, &r300->hw.tex.filter); insert_at_tail(&r300->hw.atomlist, &r300->hw.tex.unknown1); insert_at_tail(&r300->hw.atomlist, &r300->hw.tex.size); insert_at_tail(&r300->hw.atomlist, &r300->hw.tex.format); insert_at_tail(&r300->hw.atomlist, &r300->hw.tex.pitch); insert_at_tail(&r300->hw.atomlist, &r300->hw.tex.offset); insert_at_tail(&r300->hw.atomlist, &r300->hw.tex.unknown4); insert_at_tail(&r300->hw.atomlist, &r300->hw.tex.border_color); r300->hw.is_dirty = GL_TRUE; r300->hw.all_dirty = GL_TRUE; /* Initialize command buffer */ size = 256 * driQueryOptioni(&r300->radeon.optionCache, "command_buffer_size"); if (size < 2*r300->hw.max_state_size) { size = 2*r300->hw.max_state_size+65535; } if (size > 64*256) size = 64*256; if (RADEON_DEBUG & (DEBUG_IOCTL|DEBUG_DMA)) { fprintf(stderr, "sizeof(drm_r300_cmd_header_t)=%d\n", sizeof(drm_r300_cmd_header_t)); fprintf(stderr, "sizeof(drm_radeon_cmd_buffer_t)=%d\n", sizeof(drm_radeon_cmd_buffer_t)); fprintf(stderr, "Allocating %d bytes command buffer (max state is %d bytes)\n", size*4, r300->hw.max_state_size*4); } r300->cmdbuf.size = size; r300->cmdbuf.cmd_buf = (uint32_t*)CALLOC(size*4); r300->cmdbuf.count_used = 0; r300->cmdbuf.count_reemit = 0;}/** * Destroy the command buffer and state atoms. */void r300DestroyCmdBuf(r300ContextPtr r300){ struct r300_state_atom* atom; FREE(r300->cmdbuf.cmd_buf); foreach(atom, &r300->hw.atomlist) { FREE(atom->cmd); }}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){ drm_r300_cmd_header_t *cmd; if (RADEON_DEBUG & DEBUG_IOCTL) fprintf(stderr, "%s src %x/%x %d,%d dst: %x/%x %d,%d sz: %dx%d\n", __FUNCTION__, src_pitch, src_offset, srcx, srcy, dst_pitch, dst_offset, dstx, dsty, w, h); assert((src_pitch & 63) == 0); assert((dst_pitch & 63) == 0); assert((src_offset & 1023) == 0); assert((dst_offset & 1023) == 0); assert(w < (1 << 16)); assert(h < (1 << 16)); cmd = (drm_r300_cmd_header_t *) r300AllocCmdBuf(rmesa, 8, __FUNCTION__); cmd[0].header.cmd_type = R300_CMD_PACKET3; cmd[0].header.pad0 = R300_CMD_PACKET3_RAW; cmd[1].u = R200_CP_CMD_BITBLT_MULTI | (5 << 16); cmd[2].u = (RADEON_GMC_SRC_PITCH_OFFSET_CNTL | RADEON_GMC_DST_PITCH_OFFSET_CNTL | RADEON_GMC_BRUSH_NONE | (color_fmt << 8) | RADEON_GMC_SRC_DATATYPE_COLOR | RADEON_ROP3_S | RADEON_DP_SRC_SOURCE_MEMORY | RADEON_GMC_CLR_CMP_CNTL_DIS | RADEON_GMC_WR_MSK_DIS); cmd[3].u = ((src_pitch / 64) << 22) | (src_offset >> 10); cmd[4].u = ((dst_pitch / 64) << 22) | (dst_offset >> 10); cmd[5].u = (srcx << 16) | srcy; cmd[6].u = (dstx << 16) | dsty; /* dst */ cmd[7].u = (w << 16) | h;}void r300EmitWait(r300ContextPtr rmesa, GLuint flags){ drm_r300_cmd_header_t *cmd; assert(!(flags & ~(R300_WAIT_2D | R300_WAIT_3D))); cmd = (drm_r300_cmd_header_t *) r300AllocCmdBuf(rmesa, 1, __FUNCTION__); cmd[0].u = 0; cmd[0].wait.cmd_type = R300_CMD_WAIT; cmd[0].wait.flags = flags;}void r300EmitAOS(r300ContextPtr rmesa, GLuint nr, GLuint offset){ int sz = 1 + (nr >> 1) * 3 + (nr & 1) * 2; int i; LOCAL_VARS if (RADEON_DEBUG & DEBUG_VERTS) fprintf(stderr, "%s: nr=%d, ofs=0x%08x\n", __func__, nr, offset); start_packet3(RADEON_CP_PACKET3_3D_LOAD_VBPNTR, sz-1); e32(nr); for(i=0;i+1<nr;i+=2){ e32( (rmesa->state.aos[i].aos_size << 0) |(rmesa->state.aos[i].aos_stride << 8) |(rmesa->state.aos[i+1].aos_size << 16) |(rmesa->state.aos[i+1].aos_stride << 24) ); e32(rmesa->state.aos[i].aos_offset+offset*4*rmesa->state.aos[i].aos_stride); e32(rmesa->state.aos[i+1].aos_offset+offset*4*rmesa->state.aos[i+1].aos_stride); } if(nr & 1){ e32( (rmesa->state.aos[nr-1].aos_size << 0) |(rmesa->state.aos[nr-1].aos_stride << 8) ); e32(rmesa->state.aos[nr-1].aos_offset+offset*4*rmesa->state.aos[nr-1].aos_stride); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -