Previous 199869 Revisions Next

r34822 Tuesday 3rd February, 2015 at 18:31:11 UTC by Couriersud
Reowrked the -video soft driver so it works like accel and opengl. That
will enable the move of some now identical functions back to window.c.
(nw)
[src/osd/sdl]drawsdl.c input.c window.c window.h

trunk/src/osd/sdl/drawsdl.c
r243333r243334
6464   #endif
6565   m_yuv_lookup(NULL),
6666   m_yuv_bitmap(NULL),
67   m_hw_scale_width(0),
68   m_hw_scale_height(0),
67   //m_hw_scale_width(0),
68   //m_hw_scale_height(0),
6969   m_last_hofs(0),
7070   m_last_vofs(0),
7171   m_old_blitwidth(0),
r243333r243334
114114   // if we leave scaling to SDL and the underlying driver, this
115115   // is the render_target_width/height to use
116116
117   int                 m_hw_scale_width;
118   int                 m_hw_scale_height;
119117   int                 m_last_hofs;
120118   int                 m_last_vofs;
121119   int                 m_old_blitwidth;
r243333r243334
135133   const char      *sdl_scale_mode;        /* what to use as a hint ? */
136134#endif
137135   int             pixel_format;       /* Pixel/Overlay format  */
138   void            (*yuv_blit)(UINT16 *bitmap, sdl_info *sdl, UINT8 *ptr, int pitch);
136   void            (*yuv_blit)(const UINT16 *bitmap, UINT8 *ptr, const int pitch, const UINT32 *lookup, const int width, const int height);
139137};
140138
141139//============================================================
r243333r243334
151149
152150// YUV overlays
153151
154static void yuv_RGB_to_YV12(UINT16 *bitmap, sdl_info *sdl, UINT8 *ptr, int pitch);
155static void yuv_RGB_to_YV12X2(UINT16 *bitmap, sdl_info *sdl, UINT8 *ptr, int pitch);
156static void yuv_RGB_to_YUY2(UINT16 *bitmap, sdl_info *sdl, UINT8 *ptr, int pitch);
157static void yuv_RGB_to_YUY2X2(UINT16 *bitmap, sdl_info *sdl, UINT8 *ptr, int pitch);
152static void yuv_RGB_to_YV12(const UINT16 *bitmap, UINT8 *ptr, const int pitch, \
153      const UINT32 *lookup, const int width, const int height);
154static void yuv_RGB_to_YV12X2(const UINT16 *bitmap, UINT8 *ptr, const int pitch, \
155      const UINT32 *lookup, const int width, const int height);
156static void yuv_RGB_to_YUY2(const UINT16 *bitmap, UINT8 *ptr, const int pitch, \
157      const UINT32 *lookup, const int width, const int height);
158static void yuv_RGB_to_YUY2X2(const UINT16 *bitmap, UINT8 *ptr, const int pitch, \
159      const UINT32 *lookup, const int width, const int height);
158160
159161// Static declarations
160162
r243333r243334
163165
164166static const sdl_scale_mode scale_modes[] =
165167{
166      { "none",    0, 0, 0, 0, SDL_DOUBLEBUF, 0, 0 },
167      { "async",   0, 0, 0, 0, SDL_DOUBLEBUF | SDL_ASYNCBLIT, 0, 0 },
168      { "none",    0, 0, 1, 1, SDL_DOUBLEBUF, 0, 0 },
169      { "async",   0, 0, 1, 1, SDL_DOUBLEBUF | SDL_ASYNCBLIT, 0, 0 },
168170      { "yv12",    1, 1, 1, 1, 0,              SDL_YV12_OVERLAY, yuv_RGB_to_YV12 },
169171      { "yv12x2",  1, 1, 2, 2, 0,              SDL_YV12_OVERLAY, yuv_RGB_to_YV12X2 },
170172      { "yuy2",    1, 1, 1, 1, 0,              SDL_YUY2_OVERLAY, yuv_RGB_to_YUY2 },
r243333r243334
174176#else
175177static const sdl_scale_mode scale_modes[] =
176178{
177      { "none",    0, 0, 0, 0, DRAW2_SCALEMODE_NEAREST, 0, 0 },
179      { "none",    0, 0, 1, 1, DRAW2_SCALEMODE_NEAREST, 0, 0 },
178180      { "hwblit",  1, 0, 1, 1, DRAW2_SCALEMODE_LINEAR, 0, 0 },
179181      { "hwbest",  1, 0, 1, 1, DRAW2_SCALEMODE_BEST, 0, 0 },
180182      { "yv12",    1, 1, 1, 1, DRAW2_SCALEMODE_NEAREST, SDL_PIXELFORMAT_YV12, yuv_RGB_to_YV12 },
r243333r243334
280282      m_yuv_bitmap = NULL;
281283   }
282284
285   fmt = (sdl_sm->pixel_format ? sdl_sm->pixel_format : mode.format);
286
283287   if (sdl_sm->is_scale)
284288   {
289      int m_hw_scale_width =0;
290      int m_hw_scale_height = 0;
291
285292      window().m_target->compute_minimum_size(m_hw_scale_width, m_hw_scale_height);
286293      if (video_config.prescale)
287294      {
r243333r243334
291298         /* This must be a multiple of 2 */
292299         m_hw_scale_width = (m_hw_scale_width + 1) & ~1;
293300      }
294   }
301      if (sdl_sm->is_yuv)
302         m_yuv_bitmap = global_alloc_array(UINT16, m_hw_scale_width * m_hw_scale_height);
295303
296   if (sdl_sm->is_yuv)
297      m_yuv_bitmap = global_alloc_array(UINT16, m_hw_scale_width * m_hw_scale_height);
298
299   fmt = (sdl_sm->pixel_format ? sdl_sm->pixel_format : mode.format);
300
301   if (sdl_sm->is_scale)
302   {
303304      int w = m_hw_scale_width * sdl_sm->mult_w;
304305      int h = m_hw_scale_height * sdl_sm->mult_h;
305306
r243333r243334
355356      //return 1;
356357   }
357358
358   m_hw_scale_width = minimum_width;
359   m_hw_scale_height = minimum_height;
360
361359   if (!shown_video_info)
362360   {
363361      osd_printf_verbose("YUV Mode         : %s\n", sdl_sm->name);
r243333r243334
546544
547545   if (!m_sdlsurf)
548546      return 1;
549
550547   window().m_width = m_sdlsurf->w;
551548   window().m_height = m_sdlsurf->h;
552
553549   if (sm->is_yuv)
554550      yuv_overlay_init();
555551
r243333r243334
589585   
590586   m_sdlsurf = SDL_SetVideoMode(width, height, 0,
591587         SDL_SWSURFACE | SDL_ANYFORMAT | m_extra_flags);
588
592589   window().m_width = m_sdlsurf->w;
593590   window().m_height = m_sdlsurf->h;
594591
595   if (sdl_sm->is_yuv)
592      if (sdl_sm->is_yuv)
596593   {
597594      yuv_overlay_init();
598595   }
r243333r243334
670667      return 0;
671668   if (*yt<0 || *xt >= window().m_blitheight)
672669      return 0;
673   if (!sm->is_scale)
674   {
675      return 1;
676   }
677   /* Rescale */
678   *xt = (*xt * m_hw_scale_width) / window().m_blitwidth;
679   *yt = (*yt * m_hw_scale_height) / window().m_blitheight;
680670   return 1;
681671}
682672
r243333r243334
686676
687677void sdl_info::set_target_bounds()
688678{
689   const sdl_scale_mode *sm = &scale_modes[video_config.scale_mode];
690
691   if (!sm->is_scale)
692      window().m_target->set_bounds(window().m_blitwidth, window().m_blitheight, window().monitor()->aspect());
693   else
694      window().m_target->set_bounds(m_hw_scale_width, m_hw_scale_height);
679   window().m_target->set_bounds(window().m_blitwidth, window().m_blitheight, window().monitor()->aspect());
695680}
696681
697682//============================================================
r243333r243334
703688   const sdl_scale_mode *sm = &scale_modes[video_config.scale_mode];
704689   UINT8 *surfptr;
705690   INT32 pitch;
706   int bpp;
707691   Uint32 rmask, gmask, bmask;
708692#if (SDLMAME_SDL2)
709693   Uint32 amask;
710694#endif
711695   INT32 vofs, hofs, blitwidth, blitheight, ch, cw;
696   int bpp;
712697
713698   if (video_config.novideo)
714699   {
r243333r243334
750735      SDL_LockYUVOverlay(m_yuvsurf);
751736      surfptr = m_yuvsurf->pixels[0]; // (UINT8 *) m_yuv_bitmap;
752737      pitch = m_yuvsurf->pitches[0]; // (UINT8 *) m_yuv_bitmap;
738#if 0
739      printf("abcd %d\n", m_yuvsurf->h);
740      printf("abcd %d %d %d\n", m_yuvsurf->pitches[0], m_yuvsurf->pitches[1], m_yuvsurf->pitches[2]);
741      printf("abcd %p %p %p\n", m_yuvsurf->pixels[0], m_yuvsurf->pixels[1], m_yuvsurf->pixels[2]);
742      printf("abcd %ld %ld\n", m_yuvsurf->pixels[1] - m_yuvsurf->pixels[0], m_yuvsurf->pixels[2] - m_yuvsurf->pixels[1]);
743#endif
753744   }
754745   else
755746      surfptr = (UINT8 *)m_sdlsurf->pixels;
r243333r243334
832823
833824   window().m_primlist->acquire_lock();
834825
835   // render to it
836   if (!sm->is_yuv)
837   {
838      int mamewidth, mameheight;
826   int mamewidth, mameheight;
839827
840      if (!sm->is_scale)
828#if !SDLMAME_SDL2
829      if (!sm->is_yuv)
841830      {
842         mamewidth = blitwidth;
843         mameheight = blitheight;
844#if !SDLMAME_SDL2
845831         surfptr += ((vofs * pitch) + (hofs * bpp));
846#endif
832         mamewidth = blitwidth; //m_sdlsurf->w;
833         mameheight = blitheight; //m_sdlsurf->h;
847834      }
848835      else
849836      {
850         mamewidth = m_hw_scale_width;
851         mameheight = m_hw_scale_height;
837         mamewidth = m_yuvsurf->w / sm->mult_w;
838         mameheight = m_yuvsurf->h / sm->mult_h;
852839      }
840#else
841      Uint32 fmt = 0;
842      int access = 0;
843      SDL_QueryTexture(m_texture_id, &fmt, &access, &mamewidth, &mameheight);
844      mamewidth /= sm->mult_w;
845      mameheight /= sm->mult_h;
846#endif
847   //printf("w h %d %d %d %d\n", mamewidth, mameheight, blitwidth, blitheight);
848
849   // rescale bounds
850   float fw = (float) mamewidth / (float) blitwidth;
851   float fh = (float) mameheight / (float) blitheight;
852
853   // FIXME: this could be a lot easier if we get the primlist here!
854   //         Bounds would be set fit for purpose and done!
855
856   for (render_primitive *prim = window().m_primlist->first(); prim != NULL; prim = prim->next())
857   {
858      prim->bounds.x0 *= fw;
859      prim->bounds.x1 *= fw;
860      prim->bounds.y0 *= fh;
861      prim->bounds.y1 *= fh;
862   }
863
864   // render to it
865   if (!sm->is_yuv)
866   {
853867      switch (rmask)
854868      {
855869         case 0x0000ff00:
r243333r243334
881895   {
882896      assert (m_yuv_bitmap != NULL);
883897      assert (surfptr != NULL);
884      software_renderer<UINT16, 3,3,3, 10,5,0>::draw_primitives(*window().m_primlist, m_yuv_bitmap, m_hw_scale_width, m_hw_scale_height, m_hw_scale_width);
885      sm->yuv_blit((UINT16 *)m_yuv_bitmap, this, surfptr, pitch);
898      software_renderer<UINT16, 3,3,3, 10,5,0>::draw_primitives(*window().m_primlist, m_yuv_bitmap, mamewidth, mameheight, mamewidth);
899      sm->yuv_blit((UINT16 *)m_yuv_bitmap, surfptr, pitch, m_yuv_lookup, mamewidth, mameheight);
886900   }
887901
888902   window().m_primlist->release_lock();
r243333r243334
9921006         }
9931007}
9941008
995static void yuv_RGB_to_YV12(UINT16 *bitmap, sdl_info *sdl, UINT8 *ptr, int pitch)
1009//UINT32 *lookup = sdl->m_yuv_lookup;
1010
1011static void yuv_RGB_to_YV12(const UINT16 *bitmap, UINT8 *ptr, const int pitch, \
1012      const UINT32 *lookup, const int width, const int height)
9961013{
9971014   int x, y;
998   UINT8 *dest_y;
999   UINT8 *dest_u;
1000   UINT8 *dest_v;
1001   UINT16 *src;
1002   UINT16 *src2;
1003   UINT32 *lookup = sdl->m_yuv_lookup;
10041015   UINT8 *pixels[3];
10051016   int u1,v1,y1,u2,v2,y2,u3,v3,y3,u4,v4,y4;      /* 12 */
10061017
10071018   pixels[0] = ptr;
1008   pixels[1] = ptr + pitch * sdl->m_hw_scale_height;
1009   pixels[2] = pixels[1] + pitch * sdl->m_hw_scale_height / 4;
1019   pixels[1] = ptr + pitch * height;
1020   pixels[2] = pixels[1] + pitch * height / 4;
10101021
1011   for(y=0;y<sdl->m_hw_scale_height;y+=2)
1022   for(y=0;y<height;y+=2)
10121023   {
1013      src=bitmap + (y * sdl->m_hw_scale_width) ;
1014      src2=src + sdl->m_hw_scale_width;
1024      const UINT16 *src=bitmap + (y * width) ;
1025      const UINT16 *src2=src + width;
10151026
1016      dest_y = pixels[0] + y * pitch;
1017      dest_v = pixels[1] + (y>>1) * pitch / 2;
1018      dest_u = pixels[2] + (y>>1) * pitch / 2;
1027      UINT8 *dest_y = pixels[0] + y * pitch;
1028      UINT8 *dest_v = pixels[1] + (y>>1) * pitch / 2;
1029      UINT8 *dest_u = pixels[2] + (y>>1) * pitch / 2;
10191030
1020      for(x=0;x<sdl->m_hw_scale_width;x+=2)
1031      for(x=0;x<width;x+=2)
10211032      {
10221033         v1 = lookup[src[x]];
10231034         y1 = (v1>>Y1SHIFT) & 0xff;
r243333r243334
10511062   }
10521063}
10531064
1054static void yuv_RGB_to_YV12X2(UINT16 *bitmap, sdl_info *sdl, UINT8 *ptr, int pitch)
1065static void yuv_RGB_to_YV12X2(const UINT16 *bitmap, UINT8 *ptr, const int pitch, \
1066      const UINT32 *lookup, const int width, const int height)
10551067{
10561068   /* this one is used when scale==2 */
10571069   unsigned int x,y;
1058   UINT16 *dest_y;
1059   UINT8 *dest_u;
1060   UINT8 *dest_v;
1061   UINT16 *src;
10621070   int u1,v1,y1;
10631071   UINT8 *pixels[3];
10641072
10651073   pixels[0] = ptr;
1066   pixels[1] = ptr + pitch * sdl->m_hw_scale_height * 2;
1067   pixels[2] = pixels[1] + pitch * sdl->m_hw_scale_height / 2;
1074   pixels[1] = ptr + pitch * height * 2;
1075#if (SDLMAME_SDL2)
1076   int p2 = (pitch >> 1);
1077#else
1078   int p2 = (pitch + 7) & ~ 7;;
1079   p2 = (p2 >> 1);
1080#endif
1081   pixels[2] = pixels[1] + p2 * height;
10681082
1069   for(y=0;y<sdl->m_hw_scale_height;y++)
1083   for(y=0;y<height;y++)
10701084   {
1071      src = bitmap + (y * sdl->m_hw_scale_width) ;
1085      const UINT16 *src = bitmap + (y * width) ;
10721086
1073      dest_y = (UINT16 *)(pixels[0] + 2 * y * pitch);
1074      dest_v = pixels[1] + y * pitch / 2;
1075      dest_u = pixels[2] + y * pitch / 2;
1076      for(x=0;x<sdl->m_hw_scale_width;x++)
1087      UINT16 *dest_y = (UINT16 *)(pixels[0] + 2 * y * pitch);
1088      UINT8 *dest_v = pixels[1] + y * p2;
1089      UINT8 *dest_u = pixels[2] + y * p2;
1090      for(x=0;x<width;x++)
10771091      {
1078         v1 = sdl->m_yuv_lookup[src[x]];
1092         v1 = lookup[src[x]];
10791093         y1 = (v1 >> Y1SHIFT) & 0xff;
10801094         u1 = (v1 >> USHIFT)  & 0xff;
10811095         v1 = (v1 >> VSHIFT)  & 0xff;
r243333r243334
10881102   }
10891103}
10901104
1091static void yuv_RGB_to_YUY2(UINT16 *bitmap, sdl_info *sdl, UINT8 *ptr, int pitch)
1105static void yuv_RGB_to_YUY2(const UINT16 *bitmap, UINT8 *ptr, const int pitch, \
1106      const UINT32 *lookup, const int width, const int height)
10921107{
10931108   /* this one is used when scale==2 */
10941109   unsigned int y;
1095   UINT32 *dest;
1096   UINT16 *src;
1097   UINT16 *end;
10981110   UINT32 p1,p2,uv;
1099   UINT32 *lookup = sdl->m_yuv_lookup;
1100   int yuv_pitch = pitch/4;
1111   const int yuv_pitch = pitch/4;
11011112
1102   for(y=0;y<sdl->m_hw_scale_height;y++)
1113   for(y=0;y<height;y++)
11031114   {
1104      src=bitmap + (y * sdl->m_hw_scale_width) ;
1105      end=src+sdl->m_hw_scale_width;
1115      const UINT16 *src=bitmap + (y * width) ;
1116      const UINT16 *end=src+width;
11061117
1107      dest = (UINT32 *) ptr;
1118      UINT32 *dest = (UINT32 *) ptr;
11081119      dest += y * yuv_pitch;
11091120      for(; src<end; src+=2)
11101121      {
r243333r243334
11171128   }
11181129}
11191130
1120static void yuv_RGB_to_YUY2X2(UINT16 *bitmap, sdl_info *sdl, UINT8 *ptr, int pitch)
1131static void yuv_RGB_to_YUY2X2(const UINT16 *bitmap, UINT8 *ptr, const int pitch, \
1132      const UINT32 *lookup, const int width, const int height)
11211133{
11221134   /* this one is used when scale==2 */
11231135   unsigned int y;
1124   UINT32 *dest;
1125   UINT16 *src;
1126   UINT16 *end;
1127   UINT32 *lookup = sdl->m_yuv_lookup;
11281136   int yuv_pitch = pitch / 4;
11291137
1130   for(y=0;y<sdl->m_hw_scale_height;y++)
1138   for(y=0;y<height;y++)
11311139   {
1132      src=bitmap + (y * sdl->m_hw_scale_width) ;
1133      end=src+sdl->m_hw_scale_width;
1140      const UINT16 *src=bitmap + (y * width) ;
1141      const UINT16 *end=src+width;
11341142
1135      dest = (UINT32 *) ptr;
1143      UINT32 *dest = (UINT32 *) ptr;
11361144      dest += (y * yuv_pitch);
11371145      for(; src<end; src++)
11381146      {
trunk/src/osd/sdl/input.c
r243333r243334
18621862            int cx, cy;
18631863            osd_ticks_t click = osd_ticks() * 1000 / osd_ticks_per_second();
18641864            sdl_window_info *window = GET_FOCUS_WINDOW(&event.button);
1865            if (window != NULL && window->renderer().xy_to_render_target(event.button.x,event.button.y, &cx, &cy) )
1865            if (window != NULL && window->xy_to_render_target(event.button.x,event.button.y, &cx, &cy) )
18661866            {
18671867               ui_input_push_mouse_down_event(machine, window->m_target, cx, cy);
18681868               // FIXME Parameter ?
r243333r243334
18961896            int cx, cy;
18971897            sdl_window_info *window = GET_FOCUS_WINDOW(&event.button);
18981898
1899            if (window != NULL && window->renderer().xy_to_render_target(event.button.x,event.button.y, &cx, &cy) )
1899            if (window != NULL && window->xy_to_render_target(event.button.x,event.button.y, &cx, &cy) )
19001900            {
19011901               ui_input_push_mouse_up_event(machine, window->m_target, cx, cy);
19021902            }
r243333r243334
19211921            int cx=-1, cy=-1;
19221922            sdl_window_info *window = GET_FOCUS_WINDOW(&event.motion);
19231923
1924            if (window != NULL && window->renderer().xy_to_render_target(event.motion.x, event.motion.y, &cx, &cy) )
1924            if (window != NULL && window->xy_to_render_target(event.motion.x, event.motion.y, &cx, &cy) )
19251925               ui_input_push_mouse_move_event(machine, window->m_target, cx, cy);
19261926         }
19271927         break;
trunk/src/osd/sdl/window.c
r243333r243334
5555#define ASSERT_WINDOW_THREAD()  ASSERT_USE(window_threadid)
5656#define ASSERT_MAIN_THREAD()    ASSERT_USE(main_threadid)
5757
58#define OSDWORK_CALLBACK(name)  void *name(void *param, ATTR_UNUSED int threadid)
59
6058// minimum window dimension
6159#define MIN_WINDOW_DIM                  200
6260
r243333r243334
141139//  PROTOTYPES
142140//============================================================
143141
144static OSDWORK_CALLBACK( draw_video_contents_wt );
145static OSDWORK_CALLBACK( sdlwindow_video_window_destroy_wt );
146static OSDWORK_CALLBACK( sdlwindow_resize_wt );
147static OSDWORK_CALLBACK( sdlwindow_toggle_full_screen_wt );
148142static void sdlwindow_update_cursor_state(running_machine &machine, sdl_window_info *window);
149143static void sdlwindow_sync(void);
150144
151static void *complete_create_wt(void *param, int threadid);
152145static void set_starting_view(running_machine &machine, int index, sdl_window_info *window, const char *defview, const char *view);
153146
154147//============================================================
r243333r243334
483476//  (main thread)
484477//============================================================
485478
486static OSDWORK_CALLBACK( sdlwindow_resize_wt )
479OSDWORK_CALLBACK( sdl_window_info::sdlwindow_resize_wt )
487480{
488481   worker_param *      wp = (worker_param *) param;
489482   sdl_window_info *   window = wp->window();
r243333r243334
517510//  (window thread)
518511//============================================================
519512
520static OSDWORK_CALLBACK( sdlwindow_clear_surface_wt )
513OSDWORK_CALLBACK( sdl_window_info::sdlwindow_clear_surface_wt )
521514{
522515   worker_param *wp = (worker_param *) param;
523516   sdl_window_info *window = wp->window();
r243333r243334
547540//  (main thread)
548541//============================================================
549542
550static OSDWORK_CALLBACK( sdlwindow_toggle_full_screen_wt )
543OSDWORK_CALLBACK( sdl_window_info::sdlwindow_toggle_full_screen_wt )
551544{
552545   worker_param *wp = (worker_param *) param;
553546   sdl_window_info *window = wp->window();
r243333r243334
583576   execute_async_wait(&sdlwindow_toggle_full_screen_wt, worker_param(machine, this));
584577}
585578
586static OSDWORK_CALLBACK( destroy_all_textures_wt )
579OSDWORK_CALLBACK( sdl_window_info::destroy_all_textures_wt )
587580{
588581   worker_param *wp = (worker_param *) param;
589582
r243333r243334
703696   return NULL;
704697}
705698
699int sdl_window_info::xy_to_render_target(int x, int y, int *xt, int *yt)
700{
701   return renderer().xy_to_render_target(x, y, xt, yt);
702}
706703
707704//============================================================
708705//  sdlwindow_video_window_create
r243333r243334
753750   {
754751      osd_work_item *wi;
755752
756      wi = osd_work_item_queue(work_queue, &complete_create_wt, (void *) wp, 0);
753      wi = osd_work_item_queue(work_queue, &sdl_window_info::complete_create_wt, (void *) wp, 0);
757754      sdlwindow_sync();
758755      result = *((int *) (osd_work_item_result)(wi));
759756      osd_work_item_release(wi);
760757   }
761758   else
762      result = *((int *) complete_create_wt((void *) wp, 0));
759      result = *((int *) sdl_window_info::complete_create_wt((void *) wp, 0));
763760
764761   // handle error conditions
765762   if (result == 1)
r243333r243334
780777//  (main thread)
781778//============================================================
782779
783static OSDWORK_CALLBACK( sdlwindow_video_window_destroy_wt )
780OSDWORK_CALLBACK( sdl_window_info::sdlwindow_video_window_destroy_wt )
784781{
785782   worker_param *      wp = (worker_param *) param;
786783   sdl_window_info *   window = wp->window();
r243333r243334
10751072//  (window thread)
10761073//============================================================
10771074
1078static OSDWORK_CALLBACK( complete_create_wt )
1075OSDWORK_CALLBACK( sdl_window_info::complete_create_wt )
10791076{
10801077   worker_param *      wp = (worker_param *) param;
10811078   sdl_window_info *   window = wp->window();
r243333r243334
11391136//  (window thread)
11401137//============================================================
11411138
1142static void measure_fps(sdl_window_info *window, UINT32 dc, int update)
1139void sdl_window_info::measure_fps(UINT32 dc, int update)
11431140{
11441141   const unsigned long frames_skip4fps = 100;
11451142   static int64_t lastTime=0, sumdt=0, startTime=0;
r243333r243334
11541151
11551152   t0 = osd_ticks();
11561153
1157   window->renderer().draw(dc, update);
1154   renderer().draw(dc, update);
11581155
11591156   frames++;
11601157   currentTime = osd_ticks();
r243333r243334
11811178   }
11821179}
11831180
1184static OSDWORK_CALLBACK( draw_video_contents_wt )
1181OSDWORK_CALLBACK( sdl_window_info::draw_video_contents_wt )
11851182{
11861183   UINT32  dc =        0;
11871184   int     update =    1;
r243333r243334
12031200   else
12041201   {
12051202      if( video_config.perftest )
1206         measure_fps(window, dc, update);
1203         window->measure_fps(dc, update);
12071204      else
12081205         window->renderer().draw(dc, update);
12091206   }
trunk/src/osd/sdl/window.h
r243333r243334
5757   sdl_window_info *m_window;
5858};
5959
60#define OSDWORK_CALLBACK(name)  void *name(void *param, ATTR_UNUSED int threadid)
61
6062class sdl_window_info
6163{
6264public:
r243333r243334
116118   void pick_best_mode(int *fswidth, int *fsheight);
117119   int index() const { return m_index; }
118120
119   osd_renderer &renderer() { return *m_renderer; }
121   int xy_to_render_target(int x, int y, int *xt, int *yt);
120122
121123   // Pointer to next window
122124   sdl_window_info *   m_next;
r243333r243334
167169   {
168170      m_renderer = renderer;
169171   }
172
173   static OSDWORK_CALLBACK( complete_create_wt );
174protected:
175   osd_renderer &renderer() { return *m_renderer; }
170176private:
171177   void constrain_to_aspect_ratio(int *window_width, int *window_height, int adjustment);
172178
r243333r243334
178184   int                 m_index;
179185   osd_renderer *      m_renderer;
180186
187   // static callbacks ...
188
189   static OSDWORK_CALLBACK( sdlwindow_resize_wt );
190   static OSDWORK_CALLBACK( draw_video_contents_wt );
191   static OSDWORK_CALLBACK( sdlwindow_video_window_destroy_wt );
192   static OSDWORK_CALLBACK( sdlwindow_toggle_full_screen_wt );
193   static OSDWORK_CALLBACK( sdlwindow_clear_surface_wt );
194   static OSDWORK_CALLBACK( destroy_all_textures_wt );
195
196   void measure_fps(UINT32 dc, int update);
197
181198};
182199
183200struct sdl_draw_info


Previous 199869 Revisions Next


© 1997-2024 The MAME Team