Previous 199869 Revisions Next

r34850 Wednesday 4th February, 2015 at 17:16:42 UTC by Couriersud
Some more code alignment. (nw)
[src/osd/sdl]draw13.c drawogl.c drawsdl.c window.h

trunk/src/osd/sdl/draw13.c
r243361r243362
165165   INT32           m_blittimer;
166166   UINT32          m_extra_flags;
167167
168
169#if (SDLMAME_SDL2)
170   // Original display_mode
171   SDL_DisplayMode m_original_mode;
172
173   SDL_GLContext   m_gl_context_id;
174#else
175   // SDL surface
176   SDL_Surface         *m_sdlsurf;
177#endif
178
168179   SDL_Renderer *  m_renderer;
169180   simple_list<texture_info>  m_texlist;                // list of active textures
170181
r243361r243362
180191   // Stats
181192   INT64           m_last_blit_time;
182193   INT64           m_last_blit_pixels;
183
184   // Original display_mode
185   SDL_DisplayMode m_original_mode;
186194};
187195
188196struct copy_info_t {
r243361r243362
201209   copy_info_t           *next;
202210};
203211
212
204213//============================================================
205214//  PROTOTYPES
206215//============================================================
r243361r243362
453462}
454463
455464//============================================================
456//  drawsdl2_init
465//  drawsdl_init
457466//============================================================
458467
459468static void add_list(copy_info_t **head, copy_info_t *element, Uint32 bm)
r243361r243362
517526   else
518527      osd_printf_verbose("Loaded opengl shared library: %s\n", stemp ? stemp : "<default>");
519528
520   /* Enable bilinear filtering in case it is supported.
521    * This applies to all texture operations. However, artwort is pre-scaled
522    * and thus shouldn't be affected.
523    */
524   if (video_config.filter)
525   {
526      SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "1");
527   }
528   else
529   {
530      SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "0");
531   }
532
533529   return 0;
534530}
535531
536532
537533//============================================================
538//  drawsdl2_exit
534//  drawsdl_exit
539535//============================================================
540536
541537static void drawsdl2_exit(void)
r243361r243362
671667
672668   // create renderer
673669
670   /* Enable bilinear filtering in case it is supported.
671    * This applies to all texture operations. However, artwort is pre-scaled
672    * and thus shouldn't be affected.
673    */
674   if (video_config.filter)
675   {
676      SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "1");
677   }
678   else
679   {
680      SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "0");
681   }
682
674683   if (video_config.waitvsync)
675684      m_renderer = SDL_CreateRenderer(window().m_sdl_window, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED);
676685   else
r243361r243362
690699
691700#else
692701   m_extra_flags = (window().fullscreen() ?  SDL_FULLSCREEN : SDL_RESIZABLE);
702
703   if (this->check_flag(FLAG_NEEDS_DOUBLEBUF))
693704   m_extra_flags |= SDL_DOUBLEBUF;
705   if (this->check_flag(FLAG_NEEDS_ASYNCBLIT))
706      m_extra_flags |= SDL_ASYNCBLIT;
694707
695   if (check_flag(FLAG_NEEDS_OPENGL))
708   if (this->check_flag(FLAG_NEEDS_OPENGL))
696709 {
697      m_extra_flags |= SDL_OPENGL;
710      m_extra_flags |= SDL_DOUBLEBUF | SDL_OPENGL;
698711      SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
699712      #if (SDL_VERSION_ATLEAST(1,2,10)) && (!defined(SDLMAME_EMSCRIPTEN))
700713      SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, video_config.waitvsync ? 1 : 0);
r243361r243362
752765
753766void sdl_info13::destroy()
754767{
768
755769   // free the memory in the window
756770
757771   destroy_all_textures();
758772
773#if (SDLMAME_SDL2)
774   if (check_flag(FLAG_NEEDS_OPENGL))
775      SDL_GL_DeleteContext(m_gl_context_id);
759776   if (window().fullscreen() && video_config.switchres)
760777   {
761778      SDL_SetWindowFullscreen(window().m_sdl_window, 0);    // Try to set mode
r243361r243362
764781   }
765782
766783   SDL_DestroyWindow(window().m_sdl_window);
767
784#else
785   if (m_sdlsurf)
786   {
787      SDL_FreeSurface(m_sdlsurf);
788      m_sdlsurf = NULL;
789   }
790#endif
768791}
769792
770793//============================================================
r243361r243362
794817}
795818
796819//============================================================
820//  drawsdl_destroy_all_textures
821//============================================================
822
823void sdl_info13::destroy_all_textures()
824{
825   if(window().m_primlist)
826   {
827      window().m_primlist->acquire_lock();
828      m_texlist.reset();
829      window().m_primlist->release_lock();
830   }
831   else
832      m_texlist.reset();
833}
834
835//============================================================
797836//  sdl_info::draw
798837//============================================================
799838
r243361r243362
12241263   return texture;
12251264}
12261265
1227
1228void sdl_info13::destroy_all_textures()
1229{
1230   if(window().m_primlist)
1231   {
1232      window().m_primlist->acquire_lock();
1233      m_texlist.reset();
1234      window().m_primlist->release_lock();
1235   }
1236   else
1237      m_texlist.reset();
1238}
trunk/src/osd/sdl/drawogl.c
r243361r243362
811811
812812#else
813813   m_extra_flags = (window().fullscreen() ?  SDL_FULLSCREEN : SDL_RESIZABLE);
814
815   if (this->check_flag(FLAG_NEEDS_DOUBLEBUF))
814816   m_extra_flags |= SDL_DOUBLEBUF;
817   if (this->check_flag(FLAG_NEEDS_ASYNCBLIT))
818      m_extra_flags |= SDL_ASYNCBLIT;
815819
816   if (check_flag(FLAG_NEEDS_OPENGL))
820   if (this->check_flag(FLAG_NEEDS_OPENGL))
817821   {
818      m_extra_flags |= SDL_OPENGL;
822      m_extra_flags |= SDL_DOUBLEBUF | SDL_OPENGL;
819823      SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
820824      #if (SDL_VERSION_ATLEAST(1,2,10)) && (!defined(SDLMAME_EMSCRIPTEN))
821825      SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, video_config.waitvsync ? 1 : 0);
r243361r243362
908912   destroy_all_textures();
909913
910914#if (SDLMAME_SDL2)
911   SDL_GL_DeleteContext(m_gl_context_id);
915   if (check_flag(FLAG_NEEDS_OPENGL))
916      SDL_GL_DeleteContext(m_gl_context_id);
912917   if (window().fullscreen() && video_config.switchres)
913918   {
914919      SDL_SetWindowFullscreen(window().m_sdl_window, 0);    // Try to set mode
r243361r243362
942947
943948int sdl_info_ogl::xy_to_render_target(int x, int y, int *xt, int *yt)
944949{
950
945951   *xt = x - m_last_hofs;
946952   *yt = y - m_last_vofs;
947953   if (*xt<0 || *xt >= window().m_blitwidth)
r243361r243362
952958}
953959
954960//============================================================
961//  drawsdl_destroy_all_textures
962//============================================================
963
964void sdl_info_ogl::destroy_all_textures()
965{
966   texture_info *texture = NULL;
967   int lock=FALSE;
968   int i;
969
970   if ( !m_initialized )
971      return;
972
973#if (SDLMAME_SDL2)
974   SDL_GL_MakeCurrent(window().m_sdl_window, m_gl_context_id);
975#endif
976
977   if(window().m_primlist)
978   {
979      lock=TRUE;
980      window().m_primlist->acquire_lock();
981   }
982
983   glFinish();
984
985   texture_all_disable();
986   glFinish();
987   glDisableClientState(GL_VERTEX_ARRAY);
988
989   i=0;
990   while (i<HASH_SIZE+OVERFLOW_SIZE)
991   {
992      texture = m_texhash[i];
993      m_texhash[i] = NULL;
994      if (texture != NULL)
995      {
996         if(m_usevbo)
997         {
998            pfn_glDeleteBuffers( 1, &(texture->texCoordBufferName) );
999            texture->texCoordBufferName=0;
1000         }
1001
1002         if(m_usepbo && texture->pbo)
1003         {
1004            pfn_glDeleteBuffers( 1, (GLuint *)&(texture->pbo) );
1005            texture->pbo=0;
1006         }
1007
1008         if( m_glsl_program_num > 1 )
1009         {
1010            assert(m_usefbo);
1011            pfn_glDeleteFramebuffers(2, (GLuint *)&texture->mpass_fbo_mamebm[0]);
1012            glDeleteTextures(2, (GLuint *)&texture->mpass_texture_mamebm[0]);
1013         }
1014
1015         if ( m_glsl_program_mb2sc < m_glsl_program_num - 1 )
1016         {
1017            assert(m_usefbo);
1018            pfn_glDeleteFramebuffers(2, (GLuint *)&texture->mpass_fbo_scrn[0]);
1019            glDeleteTextures(2, (GLuint *)&texture->mpass_texture_scrn[0]);
1020         }
1021
1022         glDeleteTextures(1, (GLuint *)&texture->texture);
1023         if ( texture->data_own )
1024         {
1025            free(texture->data);
1026            texture->data=NULL;
1027            texture->data_own=FALSE;
1028         }
1029         global_free(texture);
1030      }
1031      i++;
1032   }
1033   if ( m_useglsl )
1034   {
1035      glsl_shader_free(m_glsl);
1036      m_glsl = NULL;
1037   }
1038
1039   m_initialized = 0;
1040
1041   if (lock)
1042      window().m_primlist->release_lock();
1043}
1044//============================================================
9551045//  loadGLExtensions
9561046//============================================================
9571047
r243361r243362
31073197   }
31083198}
31093199
3110void sdl_info_ogl::destroy_all_textures()
3111{
3112   texture_info *texture = NULL;
3113   int lock=FALSE;
3114   int i;
31153200
3116   if ( !m_initialized )
3117      return;
31183201
3119#if (SDLMAME_SDL2)
3120   SDL_GL_MakeCurrent(window().m_sdl_window, m_gl_context_id);
3121#endif
3122
3123   if(window().m_primlist)
3124   {
3125      lock=TRUE;
3126      window().m_primlist->acquire_lock();
3127   }
3128
3129   glFinish();
3130
3131   texture_all_disable();
3132   glFinish();
3133   glDisableClientState(GL_VERTEX_ARRAY);
3134
3135   i=0;
3136   while (i<HASH_SIZE+OVERFLOW_SIZE)
3137   {
3138      texture = m_texhash[i];
3139      m_texhash[i] = NULL;
3140      if (texture != NULL)
3141      {
3142         if(m_usevbo)
3143         {
3144            pfn_glDeleteBuffers( 1, &(texture->texCoordBufferName) );
3145            texture->texCoordBufferName=0;
3146         }
3147
3148         if(m_usepbo && texture->pbo)
3149         {
3150            pfn_glDeleteBuffers( 1, (GLuint *)&(texture->pbo) );
3151            texture->pbo=0;
3152         }
3153
3154         if( m_glsl_program_num > 1 )
3155         {
3156            assert(m_usefbo);
3157            pfn_glDeleteFramebuffers(2, (GLuint *)&texture->mpass_fbo_mamebm[0]);
3158            glDeleteTextures(2, (GLuint *)&texture->mpass_texture_mamebm[0]);
3159         }
3160
3161         if ( m_glsl_program_mb2sc < m_glsl_program_num - 1 )
3162         {
3163            assert(m_usefbo);
3164            pfn_glDeleteFramebuffers(2, (GLuint *)&texture->mpass_fbo_scrn[0]);
3165            glDeleteTextures(2, (GLuint *)&texture->mpass_texture_scrn[0]);
3166         }
3167
3168         glDeleteTextures(1, (GLuint *)&texture->texture);
3169         if ( texture->data_own )
3170         {
3171            free(texture->data);
3172            texture->data=NULL;
3173            texture->data_own=FALSE;
3174         }
3175         global_free(texture);
3176      }
3177      i++;
3178   }
3179   if ( m_useglsl )
3180   {
3181      glsl_shader_free(m_glsl);
3182      m_glsl = NULL;
3183   }
3184
3185   m_initialized = 0;
3186
3187   if (lock)
3188      window().m_primlist->release_lock();
3189}
3190
trunk/src/osd/sdl/drawsdl.c
r243361r243362
5050{
5151public:
5252
53   sdl_info(sdl_window_info *w)
54   : osd_renderer(w, FLAG_NONE),
53   sdl_info(sdl_window_info *w, int extra_flags)
54   : osd_renderer(w, extra_flags),
5555   m_blittimer(0),
5656   m_extra_flags(0),
5757
r243361r243362
164164
165165static const sdl_scale_mode scale_modes[] =
166166{
167      { "none",    0, 0, 1, 1, SDL_DOUBLEBUF, 0, 0 },
168      { "async",   0, 0, 1, 1, SDL_DOUBLEBUF | SDL_ASYNCBLIT, 0, 0 },
167      { "none",    0, 0, 1, 1, osd_renderer::FLAG_NEEDS_DOUBLEBUF, 0, 0 },
168      { "async",   0, 0, 1, 1, osd_renderer::FLAG_NEEDS_DOUBLEBUF | osd_renderer::FLAG_NEEDS_ASYNCBLIT, 0, 0 },
169169      { "yv12",    1, 1, 1, 1, 0,              SDL_YV12_OVERLAY, yuv_RGB_to_YV12 },
170170      { "yv12x2",  1, 1, 2, 2, 0,              SDL_YV12_OVERLAY, yuv_RGB_to_YV12X2 },
171171      { "yuy2",    1, 1, 1, 1, 0,              SDL_YUY2_OVERLAY, yuv_RGB_to_YUY2 },
r243361r243362
178178      { "none",    0, 0, 1, 1, DRAW2_SCALEMODE_NEAREST, 0, 0 },
179179      { "hwblit",  1, 0, 1, 1, DRAW2_SCALEMODE_LINEAR, 0, 0 },
180180      { "hwbest",  1, 0, 1, 1, DRAW2_SCALEMODE_BEST, 0, 0 },
181      { "yv12",    1, 1, 1, 1, DRAW2_SCALEMODE_NEAREST, SDL_PIXELFORMAT_YV12, yuv_RGB_to_YV12 },
182      { "yv12x2",  1, 1, 2, 2, DRAW2_SCALEMODE_NEAREST, SDL_PIXELFORMAT_YV12, yuv_RGB_to_YV12X2 },
183      { "yuy2",    1, 1, 1, 1, DRAW2_SCALEMODE_NEAREST, SDL_PIXELFORMAT_YUY2, yuv_RGB_to_YUY2 },
184      { "yuy2x2",  1, 1, 2, 1, DRAW2_SCALEMODE_NEAREST, SDL_PIXELFORMAT_YUY2, yuv_RGB_to_YUY2X2 },
181      /* SDL1.2 uses interpolation as well */
182      { "yv12",    1, 1, 1, 1, DRAW2_SCALEMODE_BEST, SDL_PIXELFORMAT_YV12, yuv_RGB_to_YV12 },
183      { "yv12x2",  1, 1, 2, 2, DRAW2_SCALEMODE_BEST, SDL_PIXELFORMAT_YV12, yuv_RGB_to_YV12X2 },
184      { "yuy2",    1, 1, 1, 1, DRAW2_SCALEMODE_BEST, SDL_PIXELFORMAT_YUY2, yuv_RGB_to_YUY2 },
185      { "yuy2x2",  1, 1, 2, 1, DRAW2_SCALEMODE_BEST, SDL_PIXELFORMAT_YUY2, yuv_RGB_to_YUY2X2 },
185186      { NULL }
186187};
187188#endif
r243361r243362
220221   return -1;
221222}
222223
223//============================================================
224//  drawsdl_init
225//============================================================
226224
227225static osd_renderer *drawsdl_create(sdl_window_info *window)
228226{
229   return global_alloc(sdl_info(window));
227   const sdl_scale_mode *sm = &scale_modes[video_config.scale_mode];
228
229   // FIXME: QUALITY HINTS
230#if (SDLMAME_SDL2)
231   return global_alloc(sdl_info(window, osd_renderer::FLAG_NONE));
232#else
233   return global_alloc(sdl_info(window, sm->m_extra_flags));
234#endif
230235}
231236
237//============================================================
238//  drawsdl_init
239//============================================================
232240
233241int drawsdl_init(sdl_draw_info *callbacks)
234242{
r243361r243362
253261}
254262
255263//============================================================
256//  drawsdl_destroy_all_textures
257//============================================================
258
259void sdl_info::destroy_all_textures()
260{
261   /* nothing to be done in soft mode */
262}
263
264//============================================================
265264//  setup_texture for window
266265//============================================================
267266
r243361r243362
457456   else
458457            m_extra_flags = 0;
459458
460   /* set hints ... */
461   SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, sm->sdl_scale_mode);
462
463459   // create the SDL window
464460   // soft driver also used | SDL_WINDOW_INPUT_GRABBED | SDL_WINDOW_MOUSE_FOCUS
465461   m_extra_flags |= (window().fullscreen() ?
r243361r243362
519515
520516   // create renderer
521517
518   /* set hints ... */
519   SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, sm->sdl_scale_mode);
520
521
522522   if (video_config.waitvsync)
523523      m_sdl_renderer = SDL_CreateRenderer(window().m_sdl_window, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED);
524524   else
r243361r243362
557557#else
558558   m_extra_flags = (window().fullscreen() ?  SDL_FULLSCREEN : SDL_RESIZABLE);
559559
560   m_extra_flags |= sm->m_extra_flags;
560   if (this->check_flag(FLAG_NEEDS_DOUBLEBUF))
561      m_extra_flags |= SDL_DOUBLEBUF;
562   if (this->check_flag(FLAG_NEEDS_ASYNCBLIT))
563      m_extra_flags |= SDL_ASYNCBLIT;
561564
562   if (check_flag(FLAG_NEEDS_OPENGL))
565   if (this->check_flag(FLAG_NEEDS_OPENGL))
563566   {
564567      m_extra_flags |= SDL_DOUBLEBUF | SDL_OPENGL;
565568      SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
r243361r243362
707710}
708711
709712//============================================================
713//  drawsdl_destroy_all_textures
714//============================================================
715
716void sdl_info::destroy_all_textures()
717{
718   /* nothing to be done in soft mode */
719}
720
721
722//============================================================
710723//  sdl_info::draw
711724//============================================================
712725
trunk/src/osd/sdl/window.h
r243361r243362
3838{
3939public:
4040
41   static const int FLAG_NONE = 0;
42   static const int FLAG_NEEDS_OPENGL = 1;
41   /* Generic flags */
42   static const int FLAG_NONE                = 0x0000;
43   static const int FLAG_NEEDS_OPENGL          = 0x0001;
4344
45#if (!(SDLMAME_SDL2))
46   /* SDL 1.2 flags */
47   static const int FLAG_NEEDS_DOUBLEBUF       = 0x0100;
48   static const int FLAG_NEEDS_ASYNCBLIT       = 0x0200;
49#endif
50
4451   osd_renderer(sdl_window_info *window, const int flags)
4552   : m_window(window), m_flags(flags) { }
4653


Previous 199869 Revisions Next


© 1997-2024 The MAME Team