Path: blob/master/drivers/gpu/drm/radeon/r100_track.h
15113 views
1#define R100_TRACK_MAX_TEXTURE 32#define R200_TRACK_MAX_TEXTURE 63#define R300_TRACK_MAX_TEXTURE 1645#define R100_MAX_CB 16#define R300_MAX_CB 478/*9* CS functions10*/11struct r100_cs_track_cb {12struct radeon_bo *robj;13unsigned pitch;14unsigned cpp;15unsigned offset;16};1718struct r100_cs_track_array {19struct radeon_bo *robj;20unsigned esize;21};2223struct r100_cs_cube_info {24struct radeon_bo *robj;25unsigned offset;26unsigned width;27unsigned height;28};2930#define R100_TRACK_COMP_NONE 031#define R100_TRACK_COMP_DXT1 132#define R100_TRACK_COMP_DXT35 23334struct r100_cs_track_texture {35struct radeon_bo *robj;36struct r100_cs_cube_info cube_info[5]; /* info for 5 non-primary faces */37unsigned pitch;38unsigned width;39unsigned height;40unsigned num_levels;41unsigned cpp;42unsigned tex_coord_type;43unsigned txdepth;44unsigned width_11;45unsigned height_11;46bool use_pitch;47bool enabled;48bool lookup_disable;49bool roundup_w;50bool roundup_h;51unsigned compress_format;52};5354struct r100_cs_track {55unsigned num_cb;56unsigned num_texture;57unsigned maxy;58unsigned vtx_size;59unsigned vap_vf_cntl;60unsigned vap_alt_nverts;61unsigned immd_dwords;62unsigned num_arrays;63unsigned max_indx;64unsigned color_channel_mask;65struct r100_cs_track_array arrays[16];66struct r100_cs_track_cb cb[R300_MAX_CB];67struct r100_cs_track_cb zb;68struct r100_cs_track_cb aa;69struct r100_cs_track_texture textures[R300_TRACK_MAX_TEXTURE];70bool z_enabled;71bool separate_cube;72bool zb_cb_clear;73bool blend_read_enable;74bool cb_dirty;75bool zb_dirty;76bool tex_dirty;77bool aa_dirty;78bool aaresolve;79};8081int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track);82void r100_cs_track_clear(struct radeon_device *rdev, struct r100_cs_track *track);83int r100_cs_packet_next_reloc(struct radeon_cs_parser *p,84struct radeon_cs_reloc **cs_reloc);85void r100_cs_dump_packet(struct radeon_cs_parser *p,86struct radeon_cs_packet *pkt);8788int r100_cs_packet_parse_vline(struct radeon_cs_parser *p);8990int r200_packet0_check(struct radeon_cs_parser *p,91struct radeon_cs_packet *pkt,92unsigned idx, unsigned reg);93949596static inline int r100_reloc_pitch_offset(struct radeon_cs_parser *p,97struct radeon_cs_packet *pkt,98unsigned idx,99unsigned reg)100{101int r;102u32 tile_flags = 0;103u32 tmp;104struct radeon_cs_reloc *reloc;105u32 value;106107r = r100_cs_packet_next_reloc(p, &reloc);108if (r) {109DRM_ERROR("No reloc for ib[%d]=0x%04X\n",110idx, reg);111r100_cs_dump_packet(p, pkt);112return r;113}114value = radeon_get_ib_value(p, idx);115tmp = value & 0x003fffff;116tmp += (((u32)reloc->lobj.gpu_offset) >> 10);117118if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)119tile_flags |= RADEON_DST_TILE_MACRO;120if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) {121if (reg == RADEON_SRC_PITCH_OFFSET) {122DRM_ERROR("Cannot src blit from microtiled surface\n");123r100_cs_dump_packet(p, pkt);124return -EINVAL;125}126tile_flags |= RADEON_DST_TILE_MICRO;127}128129tmp |= tile_flags;130p->ib->ptr[idx] = (value & 0x3fc00000) | tmp;131return 0;132}133134static inline int r100_packet3_load_vbpntr(struct radeon_cs_parser *p,135struct radeon_cs_packet *pkt,136int idx)137{138unsigned c, i;139struct radeon_cs_reloc *reloc;140struct r100_cs_track *track;141int r = 0;142volatile uint32_t *ib;143u32 idx_value;144145ib = p->ib->ptr;146track = (struct r100_cs_track *)p->track;147c = radeon_get_ib_value(p, idx++) & 0x1F;148if (c > 16) {149DRM_ERROR("Only 16 vertex buffers are allowed %d\n",150pkt->opcode);151r100_cs_dump_packet(p, pkt);152return -EINVAL;153}154track->num_arrays = c;155for (i = 0; i < (c - 1); i+=2, idx+=3) {156r = r100_cs_packet_next_reloc(p, &reloc);157if (r) {158DRM_ERROR("No reloc for packet3 %d\n",159pkt->opcode);160r100_cs_dump_packet(p, pkt);161return r;162}163idx_value = radeon_get_ib_value(p, idx);164ib[idx+1] = radeon_get_ib_value(p, idx + 1) + ((u32)reloc->lobj.gpu_offset);165166track->arrays[i + 0].esize = idx_value >> 8;167track->arrays[i + 0].robj = reloc->robj;168track->arrays[i + 0].esize &= 0x7F;169r = r100_cs_packet_next_reloc(p, &reloc);170if (r) {171DRM_ERROR("No reloc for packet3 %d\n",172pkt->opcode);173r100_cs_dump_packet(p, pkt);174return r;175}176ib[idx+2] = radeon_get_ib_value(p, idx + 2) + ((u32)reloc->lobj.gpu_offset);177track->arrays[i + 1].robj = reloc->robj;178track->arrays[i + 1].esize = idx_value >> 24;179track->arrays[i + 1].esize &= 0x7F;180}181if (c & 1) {182r = r100_cs_packet_next_reloc(p, &reloc);183if (r) {184DRM_ERROR("No reloc for packet3 %d\n",185pkt->opcode);186r100_cs_dump_packet(p, pkt);187return r;188}189idx_value = radeon_get_ib_value(p, idx);190ib[idx+1] = radeon_get_ib_value(p, idx + 1) + ((u32)reloc->lobj.gpu_offset);191track->arrays[i + 0].robj = reloc->robj;192track->arrays[i + 0].esize = idx_value >> 8;193track->arrays[i + 0].esize &= 0x7F;194}195return r;196}197198199