Ejemplo n.º 1
0
void CGEDebugger::UpdatePreviews() {
	auto memLock = Memory::Lock();
	if (!PSP_IsInited()) {
		return;
	}

	wchar_t desc[256];
	const GPUDebugBuffer *primaryBuffer = NULL;
	bool bufferResult = false;
	GPUgstate state = {0};

	if (gpuDebug != NULL) {
		state = gpuDebug->GetGState();
	}

	switch (PrimaryDisplayType(fbTabs->CurrentTabIndex())) {
	case PRIMARY_FRAMEBUF:
		bufferResult = GPU_GetCurrentFramebuffer(primaryBuffer);
		if (bufferResult) {
			_snwprintf(desc, ARRAY_SIZE(desc), L"Color: 0x%08x (%dx%d) fmt %i", state.getFrameBufRawAddress(), primaryBuffer->GetStride(), primaryBuffer->GetHeight(), state.FrameBufFormat());
		}
		break;

	case PRIMARY_DEPTHBUF:
		bufferResult = GPU_GetCurrentDepthbuffer(primaryBuffer);
		if (bufferResult) {
			_snwprintf(desc, ARRAY_SIZE(desc), L"Depth: 0x%08x (%dx%d)", state.getDepthBufRawAddress(), primaryBuffer->GetStride(), primaryBuffer->GetHeight());
		}
		break;

	case PRIMARY_STENCILBUF:
		bufferResult = GPU_GetCurrentStencilbuffer(primaryBuffer);
		if (bufferResult) {
			_snwprintf(desc, ARRAY_SIZE(desc), L"Stencil: 0x%08x (%dx%d)", state.getFrameBufRawAddress(), primaryBuffer->GetStride(), primaryBuffer->GetHeight());
		}
		break;
	}

	if (bufferResult && primaryBuffer != NULL) {
		auto fmt = SimpleGLWindow::Format(primaryBuffer->GetFormat());
		frameWindow->Draw(primaryBuffer->GetData(), primaryBuffer->GetStride(), primaryBuffer->GetHeight(), primaryBuffer->GetFlipped(), fmt);
		SetDlgItemText(m_hDlg, IDC_GEDBG_FRAMEBUFADDR, desc);
	} else if (frameWindow != NULL) {
		frameWindow->Clear();
		SetDlgItemText(m_hDlg, IDC_GEDBG_FRAMEBUFADDR, L"Failed");
	}

	const GPUDebugBuffer *bufferTex = NULL;
	UpdateTextureLevel(textureLevel_);
	bufferResult = GPU_GetCurrentTexture(bufferTex, textureLevel_);

	if (bufferResult) {
		auto fmt = SimpleGLWindow::Format(bufferTex->GetFormat());
		texWindow->Draw(bufferTex->GetData(), bufferTex->GetStride(), bufferTex->GetHeight(), bufferTex->GetFlipped(), fmt);

		if (gpuDebug != NULL) {
			if (state.isTextureAlphaUsed()) {
				texWindow->SetFlags(SimpleGLWindow::ALPHA_BLEND | SimpleGLWindow::RESIZE_SHRINK_CENTER);
			} else {
				texWindow->SetFlags(SimpleGLWindow::RESIZE_SHRINK_CENTER);
			}
			_snwprintf(desc, ARRAY_SIZE(desc), L"Texture L%d: 0x%08x (%dx%d)", textureLevel_, state.getTextureAddress(textureLevel_), state.getTextureWidth(textureLevel_), state.getTextureHeight(textureLevel_));
			SetDlgItemText(m_hDlg, IDC_GEDBG_TEXADDR, desc);

			UpdateLastTexture(state.getTextureAddress(textureLevel_));
		} else {
			UpdateLastTexture((u32)-1);
		}
	} else if (texWindow != NULL) {
		texWindow->Clear();
		if (gpuDebug == NULL || state.isTextureMapEnabled()) {
			SetDlgItemText(m_hDlg, IDC_GEDBG_TEXADDR, L"Texture: failed");
		} else {
			SetDlgItemText(m_hDlg, IDC_GEDBG_TEXADDR, L"Texture: disabled");
		}
		UpdateLastTexture((u32)-1);
	}

	DisplayList list;
	if (gpuDebug != NULL && gpuDebug->GetCurrentDisplayList(list)) {
		const u32 op = Memory::Read_U32(list.pc);
		const u32 cmd = op >> 24;
		// TODO: Bezier/spline?
		if (cmd == GE_CMD_PRIM) {
			UpdatePrimPreview(op);
		}

		displayList->setDisplayList(list);
	}

	flags->Update();
	lighting->Update();
	textureState->Update();
	settings->Update();
	vertices->Update();
	matrices->Update();
	lists->Update();
}