void cpu_startnext(uintptr_t eip, unsigned cpu) { uintptr_t sysp = (uintptr_t)lsp.system_private.p->kern_syspageptr; if (debug_flag) { kprintf("cpu_startnext: cpu%d -> %x\n", cpu, eip); } board_cpu_startnext(); /* * Call the next program, passing syspage pointer in r0 */ if (shdr->flags1 & STARTUP_HDR_FLAGS1_VIRTUAL) { if (vstart == 0) { vstart = vstart_v4; } vstart(sysp, eip, cpu); } else { ((void (*)(void *, unsigned))eip)((void *)sysp, cpu); } }
void VideoDisplay::DrawOverscanMask(float horizontal_percent, float vertical_percent) const { Vector2D v(viewport_width, viewport_height); Vector2D size = Vector2D(horizontal_percent, vertical_percent) / 2 * v; // Clockwise from top-left Vector2D corners[] = { size, Vector2D(viewport_width - size.X(), size), v - size, Vector2D(size, viewport_height - size.Y()) }; // Shift to compensate for black bars Vector2D pos(viewport_left, viewport_top); for (auto& corner : corners) corner = corner + pos; int count = 0; std::vector<float> points; for (size_t i = 0; i < 4; ++i) { size_t prev = (i + 3) % 4; size_t next = (i + 1) % 4; count += SplineCurve( (corners[prev] + corners[i] * 4) / 5, corners[i], corners[i], (corners[next] + corners[i] * 4) / 5) .GetPoints(points); } OpenGLWrapper gl; gl.SetFillColour(wxColor(30, 70, 200), .5f); gl.SetLineColour(*wxBLACK, 0, 1); std::vector<int> vstart(1, 0); std::vector<int> vcount(1, count); gl.DrawMultiPolygon(points, vstart, vcount, Vector2D(viewport_left, viewport_top), Vector2D(viewport_width, viewport_height), true); }