Subversion Repositories Kolibri OS

Rev

Rev 5353 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5353 Rev 5380
Line 304... Line 304...
304
	stdcall gl_add_op,eax
304
	stdcall gl_add_op,eax
305
	ret
305
	ret
306
endp
306
endp
Line 307... Line 307...
307
 
307
 
308
align 4
308
align 4
309
proc glopDrawElements uses eax ebx edx, context:dword, param:dword
309
proc glopDrawElements, context:dword, param:dword
-
 
310
locals
-
 
311
	ii dd ?
-
 
312
	idx dd ?
-
 
313
	states dd ?
-
 
314
	type dd ?
-
 
315
	size dd ?
310
locals
316
	indices dd ? ;указатель на 16 или 32 битные индексы
311
	p rd 8
317
	p rd 8
312
endl
318
endl
313
 
319
pushad
314
	mov edx,[context]
320
	mov edx,[context]
315
	mov ebx,[param]
-
 
316
  ;int i;
-
 
317
  ;int idx;
321
	mov ebx,[param]
318
  ;int states = c->client_states;
-
 
319
  ;int count = param[2].i;
322
	mov eax,[edx+offs_cont_client_states]
320
  ;int type = param[3].i;
-
 
321
  ;unsigned int *indices_u32 = (unsigned int*)param[4].p;
-
 
322
  ;unsigned short *indices_u16 = (unsigned short*)indices_u32;
-
 
323
 
323
	mov [states],eax
324
	mov eax,[ebx+4]
324
	mov eax,[ebx+4]
-
 
325
	mov [p+4],eax ;p[1].i = param[1].i
-
 
326
	mov ecx,[ebx+8] ;count = param[2].i
-
 
327
	mov eax,[ebx+12]
-
 
328
	mov [type],eax ;type = param[3].i
-
 
329
	mov eax,[ebx+16]
325
	mov [p+4],eax ;p[1].i = param[1].i
330
	mov [indices],eax ;*indices = param[4].p
326
	mov eax,ebp
331
	mov eax,ebp
327
	sub eax,32 ;=sizeof(dd)*8
332
	sub eax,32 ;=sizeof(dd)*8
Line -... Line 333...
-
 
333
	stdcall glopBegin, edx,eax
-
 
334
 
328
	stdcall glopBegin, edx,eax
335
	mov dword[ii],0
-
 
336
align 4
-
 
