mirror of
https://github.com/blawar/GLideN64.git
synced 2024-07-02 09:03:37 +00:00
Refactor: Make DepthBufferList singleton.
This commit is contained in:
parent
4f8c3f691d
commit
fbf660d4ec
109
DepthBuffer.cpp
109
DepthBuffer.cpp
|
@ -8,61 +8,63 @@
|
|||
#include "Config.h"
|
||||
#include "Debug.h"
|
||||
|
||||
DepthBufferInfo depthBuffer;
|
||||
const GLuint ZlutImageUnit = 0;
|
||||
const GLuint TlutImageUnit = 1;
|
||||
const GLuint depthImageUnit = 2;
|
||||
|
||||
void DepthBuffer_Init()
|
||||
{
|
||||
depthBuffer.current = NULL;
|
||||
depthBuffer.top = NULL;
|
||||
depthBuffer.bottom = NULL;
|
||||
depthBuffer.numBuffers = 0;
|
||||
DepthBufferList & dbList = depthBufferList();
|
||||
dbList.current = NULL;
|
||||
dbList.top = NULL;
|
||||
dbList.bottom = NULL;
|
||||
dbList.numBuffers = 0;
|
||||
}
|
||||
|
||||
void DepthBuffer_RemoveBottom()
|
||||
{
|
||||
DepthBuffer *newBottom = depthBuffer.bottom->higher;
|
||||
DepthBufferList & dbList = depthBufferList();
|
||||
DepthBuffer *newBottom = dbList.bottom->higher;
|
||||
|
||||
if (depthBuffer.bottom == depthBuffer.top)
|
||||
depthBuffer.top = NULL;
|
||||
if (dbList.bottom == dbList.top)
|
||||
dbList.top = NULL;
|
||||
|
||||
if (depthBuffer.bottom->renderbuf != 0)
|
||||
glDeleteRenderbuffers(1, &depthBuffer.bottom->renderbuf);
|
||||
if (depthBuffer.bottom->depth_texture != NULL)
|
||||
textureCache().removeFrameBufferTexture(depthBuffer.bottom->depth_texture);
|
||||
free( depthBuffer.bottom );
|
||||
if (dbList.bottom->renderbuf != 0)
|
||||
glDeleteRenderbuffers(1, &dbList.bottom->renderbuf);
|
||||
if (dbList.bottom->depth_texture != NULL)
|
||||
textureCache().removeFrameBufferTexture(dbList.bottom->depth_texture);
|
||||
free( dbList.bottom );
|
||||
|
||||
depthBuffer.bottom = newBottom;
|
||||
dbList.bottom = newBottom;
|
||||
|
||||
if (depthBuffer.bottom != NULL)
|
||||
depthBuffer.bottom->lower = NULL;
|
||||
if (dbList.bottom != NULL)
|
||||
dbList.bottom->lower = NULL;
|
||||
|
||||
depthBuffer.numBuffers--;
|
||||
dbList.numBuffers--;
|
||||
}
|
||||
|
||||
void DepthBuffer_Remove( DepthBuffer *buffer )
|
||||
{
|
||||
if ((buffer == depthBuffer.bottom) &&
|
||||
(buffer == depthBuffer.top))
|
||||
DepthBufferList & dbList = depthBufferList();
|
||||
if ((buffer == dbList.bottom) &&
|
||||
(buffer == dbList.top))
|
||||
{
|
||||
depthBuffer.top = NULL;
|
||||
depthBuffer.bottom = NULL;
|
||||
dbList.top = NULL;
|
||||
dbList.bottom = NULL;
|
||||
}
|
||||
else if (buffer == depthBuffer.bottom)
|
||||
else if (buffer == dbList.bottom)
|
||||
{
|
||||
depthBuffer.bottom = buffer->higher;
|
||||
dbList.bottom = buffer->higher;
|
||||
|
||||
if (depthBuffer.bottom)
|
||||
depthBuffer.bottom->lower = NULL;
|
||||
if (dbList.bottom)
|
||||
dbList.bottom->lower = NULL;
|
||||
}
|
||||
else if (buffer == depthBuffer.top)
|
||||
else if (buffer == dbList.top)
|
||||
{
|
||||
depthBuffer.top = buffer->lower;
|
||||
dbList.top = buffer->lower;
|
||||
|
||||
if (depthBuffer.top)
|
||||
depthBuffer.top->higher = NULL;
|
||||
if (dbList.top)
|
||||
dbList.top->higher = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -78,12 +80,12 @@ void DepthBuffer_Remove( DepthBuffer *buffer )
|
|||
textureCache().removeFrameBufferTexture(buffer->depth_texture);
|
||||
free( buffer );
|
||||
|
||||
depthBuffer.numBuffers--;
|
||||
dbList.numBuffers--;
|
||||
}
|
||||
|
||||
void DepthBuffer_RemoveBuffer( u32 address )
|
||||
{
|
||||
DepthBuffer *current = depthBuffer.bottom;
|
||||
DepthBuffer *current = depthBufferList().bottom;
|
||||
|
||||
while (current != NULL)
|
||||
{
|
||||
|
@ -98,35 +100,37 @@ void DepthBuffer_RemoveBuffer( u32 address )
|
|||
|
||||
DepthBuffer *DepthBuffer_AddTop()
|
||||
{
|
||||
DepthBufferList & dbList = depthBufferList();
|
||||
DepthBuffer *newtop = (DepthBuffer*)malloc( sizeof( DepthBuffer ) );
|
||||
|
||||
newtop->lower = depthBuffer.top;
|
||||
newtop->lower = dbList.top;
|
||||
newtop->higher = NULL;
|
||||
newtop->renderbuf = 0;
|
||||
newtop->fbo = 0;
|
||||
|
||||
if (depthBuffer.top)
|
||||
depthBuffer.top->higher = newtop;
|
||||
if (dbList.top)
|
||||
dbList.top->higher = newtop;
|
||||
|
||||
if (!depthBuffer.bottom)
|
||||
depthBuffer.bottom = newtop;
|
||||
if (!dbList.bottom)
|
||||
dbList.bottom = newtop;
|
||||
|
||||
depthBuffer.top = newtop;
|
||||
dbList.top = newtop;
|
||||
|
||||
depthBuffer.numBuffers++;
|
||||
dbList.numBuffers++;
|
||||
|
||||
return newtop;
|
||||
}
|
||||
|
||||
void DepthBuffer_MoveToTop( DepthBuffer *newtop )
|
||||
{
|
||||
if (newtop == depthBuffer.top)
|
||||
DepthBufferList & dbList = depthBufferList();
|
||||
if (newtop == dbList.top)
|
||||
return;
|
||||
|
||||
if (newtop == depthBuffer.bottom)
|
||||
if (newtop == dbList.bottom)
|
||||
{
|
||||
depthBuffer.bottom = newtop->higher;
|
||||
depthBuffer.bottom->lower = NULL;
|
||||
dbList.bottom = newtop->higher;
|
||||
dbList.bottom->lower = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -135,26 +139,28 @@ void DepthBuffer_MoveToTop( DepthBuffer *newtop )
|
|||
}
|
||||
|
||||
newtop->higher = NULL;
|
||||
newtop->lower = depthBuffer.top;
|
||||
depthBuffer.top->higher = newtop;
|
||||
depthBuffer.top = newtop;
|
||||
newtop->lower = dbList.top;
|
||||
dbList.top->higher = newtop;
|
||||
dbList.top = newtop;
|
||||
}
|
||||
|
||||
void DepthBuffer_Destroy()
|
||||
{
|
||||
while (depthBuffer.bottom)
|
||||
DepthBufferList & dbList = depthBufferList();
|
||||
while (dbList.bottom)
|
||||
DepthBuffer_RemoveBottom();
|
||||
|
||||
depthBuffer.top = depthBuffer.bottom = depthBuffer.current = NULL;
|
||||
dbList.top = dbList.bottom = dbList.current = NULL;
|
||||
}
|
||||
|
||||
void DepthBuffer_SetBuffer( u32 address )
|
||||
{
|
||||
DepthBufferList & dbList = depthBufferList();
|
||||
FrameBuffer * pFrameBuffer = frameBufferList().findBuffer(address);
|
||||
if (pFrameBuffer == NULL)
|
||||
pFrameBuffer = frameBufferList().getCurrent();
|
||||
|
||||
DepthBuffer *current = depthBuffer.top;
|
||||
DepthBuffer *current = dbList.top;
|
||||
|
||||
// Search through saved depth buffers
|
||||
while (current != NULL)
|
||||
|
@ -203,12 +209,13 @@ void DepthBuffer_SetBuffer( u32 address )
|
|||
#endif
|
||||
|
||||
}
|
||||
depthBuffer.current = current;
|
||||
dbList.current = current;
|
||||
}
|
||||
|
||||
DepthBuffer *DepthBuffer_FindBuffer( u32 address )
|
||||
{
|
||||
DepthBuffer *current = depthBuffer.top;
|
||||
DepthBufferList & dbList = depthBufferList();
|
||||
DepthBuffer *current = dbList.top;
|
||||
|
||||
while (current)
|
||||
{
|
||||
|
@ -224,7 +231,7 @@ void DepthBuffer_ClearBuffer() {
|
|||
#ifndef GLES2
|
||||
if (!OGL.bImageTexture)
|
||||
return;
|
||||
DepthBuffer *current = depthBuffer.top;
|
||||
DepthBuffer *current = depthBufferList().top;
|
||||
if (current == NULL || current->fbo == 0)
|
||||
return;
|
||||
float color[4] = {1.0f, 1.0f, 0.0f, 1.0f};
|
||||
|
|
|
@ -14,13 +14,27 @@ struct DepthBuffer
|
|||
GLuint fbo;
|
||||
};
|
||||
|
||||
struct DepthBufferInfo
|
||||
struct DepthBufferList
|
||||
{
|
||||
DepthBuffer *top, *bottom, *current;
|
||||
int numBuffers;
|
||||
|
||||
static DepthBufferList & get()
|
||||
{
|
||||
static DepthBufferList depthBufferList;
|
||||
return depthBufferList;
|
||||
}
|
||||
|
||||
private:
|
||||
DepthBufferList() : current(NULL) {}
|
||||
DepthBufferList(const FrameBufferList &);
|
||||
};
|
||||
|
||||
extern DepthBufferInfo depthBuffer;
|
||||
inline
|
||||
DepthBufferList & depthBufferList()
|
||||
{
|
||||
return DepthBufferList::get();
|
||||
}
|
||||
|
||||
extern const GLuint ZlutImageUnit;
|
||||
extern const GLuint TlutImageUnit;
|
||||
|
|
|
@ -276,56 +276,58 @@ void FrameBufferList::removeBuffer(u32 _address )
|
|||
void FrameBufferList::_initDepthTexture()
|
||||
{
|
||||
#ifndef GLES2
|
||||
depthBuffer.top->depth_texture = textureCache().addFrameBufferTexture();
|
||||
DepthBufferList & dbList = depthBufferList();
|
||||
dbList.top->depth_texture = textureCache().addFrameBufferTexture();
|
||||
|
||||
depthBuffer.top->depth_texture->width = (u32)(m_pCurrent->m_width * OGL.scaleX);
|
||||
depthBuffer.top->depth_texture->height = (u32)(m_pCurrent->m_height * OGL.scaleY);
|
||||
depthBuffer.top->depth_texture->format = 0;
|
||||
depthBuffer.top->depth_texture->size = 2;
|
||||
depthBuffer.top->depth_texture->clampS = 1;
|
||||
depthBuffer.top->depth_texture->clampT = 1;
|
||||
depthBuffer.top->depth_texture->address = m_pCurrent->m_startAddress;
|
||||
depthBuffer.top->depth_texture->clampWidth = m_pCurrent->m_width;
|
||||
depthBuffer.top->depth_texture->clampHeight = m_pCurrent->m_height;
|
||||
depthBuffer.top->depth_texture->frameBufferTexture = TRUE;
|
||||
depthBuffer.top->depth_texture->maskS = 0;
|
||||
depthBuffer.top->depth_texture->maskT = 0;
|
||||
depthBuffer.top->depth_texture->mirrorS = 0;
|
||||
depthBuffer.top->depth_texture->mirrorT = 0;
|
||||
depthBuffer.top->depth_texture->realWidth = (u32)pow2( depthBuffer.top->depth_texture->width );
|
||||
depthBuffer.top->depth_texture->realHeight = (u32)pow2( depthBuffer.top->depth_texture->height );
|
||||
depthBuffer.top->depth_texture->textureBytes = depthBuffer.top->depth_texture->realWidth * depthBuffer.top->depth_texture->realHeight * 2;
|
||||
textureCache().addFrameBufferTextureSize(depthBuffer.top->depth_texture->textureBytes);
|
||||
dbList.top->depth_texture->width = (u32)(m_pCurrent->m_width * OGL.scaleX);
|
||||
dbList.top->depth_texture->height = (u32)(m_pCurrent->m_height * OGL.scaleY);
|
||||
dbList.top->depth_texture->format = 0;
|
||||
dbList.top->depth_texture->size = 2;
|
||||
dbList.top->depth_texture->clampS = 1;
|
||||
dbList.top->depth_texture->clampT = 1;
|
||||
dbList.top->depth_texture->address = m_pCurrent->m_startAddress;
|
||||
dbList.top->depth_texture->clampWidth = m_pCurrent->m_width;
|
||||
dbList.top->depth_texture->clampHeight = m_pCurrent->m_height;
|
||||
dbList.top->depth_texture->frameBufferTexture = TRUE;
|
||||
dbList.top->depth_texture->maskS = 0;
|
||||
dbList.top->depth_texture->maskT = 0;
|
||||
dbList.top->depth_texture->mirrorS = 0;
|
||||
dbList.top->depth_texture->mirrorT = 0;
|
||||
dbList.top->depth_texture->realWidth = (u32)pow2( dbList.top->depth_texture->width );
|
||||
dbList.top->depth_texture->realHeight = (u32)pow2( dbList.top->depth_texture->height );
|
||||
dbList.top->depth_texture->textureBytes = dbList.top->depth_texture->realWidth * dbList.top->depth_texture->realHeight * 2;
|
||||
textureCache().addFrameBufferTextureSize(dbList.top->depth_texture->textureBytes);
|
||||
|
||||
glBindTexture( GL_TEXTURE_2D, depthBuffer.top->depth_texture->glName );
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, depthBuffer.top->depth_texture->realWidth, depthBuffer.top->depth_texture->realHeight, 0, GL_RGBA, GL_FLOAT, NULL);
|
||||
glBindTexture( GL_TEXTURE_2D, dbList.top->depth_texture->glName );
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, dbList.top->depth_texture->realWidth, dbList.top->depth_texture->realHeight, 0, GL_RGBA, GL_FLOAT, NULL);
|
||||
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
|
||||
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
|
||||
glBindTexture( GL_TEXTURE_2D, 0);
|
||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
|
||||
glGenFramebuffers(1, &depthBuffer.top->fbo);
|
||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, depthBuffer.top->fbo);
|
||||
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, depthBuffer.top->depth_texture->glName, 0);
|
||||
glGenFramebuffers(1, &dbList.top->fbo);
|
||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, dbList.top->fbo);
|
||||
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, dbList.top->depth_texture->glName, 0);
|
||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
|
||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_pCurrent->m_FBO);
|
||||
m_pCurrent->m_pDepthBuffer = depthBuffer.top;
|
||||
m_pCurrent->m_pDepthBuffer = dbList.top;
|
||||
DepthBuffer_ClearBuffer();
|
||||
#else
|
||||
depthBuffer.top->depth_texture = NULL;
|
||||
dbList.top->depth_texture = NULL;
|
||||
#endif // GLES2
|
||||
}
|
||||
|
||||
void FrameBufferList::attachDepthBuffer()
|
||||
{
|
||||
if (m_pCurrent != NULL && m_pCurrent->m_FBO > 0 && depthBuffer.top != NULL && depthBuffer.top->renderbuf > 0) {
|
||||
if (depthBuffer.top->depth_texture == NULL)
|
||||
DepthBufferList & dbList = depthBufferList();
|
||||
if (m_pCurrent != NULL && m_pCurrent->m_FBO > 0 && dbList.top != NULL && dbList.top->renderbuf > 0) {
|
||||
if (dbList.top->depth_texture == NULL)
|
||||
_initDepthTexture();
|
||||
m_pCurrent->m_pDepthBuffer = depthBuffer.top;
|
||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuffer.top->renderbuf);
|
||||
m_pCurrent->m_pDepthBuffer = dbList.top;
|
||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, dbList.top->renderbuf);
|
||||
#ifndef GLES2
|
||||
GLuint attachments[2] = { GL_COLOR_ATTACHMENT0, GL_DEPTH_ATTACHMENT };
|
||||
glDrawBuffers(2, attachments);
|
||||
glBindImageTexture(depthImageUnit, depthBuffer.top->depth_texture->glName, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
|
||||
glBindImageTexture(depthImageUnit, dbList.top->depth_texture->glName, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
|
||||
#endif
|
||||
assert(checkFBO());
|
||||
} else if (m_pCurrent != NULL) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user