15#include "ps2s/displayenv.h"
16#include "ps2s/drawenv.h"
17#include "ps2s/gsmem.h"
19#include "ps2s/packet.h"
20#include "ps2s/ps2stuff.h"
21#include "ps2s/texture.h"
22#include "ps2s/types.h"
24#include "ps2gl/displaycontext.h"
25#include "ps2gl/dlgmanager.h"
26#include "ps2gl/dlist.h"
27#include "ps2gl/drawcontext.h"
28#include "ps2gl/glcontext.h"
29#include "ps2gl/gmanager.h"
30#include "ps2gl/immgmanager.h"
31#include "ps2gl/lighting.h"
32#include "ps2gl/material.h"
33#include "ps2gl/matrix.h"
34#include "ps2gl/texture.h"
48CVifSCDmaPacket *CGLContext::CurPacket, *CGLContext::LastPacket,
49 *CGLContext::Vif1Packet = NULL, *CGLContext::SavedVif1Packet = NULL,
50 *CGLContext::ImmVif1Packet;
53int CGLContext::ImmediateRenderingFinishedSemaId = -1;
54int CGLContext::VsyncSemaId = -1;
56CGLContext::tRenderingFinishedCallback CGLContext::RenderingFinishedCallback = NULL;
58CGLContext::CGLContext(
int immBufferQwordSize,
int immDrawBufferQwordSize)
59 : StateChangesArePushed(false)
60 , IsCurrentFieldEven(true)
61 , CurrentFrameNumber(0)
64 CurPacket =
new CVifSCDmaPacket(kDmaPacketMaxQwordLength, DMAC::Channels::vif1,
65 Packet::kXferTags, Core::MemMappings::UncachedAccl);
66 LastPacket =
new CVifSCDmaPacket(kDmaPacketMaxQwordLength, DMAC::Channels::vif1,
67 Packet::kXferTags, Core::MemMappings::UncachedAccl);
68 Vif1Packet = CurPacket;
70 ImmVif1Packet =
new CVifSCDmaPacket(immDrawBufferQwordSize, DMAC::Channels::vif1,
71 Packet::kXferTags, Core::MemMappings::UncachedAccl);
73 CurDrawEnvPtrs = DrawEnvPtrs0;
74 LastDrawEnvPtrs = DrawEnvPtrs1;
75 NumCurDrawEnvPtrs = 0;
76 NumLastDrawEnvPtrs = 0;
80 CurGManager = ImmGManager;
85 CurMatrixStack = ModelViewMatStack;
86 SavedCurMatStack = NULL;
90 CurLighting = ImmLighting;
92 CLight& light = ImmLighting->GetLight(0);
93 light.SetDiffuse(cpu_vec_xyzw(1.0f, 1.0f, 1.0f, 1.0f));
94 light.SetSpecular(cpu_vec_xyzw(1.0f, 1.0f, 1.0f, 1.0f));
102 CurDrawContext = ImmDrawContext;
106 SetRendererContextChanged(
true);
107 SetGsContextChanged(
true);
108 SetRendererPropsChanged(
true);
111 NumBuffersToBeFreed[0] = NumBuffersToBeFreed[1] = 0;
117 struct t_ee_sema newSemaphore = { 0, 1, 0 };
118 VsyncSemaId = CreateSema(&newSemaphore);
119 RenderingFinishedSemaId = CreateSema(&newSemaphore);
120 ImmediateRenderingFinishedSemaId = CreateSema(&newSemaphore);
121 mErrorIf(VsyncSemaId == -1
122 || RenderingFinishedSemaId == -1
123 || ImmediateRenderingFinishedSemaId == -1,
124 "Failed to create ps2gl semaphores.");
128 AddIntcHandler(INTC_GS, CGLContext::GsIntHandler, 0 );
131 *(
volatile unsigned int*)GS::ControlRegs::csr = 9;
133 *(
volatile unsigned int*)GS::ControlRegs::imr = 0x7600;
139CGLContext::~CGLContext()
145 delete DListGManager;
147 delete ProjectionMatStack;
148 delete ModelViewMatStack;
149 delete DListMatStack;
152 delete DListLighting;
154 delete MaterialManager;
158 delete ImmDrawContext;
159 delete DListDrawContext;
161 delete DisplayContext;
168void CGLContext::BeginDListDef(
unsigned int listID, GLenum mode)
170 DListManager->NewList(listID, mode);
175 SetRendererContextChanged(
true);
176 SetGsContextChanged(
true);
178 SetRendererPropsChanged(
true);
180 MaterialManager->BeginDListDef();
181 TexManager->BeginDListDef();
182 DListGManager->BeginDListDef();
184 CurLighting = DListLighting;
185 CurGManager = DListGManager;
186 SavedCurMatStack = CurMatrixStack;
187 CurMatrixStack = DListMatStack;
188 CurDrawContext = DListDrawContext;
191void CGLContext::EndDListDef()
193 DListGManager->EndDListDef();
194 MaterialManager->EndDListDef();
195 TexManager->EndDListDef();
197 CurLighting = ImmLighting;
198 CurGManager = ImmGManager;
199 CurMatrixStack = SavedCurMatStack;
200 CurDrawContext = ImmDrawContext;
204 DListManager->EndList();
222 return CDListCmd::GetNextCmd(
this);
226void CGLContext::SetMatrixMode(GLenum mode)
233 CurMatrixStack = ModelViewMatStack;
236 CurMatrixStack = ProjectionMatStack;
248void CGLContext::BeginImmediateGeometry()
254 GetImmGeomManager().Flush();
257 SetVif1Packet(*ImmVif1Packet);
259 ImmVif1Packet->Reset();
262void CGLContext::EndImmediateGeometry()
264 mAssert(Vif1Packet == ImmVif1Packet);
271void CGLContext::RenderImmediateGeometry()
273 ImmVif1Packet->End();
274 ImmVif1Packet->Pad128();
275 ImmVif1Packet->CloseTag();
277 ImmVif1Packet->Send();
280void CGLContext::FinishRenderingImmediateGeometry(
bool forceImmediateStop)
282 mWarnIf(forceImmediateStop,
"Interrupting currently rendering dma chain not supported yet");
290void CGLContext::BeginGeometry()
297void CGLContext::EndGeometry()
302void CGLContext::EndVif1Packet(
unsigned short signalNum)
307 GetImmGeomManager().Flush();
323 Vif1Packet->OpenDirect();
325 *Vif1Packet += giftag;
327 *Vif1Packet += (uint64_t)0x60;
329 Vif1Packet->CloseDirect();
330 Vif1Packet->CloseTag();
333void CGLContext::RenderGeometry()
344int CGLContext::GsIntHandler(
int cause)
346 uint32_t csr = *(
volatile uint32_t*)GS::ControlRegs::csr;
350 uint64_t sigLblId = *(
volatile uint64_t*)GS::ControlRegs::siglblid;
352 switch (sigLblId & 0xffff) {
355 if (RenderingFinishedCallback != NULL)
356 RenderingFinishedCallback();
359 iSignalSema(ImmediateRenderingFinishedSemaId);
362 mError(
"Unknown signal");
366 sigLblId &= ~0xffffffff;
367 *(
volatile uint64_t*)GS::ControlRegs::siglblid = sigLblId;
369 *(
volatile unsigned int*)GS::ControlRegs::csr = 1;
374 iSignalSema(VsyncSemaId);
376 *(
volatile unsigned int*)GS::ControlRegs::csr = 8;
384void CGLContext::FinishRenderingGeometry(
bool forceImmediateStop)
388 mWarnIf(forceImmediateStop,
"Interrupting currently rendering dma chain not supported yet");
392void CGLContext::WaitForVSync()
397 WaitSema(VsyncSemaId);
402 while (PollSema(VsyncSemaId) != -1)
405 uint32_t csr = *(
volatile uint32_t*)GS::ControlRegs::csr;
406 IsCurrentFieldEven = (bool)((csr >> 13) & 1);
409void CGLContext::SwapBuffers()
415 CVifSCDmaPacket* tempPkt = CurPacket;
416 CurPacket = LastPacket;
417 LastPacket = tempPkt;
418 Vif1Packet = CurPacket;
422 void** tempDEPtrs = CurDrawEnvPtrs;
423 CurDrawEnvPtrs = LastDrawEnvPtrs;
424 LastDrawEnvPtrs = tempDEPtrs;
425 NumLastDrawEnvPtrs = NumCurDrawEnvPtrs;
426 NumCurDrawEnvPtrs = 0;
430 GetImmGeomManager().SwapBuffers();
431 GetDListManager().SwapBuffers();
432 GetDisplayContext().SwapBuffers();
433 GetImmDrawContext().SwapBuffers(IsCurrentFieldEven);
436 FreeWaitingBuffersAndSwap();
438 CurrentFrameNumber++;
441void CGLContext::FreeWaitingBuffersAndSwap()
445 CurBuffer = 1 - CurBuffer;
447 for (
int i = 0; i < NumBuffersToBeFreed[CurBuffer]; i++) {
448 free(BuffersToBeFreed[CurBuffer][i]);
451 NumBuffersToBeFreed[CurBuffer] = 0;
485int pglInit(
int immBufferVertexSize,
int immDrawBufferQwordSize)
488 pGLContext =
new CGLContext(immBufferVertexSize, immDrawBufferQwordSize);
499 return (pGLContext != NULL);
521 dma_channel_wait(DMAC::Channels::vif1, 1000000);
530 pGLContext->WaitForVSync();
541 mErrorIf(pGLContext == NULL,
"You need to call pglInit()");
543 pGLContext->SwapBuffers();
553 pGLContext->SetRenderingFinishedCallback(cb);
560void pglBeginImmediateGeometry(
void)
562 pGLContext->BeginImmediateGeometry();
564void pglEndImmediateGeometry(
void)
566 pGLContext->EndImmediateGeometry();
568void pglRenderImmediateGeometry(
void)
570 pGLContext->RenderImmediateGeometry();
572void pglFinishRenderingImmediateGeometry(
int forceImmediateStop)
574 pGLContext->FinishRenderingImmediateGeometry((
bool)forceImmediateStop);
581void pglBeginGeometry(
void)
583 pGLContext->BeginGeometry();
585void pglEndGeometry(
void)
587 pGLContext->EndGeometry();
589void pglRenderGeometry(
void)
591 pGLContext->RenderGeometry();
593void pglFinishRenderingGeometry(
int forceImmediateStop)
595 pGLContext->FinishRenderingGeometry((
bool)forceImmediateStop);
602void pglEnable(GLenum cap)
606 pGLContext->GetDrawContext().SetDoClipping(
true);
609 mError(
"Unknown option passed to pglEnable()");
613void pglDisable(GLenum cap)
617 pGLContext->GetDrawContext().SetDoClipping(
false);
620 mError(
"Unknown option passed to pglDisable()");
632void glEnable(GLenum cap)
634 GL_FUNC_DEBUG(
"%s(0x%x)\n", __FUNCTION__, cap);
636 CLighting& lighting = pGLContext->GetLighting();
647 lighting.GetLight(0x7 & cap).SetEnabled(
true);
650 lighting.SetLightingEnabled(
true);
654 pGLContext->GetDrawContext().SetBlendEnabled(
true);
657 case GL_COLOR_MATERIAL:
658 pGLContext->GetMaterialManager().SetUseColorMaterial(
true);
660 case GL_RESCALE_NORMAL:
661 pGLContext->GetDrawContext().SetRescaleNormals(
true);
665 pGLContext->GetTexManager().SetTexEnabled(
true);
669 pGLContext->GetGeomManager().SetDoNormalize(
true);
673 pGLContext->GetDrawContext().SetDoCullFace(
true);
677 pGLContext->GetDrawContext().SetAlphaTestEnabled(
true);
681 pGLContext->GetDrawContext().SetDepthTestEnabled(
true);
690void glDisable(GLenum cap)
692 GL_FUNC_DEBUG(
"%s(0x%x)\n", __FUNCTION__, cap);
703 pGLContext->GetLighting().GetLight(0x7 & cap).SetEnabled(
false);
706 pGLContext->GetLighting().SetLightingEnabled(
false);
710 pGLContext->GetDrawContext().SetBlendEnabled(
false);
713 case GL_COLOR_MATERIAL:
714 pGLContext->GetMaterialManager().SetUseColorMaterial(
false);
716 case GL_RESCALE_NORMAL:
717 pGLContext->GetDrawContext().SetRescaleNormals(
false);
721 pGLContext->GetTexManager().SetTexEnabled(
false);
725 pGLContext->GetGeomManager().SetDoNormalize(
false);
729 pGLContext->GetDrawContext().SetDoCullFace(
false);
733 pGLContext->GetDrawContext().SetAlphaTestEnabled(
false);
737 pGLContext->GetDrawContext().SetDepthTestEnabled(
false);
745void glHint(GLenum target, GLenum mode)
747 GL_FUNC_DEBUG(
"%s(0x%x,0x%x)\n", __FUNCTION__, target, mode);
752void glGetFloatv(GLenum pname, GLfloat* params)
754 GL_FUNC_DEBUG(
"%s(0x%x,...)\n", __FUNCTION__, pname);
757 case GL_MODELVIEW_MATRIX:
758 memcpy(params, &(pGLContext->GetModelViewStack().GetTop()), 16 * 4);
760 case GL_PROJECTION_MATRIX:
761 memcpy(params, &(pGLContext->GetProjectionStack().GetTop()), 16 * 4);
764 mNotImplemented(
"pname %d", pname);
769void glGetIntegerv(GLenum pname,
int* params)
771 GL_FUNC_DEBUG(
"%s(0x%x,...)\n", __FUNCTION__, pname);
776GLenum glGetError(
void)
778 GL_FUNC_DEBUG(
"%s()\n", __FUNCTION__);
780 mWarn(
"glGetError does nothing");
785const GLubyte* glGetString(GLenum name)
787 GL_FUNC_DEBUG(
"%s(0x%x)\n", __FUNCTION__, name);
790 return (GLubyte*)
"not implemented";
static uint16_t GetPs2glSignalId()
static int RenderingFinishedSemaId
Semaphores signaled by the gs int handler.
static const uint64_t Ps2glSignalId
void pglSetRenderingFinishedCallback(void(*cb)(void))
void pglSwapBuffers(void)
int pglHasLibraryBeenInitted(void)
void pglWaitForVSync(void)
int pglInit(int immBufferVertexSize, int immDrawBufferQwordSize)