annotate TaskManager/Test/simple_render/spe/SpuDraw.cpp @ 176:08e2bb36639b

fix
author gongo@localhost.localdomain
date Tue, 16 Dec 2008 17:01:24 +0900
parents 5c194c71eca8
children 58fd16298954
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
99
57bac9e07662 rotate cube only polygon
gongo
parents: 94
diff changeset
1 #include <malloc.h>
94
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
2 #include <stdio.h>
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
3 #include <stdlib.h>
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
4 #include <string.h>
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
5 #include <spu_mfcio.h>
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
6 #include "SpuDraw.h"
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
7 #include "polygon_pack.h"
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
8 #include "SpanPack.h"
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
9 #include "SpanPackList.h"
94
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
10 #include "error.h"
99
57bac9e07662 rotate cube only polygon
gongo
parents: 94
diff changeset
11 #include "CellScheduler.h"
94
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
12
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
13 #define PIXELSIZE 11520 //32 line pixel size
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
14
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
15 // 本来なら PPE から受け取る情報です
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
16 #define FRAMEBUFFER_X 1920
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
17 #define FRAMEBUFFER_Y 1080
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
18
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
19 // IMG_MAX_X x 8 が、spe が持てる 最大
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
20 // 現在、1920x8の zBuf は持てない
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
21 #define IMG_MAX_X 720
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
22
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
23 #define SPAN_PACK_LOAD 20
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
24
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
25 /**
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
26 * SpanPack にある Span が持つ y 座標は
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
27 * .. [-16 ~ -9] [-8 ~ -1] [0 ~ 7] [8 ~ 16] ..
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
28 * のどれかの区域に入るように Pack されている。
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
29 * sp->span[0].y から、その区域の一番上の y 座標を求める。
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
30 */
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
31 #define YTOP(y) (y &~(TEXTURE_SPLIT_PIXEL-1))
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
32 #define YOFF(y) (y & (TEXTURE_SPLIT_PIXEL-1))
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
33
94
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
34 SpuDraw::~SpuDraw(void)
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
35 {
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
36 //free(zRow);
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
37 free(linebuf);
94
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
38 }
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
39
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
40 void
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
41 SpuDraw::linebuf_init(int rgb)
94
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
42 {
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
43 int y = TEXTURE_SPLIT_PIXEL;
99
57bac9e07662 rotate cube only polygon
gongo
parents: 94
diff changeset
44 int x = IMG_MAX_X;
94
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
45
99
57bac9e07662 rotate cube only polygon
gongo
parents: 94
diff changeset
46 linebuf = (int*)memalign(DEFAULT_ALIGNMENT, sizeof(int)*x*y);
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
47 #if 1
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
48 // memset は 1 バイトで描き込むから
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
49 // 0x12345678 とか渡しても 0x12 (0x78だったかな) でしか
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
50 // 描かないんだなー
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
51 memset(linebuf, rgb, sizeof(int)*x*y);
102
62679f4cae18 tag:first_render_with_spe fix
gongo
parents: 100
diff changeset
52 //bzero(linebuf, sizeof(int)*x*y);
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
53 #else
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
54 for (int i = 0; i < x*y; i++) {
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
55 linebuf[i] = rgb;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
56 }
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
57 #endif
94
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
58 }
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
59
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
60 void
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
61 SpuDraw::zRow_init(void)
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
62 {
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
63 int y = TEXTURE_SPLIT_PIXEL;
99
57bac9e07662 rotate cube only polygon
gongo
parents: 94
diff changeset
64 int x = IMG_MAX_X;
105
3e331f7576a1 *** empty log message ***
gongo
parents: 102
diff changeset
65 float z = 65535.0f;
3e331f7576a1 *** empty log message ***
gongo
parents: 102
diff changeset
66 int length = x*y;
3e331f7576a1 *** empty log message ***
gongo
parents: 102
diff changeset
67
3e331f7576a1 *** empty log message ***
gongo
parents: 102
diff changeset
68 zRow = (float*)malloc(sizeof(float)*length);
94
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
69
105
3e331f7576a1 *** empty log message ***
gongo
parents: 102
diff changeset
70 #if 1
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
71 vector float indx = {0.0f, 0.0f, 0.0f, 0.0f};
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
72 vector float maxf = {z, z, z, z};
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
73 vector float *vbuf;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
74
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
75 int i;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
76 for (i = 0; i < length - 4; i += 4) {
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
77 vbuf = (vector float*)&zRow[i];
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
78 *vbuf = spu_madd(*vbuf, indx, maxf);
105
3e331f7576a1 *** empty log message ***
gongo
parents: 102
diff changeset
79 }
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
80
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
81 for (; i < length; i++) {
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
82 zRow[i] = z;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
83 }
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
84 #else
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
85 for (int i = 0; i < length; i++) {
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
86 zRow[i] = z;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
87 }
105
3e331f7576a1 *** empty log message ***
gongo
parents: 102
diff changeset
88 #endif
94
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
89 }
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
90
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
91
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
92 char*
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
93 SpuDraw::get_pixel(int tx, int ty, void *texture_image)
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
94 {
99
57bac9e07662 rotate cube only polygon
gongo
parents: 94
diff changeset
95 //return (char*)texture_image->pixels+(texture_image->format->BytesPerPixel*((texture_image->w)*ty+tx));
57bac9e07662 rotate cube only polygon
gongo
parents: 94
diff changeset
96 return (char*)texture_image+(3*((128)*ty+tx));
94
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
97 }
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
98
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
99 Uint32
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
100 SpuDraw::get_rgb(int tx, int ty, void *texture)
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
101 {
99
57bac9e07662 rotate cube only polygon
gongo
parents: 94
diff changeset
102 Uint8 red, green, blue, alpha;
94
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
103
99
57bac9e07662 rotate cube only polygon
gongo
parents: 94
diff changeset
104 if (tx<0) tx = 0;
57bac9e07662 rotate cube only polygon
gongo
parents: 94
diff changeset
105 if (128-1< tx) tx = 128-1 ;
57bac9e07662 rotate cube only polygon
gongo
parents: 94
diff changeset
106 if (ty<0) ty = 0;
57bac9e07662 rotate cube only polygon
gongo
parents: 94
diff changeset
107 if (128-1< ty) ty = 128-1 ;
57bac9e07662 rotate cube only polygon
gongo
parents: 94
diff changeset
108
57bac9e07662 rotate cube only polygon
gongo
parents: 94
diff changeset
109 char *p = get_pixel(tx,ty,texture);
94
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
110
99
57bac9e07662 rotate cube only polygon
gongo
parents: 94
diff changeset
111 blue = (Uint8) p[0];
57bac9e07662 rotate cube only polygon
gongo
parents: 94
diff changeset
112 green = (Uint8) p[1];
57bac9e07662 rotate cube only polygon
gongo
parents: 94
diff changeset
113 red = (Uint8) p[2];
57bac9e07662 rotate cube only polygon
gongo
parents: 94
diff changeset
114 alpha = 255;
94
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
115
102
62679f4cae18 tag:first_render_with_spe fix
gongo
parents: 100
diff changeset
116 return (red & 0xff) * 0x10000 + (green & 0xff) * 0x100
62679f4cae18 tag:first_render_with_spe fix
gongo
parents: 100
diff changeset
117 + (blue & 0xff) + (alpha << 24);
94
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
118 }
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
119
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
120 int
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
121 SpuDraw::run(void *rbuf, void *writebuf)
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
122 {
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
123 SpanPack *sp = (SpanPack*)rbuf;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
124 SpanPack *next_sp = (SpanPack*)memalign(16, sizeof(SpanPack));
102
62679f4cae18 tag:first_render_with_spe fix
gongo
parents: 100
diff changeset
125
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
126 SpanPack *free_sp = next_sp; // free()用
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
127 SpanPack *tmp_sp = NULL;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
128 unsigned int fbdev_addr = task->out_addr;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
129 Span *span;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
130 int width = IMG_MAX_X;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
131 int linebuf_rgb;
94
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
132
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
133 zRow = NULL;
94
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
134
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
135 dma_tags = 0;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
136
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
137 __debug("[SpuDraw]:%s\n", __FUNCTION__);
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
138
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
139 int render_y = 0;
99
57bac9e07662 rotate cube only polygon
gongo
parents: 94
diff changeset
140
57bac9e07662 rotate cube only polygon
gongo
parents: 94
diff changeset
141 render_y = sp->span[0].y;
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
142 render_y = YTOP(render_y);
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
143 //render_y += FRAMEBUFFER_Y/2;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
144
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
145 if (sp->info.size < 0) {
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
146 // 塗りつぶしSpan
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
147 // あとでちゃんと定義すべし
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
148 // むしろ別Class で作る方がいいか。
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
149 linebuf_rgb = 0xffffff;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
150 linebuf_init(linebuf_rgb);
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
151 goto WRITE;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
152 } else {
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
153 linebuf_rgb = 0x000000;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
154 linebuf_init(linebuf_rgb);
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
155 }
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
156 zRow_init();
94
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
157
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
158
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
159 /**
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
160 * SpanPack->next が存在する場合が有るので
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
161 * 現在の SpanPack を処理してる間に
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
162 * 次の SpanPack の DMA 転送を行っています
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
163 */
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
164 do {
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
165 if (sp->next != NULL) {
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
166 connector->dma_load(next_sp, (uint32)sp->next, sizeof(SpanPack),
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
167 SPAN_PACK_LOAD);
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
168 } else {
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
169 next_sp = NULL;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
170 }
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
171
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
172 for (int t = 0; t < sp->info.size; t++) {
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
173 span = &sp->span[t];
99
57bac9e07662 rotate cube only polygon
gongo
parents: 94
diff changeset
174
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
175 int end = span->length_x;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
176 Uint32 rgb = 0x00ff00;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
177 float tex1 = span->tex_x1;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
178 float tex2 = span->tex_x2;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
179 float tey1 = span->tex_y1;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
180 float tey2 = span->tex_y2;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
181 int tex_xpos;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
182 int tex_ypos;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
183 int tex_zpos;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
184 int x = span->x;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
185 int y = span->y;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
186 float z = span->start_z;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
187 float zpos = span->end_z;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
188 float tex_x, tex_y, tex_z;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
189
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
190 if (end == 1) {
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
191 tex_xpos = (int)((span->tex_height-1) * tex1);
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
192 tex_ypos = (int)((span->tex_width-1) * tey1);
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
193 tex_zpos = (int)z;
94
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
194
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
195 if (zpos < zRow[x + (width * YOFF(y))]) {
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
196 rgb = get_rgb(tex_xpos, tex_ypos, CellScheduler::tex);
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
197 zRow[x + (width * YOFF(y))] = zpos;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
198 linebuf[x + (width * YOFF(y))] = rgb;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
199 }
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
200 } else {
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
201 for (int j = 0; j < end; j++) {
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
202 tex_x = tex1*(end-1-j)/(end-1) + tex2*j/(end-1);
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
203 tex_y = tey1*(end-1-j)/(end-1) + tey2*j/(end-1);
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
204 tex_z = z*(end-1-j)/(end-1) + zpos*j/(end-1);
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
205 if (tex_x > 1) tex_x = 1;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
206 if (tex_y > 1) tex_y = 1;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
207 tex_xpos = (int)((span->tex_height-1) * tex_x);
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
208 tex_ypos = (int)((span->tex_width-1) * tex_y);
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
209
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
210 if (tex_z < zRow[x + j + (width * YOFF(y))]) {
100
9f8b53beef7e *** empty log message ***
gongo
parents: 99
diff changeset
211 rgb = get_rgb(tex_xpos,tex_ypos,CellScheduler::tex);
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
212 zRow[x + j + (width * YOFF(y))] = tex_z;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
213 linebuf[x + j + (width * YOFF(y))] = rgb;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
214 }
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
215 }
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
216 }
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
217 }
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
218
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
219 connector->dma_wait(SPAN_PACK_LOAD);
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
220 tmp_sp = sp;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
221 sp = next_sp;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
222 next_sp = tmp_sp;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
223 } while (sp);
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
224
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
225 WRITE:
102
62679f4cae18 tag:first_render_with_spe fix
gongo
parents: 100
diff changeset
226 writebuffer(fbdev_addr, render_y);
94
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
227
99
57bac9e07662 rotate cube only polygon
gongo
parents: 94
diff changeset
228 free(rbuf);
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
229 free(free_sp);
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
230 if (zRow != NULL) free(zRow);
102
62679f4cae18 tag:first_render_with_spe fix
gongo
parents: 100
diff changeset
231
99
57bac9e07662 rotate cube only polygon
gongo
parents: 94
diff changeset
232 return 0;
94
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
233 }
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
234
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
235 void
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
236 SpuDraw::writebuffer(unsigned int fbdev_addr, int y)
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
237 {
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
238 int end_y;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
239 int start_y;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
240
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
241 // 画面上の領域に描き込まないように
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
242 // ・・・なんか変だな。
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
243 // とりあえず if 文どうにかしようぜ俺
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
244
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
245 if (y < 0) {
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
246 if (y + TEXTURE_SPLIT_PIXEL < 0) {
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
247 return;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
248 } else {
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
249 start_y = -y;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
250 }
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
251 } else {
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
252 start_y = 0;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
253 }
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
254
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
255 // 画面下の領域に書き込まないように
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
256 end_y = FRAMEBUFFER_Y - y + TEXTURE_SPLIT_PIXEL;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
257 end_y = (end_y < 0) ? TEXTURE_SPLIT_PIXEL + end_y : TEXTURE_SPLIT_PIXEL;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
258
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
259 for (int i = start_y; i < end_y; i++) {
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
260 spu_mfcdma32(&linebuf[i*IMG_MAX_X], fbdev_addr + (4*FRAMEBUFFER_X*(y+i)),
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
261 sizeof(int)*IMG_MAX_X, i+5, MFC_PUT_CMD);
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
262 dma_tags |= 1 << (i+5);
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
263 }
94
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
264 }
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
265
102
62679f4cae18 tag:first_render_with_spe fix
gongo
parents: 100
diff changeset
266 void
62679f4cae18 tag:first_render_with_spe fix
gongo
parents: 100
diff changeset
267 SpuDraw::write(void)
62679f4cae18 tag:first_render_with_spe fix
gongo
parents: 100
diff changeset
268 {
62679f4cae18 tag:first_render_with_spe fix
gongo
parents: 100
diff changeset
269 SchedTask::write();
62679f4cae18 tag:first_render_with_spe fix
gongo
parents: 100
diff changeset
270
105
3e331f7576a1 *** empty log message ***
gongo
parents: 102
diff changeset
271 spu_writech(MFC_WrTagMask, dma_tags);
3e331f7576a1 *** empty log message ***
gongo
parents: 102
diff changeset
272 spu_mfcstat(MFC_TAG_UPDATE_ALL);
102
62679f4cae18 tag:first_render_with_spe fix
gongo
parents: 100
diff changeset
273 }
94
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
274
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
275 SchedTask*
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
276 createTask_spuDraw(TaskListPtr _taskList, TaskPtr _task,
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
277 void *rbuff, void *wbuff, DmaManager *dma)
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
278 {
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 105
diff changeset
279 rbuff = memalign(16, sizeof(SpanPack));
99
57bac9e07662 rotate cube only polygon
gongo
parents: 94
diff changeset
280
57bac9e07662 rotate cube only polygon
gongo
parents: 94
diff changeset
281 return new SpuDraw(_taskList, _task, rbuff, wbuff, dma);
94
588ab5f0e659 *** empty log message ***
gongo
parents:
diff changeset
282 }