comparison src/video/ataricommon/SDL_atarigl.c @ 1000:fbeac9312843

TinyGL only support RGB24 color buffer
author Patrice Mandin <patmandin@gmail.com>
date Tue, 30 Nov 2004 16:14:05 +0000
parents 22fc5f45bbb7
children 13aa96c76e86
comparison
equal deleted inserted replaced
999:8be85fa59cf3 1000:fbeac9312843
45 45
46 #define PATH_OSMESA_LDG "osmesa.ldg" 46 #define PATH_OSMESA_LDG "osmesa.ldg"
47 #define PATH_MESAGL_LDG "mesa_gl.ldg" 47 #define PATH_MESAGL_LDG "mesa_gl.ldg"
48 #define PATH_TINYGL_LDG "tiny_gl.ldg" 48 #define PATH_TINYGL_LDG "tiny_gl.ldg"
49 49
50 #define VDI_RGB 0xf
51
50 /*--- Functions prototypes ---*/ 52 /*--- Functions prototypes ---*/
51 53
52 static void SDL_AtariGL_UnloadLibrary(_THIS); 54 static void SDL_AtariGL_UnloadLibrary(_THIS);
53 55
56 #ifdef HAVE_OPENGL
54 static void CopyShadowNull(_THIS, SDL_Surface *surface); 57 static void CopyShadowNull(_THIS, SDL_Surface *surface);
55 static void CopyShadowDirect(_THIS, SDL_Surface *surface); 58 static void CopyShadowDirect(_THIS, SDL_Surface *surface);
59 static void CopyShadowRGBTo555(_THIS, SDL_Surface *surface);
60 static void CopyShadowRGBTo565(_THIS, SDL_Surface *surface);
61 static void CopyShadowRGBSwap(_THIS, SDL_Surface *surface);
62 static void CopyShadowRGBToARGB(_THIS, SDL_Surface *surface);
63 static void CopyShadowRGBToABGR(_THIS, SDL_Surface *surface);
64 static void CopyShadowRGBToBGRA(_THIS, SDL_Surface *surface);
65 static void CopyShadowRGBToRGBA(_THIS, SDL_Surface *surface);
56 static void CopyShadow8888To555(_THIS, SDL_Surface *surface); 66 static void CopyShadow8888To555(_THIS, SDL_Surface *surface);
57 static void CopyShadow8888To565(_THIS, SDL_Surface *surface); 67 static void CopyShadow8888To565(_THIS, SDL_Surface *surface);
58 68
59 static void ConvertNull(_THIS, SDL_Surface *surface); 69 static void ConvertNull(_THIS, SDL_Surface *surface);
60 static void Convert565To555be(_THIS, SDL_Surface *surface); 70 static void Convert565To555be(_THIS, SDL_Surface *surface);
62 static void Convert565le(_THIS, SDL_Surface *surface); 72 static void Convert565le(_THIS, SDL_Surface *surface);
63 static void ConvertBGRAToABGR(_THIS, SDL_Surface *surface); 73 static void ConvertBGRAToABGR(_THIS, SDL_Surface *surface);
64 74
65 static int InitNew(_THIS, SDL_Surface *current); 75 static int InitNew(_THIS, SDL_Surface *current);
66 static int InitOld(_THIS, SDL_Surface *current); 76 static int InitOld(_THIS, SDL_Surface *current);
77 #endif
67 78
68 /*--- Public functions ---*/ 79 /*--- Public functions ---*/
69 80
70 int SDL_AtariGL_Init(_THIS, SDL_Surface *current) 81 int SDL_AtariGL_Init(_THIS, SDL_Surface *current)
71 { 82 {
394 #endif 405 #endif
395 } 406 }
396 407
397 /*--- Creation of an OpenGL context using new/old functions ---*/ 408 /*--- Creation of an OpenGL context using new/old functions ---*/
398 409
410 #ifdef HAVE_OPENGL
399 static int InitNew(_THIS, SDL_Surface *current) 411 static int InitNew(_THIS, SDL_Surface *current)
400 { 412 {
401 GLenum osmesa_format; 413 GLenum osmesa_format;
402 SDL_PixelFormat *pixel_format; 414 SDL_PixelFormat *pixel_format;
403 Uint32 redmask; 415 Uint32 redmask;
500 } 512 }
501 513
502 return (gl_ctx != NULL); 514 return (gl_ctx != NULL);
503 } 515 }
504 516
517
505 static int InitOld(_THIS, SDL_Surface *current) 518 static int InitOld(_THIS, SDL_Surface *current)
506 { 519 {
507 GLenum osmesa_format; 520 GLenum osmesa_format;
508 SDL_PixelFormat *pixel_format; 521 SDL_PixelFormat *pixel_format;
509 Uint32 redmask; 522 Uint32 redmask;
510 int recreatecontext; 523 int recreatecontext, tinygl_present;
511 524
512 if (this->gl_config.dll_handle) { 525 if (this->gl_config.dll_handle) {
513 if (this->gl_data->OSMesaCreateLDG == NULL) { 526 if (this->gl_data->OSMesaCreateLDG == NULL) {
514 return 0; 527 return 0;
528 }
529 }
530
531 /* TinyGL only supports VDI_RGB (OSMESA_RGB) */
532 tinygl_present=0;
533 if (this->gl_config.dll_handle) {
534 if (this->gl_data->glFinish == NULL) {
535 tinygl_present=1;
515 } 536 }
516 } 537 }
517 538
518 /* Init OpenGL context using OSMesa */ 539 /* Init OpenGL context using OSMesa */
519 gl_convert = ConvertNull; 540 gl_convert = ConvertNull;
523 redmask = pixel_format->Rmask; 544 redmask = pixel_format->Rmask;
524 switch (pixel_format->BitsPerPixel) { 545 switch (pixel_format->BitsPerPixel) {
525 case 15: 546 case 15:
526 /* 15 bits unsupported */ 547 /* 15 bits unsupported */
527 gl_pixelsize = 2; 548 gl_pixelsize = 2;
528 osmesa_format = OSMESA_ARGB; 549 if (tinygl_present) {
529 if (redmask == 31<<10) { 550 osmesa_format = VDI_RGB;
530 gl_copyshadow = CopyShadow8888To555; 551 if (redmask == 31<<10) {
552 gl_copyshadow = CopyShadowRGBTo555;
553 } else {
554 gl_copyshadow = CopyShadowRGBTo565;
555 gl_convert = Convert565To555le;
556 }
531 } else { 557 } else {
532 gl_copyshadow = CopyShadow8888To565; 558 osmesa_format = OSMESA_ARGB;
533 gl_convert = Convert565To555le; 559 if (redmask == 31<<10) {
560 gl_copyshadow = CopyShadow8888To555;
561 } else {
562 gl_copyshadow = CopyShadow8888To565;
563 gl_convert = Convert565To555le;
564 }
534 } 565 }
535 break; 566 break;
536 case 16: 567 case 16:
537 /* 16 bits unsupported */ 568 /* 16 bits unsupported */
538 gl_pixelsize = 2; 569 gl_pixelsize = 2;
539 osmesa_format = OSMESA_ARGB; 570 if (tinygl_present) {
540 gl_copyshadow = CopyShadow8888To565; 571 osmesa_format = VDI_RGB;
541 if (redmask != 31<<11) { 572 gl_copyshadow = CopyShadowRGBTo565;
542 /* 565, little endian, unsupported */ 573 if (redmask != 31<<11) {
543 gl_convert = Convert565le; 574 /* 565, little endian, unsupported */
575 gl_convert = Convert565le;
576 }
577 } else {
578 osmesa_format = OSMESA_ARGB;
579 gl_copyshadow = CopyShadow8888To565;
580 if (redmask != 31<<11) {
581 /* 565, little endian, unsupported */
582 gl_convert = Convert565le;
583 }
544 } 584 }
545 break; 585 break;
546 case 24: 586 case 24:
547 gl_pixelsize = 3; 587 gl_pixelsize = 3;
548 gl_copyshadow = CopyShadowDirect; 588 if (tinygl_present) {
549 if (redmask == 255<<16) { 589 osmesa_format = VDI_RGB;
550 osmesa_format = OSMESA_RGB; 590 gl_copyshadow = CopyShadowDirect;
591 if (redmask != 255<<16) {
592 gl_copyshadow = CopyShadowRGBSwap;
593 }
551 } else { 594 } else {
552 osmesa_format = OSMESA_BGR; 595 gl_copyshadow = CopyShadowDirect;
596 if (redmask == 255<<16) {
597 osmesa_format = OSMESA_RGB;
598 } else {
599 osmesa_format = OSMESA_BGR;
600 }
553 } 601 }
554 break; 602 break;
555 case 32: 603 case 32:
556 gl_pixelsize = 4; 604 gl_pixelsize = 4;
557 gl_copyshadow = CopyShadowDirect; 605 if (tinygl_present) {
558 if (redmask == 255<<16) { 606 osmesa_format = VDI_RGB;
559 osmesa_format = OSMESA_ARGB; 607 gl_copyshadow = CopyShadowRGBToARGB;
560 } else if (redmask == 255<<8) { 608 if (redmask == 255) {
561 osmesa_format = OSMESA_BGRA; 609 gl_convert = CopyShadowRGBToABGR;
562 } else if (redmask == 255<<24) { 610 } else if (redmask == 255<<8) {
563 osmesa_format = OSMESA_RGBA; 611 gl_convert = CopyShadowRGBToBGRA;
612 } else if (redmask == 255<<24) {
613 gl_convert = CopyShadowRGBToRGBA;
614 }
564 } else { 615 } else {
565 /* ABGR format unsupported */ 616 gl_copyshadow = CopyShadowDirect;
566 osmesa_format = OSMESA_BGRA; 617 if (redmask == 255<<16) {
567 gl_convert = ConvertBGRAToABGR; 618 osmesa_format = OSMESA_ARGB;
619 } else if (redmask == 255<<8) {
620 osmesa_format = OSMESA_BGRA;
621 } else if (redmask == 255<<24) {
622 osmesa_format = OSMESA_RGBA;
623 } else {
624 /* ABGR format unsupported */
625 osmesa_format = OSMESA_BGRA;
626 gl_convert = ConvertBGRAToABGR;
627 }
568 } 628 }
569 break; 629 break;
570 default: 630 default:
631 if (tinygl_present) {
632 SDL_AtariGL_Quit(this, SDL_FALSE);
633 return 0;
634 }
571 gl_pixelsize = 1; 635 gl_pixelsize = 1;
572 gl_copyshadow = CopyShadowDirect; 636 gl_copyshadow = CopyShadowDirect;
573 osmesa_format = OSMESA_COLOR_INDEX; 637 osmesa_format = OSMESA_COLOR_INDEX;
574 break; 638 break;
575 } 639 }
625 srcline += srcpitch; 689 srcline += srcpitch;
626 dstline += dstpitch; 690 dstline += dstpitch;
627 } 691 }
628 } 692 }
629 693
694 static void CopyShadowRGBTo555(_THIS, SDL_Surface *surface)
695 {
696 int x,y, srcpitch, dstpitch;
697 Uint16 *dstline, *dstcol;
698 Uint8 *srcline, *srccol;
699
700 srcline = (Uint8 *)gl_shadow;
701 srcpitch = surface->w *3;
702 dstline = surface->pixels;
703 dstpitch = surface->pitch >>1;
704
705 for (y=0; y<surface->h; y++) {
706 srccol = srcline;
707 dstcol = dstline;
708 for (x=0; x<surface->w; x++) {
709 Uint16 dstcolor;
710
711 dstcolor = ((*srccol++)>>9) & (31<<10);
712 dstcolor |= ((*srccol++)>>6) & (31<<5);
713 dstcolor |= ((*srccol++)>>3) & 31;
714 *dstcol++ = dstcolor;
715 }
716
717 srcline += srcpitch;
718 dstline += dstpitch;
719 }
720 }
721
722 static void CopyShadowRGBTo565(_THIS, SDL_Surface *surface)
723 {
724 int x,y, srcpitch, dstpitch;
725 Uint16 *dstline, *dstcol;
726 Uint8 *srcline, *srccol;
727
728 srcline = (Uint8 *)gl_shadow;
729 srcpitch = surface->w *3;
730 dstline = surface->pixels;
731 dstpitch = surface->pitch >>1;
732
733 for (y=0; y<surface->h; y++) {
734 srccol = srcline;
735 dstcol = dstline;
736
737 for (x=0; x<surface->w; x++) {
738 Uint16 dstcolor;
739
740 dstcolor = ((*srccol++)>>8) & (31<<11);
741 dstcolor |= ((*srccol++)>>5) & (63<<5);
742 dstcolor |= ((*srccol++)>>3) & 31;
743 *dstcol++ = dstcolor;
744 }
745
746 srcline += srcpitch;
747 dstline += dstpitch;
748 }
749 }
750
751 static void CopyShadowRGBSwap(_THIS, SDL_Surface *surface)
752 {
753 int x,y, srcpitch, dstpitch;
754 Uint8 *dstline, *dstcol;
755 Uint8 *srcline, *srccol;
756
757 srcline = (Uint8 *)gl_shadow;
758 srcpitch = surface->w *3;
759 dstline = surface->pixels;
760 dstpitch = surface->pitch;
761
762 for (y=0; y<surface->h; y++) {
763 srccol = srcline;
764 dstcol = dstline;
765
766 for (x=0; x<surface->w; x++) {
767 *dstcol++ = srccol[2];
768 *dstcol++ = srccol[1];
769 *dstcol++ = srccol[0];
770 srccol += 3;
771 }
772
773 srcline += srcpitch;
774 dstline += dstpitch;
775 }
776 }
777
778 static void CopyShadowRGBToARGB(_THIS, SDL_Surface *surface)
779 {
780 int x,y, srcpitch, dstpitch;
781 Uint32 *dstline, *dstcol;
782 Uint8 *srcline, *srccol;
783
784 srcline = (Uint8 *)gl_shadow;
785 srcpitch = surface->w *3;
786 dstline = surface->pixels;
787 dstpitch = surface->pitch >>2;
788
789 for (y=0; y<surface->h; y++) {
790 srccol = srcline;
791 dstcol = dstline;
792
793 for (x=0; x<surface->w; x++) {
794 Uint32 dstcolor;
795
796 dstcolor = (*srccol++)<<16;
797 dstcolor |= (*srccol++)<<8;
798 dstcolor |= *srccol++;
799
800 *dstcol++ = dstcolor;
801 }
802
803 srcline += srcpitch;
804 dstline += dstpitch;
805 }
806 }
807
808 static void CopyShadowRGBToABGR(_THIS, SDL_Surface *surface)
809 {
810 int x,y, srcpitch, dstpitch;
811 Uint32 *dstline, *dstcol;
812 Uint8 *srcline, *srccol;
813
814 srcline = (Uint8 *)gl_shadow;
815 srcpitch = surface->w *3;
816 dstline = surface->pixels;
817 dstpitch = surface->pitch >>2;
818
819 for (y=0; y<surface->h; y++) {
820 srccol = srcline;
821 dstcol = dstline;
822
823 for (x=0; x<surface->w; x++) {
824 Uint32 dstcolor;
825
826 dstcolor = *srccol++;
827 dstcolor |= (*srccol++)<<8;
828 dstcolor |= (*srccol++)<<16;
829
830 *dstcol++ = dstcolor;
831 }
832
833 srcline += srcpitch;
834 dstline += dstpitch;
835 }
836 }
837
838 static void CopyShadowRGBToBGRA(_THIS, SDL_Surface *surface)
839 {
840 int x,y, srcpitch, dstpitch;
841 Uint32 *dstline, *dstcol;
842 Uint8 *srcline, *srccol;
843
844 srcline = (Uint8 *)gl_shadow;
845 srcpitch = surface->w *3;
846 dstline = surface->pixels;
847 dstpitch = surface->pitch >>2;
848
849 for (y=0; y<surface->h; y++) {
850 srccol = srcline;
851 dstcol = dstline;
852
853 for (x=0; x<surface->w; x++) {
854 Uint32 dstcolor;
855
856 dstcolor = (*srccol++)<<8;
857 dstcolor |= (*srccol++)<<16;
858 dstcolor |= (*srccol++)<<24;
859
860 *dstcol++ = dstcolor;
861 }
862
863 srcline += srcpitch;
864 dstline += dstpitch;
865 }
866 }
867
868 static void CopyShadowRGBToRGBA(_THIS, SDL_Surface *surface)
869 {
870 int x,y, srcpitch, dstpitch;
871 Uint32 *dstline, *dstcol;
872 Uint8 *srcline, *srccol;
873
874 srcline = (Uint8 *)gl_shadow;
875 srcpitch = surface->w *3;
876 dstline = surface->pixels;
877 dstpitch = surface->pitch >>2;
878
879 for (y=0; y<surface->h; y++) {
880 srccol = srcline;
881 dstcol = dstline;
882
883 for (x=0; x<surface->w; x++) {
884 Uint32 dstcolor;
885
886 dstcolor = (*srccol++)<<24;
887 dstcolor |= (*srccol++)<<16;
888 dstcolor |= (*srccol++)<<8;
889
890 *dstcol++ = dstcolor;
891 }
892
893 srcline += srcpitch;
894 dstline += dstpitch;
895 }
896 }
897
630 static void CopyShadow8888To555(_THIS, SDL_Surface *surface) 898 static void CopyShadow8888To555(_THIS, SDL_Surface *surface)
631 { 899 {
632 int x,y, srcpitch, dstpitch; 900 int x,y, srcpitch, dstpitch;
633 Uint16 *dstline, *dstcol; 901 Uint16 *dstline, *dstcol;
634 Uint32 *srcline, *srccol; 902 Uint32 *srcline, *srccol;
768 } 1036 }
769 1037
770 line += pitch; 1038 line += pitch;
771 } 1039 }
772 } 1040 }
1041
1042 #endif /* HAVE_OPENGL */