void cpu_init_refresh_timer(void) { /* allocate an infinite timer to track elapsed time since the last refresh */ refresh_period = TIME_IN_HZ(Machine->drv->frames_per_second); refresh_period_inv = 1.0 / refresh_period; refresh_timer = timer_alloc(NULL); /* while we're at it, compute the scanline times */ cpu_compute_scanline_timing(); }
void set_refresh_rate(float fps) { /* bail if already equal */ if (Machine->refresh_rate == fps) return; /* "dirty" the rate for the next display update */ refresh_rate_changed = 1; /* set the new values in the Machine struct */ Machine->refresh_rate = fps; /* recompute scanline timing */ cpu_compute_scanline_timing(); }
void set_visible_area(int min_x, int max_x, int min_y, int max_y) { if ( Machine->visible_area.min_x == min_x && Machine->visible_area.max_x == max_x && Machine->visible_area.min_y == min_y && Machine->visible_area.max_y == max_y) return; /* "dirty" the area for the next display update */ visible_area_changed = 1; /* bounds check */ if (!(Machine->drv->video_attributes & VIDEO_TYPE_VECTOR) && scrbitmap[0]) if ((min_x < 0) || (min_y < 0) || (max_x >= scrbitmap[0]->width) || (max_y >= scrbitmap[0]->height)) { fatalerror("set_visible_area(%d,%d,%d,%d) out of bounds; bitmap dimensions are (%d,%d)", min_x, min_y, max_x, max_y, scrbitmap[0]->width, scrbitmap[0]->height); } /* set the new values in the Machine struct */ Machine->visible_area.min_x = min_x; Machine->visible_area.max_x = max_x; Machine->visible_area.min_y = min_y; Machine->visible_area.max_y = max_y; /* vector games always use the whole bitmap */ if (Machine->drv->video_attributes & VIDEO_TYPE_VECTOR) { Machine->absolute_visible_area.min_x = 0; Machine->absolute_visible_area.max_x = scrbitmap[0]->width - 1; Machine->absolute_visible_area.min_y = 0; Machine->absolute_visible_area.max_y = scrbitmap[0]->height - 1; } /* raster games need to use the visible area */ else Machine->absolute_visible_area = Machine->visible_area; /* recompute scanline timing */ cpu_compute_scanline_timing(); /* set UI visible area */ ui_set_visible_area(Machine->absolute_visible_area.min_x, Machine->absolute_visible_area.min_y, Machine->absolute_visible_area.max_x, Machine->absolute_visible_area.max_y); }
void video_screen_configure(int scrnum, int width, int height, const rectangle *visarea, float refresh) { const screen_config *config = &Machine->drv->screen[scrnum]; screen_state *state = &Machine->screen[scrnum]; internal_screen_info *info = &scrinfo[scrnum]; mame_time timeval; /* reallocate bitmap if necessary */ if (!(Machine->drv->video_attributes & VIDEO_TYPE_VECTOR)) { int curwidth = 0, curheight = 0; /* reality checks */ if (visarea->min_x < 0 || visarea->min_y < 0 || visarea->max_x >= width || visarea->max_y >= height) fatalerror("video_screen_configure(): visible area must be contained within the width/height!"); /* extract the current width/height from the bitmap */ if (info->bitmap[0] != NULL) { curwidth = info->bitmap[0]->width; curheight = info->bitmap[0]->height; } /* if we're too small to contain this width/height, reallocate our bitmaps and textures */ if (width > curwidth || height > curheight) { mame_bitmap_format screen_format = state->format; /* free what we have currently */ if (info->texture != NULL) render_texture_free(info->texture); if (info->bitmap[0] != NULL) bitmap_free(info->bitmap[0]); if (info->bitmap[1] != NULL) bitmap_free(info->bitmap[1]); /* compute new width/height */ curwidth = MAX(width, curwidth); curheight = MAX(height, curheight); /* choose the texture format */ /* convert the screen format to a texture format */ switch (screen_format) { case BITMAP_FORMAT_INDEXED16: info->format = TEXFORMAT_PALETTE16; break; case BITMAP_FORMAT_RGB15: info->format = TEXFORMAT_RGB15; break; case BITMAP_FORMAT_RGB32: info->format = TEXFORMAT_RGB32; break; default: fatalerror("Invalid bitmap format!"); break; } /* allocate new stuff */ info->bitmap[0] = bitmap_alloc_format(curwidth, curheight, screen_format); info->bitmap[1] = bitmap_alloc_format(curwidth, curheight, screen_format); info->texture = render_texture_alloc(info->bitmap[0], visarea, config->palette_base, info->format, NULL, NULL); } } /* now fill in the new parameters */ state->width = width; state->height = height; state->visarea = *visarea; state->refresh = refresh; /* compute timing parameters */ timeval = double_to_mame_time(TIME_IN_HZ(refresh) / (double)height); assert(timeval.seconds == 0); info->scantime = timeval.subseconds; info->pixeltime = timeval.subseconds / width; /* recompute scanline timing */ cpu_compute_scanline_timing(); }