@@ -365,7 +365,7 @@ static void compute_wave_vertices(struct frame_descriptor *frd, struct wave_para
365
365
}
366
366
}
367
367
368
- static void draw (unsigned short * fb , struct frame_descriptor * frd , struct wave_params * params , struct wave_vertex * vertices , int nvertices )
368
+ static void software_draw (unsigned short * fb , struct frame_descriptor * frd , struct wave_params * params , struct wave_vertex * vertices , int nvertices )
369
369
{
370
370
draw_motion_vectors (fb , frd );
371
371
draw_borders (fb , frd );
@@ -488,6 +488,83 @@ static void video(unsigned short *tex_backbuffer, struct frame_descriptor *frd,
488
488
ioctl (video_fd , VIDEO_BUFFER_UNLOCK , videoframe );
489
489
}
490
490
491
+ static void images (unsigned short * tex_backbuffer , struct frame_descriptor * frd , int tmu_fd , struct tmu_vertex * scale_vertices )
492
+ {
493
+ int i ;
494
+ struct tmu_td td ;
495
+ int alpha ;
496
+ float ftexsize ;
497
+ int dx , dy ;
498
+ int sx , sy ;
499
+
500
+ for (i = 0 ;i < IMAGE_COUNT ;i ++ ) {
501
+ if ((frd -> images [i ] != NULL ) && (frd -> image_a [i ] != 0.0 )) {
502
+ alpha = 64.0 * frd -> image_a [i ];
503
+ alpha -- ;
504
+ if (alpha > TMU_ALPHA_MAX )
505
+ alpha = TMU_ALPHA_MAX ;
506
+ if (alpha <= 0 )
507
+ continue ;
508
+
509
+ ftexsize = (float )renderer_texsize ;
510
+ dx = ftexsize * frd -> image_x [i ];
511
+ dx = ftexsize * frd -> image_y [i ];
512
+ sx = ((float )frd -> images [i ]-> width )* frd -> image_zoom [i ];
513
+ sy = ((float )frd -> images [i ]-> height )* frd -> image_zoom [i ];
514
+
515
+ scale_vertices [0 ].x = 0 ;
516
+ scale_vertices [0 ].y = 0 ;
517
+ scale_vertices [1 ].x = frd -> images [i ]-> width << TMU_FIXEDPOINT_SHIFT ;
518
+ scale_vertices [1 ].y = 0 ;
519
+ scale_vertices [TMU_MESH_MAXSIZE ].x = 0 ;
520
+ scale_vertices [TMU_MESH_MAXSIZE ].y = frd -> images [i ]-> height << TMU_FIXEDPOINT_SHIFT ;
521
+ scale_vertices [TMU_MESH_MAXSIZE + 1 ].x = frd -> images [i ]-> width << TMU_FIXEDPOINT_SHIFT ;
522
+ scale_vertices [TMU_MESH_MAXSIZE + 1 ].y = frd -> images [i ]-> height << TMU_FIXEDPOINT_SHIFT ;
523
+
524
+ td .flags = 0 ;
525
+ td .hmeshlast = 1 ;
526
+ td .vmeshlast = 1 ;
527
+ td .brightness = TMU_BRIGHTNESS_MAX ;
528
+ td .chromakey = 0 ;
529
+ td .vertices = scale_vertices ;
530
+ td .texfbuf = frd -> images [i ]-> pixels ;
531
+ td .texhres = frd -> images [i ]-> width ;
532
+ td .texvres = frd -> images [i ]-> height ;
533
+ td .texhmask = TMU_MASK_FULL ;
534
+ td .texvmask = TMU_MASK_FULL ;
535
+ td .dstfbuf = tex_backbuffer ;
536
+ td .dsthres = renderer_texsize ;
537
+ td .dstvres = renderer_texsize ;
538
+ td .dsthoffset = dx - (sx >> 1 );
539
+ td .dstvoffset = dy - (sy >> 1 );
540
+ td .dstsquarew = sx ;
541
+ td .dstsquareh = sy ;
542
+ td .alpha = alpha ;
543
+ td .invalidate_before = false;
544
+ td .invalidate_after = false;
545
+
546
+ ioctl (tmu_fd , TMU_EXECUTE , & td );
547
+ }
548
+ }
549
+ }
550
+
551
+ static void update_dmx_outputs (int dmx_fd , struct frame_descriptor * frd , int * dmx_map )
552
+ {
553
+ int i ;
554
+ unsigned char dmx_val ;
555
+
556
+ for (i = 0 ;i < DMX_COUNT ;i ++ ) {
557
+ lseek (dmx_fd , dmx_map [i ], SEEK_SET );
558
+ if (frd -> dmx [i ] > 1.0 )
559
+ dmx_val = 255 ;
560
+ else if (frd -> dmx [i ] < 0.0 )
561
+ dmx_val = 0 ;
562
+ else
563
+ dmx_val = frd -> dmx [i ]* 255.0 ;
564
+ write (dmx_fd , & dmx_val , 1 );
565
+ }
566
+ }
567
+
491
568
struct raster_task_param {
492
569
int framebuffer_fd ;
493
570
int dmx_map [DMX_COUNT ];
@@ -518,8 +595,6 @@ static rtems_task raster_task(rtems_task_argument argument)
518
595
struct wave_vertex vertices [256 ];
519
596
int nvertices ;
520
597
int vecho_alpha ;
521
- int i ;
522
- unsigned char dmx_val ;
523
598
524
599
status = posix_memalign ((void * * )& tex_frontbuffer , 32 ,
525
600
2 * renderer_texsize * renderer_texsize );
@@ -576,8 +651,9 @@ static rtems_task raster_task(rtems_task_argument argument)
576
651
warp (tmu_fd , tex_frontbuffer , tex_backbuffer , frd -> vertices , frd -> tex_wrap , ibrightness );
577
652
compute_wave_vertices (frd , & params , vertices , & nvertices );
578
653
ioctl (tmu_fd , TMU_EXECUTE_WAIT );
579
- draw (tex_backbuffer , frd , & params , vertices , nvertices );
654
+ software_draw (tex_backbuffer , frd , & params , vertices , nvertices );
580
655
video (tex_backbuffer , frd , tmu_fd , video_fd , scale_vertices );
656
+ images (tex_backbuffer , frd , tmu_fd , scale_vertices );
581
657
582
658
/* Scale and send to screen */
583
659
screen_backbuffer = get_screen_backbuffer (param -> framebuffer_fd );
@@ -595,16 +671,7 @@ static rtems_task raster_task(rtems_task_argument argument)
595
671
ioctl (param -> framebuffer_fd , FBIOSWAPBUFFERS );
596
672
597
673
/* Update DMX outputs */
598
- for (i = 0 ;i < DMX_COUNT ;i ++ ) {
599
- lseek (dmx_fd , param -> dmx_map [i ], SEEK_SET );
600
- if (frd -> dmx [i ] > 1.0 )
601
- dmx_val = 255 ;
602
- else if (frd -> dmx [i ] < 0.0 )
603
- dmx_val = 0 ;
604
- else
605
- dmx_val = frd -> dmx [i ]* 255.0 ;
606
- write (dmx_fd , & dmx_val , 1 );
607
- }
674
+ update_dmx_outputs (dmx_fd , frd , param -> dmx_map );
608
675
609
676
/* Swap texture buffers */
610
677
p = tex_frontbuffer ;
0 commit comments