Mercurial > sdl-ios-xcode
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 */ |