コード例 #1
0
ファイル: debugger_disasm.cpp プロジェクト: Bennieboj/ppsspp
void Debugger_Disasm::Step()
{
	EmuThread_LockDraw(true);
	Core_DoSingleStep();
	EmuThread_LockDraw(false);
	_dbg_update_();
}
コード例 #2
0
ファイル: QtHost.cpp プロジェクト: Carter07/ppsspp
void QtHost::SendGPUWait(u32 cmd, u32 addr, void *data)
{
	EmuThread_LockDraw(false);

	if((m_GPUFlag == 1 && (cmd == GE_CMD_PRIM || cmd == GE_CMD_BEZIER || cmd == GE_CMD_SPLINE)))
	{
		// Break after the draw
		m_GPUFlag = 0;
	}
	else if(m_GPUFlag == 0)
	{
		mainWindow->GetDialogDisasm()->UpdateDisplayList();
		mainWindow->GetDialogDisplaylist()->Update();
		m_hGPUStepEvent.wait(m_hGPUStepMutex);
	}
	else if(m_GPUFlag == 2 && addr == m_GPUData)
	{
		mainWindow->GetDialogDisasm()->UpdateDisplayList();
		mainWindow->GetDialogDisplaylist()->Update();
		m_hGPUStepEvent.wait(m_hGPUStepMutex);
	}
	else if(m_GPUFlag == 3 && (cmd == GE_CMD_PRIM || cmd == GE_CMD_BEZIER || cmd == GE_CMD_SPLINE))
	{
		GPUgstate *state = (GPUgstate*)data;
		u32 texAddr = (state->texaddr[0] & 0xFFFFF0) | ((state->texbufwidth[0]<<8) & 0x0F000000);
		if(texAddr == m_GPUData)
		{
			mainWindow->GetDialogDisasm()->UpdateDisplayList();
			mainWindow->GetDialogDisplaylist()->Update();
			m_hGPUStepEvent.wait(m_hGPUStepMutex);
		}
	}

	EmuThread_LockDraw(true);
}
コード例 #3
0
ファイル: debugger_disasm.cpp プロジェクト: Bennieboj/ppsspp
void Debugger_Disasm::UpdateBreakpointsGUI()
{
	u32 curBpAddr = 0;
	QTreeWidgetItem* curItem = ui->breakpointsList->currentItem();
	if(curItem)
		curBpAddr = ui->breakpointsList->currentItem()->data(0,Qt::UserRole).toInt();

	ui->breakpointsList->clear();

	EmuThread_LockDraw(true);
	for(int i = 0; i < CBreakPoints::GetNumBreakpoints(); i++)
	{
		u32 addr_ = CBreakPoints::GetBreakpointAddress(i);
		if(!CBreakPoints::IsTempBreakPoint(addr_))
		{
			QTreeWidgetItem* item = new QTreeWidgetItem();
			item->setText(0,QString("%1").arg(addr_,8,16,QChar('0')));
			item->setData(0,Qt::UserRole,addr_);
			ui->breakpointsList->addTopLevelItem(item);
			if(curBpAddr == addr_)
				ui->breakpointsList->setCurrentItem(item);
		}
	}
	EmuThread_LockDraw(false);
}
コード例 #4
0
ファイル: debugger_disasm.cpp プロジェクト: Bennieboj/ppsspp
void Debugger_Disasm::Go()
{
	SetDebugMode(false);
	EmuThread_LockDraw(true);
	Core_EnableStepping(false);
	EmuThread_LockDraw(false);
	mainWindow->UpdateMenus();
}
コード例 #5
0
ファイル: debugger_disasm.cpp プロジェクト: Bennieboj/ppsspp
void Debugger_Disasm::SetThreadStatus(ThreadStatus status)
{
	EmuThread_LockDraw(true);
	__KernelChangeThreadState(threadRowSelected->data(0,Qt::UserRole).toInt(), status);
	EmuThread_LockDraw(false);

	UpdateThread();
}
コード例 #6
0
ファイル: QtHost.cpp プロジェクト: Almamu/ppsspp
void QtHost::SendGPUWait()
{
	EmuThread_LockDraw(false);

	mainWindow->GetDialogDisasm()->UpdateDisplayList();
	m_hGPUStepEvent.wait(m_hGPUStepMutex);

	EmuThread_LockDraw(true);
}
コード例 #7
0
ファイル: debugger_disasm.cpp プロジェクト: Bennieboj/ppsspp
void Debugger_Disasm::Skip()
{
	CtrlDisAsmView *ptr = ui->DisasmView;

	EmuThread_LockDraw(true);
	cpu->SetPC(cpu->GetPC() + cpu->getInstructionSize(0));
	EmuThread_LockDraw(false);
	ptr->gotoPC();
	UpdateDialog();
}
コード例 #8
0
ファイル: debugger_disasm.cpp プロジェクト: Bennieboj/ppsspp
void Debugger_Disasm::Stop()
{
	SetDebugMode(true);
	EmuThread_LockDraw(true);
	Core_EnableStepping(true);
	EmuThread_LockDraw(false);
	_dbg_update_();
	mainWindow->UpdateMenus();
	UpdateDialog();
}
コード例 #9
0
ファイル: debugger_disasm.cpp プロジェクト: Bennieboj/ppsspp
void Debugger_Disasm::StepHLE()
{
	EmuThread_LockDraw(true);
	hleDebugBreak();
	SetDebugMode(false);
	_dbg_update_();
	Core_EnableStepping(false);
	EmuThread_LockDraw(false);
	mainWindow->UpdateMenus();
}
コード例 #10
0
ファイル: debugger_disasm.cpp プロジェクト: Bennieboj/ppsspp
void Debugger_Disasm::StepOver()
{
	SetDebugMode(false);
	EmuThread_LockDraw(true);
	CBreakPoints::AddBreakPoint(cpu->GetPC()+cpu->getInstructionSize(0),true);
	_dbg_update_();
	Core_EnableStepping(false);
	EmuThread_LockDraw(false);
	mainWindow->UpdateMenus();
}
コード例 #11
0
ファイル: QtHost.cpp プロジェクト: Carter07/ppsspp
void QtHost::SendGPUStart()
{
	EmuThread_LockDraw(false);

	if(m_GPUFlag == -1)
	{
		m_GPUFlag = 0;
	}

	EmuThread_LockDraw(true);
}
コード例 #12
0
ファイル: ctrlregisterlist.cpp プロジェクト: wanfhx/ppsspp
void CtrlRegisterList::CopyValue()
{
	int cat = category;
	int reg = selection;
	if (selection >= cpu->GetNumRegsInCategory(cat))
		return;

	EmuThread_LockDraw(true);
	u32 val = cpu->GetRegValue(cat,reg);
	EmuThread_LockDraw(false);

	QApplication::clipboard()->setText(QString("%1").arg(val,8,16,QChar('0')));
}
コード例 #13
0
ファイル: ctrlregisterlist.cpp プロジェクト: wanfhx/ppsspp
void CtrlRegisterList::GotoDisAsm()
{
	int cat = category;
	int reg = selection;
	if (selection >= cpu->GetNumRegsInCategory(cat))
		return;

	EmuThread_LockDraw(true);
	u32 val = cpu->GetRegValue(cat,reg);
	EmuThread_LockDraw(false);

	emit GotoDisasm(val);
}
コード例 #14
0
ファイル: ctrlregisterlist.cpp プロジェクト: wanfhx/ppsspp
void CtrlRegisterList::GotoMemory()
{
	int cat = category;
	int reg = selection;
	if (selection >= cpu->GetNumRegsInCategory(cat))
		return;

	EmuThread_LockDraw(true);
	u32 val = cpu->GetRegValue(cat,reg);
	EmuThread_LockDraw(false);

	parentWindow->ShowMemory(val);
}
コード例 #15
0
ファイル: gamepaddialog.cpp プロジェクト: Almamu/ppsspp
void GamePadDialog::showEvent(QShowEvent *)
{
#ifdef Q_WS_X11
	// Hack to remove the X11 crash with threaded opengl when opening the first dialog
	EmuThread_LockDraw(true);
	QTimer::singleShot(100, this, SLOT(releaseLock()));
#endif
}
コード例 #16
0
ファイル: ctrlmemview.cpp プロジェクト: CrazyMax/ppsspp
void CtrlMemView::Change()
{
	EmuThread_LockDraw(true);
	QString curVal = QString("%1").arg(Memory::ReadUnchecked_U32(selection),8,16,QChar('0'));
	EmuThread_LockDraw(false);

	bool ok;
	QString text = QInputDialog::getText(this, tr("Set new value"),
								tr("Set new value:"), QLineEdit::Normal,
								curVal, &ok);
	if (ok && !text.isEmpty())
	{
		EmuThread_LockDraw(true);
		Memory::WriteUnchecked_U32(text.toUInt(0,16),selection);
		EmuThread_LockDraw(false);
		redraw();
	}
}
コード例 #17
0
ファイル: debugger_disasm.cpp プロジェクト: Almamu/ppsspp
void Debugger_Disasm::UpdateThreadGUI()
{
	ui->threadList->clear();

	EmuThread_LockDraw(true);
	std::vector<DebugThreadInfo> threads = GetThreadsInfo();
	EmuThread_LockDraw(false);

	for(int i = 0; i < threads.size(); i++)
	{
		QTreeWidgetItem* item = new QTreeWidgetItem();
		item->setText(0,QVariant(threads[i].id).toString());
		item->setData(0,Qt::UserRole,threads[i].id);
		item->setText(1,threads[i].name);
		QString status = "";
		if(threads[i].status & THREADSTATUS_RUNNING) status += "Running ";
		if(threads[i].status & THREADSTATUS_WAIT) status += "Wait ";
		if(threads[i].status & THREADSTATUS_READY) status += "Ready ";
		if(threads[i].status & THREADSTATUS_SUSPEND) status += "Suspend ";
		if(threads[i].status & THREADSTATUS_DORMANT) status += "Dormant ";
		if(threads[i].status & THREADSTATUS_DEAD) status += "Dead ";
		item->setText(2,status);
		char temp[24];
		sprintf(temp,"%08x",threads[i].curPC);
		item->setText(3,temp);
		item->setData(3,Qt::UserRole,threads[i].curPC);
		sprintf(temp,"%08x",threads[i].entrypoint);
		item->setText(4,temp);
		item->setData(4,Qt::UserRole,threads[i].entrypoint);

		if(threads[i].isCurrent)
		{
			for(int j = 0; j < 5; j++)
				item->setTextColor(j,Qt::green);
		}

		ui->threadList->addTopLevelItem(item);
	}
}
コード例 #18
0
ファイル: debugger_disasm.cpp プロジェクト: Bennieboj/ppsspp
void Debugger_Disasm::UpdateThreadGUI()
{
	ui->threadList->clear();

	EmuThread_LockDraw(true);
	std::vector<DebugThreadInfo> threads = GetThreadsInfo();
	EmuThread_LockDraw(false);

	for(size_t i = 0; i < threads.size(); i++)
	{
		QTreeWidgetItem* item = new QTreeWidgetItem();
		item->setText(0,QString::number(threads[i].id));
		item->setData(0,Qt::UserRole,threads[i].id);
		item->setText(1,threads[i].name);
		QString status = "";
		if(threads[i].status & THREADSTATUS_RUNNING) status += "Running ";
		if(threads[i].status & THREADSTATUS_WAIT) status += "Wait ";
		if(threads[i].status & THREADSTATUS_READY) status += "Ready ";
		if(threads[i].status & THREADSTATUS_SUSPEND) status += "Suspend ";
		if(threads[i].status & THREADSTATUS_DORMANT) status += "Dormant ";
		if(threads[i].status & THREADSTATUS_DEAD) status += "Dead ";
		item->setText(2,status);
		item->setText(3,QString("%1").arg(threads[i].curPC,8,16,QChar('0')));
		item->setData(3,Qt::UserRole,threads[i].curPC);
		item->setText(4,QString("%1").arg(threads[i].entrypoint,8,16,QChar('0')));
		item->setData(4,Qt::UserRole,threads[i].entrypoint);

		if(threads[i].isCurrent)
		{
			for(int j = 0; j < 5; j++)
				item->setTextColor(j,Qt::green);
		}

		ui->threadList->addTopLevelItem(item);
	}
	for(int i = 0; i < ui->threadList->columnCount(); i++)
		ui->threadList->resizeColumnToContents(i);
}
コード例 #19
0
ファイル: ctrlregisterlist.cpp プロジェクト: wanfhx/ppsspp
void CtrlRegisterList::Change()
{
	int cat = category;
	int reg = selection;
	if (selection >= cpu->GetNumRegsInCategory(cat))
		return;

	EmuThread_LockDraw(true);
	u32 val = cpu->GetRegValue(cat,reg);
	EmuThread_LockDraw(false);

	bool ok;
	QString text = QInputDialog::getText(this, tr("Set new value"),
								tr("Set new value:"), QLineEdit::Normal,
								QString::number(val), &ok);
	if (ok && !text.isEmpty())
	{
		EmuThread_LockDraw(true);
		cpu->SetRegValue(cat,reg,text.toInt());
		EmuThread_LockDraw(false);
		redraw();
	}
}
コード例 #20
0
ファイル: debugger_disasm.cpp プロジェクト: Bennieboj/ppsspp
void Debugger_Disasm::showEvent(QShowEvent *)
{

#ifdef Q_WS_X11
	// Hack to remove the X11 crash with threaded opengl when opening the first dialog
	EmuThread_LockDraw(true);
	QTimer::singleShot(100, this, SLOT(releaseLock()));
#endif

	if(Core_IsStepping())
		SetDebugMode(true);
	else
		SetDebugMode(false);
}
コード例 #21
0
ファイル: mainwindow.cpp プロジェクト: Bulkman/ppsspp
void MainWindow::CoreEmitWait(bool isWaiting)
{
	// Unlock mutex while core is waiting;
	EmuThread_LockDraw(!isWaiting);
}
コード例 #22
0
ファイル: ctrlmemview.cpp プロジェクト: CrazyMax/ppsspp
void CtrlMemView::CopyValue()
{
	EmuThread_LockDraw(true);
	QApplication::clipboard()->setText(QString("%1").arg(Memory::ReadUnchecked_U32(selection),8,16,QChar('0')));
	EmuThread_LockDraw(false);
}
コード例 #23
0
ファイル: ctrlmemview.cpp プロジェクト: CrazyMax/ppsspp
void CtrlMemView::paintEvent(QPaintEvent *)
{
	QPainter painter(this);
	painter.setBrush(Qt::white);
	painter.setPen(Qt::white);
	painter.drawRect(rect());

	if (!debugger)
		return;

	int width = rect().width();
	int numRows=(rect().bottom()/rowHeight)/2+1;

	QPen nullPen(0xFFFFFF);
	QPen currentPen(0xFF000000);
	QPen selPen(0x808080);
	QBrush lbr(0xFFFFFF);
	QBrush nullBrush(0xFFFFFF);
	QBrush currentBrush(0xFFEFE8);
	QBrush pcBrush(0x70FF70);
	QPen textPen;

	QFont normalFont("Arial", 10);
	QFont alignedFont("Monospace", 10);
    alignedFont.setStyleHint(QFont::Monospace);
	painter.setFont(normalFont);

	int i;
	curAddress&=~(align-1);
	for (i=-numRows; i<=numRows; i++)
	{
		unsigned int address=curAddress + i*align*alignMul;

		int rowY1 = rect().bottom()/2 + rowHeight*i - rowHeight/2;
		int rowY2 = rect().bottom()/2 + rowHeight*i + rowHeight/2;

		char temp[256];

		painter.setBrush(currentBrush);

		if (selecting && address == (unsigned int)selection)
		  painter.setPen(selPen);
		else
		  painter.setPen(i==0 ? currentPen : nullPen);
		painter.drawRect(0, rowY1, 16-1, rowY2 - rowY1 - 1);

		painter.drawRect(16, rowY1, width - 16 -1, rowY2 - rowY1 - 1);
		painter.setBrush(nullBrush);
		textPen.setColor(0x600000);
		painter.setPen(textPen);
		painter.setFont(alignedFont);
		painter.drawText(17,rowY1-2+rowHeight, QString("%1").arg(address,8,16,QChar('0')));
		textPen.setColor(0xFF000000);
		painter.setPen(textPen);
		if (debugger->isAlive())
		{

			switch(mode) {
			case MV_NORMAL:
				{
					const char *m = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
					if (Memory::IsValidAddress(address))
					{
						EmuThread_LockDraw(true);
						u32 memory[4] = {
							debugger->readMemory(address),
							debugger->readMemory(address+4),
							debugger->readMemory(address+8),
							debugger->readMemory(address+12)
						};
						EmuThread_LockDraw(false);
						m = (const char*)memory;
						sprintf(temp, "%08x %08x %08x %08x  ................",
							memory[0],memory[1],memory[2],memory[3]);
					}
					for (int i=0; i<16; i++)
					{
						int c = (unsigned char)m[i];
						if (c>=32 && c<255)
							temp[i+37]=c;
					}
				}
				painter.setFont(alignedFont);
				painter.drawText(85,rowY1 - 2 + rowHeight, temp);
			break;

			case MV_SYMBOLS:
				{
					textPen.setColor(0x0000FF);
					painter.setPen(textPen);
					int fn = symbolMap.GetSymbolNum(address);
					if (fn==-1)
					{
						sprintf(temp, "%s (ns)", Memory::GetAddressName(address));
					}
					else
						sprintf(temp, "%s (0x%x b)", symbolMap.GetSymbolName(fn),symbolMap.GetSymbolSize(fn));
					painter.drawText(205,rowY1 - 2 + rowHeight, temp);

					textPen.setColor(0xFF000000);
					painter.setPen(textPen);

					if (align==4)
					{
						u32 value = Memory::ReadUnchecked_U32(address);
						int symbolnum = symbolMap.GetSymbolNum(value);
						if(symbolnum>=0)
							sprintf(temp, "%08x [%s]", value, symbolMap.GetSymbolName(symbolnum));
					}
					else if (align==2)
					{
						u16 value = Memory::ReadUnchecked_U16(address);
						int symbolnum = symbolMap.GetSymbolNum(value);
						if(symbolnum>=0)
							sprintf(temp, "%04x [%s]", value, symbolMap.GetSymbolName(symbolnum));
					}

					painter.drawText(85,rowY1 - 2 + rowHeight, temp);
					break;
				}
			case MV_MAX: break;
			}
		}
	}
}
コード例 #24
0
ファイル: debugger_memory.cpp プロジェクト: S74ck3r/ppsspp
void Debugger_Memory::releaseLock()
{
	EmuThread_LockDraw(false);
}
コード例 #25
0
ファイル: debugger_disasm.cpp プロジェクト: Almamu/ppsspp
void Debugger_Disasm::UpdateDisplayListGUI()
{
	u32 curDlId = 0;
	QTreeWidgetItem* curItem = ui->displayList->currentItem();
	if(curItem)
		curDlId = ui->displayList->currentItem()->data(0,Qt::UserRole).toInt();

	ui->displayList->clear();
	ui->displayListData->clear();

	EmuThread_LockDraw(true);
	const std::deque<DisplayList>& dlQueue = gpu->GetDisplayLists();

	DisplayList* dl = gpu->GetCurrentDisplayList();
	if(dl)
	{
		QTreeWidgetItem* item = new QTreeWidgetItem();
		item->setText(0,QVariant(dl->id).toString());
		item->setData(0, Qt::UserRole, dl->id);
		switch(dl->status)
		{
		case PSP_GE_LIST_DONE:	item->setText(1,"Done"); break;
		case PSP_GE_LIST_QUEUED:	item->setText(1,"Queued"); break;
		case PSP_GE_LIST_DRAWING:	item->setText(1,"Drawing"); break;
		case PSP_GE_LIST_STALL_REACHED:	item->setText(1,"Stall Reached"); break;
		case PSP_GE_LIST_END_REACHED:	item->setText(1,"End Reached"); break;
		case PSP_GE_LIST_CANCEL_DONE:	item->setText(1,"Cancel Done"); break;
		default: break;
		}
		char temp[24];
		sprintf(temp,"%08x",dl->startpc);
		item->setText(2,temp);
		item->setData(2, Qt::UserRole, dl->startpc);
		sprintf(temp,"%08x",dl->pc);
		item->setText(3,temp);
		item->setData(3, Qt::UserRole, dl->pc);
		ui->displayList->addTopLevelItem(item);
		if(curDlId == dl->id)
		{
			ui->displayList->setCurrentItem(item);
			displayListRowSelected = item;
			ShowDLCode();
		}
	}

	for(auto it = dlQueue.begin(); it != dlQueue.end(); ++it)
	{
		if(dl && it->id == dl->id)
			continue;
		QTreeWidgetItem* item = new QTreeWidgetItem();
		item->setText(0,QVariant(it->id).toString());
		item->setData(0, Qt::UserRole, it->id);
		switch(it->status)
		{
		case PSP_GE_LIST_DONE:	item->setText(1,"Done"); break;
		case PSP_GE_LIST_QUEUED:	item->setText(1,"Queued"); break;
		case PSP_GE_LIST_DRAWING:	item->setText(1,"Drawing"); break;
		case PSP_GE_LIST_STALL_REACHED:	item->setText(1,"Stall Reached"); break;
		case PSP_GE_LIST_END_REACHED:	item->setText(1,"End Reached"); break;
		case PSP_GE_LIST_CANCEL_DONE:	item->setText(1,"Cancel Done"); break;
		default: break;
		}
		char temp[24];
		sprintf(temp,"%08x",it->startpc);
		item->setText(2,temp);
		item->setData(2, Qt::UserRole, it->startpc);
		sprintf(temp,"%08x",it->pc);
		item->setText(3,temp);
		item->setData(3, Qt::UserRole, it->pc);
		ui->displayList->addTopLevelItem(item);
		if(curDlId == it->id)
		{
			ui->displayList->setCurrentItem(item);
			displayListRowSelected = item;
			ShowDLCode();
		}
	}
	EmuThread_LockDraw(false);
}
コード例 #26
0
ファイル: gamepaddialog.cpp プロジェクト: Almamu/ppsspp
void GamePadDialog::releaseLock()
{
	EmuThread_LockDraw(false);
}
コード例 #27
0
ファイル: EmuThread.cpp プロジェクト: ImandaSyachrul/ppsspp
void EmuThread::run()
{
	running = true;
	setCurrentThreadName("EmuThread");

	host->UpdateUI();
	host->InitGL(0);

	EmuThread_LockDraw(true);

#ifndef USING_GLES2
	glewInit();
#endif
	NativeInitGraphics();

	INFO_LOG(BOOT, "Starting up hardware.");

	QElapsedTimer timer;

	EmuThread_LockDraw(false);

	while(running) {
		//UpdateGamepad(*input_state);
		timer.start();

		gameMutex->lock();
		bool gRun = gameRunning;
		gameMutex->unlock();

		if(gRun)
		{
			EmuThread_LockDraw(true);
			if(needInitGame)
			{
				CoreParameter coreParameter;
				coreParameter.fileToStart = fileToStart.toStdString();
				coreParameter.enableSound = true;
				coreParameter.gpuCore = GPU_GLES;
				coreParameter.cpuCore = g_Config.bJit ? CPU_JIT : CPU_INTERPRETER;
				coreParameter.enableDebugging = true;
				coreParameter.printfEmuLog = false;
				coreParameter.headLess = false;
				coreParameter.renderWidth = (480 * g_Config.iWindowZoom) * (g_Config.SSAntiAliasing + 1);
				coreParameter.renderHeight = (272 * g_Config.iWindowZoom) * (g_Config.SSAntiAliasing + 1);
				coreParameter.outputWidth = dp_xres;
				coreParameter.outputHeight = dp_yres;
				coreParameter.pixelWidth = pixel_xres;
				coreParameter.pixelHeight = pixel_yres;
				coreParameter.startPaused = !g_Config.bAutoRun;

				std::string error_string;
				if (!PSP_Init(coreParameter, &error_string))
				{
					ERROR_LOG(BOOT, "Error loading: %s", error_string.c_str());
					FinalShutdown();
					return;
				}

				LayoutGamepad(dp_xres, dp_yres);

				_dbg_update_();

				host->UpdateDisassembly();
				Core_EnableStepping(coreParameter.startPaused ? TRUE : FALSE);

				globalUIState = coreParameter.startPaused ? UISTATE_PAUSEMENU : UISTATE_INGAME;
			#ifdef _DEBUG
				host->UpdateMemView();
			#endif
				host->BootDone();
				needInitGame = false;
			}

			glstate.Restore();
			glViewport(0, 0, pixel_xres, pixel_yres);
			Matrix4x4 ortho;
			ortho.setOrtho(0.0f, dp_xres, dp_yres, 0.0f, -1.0f, 1.0f);
			glsl_bind(UIShader_Get());
			glUniformMatrix4fv(UIShader_Get()->u_worldviewproj, 1, GL_FALSE, ortho.getReadPtr());


			ReapplyGfxState();

			Core_Run();

			// Hopefully coreState is now CORE_NEXTFRAME
			if (coreState == CORE_NEXTFRAME) {
				// set back to running for the next frame
				coreState = CORE_RUNNING;

				qint64 time = timer.elapsed();
				const int frameTime = (1.0f/60.0f) * 1000;
				if(time < frameTime)
				{
					EmuThread_LockDraw(false);
					msleep(frameTime-time);
					EmuThread_LockDraw(true);
				}
				timer.start();
			}

			fbo_unbind();

			UIShader_Prepare();

			uiTexture->Bind(0);

			glViewport(0, 0, pixel_xres, pixel_yres);

			ui_draw2d.Begin(UIShader_Get(), DBMODE_NORMAL);

			//if (g_Config.bShowTouchControls)
			//	DrawGamepad(ui_draw2d);

			glsl_bind(UIShader_Get());
			ui_draw2d.End();
			ui_draw2d.Flush();


			// Tiled renderers like PowerVR should benefit greatly from this. However - seems I can't call it?
#if defined(USING_GLES2)
			bool hasDiscard = false;  // TODO
			if (hasDiscard) {
				//glDiscardFramebuffer(GL_COLOR_EXT | GL_DEPTH_EXT | GL_STENCIL_EXT);
			}
#endif
			glWindow->swapBuffers();
			EmuThread_LockDraw(false);
		}
		else
		{
			EmuThread_LockDraw(true);
			glClearColor(0, 0, 0, 0);
			glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

			time_update();
			float t = (float)frames_ / 60.0f;
			frames_++;

			float alpha = t;
			if (t > 1.0f) alpha = 1.0f;
			float alphaText = alpha;
			//if (t > 2.0f) alphaText = 3.0f - t;

			glstate.Restore();
			glViewport(0, 0, pixel_xres, pixel_yres);
			Matrix4x4 ortho;
			ortho.setOrtho(0.0f, dp_xres, dp_yres, 0.0f, -1.0f, 1.0f);
			glsl_bind(UIShader_Get());
			glUniformMatrix4fv(UIShader_Get()->u_worldviewproj, 1, GL_FALSE, ortho.getReadPtr());


			ReapplyGfxState();

			UIShader_Prepare();
			glViewport(0, 0, pixel_xres, pixel_yres);
			UIBegin(UIShader_Get());
			DrawBackground(alpha);

			ui_draw2d.SetFontScale(1.5f, 1.5f);
			ui_draw2d.DrawText(UBUNTU48, "PPSSPP", dp_xres / 2, dp_yres / 2 - 30, colorAlpha(0xFFFFFFFF, alphaText), ALIGN_CENTER);
			ui_draw2d.SetFontScale(1.0f, 1.0f);
			ui_draw2d.DrawText(UBUNTU24, "Created by Henrik Rydgard", dp_xres / 2, dp_yres / 2 + 40, colorAlpha(0xFFFFFFFF, alphaText), ALIGN_CENTER);
			ui_draw2d.DrawText(UBUNTU24, "Free Software under GPL 2.0", dp_xres / 2, dp_yres / 2 + 70, colorAlpha(0xFFFFFFFF, alphaText), ALIGN_CENTER);
			ui_draw2d.DrawText(UBUNTU24, "www.ppsspp.org", dp_xres / 2, dp_yres / 2 + 130, colorAlpha(0xFFFFFFFF, alphaText), ALIGN_CENTER);

			UIEnd();
			globalUIState = UISTATE_MENU;

			glsl_bind(UIShader_Get());
			ui_draw2d.Flush();

			glWindow->swapBuffers();
			EmuThread_LockDraw(false);
			qint64 time = timer.elapsed();
			const int frameTime = (1.0f/60.0f) * 1000;
			if(time < frameTime)
			{
				msleep(frameTime-time);
			}
			timer.start();
		}

	}

	if(gameRunning)
	{
		stopGame();
	}

}
コード例 #28
0
ファイル: debugger_disasm.cpp プロジェクト: Bennieboj/ppsspp
void Debugger_Disasm::releaseLock()
{
	EmuThread_LockDraw(false);
}
コード例 #29
0
ファイル: debugger_disasm.cpp プロジェクト: Bennieboj/ppsspp
void Debugger_Disasm::UpdateDisplayListGUI()
{
	u32 curDlId = 0;
	QTreeWidgetItem* curItem = ui->displayList->currentItem();
	if(curItem)
		curDlId = ui->displayList->currentItem()->data(0,Qt::UserRole).toInt();

	ui->displayList->clear();

	EmuThread_LockDraw(true);
	const std::list<int>& dlQueue = gpu->GetDisplayLists();

	DisplayList* dl = gpu->GetCurrentDisplayList();
	if(dl)
	{
		QTreeWidgetItem* item = new QTreeWidgetItem();
		item->setText(0,QString::number(dl->id));
		item->setData(0, Qt::UserRole, dl->id);
		switch(dl->state)
		{
		case PSP_GE_DL_STATE_NONE: item->setText(1,"None"); break;
		case PSP_GE_DL_STATE_QUEUED: item->setText(1,"Queued"); break;
		case PSP_GE_DL_STATE_RUNNING: item->setText(1,"Running"); break;
		case PSP_GE_DL_STATE_COMPLETED: item->setText(1,"Completed"); break;
		case PSP_GE_DL_STATE_PAUSED: item->setText(1,"Paused"); break;
		default: break;
		}
		item->setText(2,QString("%1").arg(dl->startpc,8,16,QChar('0')));
		item->setData(2, Qt::UserRole, dl->startpc);
		item->setText(3,QString("%1").arg(dl->pc,8,16,QChar('0')));
		item->setData(3, Qt::UserRole, dl->pc);
		ui->displayList->addTopLevelItem(item);
		if(curDlId == (u32)dl->id)
		{
			ui->displayList->setCurrentItem(item);
			displayListRowSelected = item;
		}
	}

	for(auto listIdIt = dlQueue.begin(); listIdIt != dlQueue.end(); ++listIdIt)
	{
		DisplayList *it = gpu->getList(*listIdIt);
		if(dl && it->id == dl->id)
			continue;
		QTreeWidgetItem* item = new QTreeWidgetItem();
		item->setText(0,QString::number(it->id));
		item->setData(0, Qt::UserRole, it->id);
		switch(it->state)
		{
		case PSP_GE_DL_STATE_NONE: item->setText(1,"None"); break;
		case PSP_GE_DL_STATE_QUEUED: item->setText(1,"Queued"); break;
		case PSP_GE_DL_STATE_RUNNING: item->setText(1,"Running"); break;
		case PSP_GE_DL_STATE_COMPLETED: item->setText(1,"Completed"); break;
		case PSP_GE_DL_STATE_PAUSED: item->setText(1,"Paused"); break;
		default: break;
		}
		item->setText(2,QString("%1").arg(it->startpc,8,16,QChar('0')));
		item->setData(2, Qt::UserRole, it->startpc);
		item->setText(3,QString("%1").arg(it->pc,8,16,QChar('0')));
		item->setData(3, Qt::UserRole, it->pc);
		ui->displayList->addTopLevelItem(item);
		if(curDlId == (u32)it->id)
		{
			ui->displayList->setCurrentItem(item);
			displayListRowSelected = item;
		}
	}
	for(int i = 0; i < ui->displayList->columnCount(); i++)
		ui->displayList->resizeColumnToContents(i);
	EmuThread_LockDraw(false);
}