void DepthBuffer::initDepthImageTexture(FrameBuffer * _pBuffer) { #ifdef GL_IMAGE_TEXTURES_SUPPORT if (!video().getRender().isImageTexturesSupported() || config.frameBufferEmulation.N64DepthCompare == 0 || m_pDepthImageTexture != NULL) return; m_pDepthImageTexture = textureCache().addFrameBufferTexture(); m_pDepthImageTexture->width = (uint32_t)(_pBuffer->m_pTexture->width); m_pDepthImageTexture->height = (uint32_t)(_pBuffer->m_pTexture->height); m_pDepthImageTexture->format = 0; m_pDepthImageTexture->size = 2; m_pDepthImageTexture->clampS = 1; m_pDepthImageTexture->clampT = 1; m_pDepthImageTexture->address = _pBuffer->m_startAddress; m_pDepthImageTexture->clampWidth = _pBuffer->m_width; m_pDepthImageTexture->clampHeight = _pBuffer->m_height; m_pDepthImageTexture->frameBufferTexture = CachedTexture::fbOneSample; m_pDepthImageTexture->maskS = 0; m_pDepthImageTexture->maskT = 0; m_pDepthImageTexture->mirrorS = 0; m_pDepthImageTexture->mirrorT = 0; m_pDepthImageTexture->realWidth = m_pDepthImageTexture->width; m_pDepthImageTexture->realHeight = m_pDepthImageTexture->height; m_pDepthImageTexture->textureBytes = m_pDepthImageTexture->realWidth * m_pDepthImageTexture->realHeight * fboFormats.depthImageFormatBytes; textureCache().addFrameBufferTextureSize(m_pDepthImageTexture->textureBytes); glBindTexture(GL_TEXTURE_2D, m_pDepthImageTexture->glName); glTexImage2D(GL_TEXTURE_2D, 0, fboFormats.depthImageInternalFormat, m_pDepthImageTexture->realWidth, m_pDepthImageTexture->realHeight, 0, fboFormats.depthImageFormat, fboFormats.depthImageType, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glBindTexture(GL_TEXTURE_2D, 0); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_FBO); glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_pDepthImageTexture->glName, 0); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _pBuffer->m_FBO); depthBufferList().clearBuffer(0, VI.height); #endif // GL_IMAGE_TEXTURES_SUPPORT }
void RSP_ProcessDList(void) { int i, j; u32 uc_start, uc_dstart, uc_dsize; __RSP.PC[0] = *(u32*)&gfx_info.DMEM[0x0FF0]; __RSP.PCi = 0; __RSP.count = -1; __RSP.halt = FALSE; __RSP.busy = TRUE; gSP.matrix.stackSize = min( 32, *(u32*)&gfx_info.DMEM[0x0FE4] >> 6 ); gSP.matrix.modelViewi = 0; gSP.changed &= ~CHANGED_CPU_FB_WRITE; gSP.changed |= CHANGED_MATRIX; gDPSetTexturePersp(G_TP_PERSP); for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) gSP.matrix.modelView[0][i][j] = 0.0f; gSP.matrix.modelView[0][0][0] = 1.0f; gSP.matrix.modelView[0][1][1] = 1.0f; gSP.matrix.modelView[0][2][2] = 1.0f; gSP.matrix.modelView[0][3][3] = 1.0f; uc_start = *(u32*)&gfx_info.DMEM[0x0FD0]; uc_dstart = *(u32*)&gfx_info.DMEM[0x0FD8]; uc_dsize = *(u32*)&gfx_info.DMEM[0x0FDC]; if ((uc_start != __RSP.uc_start) || (uc_dstart != __RSP.uc_dstart)) gSPLoadUcodeEx( uc_start, uc_dstart, uc_dsize ); gDPSetCombineKey(G_CK_NONE); gDPSetTextureLUT(G_TT_NONE); gDPSetTexturePersp(G_TP_PERSP); gDPSetCycleType(G_CYC_1CYCLE); #ifdef NEW depthBufferList().setNotCleared(); #endif if (GBI_GetCurrentMicrocodeType() == Turbo3D) RunTurbo3D(); else while (!__RSP.halt) { u32 w0, w1, pc; pc = __RSP.PC[__RSP.PCi]; if ((pc + 8) > RDRAMSize) { #ifdef DEBUG DebugMsg( DEBUG_LOW | DEBUG_ERROR, "ATTEMPTING TO EXECUTE RSP COMMAND AT INVALID RDRAM LOCATION\n" ); #endif break; } w0 = *(u32*)&gfx_info.RDRAM[pc]; w1 = *(u32*)&gfx_info.RDRAM[pc+4]; __RSP.cmd = _SHIFTR( w0, 24, 8 ); #ifdef DEBUG DebugRSPState( RSP.PCi, RSP.PC[RSP.PCi], _SHIFTR( w0, 24, 8 ), w0, w1 ); DebugMsg( DEBUG_LOW | DEBUG_HANDLED, "0x%08lX: CMD=0x%02lX W0=0x%08lX W1=0x%08lX\n", RSP.PC[RSP.PCi], _SHIFTR( w0, 24, 8 ), w0, w1 ); #endif __RSP.PC[__RSP.PCi] += 8; __RSP.nextCmd = _SHIFTR( *(u32*)&gfx_info.RDRAM[pc+8], 24, 8 ); GBI.cmd[__RSP.cmd]( w0, w1 ); RSP_CheckDLCounter(); } if (config.frameBufferEmulation.copyToRDRAM) FrameBuffer_CopyToRDRAM( gDP.colorImage.address ); if (config.frameBufferEmulation.copyDepthToRDRAM) FrameBuffer_CopyDepthBuffer( gDP.colorImage.address ); __RSP.busy = FALSE; gSP.changed |= CHANGED_COLORBUFFER; }
void DepthBuffer_Init() { depthBufferList().init(); }
void DepthBuffer_Destroy() { depthBufferList().destroy(); }
void renderTriangles(const SPVertex * _pVertices, const GLubyte * _pElements, u32 _numElements) { //Current depth buffer can be null if we are loading from a save state if(depthBufferList().getCurrent() == nullptr) return; vertexclip vclip[16]; vertexi vdraw[12]; const SPVertex * vsrc[4]; SPVertex vdata[6]; for (u32 i = 0; i < _numElements; i += 3) { u32 orbits = 0; if (_pElements != nullptr) { for (u32 j = 0; j < 3; ++j) { vsrc[j] = &_pVertices[_pElements[i + j]]; orbits |= vsrc[j]->clip; } } else { for (u32 j = 0; j < 3; ++j) { vsrc[j] = &_pVertices[i + j]; orbits |= vsrc[j]->clip; } } vsrc[3] = vsrc[0]; int numVertex = clipW(vsrc, vdata); if (!calcScreenCoordinates(vdata, vclip, numVertex)) continue; const int dzdx = ((orbits & CLIP_W) == 0) ? calcDzDx(vclip) : calcDzDx2(vsrc); if (dzdx == 0) continue; if (orbits == 0) { assert(numVertex == 3); if ((gSP.geometryMode & G_CULL_BACK) != 0) { for (int k = 0; k < 3; ++k) { vdraw[k].x = floatToFixed16(vclip[k].x); vdraw[k].y = floatToFixed16(vclip[k].y); vdraw[k].z = floatToFixed16(vclip[k].z); } } else { for (int k = 0; k < 3; ++k) { const u32 idx = 3 - k - 1; vdraw[k].x = floatToFixed16(vclip[idx].x); vdraw[k].y = floatToFixed16(vclip[idx].y); vdraw[k].z = floatToFixed16(vclip[idx].z); } } } else { vertexclip ** vtx; numVertex = ClipPolygon(&vtx, vclip, numVertex); if (numVertex < 3) continue; if ((gSP.geometryMode & G_CULL_BACK) != 0) { for (int k = 0; k < numVertex; ++k) { vdraw[k].x = floatToFixed16(vtx[k]->x); vdraw[k].y = floatToFixed16(vtx[k]->y); vdraw[k].z = floatToFixed16(vtx[k]->z); } } else { for (int k = 0; k < numVertex; ++k) { const u32 idx = numVertex - k - 1; vdraw[k].x = floatToFixed16(vtx[idx]->x); vdraw[k].y = floatToFixed16(vtx[idx]->y); vdraw[k].z = floatToFixed16(vtx[idx]->z); } } } Rasterize(vdraw, numVertex, dzdx); } }