Rev 5159 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 5159 | Rev 6172 | ||
---|---|---|---|
Line 5... | Line 5... | ||
5 | ; |
5 | ; |
6 | ;include 'zbuffer.inc' |
6 | ;include 'zbuffer.inc' |
Line 7... | Line 7... | ||
7 | 7 | ||
8 | ;output: |
8 | ;output: |
9 | ; eax - указатель на ZBuffer (0 если не удача) |
9 | ; eax - указатель на ZBuffer (0 если не удача) |
10 | align 4 |
10 | align 16 |
11 | proc ZB_open uses ecx edi, xsize:dword, ysize:dword, mode:dword,\ |
11 | proc ZB_open uses ecx edi, xsize:dword, ysize:dword, mode:dword,\ |
Line 12... | Line 12... | ||
12 | nb_colors:dword, color_indexes:dword, color_table:dword, frame_buffer:dword |
12 | nb_colors:dword, color_indexes:dword, color_table:dword, frame_buffer:dword |
13 | 13 | ||
Line 28... | Line 28... | ||
28 | and eax,not 3 |
28 | and eax,not 3 |
29 | mov [edi+offs_zbuf_linesize],eax |
29 | mov [edi+offs_zbuf_linesize],eax |
30 | mov eax,[mode] |
30 | mov eax,[mode] |
31 | mov [edi+offs_zbuf_mode],eax |
31 | mov [edi+offs_zbuf_mode],eax |
Line 32... | Line -... | ||
32 | - | ||
33 | if TGL_FEATURE_8_BITS eq 1 |
- | |
34 | cmp eax,ZB_MODE_INDEX |
- | |
35 | jne @f |
- | |
36 | ;ZB_initDither(edi, nb_colors, color_indexes, color_table); |
- | |
37 | jmp .end_s |
- | |
38 | @@: |
- | |
39 | end if |
32 | |
40 | if TGL_FEATURE_32_BITS eq 1 |
33 | if TGL_FEATURE_32_BITS eq 1 |
41 | cmp eax,ZB_MODE_RGBA |
34 | cmp eax,ZB_MODE_RGBA |
42 | je .correct |
35 | je .correct |
43 | end if |
36 | end if |
Line 81... | Line 74... | ||
81 | ret |
74 | ret |
82 | endp |
75 | endp |
Line 83... | Line 76... | ||
83 | 76 | ||
84 | ;void ZB_close(ZBuffer * zb) |
77 | ;void ZB_close(ZBuffer * zb) |
85 | ;{ |
- | |
86 | if TGL_FEATURE_8_BITS eq 1 |
- | |
87 | ; if (zb->mode == ZB_MODE_INDEX) |
- | |
88 | ; ZB_closeDither(zb); |
- | |
89 | end if |
- | |
90 | ; |
78 | ;{ |
91 | ; if (zb->frame_buffer_allocated) |
79 | ; if (zb->frame_buffer_allocated) |
92 | ; gl_free(zb->pbuf); |
80 | ; gl_free(zb->pbuf); |
93 | ; |
81 | |
94 | ; gl_free(zb->zbuf); |
82 | ; gl_free(zb->zbuf); |
95 | ; gl_free(zb); |
83 | ; gl_free(zb); |
Line 96... | Line 84... | ||
96 | ;} |
84 | ;} |
97 | 85 | ||
98 | align 4 |
86 | align 16 |
Line 99... | Line 87... | ||
99 | proc ZB_resize uses eax ebx ecx edi esi, zb:dword, frame_buffer:dword, xsize:dword, ysize:dword |
87 | proc ZB_resize uses eax ebx ecx edi esi, zb:dword, frame_buffer:dword, xsize:dword, ysize:dword |
100 | mov ebx,[zb] |
88 | mov ebx,[zb] |
Line 147... | Line 135... | ||
147 | ; int linesize) |
135 | ; int linesize) |
148 | ;{ |
136 | ;{ |
149 | ; unsigned char *p1; |
137 | ; unsigned char *p1; |
150 | ; PIXEL *q; |
138 | ; PIXEL *q; |
151 | ; int y, n; |
139 | ; int y, n; |
152 | ; |
140 | |
153 | ; q = zb->pbuf; |
141 | ; q = zb->pbuf; |
154 | ; p1 = buf; |
142 | ; p1 = buf; |
155 | ; n = zb->xsize * PSZB; |
143 | ; n = zb->xsize * PSZB; |
156 | ; for (y = 0; y < zb->ysize; y++) { |
144 | ; for (y = 0; y < zb->ysize; y++) { |
157 | ; memcpy(p1, q, n); |
145 | ; memcpy(p1, q, n); |
158 | ; p1 += linesize; |
146 | ; p1 += linesize; |
159 | ; q = (PIXEL *) ((char *) q + zb->linesize); |
147 | ; q = (PIXEL *) ((char *) q + zb->linesize); |
160 | ; } |
148 | ; } |
161 | ;} |
149 | ;} |
162 | ; |
150 | |
163 | ;#if TGL_FEATURE_RENDER_BITS == 16 |
151 | ;#if TGL_FEATURE_RENDER_BITS == 16 |
Line 164... | Line 152... | ||
164 | 152 | ||
Line 165... | Line 153... | ||
165 | ;/* 32 bpp copy */ |
153 | ;/* 32 bpp copy */ |
Line 181... | Line 169... | ||
181 | ; int linesize) |
169 | ; int linesize) |
182 | ;{ |
170 | ;{ |
183 | ; unsigned short *q; |
171 | ; unsigned short *q; |
184 | ; unsigned int *p, *p1, v, w0, w1; |
172 | ; unsigned int *p, *p1, v, w0, w1; |
185 | ; int y, n; |
173 | ; int y, n; |
186 | ; |
174 | |
187 | ; q = zb->pbuf; |
175 | ; q = zb->pbuf; |
188 | ; p1 = (unsigned int *) buf; |
176 | ; p1 = (unsigned int *) buf; |
189 | ; |
177 | |
190 | ; for (y = 0; y < zb->ysize; y++) { |
178 | ; for (y = 0; y < zb->ysize; y++) { |
191 | ; p = p1; |
179 | ; p = p1; |
192 | ; n = zb->xsize >> 2; |
180 | ; n = zb->xsize >> 2; |
193 | ; do { |
181 | ; do { |
194 | ; v = *(unsigned int *) q; |
182 | ; v = *(unsigned int *) q; |
Line 197... | Line 185... | ||
197 | ;#else |
185 | ;#else |
198 | ; RGB16_TO_RGB32(w0, w1, v); |
186 | ; RGB16_TO_RGB32(w0, w1, v); |
199 | ;#endif |
187 | ;#endif |
200 | ; p[0] = w0; |
188 | ; p[0] = w0; |
201 | ; p[1] = w1; |
189 | ; p[1] = w1; |
202 | ; |
190 | |
203 | ; v = *(unsigned int *) (q + 2); |
191 | ; v = *(unsigned int *) (q + 2); |
204 | ;#if BYTE_ORDER == BIG_ENDIAN |
192 | ;#if BYTE_ORDER == BIG_ENDIAN |
205 | ; RGB16_TO_RGB32(w1, w0, v); |
193 | ; RGB16_TO_RGB32(w1, w0, v); |
206 | ;#else |
194 | ;#else |
207 | ; RGB16_TO_RGB32(w0, w1, v); |
195 | ; RGB16_TO_RGB32(w0, w1, v); |
208 | ;#endif |
196 | ;#endif |
209 | ; p[2] = w0; |
197 | ; p[2] = w0; |
210 | ; p[3] = w1; |
198 | ; p[3] = w1; |
211 | ; |
199 | |
212 | ; q += 4; |
200 | ; q += 4; |
213 | ; p += 4; |
201 | ; p += 4; |
214 | ; } while (--n > 0); |
202 | ; } while (--n > 0); |
215 | ; |
203 | |
216 | ; p1 += linesize; |
204 | ; p1 += linesize; |
217 | ; } |
205 | ; } |
218 | ;} |
206 | ;} |
Line 219... | Line 207... | ||
219 | 207 | ||
Line 270... | Line 258... | ||
270 | ; void *buf, int linesize) |
258 | ; void *buf, int linesize) |
271 | ;{ |
259 | ;{ |
272 | ; unsigned short *q; |
260 | ; unsigned short *q; |
273 | ; unsigned int *p, *p1, w0, w1, w2, v0, v1; |
261 | ; unsigned int *p, *p1, w0, w1, w2, v0, v1; |
274 | ; int y, n; |
262 | ; int y, n; |
275 | ; |
263 | |
276 | ; q = zb->pbuf; |
264 | ; q = zb->pbuf; |
277 | ; p1 = (unsigned int *) buf; |
265 | ; p1 = (unsigned int *) buf; |
278 | ; linesize = linesize * 3; |
266 | ; linesize = linesize * 3; |
279 | ; |
267 | |
280 | ; for (y = 0; y < zb->ysize; y++) { |
268 | ; for (y = 0; y < zb->ysize; y++) { |
281 | ; p = p1; |
269 | ; p = p1; |
282 | ; n = zb->xsize >> 2; |
270 | ; n = zb->xsize >> 2; |
283 | ; do { |
271 | ; do { |
284 | ; v0 = *(unsigned int *) q; |
272 | ; v0 = *(unsigned int *) q; |
Line 300... | Line 288... | ||
300 | 288 | ||
301 | ;void ZB_copyFrameBuffer(ZBuffer * zb, void *buf, |
289 | ;void ZB_copyFrameBuffer(ZBuffer * zb, void *buf, |
302 | ; int linesize) |
290 | ; int linesize) |
303 | ;{ |
291 | ;{ |
304 | ; switch (zb->mode) { |
- | |
305 | ;#ifdef TGL_FEATURE_8_BITS |
- | |
306 | ; case ZB_MODE_INDEX: |
- | |
307 | ; ZB_ditherFrameBuffer(zb, buf, linesize >> 1); |
- | |
308 | ; break; |
- | |
309 | ;#endif |
- | |
310 | ;#ifdef TGL_FEATURE_16_BITS |
- | |
311 | ; case ZB_MODE_5R6G5B: |
- | |
312 | ; ZB_copyBuffer(zb, buf, linesize); |
- | |
313 | ; break; |
- | |
314 | ;#endif |
292 | ; switch (zb->mode) { |
315 | ;#ifdef TGL_FEATURE_32_BITS |
293 | ;#ifdef TGL_FEATURE_32_BITS |
316 | ; case ZB_MODE_RGBA: |
294 | ; case ZB_MODE_RGBA: |
317 | ; ZB_copyFrameBufferRGB32(zb, buf, linesize >> 1); |
295 | ; ZB_copyFrameBufferRGB32(zb, buf, linesize >> 1); |
318 | ; break; |
296 | ; break; |
Line 339... | Line 317... | ||
339 | ; void *buf, int linesize) |
317 | ; void *buf, int linesize) |
340 | ;{ |
318 | ;{ |
341 | ; PIXEL *q; |
319 | ; PIXEL *q; |
342 | ; unsigned short *p, *p1; |
320 | ; unsigned short *p, *p1; |
343 | ; int y, n; |
321 | ; int y, n; |
344 | ; |
322 | |
345 | ; q = zb->pbuf; |
323 | ; q = zb->pbuf; |
346 | ; p1 = (unsigned short *) buf; |
324 | ; p1 = (unsigned short *) buf; |
347 | ; |
325 | |
348 | ; for (y = 0; y < zb->ysize; y++) { |
326 | ; for (y = 0; y < zb->ysize; y++) { |
349 | ; p = p1; |
327 | ; p = p1; |
350 | ; n = zb->xsize >> 2; |
328 | ; n = zb->xsize >> 2; |
351 | ; do { |
329 | ; do { |
352 | ; p[0] = RGB24_TO_RGB16(q[0], q[1], q[2]); |
330 | ; p[0] = RGB24_TO_RGB16(q[0], q[1], q[2]); |
Line 362... | Line 340... | ||
362 | 340 | ||
363 | ;void ZB_copyFrameBuffer(ZBuffer * zb, void *buf, |
341 | ;void ZB_copyFrameBuffer(ZBuffer * zb, void *buf, |
364 | ; int linesize) |
342 | ; int linesize) |
365 | ;{ |
343 | ;{ |
366 | ; switch (zb->mode) { |
- | |
367 | ;#ifdef TGL_FEATURE_16_BITS |
- | |
368 | ; case ZB_MODE_5R6G5B: |
- | |
369 | ; ZB_copyFrameBuffer5R6G5B(zb, buf, linesize); |
- | |
370 | ; break; |
- | |
371 | ;#endif |
344 | ; switch (zb->mode) { |
372 | ;#ifdef TGL_FEATURE_24_BITS |
345 | ;#ifdef TGL_FEATURE_24_BITS |
373 | ; case ZB_MODE_RGB24: |
346 | ; case ZB_MODE_RGB24: |
374 | ; ZB_copyBuffer(zb, buf, linesize); |
347 | ; ZB_copyBuffer(zb, buf, linesize); |
375 | ; break; |
348 | ; break; |
Line 391... | Line 364... | ||
391 | ; void *buf, int linesize) |
364 | ; void *buf, int linesize) |
392 | ;{ |
365 | ;{ |
393 | ; PIXEL *q; |
366 | ; PIXEL *q; |
394 | ; unsigned short *p, *p1; |
367 | ; unsigned short *p, *p1; |
395 | ; int y, n; |
368 | ; int y, n; |
396 | ; |
369 | |
397 | ; q = zb->pbuf; |
370 | ; q = zb->pbuf; |
398 | ; p1 = (unsigned short *) buf; |
371 | ; p1 = (unsigned short *) buf; |
399 | ; |
372 | |
400 | ; for (y = 0; y < zb->ysize; y++) { |
373 | ; for (y = 0; y < zb->ysize; y++) { |
401 | ; p = p1; |
374 | ; p = p1; |
402 | ; n = zb->xsize >> 2; |
375 | ; n = zb->xsize >> 2; |
403 | ; do { |
376 | ; do { |
404 | ; p[0] = RGB32_TO_RGB16(q[0]); |
377 | ; p[0] = RGB32_TO_RGB16(q[0]); |
Line 409... | Line 382... | ||
409 | ; p += 4; |
382 | ; p += 4; |
410 | ; } while (--n > 0); |
383 | ; } while (--n > 0); |
411 | ; p1 = (unsigned short *)((char *)p1 + linesize); |
384 | ; p1 = (unsigned short *)((char *)p1 + linesize); |
412 | ; } |
385 | ; } |
413 | ;} |
386 | ;} |
414 | ; |
387 | |
415 | ;void ZB_copyFrameBuffer(ZBuffer * zb, void *buf, |
388 | ;void ZB_copyFrameBuffer(ZBuffer * zb, void *buf, |
416 | ; int linesize) |
389 | ; int linesize) |
417 | ;{ |
390 | ;{ |
418 | ; switch (zb->mode) { |
391 | ; switch (zb->mode) { |
419 | ;#ifdef TGL_FEATURE_16_BITS |
- | |
420 | ; case ZB_MODE_5R6G5B: |
- | |
421 | ; ZB_copyFrameBuffer5R6G5B(zb, buf, linesize); |
- | |
422 | ; break; |
- | |
423 | ;#endif |
- | |
424 | ;#ifdef TGL_FEATURE_32_BITS |
392 | ;#ifdef TGL_FEATURE_32_BITS |
425 | ; case ZB_MODE_RGBA: |
393 | ; case ZB_MODE_RGBA: |
426 | ; ZB_copyBuffer(zb, buf, linesize); |
394 | ; ZB_copyBuffer(zb, buf, linesize); |
427 | ; break; |
395 | ; break; |
428 | ;#endif |
396 | ;#endif |
429 | ; default: |
397 | ; default: |
430 | ; assert(0); |
398 | ; assert(0); |
431 | ; } |
399 | ; } |
432 | ;} |
400 | ;} |
433 | ; |
401 | |
434 | ;#endif /* TGL_FEATURE_RENDER_BITS == 32 */ |
402 | ;#endif /* TGL_FEATURE_RENDER_BITS == 32 */ |
Line 435... | Line 403... | ||
435 | 403 | ||
436 | 404 | ||
437 | ; |
405 | ; |
- | 406 | ; adr must be aligned on an 'int' |
|
- | 407 | ; |
|
438 | ; adr must be aligned on an 'int' |
408 | ;destroy: |
439 | ; |
409 | ; ecx, edi |
440 | align 4 |
410 | align 16 |
441 | proc memset_s uses eax ecx edi, adr:dword, val:dword, count:dword |
411 | proc memset_s uses eax, adr:dword, val:dword, count:dword |
442 | mov eax,[val] |
412 | mov eax,[val] |
443 | mov di,ax |
413 | mov di,ax |
444 | ror eax,16 |
414 | ror eax,16 |
Line 453... | Line 423... | ||
453 | stosw |
423 | stosw |
454 | @@: |
424 | @@: |
455 | ret |
425 | ret |
456 | endp |
426 | endp |
Line 457... | Line 427... | ||
457 | 427 | ||
458 | align 4 |
428 | align 16 |
459 | proc memset_l uses eax ecx edi, adr:dword, val:dword, count:dword |
429 | proc memset_l uses eax ecx edi, adr:dword, val:dword, count:dword |
460 | mov eax,[val] |
430 | mov eax,[val] |
461 | mov ecx,[count] |
431 | mov ecx,[count] |
462 | mov edi,[adr] |
432 | mov edi,[adr] |
463 | rep stosd |
433 | rep stosd |
464 | ret |
434 | ret |
Line 465... | Line 435... | ||
465 | endp |
435 | endp |
- | 436 | ||
- | 437 | ; count must be a multiple of 4 and >= 4 |
|
466 | 438 | ;destroy: |
|
467 | ; count must be a multiple of 4 and >= 4 |
439 | ; edi, esi |
468 | align 4 |
440 | align 16 |
469 | proc memset_RGB24 uses eax ecx edi esi, adr:dword, r:dword, g:dword, b:dword, count:dword |
441 | proc memset_RGB24 uses eax ecx, adr:dword, r:dword, g:dword, b:dword, count:dword |
470 | mov esi,[adr] |
442 | mov esi,[adr] |
471 | mov eax,[r] ;копируем в буфер первые 12 байт (минимальное число кратное 3 и 4) |
443 | mov eax,[r] ;копируем в буфер первые 12 байт (минимальное число кратное 3 и 4) |
472 | mov byte[esi],al |
444 | mov byte[esi],al |
Line 499... | Line 471... | ||
499 | mov esi,ecx |
471 | mov esi,ecx |
500 | shl ecx,2 |
472 | shl ecx,2 |
501 | sub ecx,esi ;ecx*=3 |
473 | sub ecx,esi ;ecx*=3 |
502 | rep stosd |
474 | rep stosd |
503 | jmp .end_f |
475 | jmp .end_f |
504 | @@: |
476 | align 16 |
505 | - | ||
506 | ;если r!=g или g!=b или b!=r |
477 | @@: ;если r!=g или g!=b или b!=r |
507 | @@: |
- | |
508 | movsd |
478 | movsd |
509 | movsd |
479 | movsd |
510 | movsd |
480 | movsd |
511 | sub esi,12 |
481 | sub esi,12 |
512 | loop @b |
482 | loop @b |
513 | .end_f: |
483 | .end_f: |
514 | ret |
484 | ret |
515 | endp |
485 | endp |
Line 516... | Line 486... | ||
516 | 486 | ||
517 | align 4 |
487 | align 16 |
518 | proc ZB_clear uses eax ebx ecx, zb:dword, clear_z:dword, z:dword, clear_color:dword,\ |
488 | proc ZB_clear uses eax ebx ecx edi esi, zb:dword, clear_z:dword, z:dword,\ |
519 | r:dword, g:dword, b:dword |
489 | clear_color:dword, r:dword, g:dword, b:dword |
520 | ;if TGL_FEATURE_RENDER_BITS != 24 |
490 | ;if TGL_FEATURE_RENDER_BITS != 24 |
521 | ; color dd ? |
491 | ; color dd ? |
Line 522... | Line 492... | ||
522 | ;end if |
492 | ;end if |
Line 544... | Line 514... | ||
544 | push ebx |
514 | push ebx |
545 | add esp,16 |
515 | add esp,16 |
546 | end if |
516 | end if |
547 | mov ebx,[eax+offs_zbuf_pbuf] |
517 | mov ebx,[eax+offs_zbuf_pbuf] |
548 | mov ecx,[eax+offs_zbuf_ysize] |
518 | mov ecx,[eax+offs_zbuf_ysize] |
- | 519 | align 4 |
|
549 | .cycle_0: |
520 | .cycle_0: |
550 | if (TGL_FEATURE_RENDER_BITS eq 15) ;or (TGL_FEATURE_RENDER_BITS eq 16) |
- | |
551 | ;color = RGB_TO_PIXEL(r, g, b); |
- | |
552 | ;memset_s(ebx, color, zb->xsize); |
- | |
553 | end if |
- | |
554 | if TGL_FEATURE_RENDER_BITS eq 32 |
521 | if TGL_FEATURE_RENDER_BITS eq 32 |
555 | ;color = RGB_TO_PIXEL(r, g, b); |
522 | ;color = RGB_TO_PIXEL(r, g, b) |
556 | ;memset_l(ebx, color, zb->xsize); |
523 | ;memset_l(ebx, color, zb->xsize) |
557 | end if |
524 | end if |
558 | if TGL_FEATURE_RENDER_BITS eq 24 |
525 | if TGL_FEATURE_RENDER_BITS eq 24 |
559 | sub esp,16 |
526 | sub esp,16 |
560 | stdcall memset_RGB24,ebx |
527 | stdcall memset_RGB24,ebx |
561 | end if |
528 | end if |