annotate old/simple_pack/task/spu_draw.cpp @ 507:735f76483bb2

Reorganization..
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 12 Oct 2009 09:39:35 +0900
parents TaskManager/Test/simple_pack/task/spu_draw.cpp@459f54b49648
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
77
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
1 #include <iostream>
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
2 #include "polygon_pack.h"
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
3 #include "span_pack.h"
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
4 #include "spu_span.h"
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
5 using namespace std;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
6
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
7 #define PIXELSIZE 11520 //32 line pixel size
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
8
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
9 int linebuf[2][8][IMG_MAX_Y];
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
10
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
11
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
12
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
13 void linebuf_init(int j) {
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
14 int i;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
15 for(int t= 0; t < 8; t++) {
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
16 for(i = 0; i < IMG_MAX_Y; i++) {
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
17 linebuf[j][t][i] = 0;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
18 }
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
19 }
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
20 }
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
21 char *get_pixel(int tx, int ty, void *texture_image)
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
22 {
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
23 //return (char*)texture_image->pixels+(texture_image->format->BytesPerPixel*((texture_image->w)*ty+tx));
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
24 return (char*)texture_image+(3*((128)*ty+tx));
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
25 }
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
26
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
27 Uint32 Polygon::get_rgb(int tx, int ty, void *texture)
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
28 {
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
29 Uint8 red, green, blue;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
30
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
31 if (tx<0) tx = 0;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
32 if (128-1< tx) tx = 128-1 ;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
33 if (ty<0) ty = 0;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
34 if (128-1< ty) ty = 128-1 ;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
35
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
36 char *p = get_pixel(tx,ty,texture);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
37
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
38 blue = (Uint8) p[0];
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
39 green = (Uint8) p[1];
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
40 red = (Uint8) p[2];
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
41
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
42 SDL_PixelFormat pf;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
43 pf.BitsPerPixel = 32;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
44 pf.BytesPerPixel = 4;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
45 alpha = 255;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
46
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
47 return SDL_MapRGB(pf, red, green, blue);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
48 }
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
49
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
50 void write_pixel(int x, int y, float z, Uint32 rgb)
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
51 {
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
52
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
53 }
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
54
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
55 void zRow_init() {
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
56 int i;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
57 //printf("zRow_init?n");
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
58 for(int t = 0; t < 8; t++) {
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
59 for(i = 0; i < IMG_MAX_Y; i++) {
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
60 zRow[t][i] = 65535;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
61 }
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
62 }
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
63 }
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
64
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
65 int spu_draw(SPUSPAN *ss, unsigned int fbdev_addr)
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
66 {
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
67 void *texture = new void[128*128*3];
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
68 long *addr = ss->sp[0].tex_addr;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
69 GLushort zRow[8][IMG_MAX_Y];
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
70 static int j = 0;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
71 int render_y = 0;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
72 spu_mfcdma32(texture, addr, PIXELSIZE, 17, MFC_GET_CMD);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
73 spu_mfcdma32(texture+PIXELSIZE, addr+PIXELSIZE, PIXELSIZE, 18, MFC_GET_CMD);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
74 spu_mfcdma32(texture+PIXELSIZE*2, addr+PIXELSIZE*2, PIXELSIZE, 19, MFC_GET_CMD);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
75 spu_mfcdma32(texture+PIXELSIZE*3, addr+PIXELSIZE*3, PIXELSIZE, 20, MFC_GET_CMD);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
76 spu_writech(MFC_WrTagMask, 1 << 17);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
77 spu_mfcstat(MFC_TAG_UPDATE_ALL);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
78 spu_writech(MFC_WrTagMask, 1 << 18);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
79 spu_mfcstat(MFC_TAG_UPDATE_ALL);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
80 spu_writech(MFC_WrTagMask, 1 << 19);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
81 spu_mfcstat(MFC_TAG_UPDATE_ALL);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
82 spu_writech(MFC_WrTagMask, 1 << 20);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
83 spu_mfcstat(MFC_TAG_UPDATE_ALL);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
84 zRow_init();
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
85 linebuf_init(j);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
86 render_y = ss->sp[0].span[0].y;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
87 for(int i; i<ss->length; i++)
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
88 {
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
89 for(int t; t<ss->sp[i].info.size; t++)
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
90 {
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
91 int end = sp->span[n].length_x;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
92 Uint32 rgb;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
93 float tex1 = sp->span[n].tex_x1;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
94 float tex2= sp->span[n].tex_x2;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
95 float tey1 = sp->span[n].tex_y1;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
96 float tey2= sp->span[n].tex_y2;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
97 int tex_xpos;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
98 int tex_ypos;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
99 int tex_zpos;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
100 int x = sp->span[n].x;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
101 int y = sp->span[n].y;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
102 float z = sp->span[n].start_z;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
103 float zpos = sp->span[n].end_z;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
104 float tex_x,tex_y,tex_z;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
105
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
106 if(end == 1) {
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
107 //printf("end == 1\n");
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
108 //printf("tex_x:%f tex_y:%f\n",tex1,tex2);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
109 //if(tex1 > 1) tex1 = 1;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
110 //if(tey1 > 1) tey1 = 1;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
111 tex_xpos = (int)((sp->span[n].tex_height-1) * tex1);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
112 tex_ypos = (int)((sp->span[n].tex_width-1) * tey1);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
113 tex_zpos = (int)z;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
114 //printf("tex_xpos:%d tex_ypos:%d\n",tex_xpos,tex_ypos);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
115 //printf("image->h:%d tex_x:%f\n",(int)sp->span[n].tex_height,tex1);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
116 if(z < zRow[x][y%8]) {
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
117 rgb = get_rgb(tex_xpos,tex_ypos);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
118 //viewer->write_pixel(x,y,zpos,rgb);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
119 linebuf[j][x][y%8] = rgb;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
120 }
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
121
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
122 }else {
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
123 //printf("end != 1\n");
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
124 for(int j = 0; j < end; j++) {
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
125 tex_x = tex1*(end-1-j)/(end-1) + tex2*j/(end-1);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
126 tex_y = tey1*(end-1-j)/(end-1) + tey2*j/(end-1);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
127 tex_z = z*(end-1-j)/(end-1) + zpos*j/(end-1);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
128 if(tex_x > 1) tex_x = 1;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
129 if(tex_y > 1) tex_y = 1;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
130 tex_xpos = (int)((sp->span[n].tex_height-1) * tex_x);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
131 tex_ypos = (int)((sp->span[n].tex_width-1) * tex_y);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
132 //printf("tex_xpos:%d tex_ypos:%d\n",tex_xpos,tex_ypos);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
133 //printf("z:%f zpos:%f tex_z:%f\n",z,zpos,tex_z);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
134 //printf("tex_x:%f tex_y:%f\n",tex_x,tex_y);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
135 if(z < zRow[x][y%8]) {
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
136 rgb = get_rgb(tex_xpos,tex_ypos);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
137 linebuf[j][x][y%8] = rgb;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
138 //viewer->write_pixel(j+x,y,tex_z,rgb);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
139 }
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
140 }
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
141 }
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
142 }
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
143 writebuffer(j,fbdev_addr,render_y);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
144 }
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
145 j ^= 1;
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
146 }
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
147
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
148 void writebuffer(int i,fbdev_addr,int y) {
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
149 spu_mfcdma32(&linebuf[0][0],fbdev_addr,PIXELSIZE,21,MFC_PUT_CMD);
459f54b49648 *** empty log message ***
chiaki
parents:
diff changeset
150 }