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);
	}
}
Exemplo n.º 2
0
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);
}