337
	.cycle_0: ;for (int ii=0; ii
-
 
338
	cmp dword[ii],ecx
329
 
339
	jge .cycle_0_end
-
 
340
		mov esi,[ii]
-
 
341
		cmp dword[type],GL_UNSIGNED_INT
-
 
342
		jne @f
-
 
343
			shl esi,2
-
 
344
			add esi,[indices]
-
 
345
			mov esi,[esi]
-
 
346
			jmp .end_0
-
 
347
		@@:
-
 
348
			shl esi,1
-
 
349
			add esi,[indices]
-
 
350
			movzx esi,word[esi]
-
 
351
		.end_0:
330
;  for (int ii=0; ii
352
		mov [idx],esi
331
;    idx = (type == GL_UNSIGNED_INT) ? indices_u32[ii] : indices_u16[ii];
353
 
332
;    if (states & COLOR_ARRAY) {
354
		bt dword[states],1 ;2^1=COLOR_ARRAY
-
 
355
		jnc @f
333
;      GLParam p[5];
356
			mov esi,[edx+offs_cont_color_array_size]
-
 
357
			mov [size],esi
-
 
358
			add esi,[edx+offs_cont_color_array_stride]
334
;      int size = c->color_array_size; 
359
			imul esi,[idx] ;esi = i
-
 
360
			shl esi,2
-
 
361
			add esi,[edx+offs_cont_color_array] ;esi = &context.color_array[i]
-
 
362
			mov edi,ebp
335
;      i = idx * (size + c->color_array_stride);
363
			sub edi,28 ;edi = &p[1]
-
 
364
			mov ebx,[esi+8]
336
;      p[1].f = c->color_array[i];
365
			mov [edi],ebx   ;p[1].f = context.color_array[i+2]
-
 
366
			mov ebx,[esi+4]
337
;      p[2].f = c->color_array[i+1];
367
			mov [edi+4],ebx ;p[2].f = context.color_array[i+1]
-
 
368
			mov ebx,[esi]
338
;      p[3].f = c->color_array[i+2];
369
			mov [edi+8],ebx ;p[3].f = context.color_array[i]
-
 
370
			add edi,12
-
 
371
			cmp dword[size],3
-
 
372
			jle .e1
-
 
373
				add esi,12
-
 
374
				movsd
-
 
375
				jmp .e2
-
 
376
			.e1:
-
 
377
				mov dword[edi],1.0 ;если задано 3 параметра, то 4-й ставим по умолчанию 1.0
-
 
378
			.e2:
-
 
379
			mov edi,ebp
-
 
380
			sub edi,32 ;edi = &p[0]
-
 
381
			mov ebx,ebp
-
 
382
			sub ebx,12 ;ebp-12 = &p[5]
-
 
383
			push ebx
-
 
384
			add ebx,4 ;ebp-8 = &p[6]
-
 
385
			push ebx
-
 
386
			add ebx,4 ;ebp-4 = &p[7]
-
 
387
			push ebx
339
;      p[4].f = size > 3 ? c->color_array[i+3] : 1.0f;
388
			stdcall RGBFtoRGBI,[edi+12],[edi+8],[edi+4] ;call: r,g,b,&p[7],&p[6],&p[5]
340
;      glopColor(c, p);  
389
			stdcall glopColor, edx,edi ;(context, p(op,rf,gf,bf,af,ri,gi,bi)) 
-
 
390
		@@:
341
;    }
391
		bt dword[states],2 ;2^2=NORMAL_ARRAY
-
 
392
		jnc @f
342
;    if (states & NORMAL_ARRAY) {
393
			mov esi,[edx+offs_cont_normal_array_stride]
-
 
394
			add esi,3
343
;      i = idx * (3 + c->normal_array_stride);
395
			imul esi,[idx] ;esi = idx * (3 + context.normal_array_stride)
-
 
396
			shl esi,2
-
 
397
			add esi,[edx+offs_cont_normal_array]
344
;      c->current_normal.X = c->normal_array[i];
398
			mov edi,edx
-
 
399
			add edi,offs_cont_current_normal
-
 
400
			movsd ;context.current_normal.X = context.normal_array[i]
345
;      c->current_normal.Y = c->normal_array[i+1];
401
			movsd
346
;      c->current_normal.Z = c->normal_array[i+2];
402
			movsd
347
;      c->current_normal.W = 0.0f;
403
			mov dword[edi],0.0 ;context.current_normal.W = 0.0f
-
 
404
		@@:
348
;    }
405
		bt dword[states],3 ;2^3=TEXCOORD_ARRAY
-
 
406
		jnc @f
349
;    if (states & TEXCOORD_ARRAY) {
407
			mov esi,[edx+offs_cont_texcoord_array_size]
-
 
408
			mov [size],esi
-
 
409
			add esi,[edx+offs_cont_texcoord_array_stride]
350
;      int size = c->texcoord_array_size;
410
			imul esi,[idx] ;esi = i
-
 
411
			shl esi,2
351
;      i = idx * (size + c->texcoord_array_stride);
412
			add esi,[edx+offs_cont_texcoord_array] ;esi = &context.texcoord_array[i]
352
;      c->current_tex_coord.X = c->texcoord_array[i];
413
			mov edi,edx
-
 
414
			add edi,offs_cont_current_tex_coord
-
 
415
			movsd ;context.current_tex_coord.X = ccontext.texcoord_array[i]
-
 
416
			movsd
-
 
417
			cmp dword[size],2
-
 
418
			jle .e3
-
 
419
				movsd
-
 
420
				jmp .e4
-
 
421
			.e3:
-
 
422
				mov dword[edi],0.0 ;если задано 2 параметра, то 3-й ставим по умолчанию 0.0
-
 
423
				add edi,4
-
 
424
			.e4:
-
 
425
			cmp dword[size],3
-
 
426
			jle .e5
-
 
427
				movsd
353
;      c->current_tex_coord.Y = c->texcoord_array[i+1];
428
				jmp @f
354
;      c->current_tex_coord.Z = size > 2 ? c->texcoord_array[i+2] : 0.0f;
429
			.e5:
355
;      c->current_tex_coord.W = size > 3 ? c->texcoord_array[i+3] : 1.0f;
430
				mov dword[edi],1.0 ;если задано 3 параметра, то 4-й ставим по умолчанию 1.0
356
;    }
431
		@@:
357
;    if (states & VERTEX_ARRAY) {
432
		bt dword[states],0 ;2^0=VERTEX_ARRAY
-
 
433
		jnc @f
358
;      GLParam p[5];
434
			mov esi,[edx+offs_cont_vertex_array_size]
-
 
435
			mov [size],esi
-
 
436
			add esi,[edx+offs_cont_vertex_array_stride]
359
;      int size = c->vertex_array_size;
437
			imul esi,[idx] ;esi = i
-
 
438
			shl esi,2
360
;      i = idx * (size + c->vertex_array_stride);
439
			add esi,[edx+offs_cont_vertex_array] ;esi = &context.vertex_array[i]
361
;      p[1].f = c->vertex_array[i];
440
			mov edi,ebp
-
 
441
			sub edi,28 ;edi = &p[1]
-
 
442
			movsd ;p[1].f = context.vertex_array[i]
-
 
443
			movsd
-
 
444
			cmp dword[size],2
-
 
445
			jle .e6
-
 
446
				movsd
-
 
447
				jmp .e7
-
 
448
			.e6:
362
;      p[2].f = c->vertex_array[i+1];
449
				mov dword[edi],0.0 ;если задано 2 параметра, то 3-й ставим по умолчанию 0.0
-
 
450
				add edi,4
-
 
451
				jmp .e8 ;и 4-й тоже ставим по умолчанию
-
 
452
			.e7:
-
 
453
			cmp dword[size],3
-
 
454
			jle .e8
-
 
455
				movsd
-
 
456
				sub edi,20 ;edi=&p[0]
-
 
457
				jmp .e9
-
 
458
			.e8:
-
 
459
				mov dword[edi],1.0 ;если задано 3 параметра, то 4-й ставим по умолчанию 1.0
363
;      p[3].f = size > 2 ? c->vertex_array[i+2] : 0.0f;
460
				sub edi,16 ;edi=&p[0]
364
;      p[4].f = size > 3 ? c->vertex_array[i+3] : 1.0f;
461
			.e9:
-
 
462
			stdcall glopVertex, edx,edi
-
 
463
		@@:
-
 
464
	inc dword[ii]
365
;      glopVertex(c, p);
465
	jmp .cycle_0
366
;    }
466
	.cycle_0_end:
367
;  }
467
 
368
	mov eax,ebp
468
	mov eax,ebp
-
 
469
	sub eax,32 ;=sizeof(dd)*8
369
	sub eax,32 ;=sizeof(dd)*8
470
	stdcall glopEnd, edx,eax
370
	stdcall glopEnd, edx,eax
471
popad
Line 371... Line 472...
371
	ret
472
	ret
372
endp
473
endp