mirror of
https://github.com/blawar/GLideN64.git
synced 2024-07-02 09:03:37 +00:00
Depth buffer refactor
This commit is contained in:
parent
fbf660d4ec
commit
3352193632
295
DepthBuffer.cpp
295
DepthBuffer.cpp
|
@ -12,195 +12,141 @@ const GLuint ZlutImageUnit = 0;
|
|||
const GLuint TlutImageUnit = 1;
|
||||
const GLuint depthImageUnit = 2;
|
||||
|
||||
void DepthBuffer_Init()
|
||||
DepthBuffer::DepthBuffer() : m_address(0), m_width(0), m_renderbuf(0), m_FBO(0), m_pDepthTexture(NULL)
|
||||
{
|
||||
DepthBufferList & dbList = depthBufferList();
|
||||
dbList.current = NULL;
|
||||
dbList.top = NULL;
|
||||
dbList.bottom = NULL;
|
||||
dbList.numBuffers = 0;
|
||||
glGenRenderbuffers(1, &m_renderbuf);
|
||||
glGenFramebuffers(1, &m_FBO);
|
||||
}
|
||||
|
||||
void DepthBuffer_RemoveBottom()
|
||||
DepthBuffer::DepthBuffer(DepthBuffer && _other) :
|
||||
m_address(_other.m_address), m_width(_other.m_width),
|
||||
m_renderbuf(_other.m_renderbuf), m_FBO(_other.m_FBO), m_pDepthTexture(_other.m_pDepthTexture)
|
||||
{
|
||||
DepthBufferList & dbList = depthBufferList();
|
||||
DepthBuffer *newBottom = dbList.bottom->higher;
|
||||
|
||||
if (dbList.bottom == dbList.top)
|
||||
dbList.top = NULL;
|
||||
|
||||
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 );
|
||||
|
||||
dbList.bottom = newBottom;
|
||||
|
||||
if (dbList.bottom != NULL)
|
||||
dbList.bottom->lower = NULL;
|
||||
|
||||
dbList.numBuffers--;
|
||||
_other.m_renderbuf = 0;
|
||||
_other.m_FBO = 0;
|
||||
_other.m_pDepthTexture = NULL;
|
||||
}
|
||||
|
||||
void DepthBuffer_Remove( DepthBuffer *buffer )
|
||||
DepthBuffer::~DepthBuffer()
|
||||
{
|
||||
DepthBufferList & dbList = depthBufferList();
|
||||
if ((buffer == dbList.bottom) &&
|
||||
(buffer == dbList.top))
|
||||
{
|
||||
dbList.top = NULL;
|
||||
dbList.bottom = NULL;
|
||||
}
|
||||
else if (buffer == dbList.bottom)
|
||||
{
|
||||
dbList.bottom = buffer->higher;
|
||||
|
||||
if (dbList.bottom)
|
||||
dbList.bottom->lower = NULL;
|
||||
}
|
||||
else if (buffer == dbList.top)
|
||||
{
|
||||
dbList.top = buffer->lower;
|
||||
|
||||
if (dbList.top)
|
||||
dbList.top->higher = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
buffer->higher->lower = buffer->lower;
|
||||
buffer->lower->higher = buffer->higher;
|
||||
}
|
||||
|
||||
if (buffer->renderbuf != 0)
|
||||
glDeleteRenderbuffers(1, &buffer->renderbuf);
|
||||
if (buffer->fbo != 0)
|
||||
glDeleteFramebuffers(1, &buffer->fbo);
|
||||
if (buffer->depth_texture != NULL)
|
||||
textureCache().removeFrameBufferTexture(buffer->depth_texture);
|
||||
free( buffer );
|
||||
|
||||
dbList.numBuffers--;
|
||||
if (m_renderbuf != 0)
|
||||
glDeleteRenderbuffers(1, &m_renderbuf);
|
||||
if (m_FBO != 0)
|
||||
glDeleteFramebuffers(1, &m_FBO);
|
||||
if (m_pDepthTexture != NULL)
|
||||
textureCache().removeFrameBufferTexture(m_pDepthTexture);
|
||||
}
|
||||
|
||||
void DepthBuffer_RemoveBuffer( u32 address )
|
||||
void DepthBuffer::initDepthTexture(FrameBuffer * _pBuffer)
|
||||
{
|
||||
DepthBuffer *current = depthBufferList().bottom;
|
||||
#ifndef GLES2
|
||||
if (m_pDepthTexture != NULL)
|
||||
textureCache().removeFrameBufferTexture(m_pDepthTexture);
|
||||
m_pDepthTexture = textureCache().addFrameBufferTexture();
|
||||
|
||||
while (current != NULL)
|
||||
{
|
||||
if (current->address == address)
|
||||
{
|
||||
DepthBuffer_Remove( current );
|
||||
m_pDepthTexture->width = (u32)(_pBuffer->m_pTexture->width);
|
||||
m_pDepthTexture->height = (u32)(_pBuffer->m_pTexture->height);
|
||||
m_pDepthTexture->format = 0;
|
||||
m_pDepthTexture->size = 2;
|
||||
m_pDepthTexture->clampS = 1;
|
||||
m_pDepthTexture->clampT = 1;
|
||||
m_pDepthTexture->address = _pBuffer->m_startAddress;
|
||||
m_pDepthTexture->clampWidth = _pBuffer->m_width;
|
||||
m_pDepthTexture->clampHeight = _pBuffer->m_height;
|
||||
m_pDepthTexture->frameBufferTexture = TRUE;
|
||||
m_pDepthTexture->maskS = 0;
|
||||
m_pDepthTexture->maskT = 0;
|
||||
m_pDepthTexture->mirrorS = 0;
|
||||
m_pDepthTexture->mirrorT = 0;
|
||||
m_pDepthTexture->realWidth = (u32)pow2( m_pDepthTexture->width );
|
||||
m_pDepthTexture->realHeight = (u32)pow2( m_pDepthTexture->height );
|
||||
m_pDepthTexture->textureBytes = m_pDepthTexture->realWidth * m_pDepthTexture->realHeight * 4 * 4; // Width*Height*RGBA*sizeof(GL_RGBA32F)
|
||||
textureCache().addFrameBufferTextureSize(m_pDepthTexture->textureBytes);
|
||||
|
||||
glBindTexture( GL_TEXTURE_2D, m_pDepthTexture->glName );
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, m_pDepthTexture->realWidth, m_pDepthTexture->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);
|
||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_FBO);
|
||||
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_pDepthTexture->glName, 0);
|
||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
|
||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _pBuffer->m_FBO);
|
||||
_pBuffer->m_pDepthBuffer = this;
|
||||
depthBufferList().clearBuffer();
|
||||
#else
|
||||
depth_texture = NULL;
|
||||
#endif // GLES2
|
||||
}
|
||||
|
||||
void DepthBufferList::init()
|
||||
{
|
||||
m_pCurrent = NULL;
|
||||
}
|
||||
|
||||
void DepthBufferList::destroy()
|
||||
{
|
||||
m_pCurrent = NULL;
|
||||
m_list.clear();
|
||||
}
|
||||
|
||||
DepthBuffer * DepthBufferList::findBuffer(u32 _address)
|
||||
{
|
||||
for (DepthBuffers::iterator iter = m_list.begin(); iter != m_list.end(); ++iter)
|
||||
if (iter->m_address == _address)
|
||||
return &(*iter);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void DepthBufferList::removeBuffer(u32 _address )
|
||||
{
|
||||
for (DepthBuffers::iterator iter = m_list.begin(); iter != m_list.end(); ++iter)
|
||||
if (iter->m_address == _address) {
|
||||
m_list.erase(iter);
|
||||
return;
|
||||
}
|
||||
current = current->higher;
|
||||
}
|
||||
}
|
||||
|
||||
DepthBuffer *DepthBuffer_AddTop()
|
||||
void DepthBufferList::saveBuffer(u32 _address)
|
||||
{
|
||||
DepthBufferList & dbList = depthBufferList();
|
||||
DepthBuffer *newtop = (DepthBuffer*)malloc( sizeof( DepthBuffer ) );
|
||||
|
||||
newtop->lower = dbList.top;
|
||||
newtop->higher = NULL;
|
||||
newtop->renderbuf = 0;
|
||||
newtop->fbo = 0;
|
||||
|
||||
if (dbList.top)
|
||||
dbList.top->higher = newtop;
|
||||
|
||||
if (!dbList.bottom)
|
||||
dbList.bottom = newtop;
|
||||
|
||||
dbList.top = newtop;
|
||||
|
||||
dbList.numBuffers++;
|
||||
|
||||
return newtop;
|
||||
}
|
||||
|
||||
void DepthBuffer_MoveToTop( DepthBuffer *newtop )
|
||||
{
|
||||
DepthBufferList & dbList = depthBufferList();
|
||||
if (newtop == dbList.top)
|
||||
if (!config.frameBufferEmulation.enable)
|
||||
return;
|
||||
|
||||
if (newtop == dbList.bottom)
|
||||
{
|
||||
dbList.bottom = newtop->higher;
|
||||
dbList.bottom->lower = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
newtop->higher->lower = newtop->lower;
|
||||
newtop->lower->higher = newtop->higher;
|
||||
}
|
||||
|
||||
newtop->higher = NULL;
|
||||
newtop->lower = dbList.top;
|
||||
dbList.top->higher = newtop;
|
||||
dbList.top = newtop;
|
||||
}
|
||||
|
||||
void DepthBuffer_Destroy()
|
||||
{
|
||||
DepthBufferList & dbList = depthBufferList();
|
||||
while (dbList.bottom)
|
||||
DepthBuffer_RemoveBottom();
|
||||
|
||||
dbList.top = dbList.bottom = dbList.current = NULL;
|
||||
}
|
||||
|
||||
void DepthBuffer_SetBuffer( u32 address )
|
||||
{
|
||||
DepthBufferList & dbList = depthBufferList();
|
||||
FrameBuffer * pFrameBuffer = frameBufferList().findBuffer(address);
|
||||
FrameBuffer * pFrameBuffer = frameBufferList().findBuffer(_address);
|
||||
if (pFrameBuffer == NULL)
|
||||
pFrameBuffer = frameBufferList().getCurrent();
|
||||
|
||||
DepthBuffer *current = dbList.top;
|
||||
if (m_pCurrent == NULL || m_pCurrent->m_address != _address)
|
||||
m_pCurrent = findBuffer(_address);
|
||||
|
||||
// Search through saved depth buffers
|
||||
while (current != NULL)
|
||||
{
|
||||
if (current->address == address)
|
||||
{
|
||||
if (pFrameBuffer != NULL && current->width != pFrameBuffer->m_width) {
|
||||
DepthBuffer_Remove( current );
|
||||
current = NULL;
|
||||
break;
|
||||
}
|
||||
DepthBuffer_MoveToTop( current );
|
||||
break;
|
||||
}
|
||||
current = current->lower;
|
||||
if (m_pCurrent != NULL && pFrameBuffer != NULL && m_pCurrent->m_width != pFrameBuffer->m_width) {
|
||||
removeBuffer(_address);
|
||||
m_pCurrent = NULL;
|
||||
}
|
||||
|
||||
if (current == NULL) {
|
||||
current = DepthBuffer_AddTop();
|
||||
if (m_pCurrent == NULL) {
|
||||
m_list.emplace_front();
|
||||
DepthBuffer & buffer = m_list.front();
|
||||
|
||||
current->address = address;
|
||||
current->width = pFrameBuffer != NULL ? pFrameBuffer->m_width : VI.width;
|
||||
current->depth_texture = NULL;
|
||||
if (config.frameBufferEmulation.enable) {
|
||||
glGenRenderbuffers(1, ¤t->renderbuf);
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, current->renderbuf);
|
||||
buffer.m_address = _address;
|
||||
buffer.m_width = pFrameBuffer != NULL ? pFrameBuffer->m_width : VI.width;
|
||||
buffer.m_pDepthTexture = NULL;
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, buffer.m_renderbuf);
|
||||
#ifndef GLES2
|
||||
const GLenum format = GL_DEPTH_COMPONENT;
|
||||
#else
|
||||
const GLenum format = GL_DEPTH_COMPONENT24_OES;
|
||||
#endif
|
||||
if (pFrameBuffer != NULL)
|
||||
glRenderbufferStorage(GL_RENDERBUFFER, format, pFrameBuffer->m_pTexture->realWidth, pFrameBuffer->m_pTexture->realHeight);
|
||||
else
|
||||
glRenderbufferStorage(GL_RENDERBUFFER, format, (u32)pow2(OGL.width), (u32)pow2(OGL.height));
|
||||
}
|
||||
if (pFrameBuffer != NULL)
|
||||
glRenderbufferStorage(GL_RENDERBUFFER, format, pFrameBuffer->m_pTexture->realWidth, pFrameBuffer->m_pTexture->realHeight);
|
||||
else
|
||||
glRenderbufferStorage(GL_RENDERBUFFER, format, (u32)pow2(OGL.width), (u32)pow2(OGL.height));
|
||||
|
||||
m_pCurrent = &buffer;
|
||||
}
|
||||
|
||||
if (config.frameBufferEmulation.enable) {
|
||||
frameBufferList().attachDepthBuffer();
|
||||
frameBufferList().attachDepthBuffer();
|
||||
|
||||
#ifdef DEBUG
|
||||
DebugMsg( DEBUG_HIGH | DEBUG_HANDLED, "DepthBuffer_SetBuffer( 0x%08X ); color buffer is 0x%08X\n",
|
||||
|
@ -208,37 +154,30 @@ void DepthBuffer_SetBuffer( u32 address )
|
|||
);
|
||||
#endif
|
||||
|
||||
}
|
||||
dbList.current = current;
|
||||
}
|
||||
|
||||
DepthBuffer *DepthBuffer_FindBuffer( u32 address )
|
||||
void DepthBufferList::clearBuffer()
|
||||
{
|
||||
DepthBufferList & dbList = depthBufferList();
|
||||
DepthBuffer *current = dbList.top;
|
||||
|
||||
while (current)
|
||||
{
|
||||
if (current->address == address)
|
||||
return current;
|
||||
current = current->lower;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void DepthBuffer_ClearBuffer() {
|
||||
#ifndef GLES2
|
||||
if (!OGL.bImageTexture)
|
||||
return;
|
||||
DepthBuffer *current = depthBufferList().top;
|
||||
if (current == NULL || current->fbo == 0)
|
||||
if (m_pCurrent == NULL || m_pCurrent->m_FBO == 0)
|
||||
return;
|
||||
float color[4] = {1.0f, 1.0f, 0.0f, 1.0f};
|
||||
glBindImageTexture(depthImageUnit, 0, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
|
||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, current->fbo);
|
||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_pCurrent->m_FBO);
|
||||
OGL_DrawRect(0,0,VI.width, VI.height, color);
|
||||
glBindImageTexture(depthImageUnit, current->depth_texture->glName, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
|
||||
glBindImageTexture(depthImageUnit, m_pCurrent->m_pDepthTexture->glName, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
|
||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, frameBufferList().getCurrent()->m_FBO);
|
||||
#endif // GLES2
|
||||
}
|
||||
|
||||
void DepthBuffer_Init()
|
||||
{
|
||||
depthBufferList().init();
|
||||
}
|
||||
|
||||
void DepthBuffer_Destroy()
|
||||
{
|
||||
depthBufferList().destroy();
|
||||
}
|
||||
|
|
|
@ -6,18 +6,27 @@
|
|||
|
||||
struct DepthBuffer
|
||||
{
|
||||
DepthBuffer *higher, *lower;
|
||||
DepthBuffer();
|
||||
DepthBuffer(DepthBuffer && _other);
|
||||
~DepthBuffer();
|
||||
void initDepthTexture(FrameBuffer * _pBuffer);
|
||||
|
||||
u32 address, width;
|
||||
GLuint renderbuf;
|
||||
CachedTexture *depth_texture;
|
||||
GLuint fbo;
|
||||
u32 m_address, m_width;
|
||||
GLuint m_renderbuf;
|
||||
GLuint m_FBO;
|
||||
CachedTexture *m_pDepthTexture;
|
||||
};
|
||||
|
||||
struct DepthBufferList
|
||||
class DepthBufferList
|
||||
{
|
||||
DepthBuffer *top, *bottom, *current;
|
||||
int numBuffers;
|
||||
public:
|
||||
void init();
|
||||
void destroy();
|
||||
void saveBuffer(u32 _address);
|
||||
void removeBuffer(u32 _address);
|
||||
void clearBuffer();
|
||||
DepthBuffer *findBuffer(u32 _address);
|
||||
DepthBuffer * getCurrent() const {return m_pCurrent;}
|
||||
|
||||
static DepthBufferList & get()
|
||||
{
|
||||
|
@ -26,8 +35,12 @@ struct DepthBufferList
|
|||
}
|
||||
|
||||
private:
|
||||
DepthBufferList() : current(NULL) {}
|
||||
DepthBufferList() : m_pCurrent(NULL) {}
|
||||
DepthBufferList(const FrameBufferList &);
|
||||
|
||||
typedef std::list<DepthBuffer> DepthBuffers;
|
||||
DepthBuffers m_list;
|
||||
DepthBuffer *m_pCurrent;
|
||||
};
|
||||
|
||||
inline
|
||||
|
@ -42,9 +55,4 @@ extern const GLuint depthImageUnit;
|
|||
|
||||
void DepthBuffer_Init();
|
||||
void DepthBuffer_Destroy();
|
||||
void DepthBuffer_SetBuffer( u32 address );
|
||||
void DepthBuffer_RemoveBuffer( u32 address );
|
||||
void DepthBuffer_ClearBuffer();
|
||||
DepthBuffer *DepthBuffer_FindBuffer( u32 address );
|
||||
|
||||
#endif
|
||||
|
|
|
@ -273,61 +273,18 @@ void FrameBufferList::removeBuffer(u32 _address )
|
|||
}
|
||||
}
|
||||
|
||||
void FrameBufferList::_initDepthTexture()
|
||||
{
|
||||
#ifndef GLES2
|
||||
DepthBufferList & dbList = depthBufferList();
|
||||
dbList.top->depth_texture = textureCache().addFrameBufferTexture();
|
||||
|
||||
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, 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, &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 = dbList.top;
|
||||
DepthBuffer_ClearBuffer();
|
||||
#else
|
||||
dbList.top->depth_texture = NULL;
|
||||
#endif // GLES2
|
||||
}
|
||||
|
||||
void FrameBufferList::attachDepthBuffer()
|
||||
{
|
||||
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 = dbList.top;
|
||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, dbList.top->renderbuf);
|
||||
DepthBuffer * pDepthBuffer = depthBufferList().getCurrent();
|
||||
if (m_pCurrent != NULL && m_pCurrent->m_FBO > 0 && pDepthBuffer != NULL && pDepthBuffer->m_renderbuf > 0) {
|
||||
if (pDepthBuffer->m_pDepthTexture == NULL || pDepthBuffer->m_pDepthTexture->width != m_pCurrent->m_pTexture->width)
|
||||
pDepthBuffer->initDepthTexture(m_pCurrent);
|
||||
m_pCurrent->m_pDepthBuffer = pDepthBuffer;
|
||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, pDepthBuffer->m_renderbuf);
|
||||
#ifndef GLES2
|
||||
GLuint attachments[2] = { GL_COLOR_ATTACHMENT0, GL_DEPTH_ATTACHMENT };
|
||||
glDrawBuffers(2, attachments);
|
||||
glBindImageTexture(depthImageUnit, dbList.top->depth_texture->glName, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
|
||||
glBindImageTexture(depthImageUnit, pDepthBuffer->m_pDepthTexture->glName, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
|
||||
#endif
|
||||
assert(checkFBO());
|
||||
} else if (m_pCurrent != NULL) {
|
||||
|
@ -709,8 +666,8 @@ void DepthBufferToRDRAM::CopyToRDRAM( u32 address) {
|
|||
return;
|
||||
|
||||
DepthBuffer * pDepthBuffer = pBuffer->m_pDepthBuffer;
|
||||
address = pDepthBuffer->address;
|
||||
glBindFramebuffer(GL_READ_FRAMEBUFFER, pDepthBuffer->fbo);
|
||||
address = pDepthBuffer->m_address;
|
||||
glBindFramebuffer(GL_READ_FRAMEBUFFER, pDepthBuffer->m_FBO);
|
||||
glReadBuffer(GL_COLOR_ATTACHMENT0);
|
||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_FBO);
|
||||
GLuint attachment = GL_COLOR_ATTACHMENT0;
|
||||
|
|
|
@ -49,8 +49,6 @@ private:
|
|||
FrameBufferList() : m_pCurrent(NULL), m_drawBuffer(GL_BACK) {}
|
||||
FrameBufferList(const FrameBufferList &);
|
||||
|
||||
void _initDepthTexture();
|
||||
|
||||
typedef std::list<FrameBuffer> FrameBuffers;
|
||||
FrameBuffers m_list;
|
||||
FrameBuffer * m_pCurrent;
|
||||
|
|
|
@ -748,7 +748,7 @@ void GLSL_RenderDepth() {
|
|||
glPushAttrib( GL_ENABLE_BIT | GL_VIEWPORT_BIT );
|
||||
|
||||
glActiveTexture( GL_TEXTURE0 );
|
||||
glBindTexture(GL_TEXTURE_2D, pBuffer->m_pDepthBuffer->depth_texture->glName);
|
||||
glBindTexture(GL_TEXTURE_2D, pBuffer->m_pDepthBuffer->m_pDepthTexture->glName);
|
||||
// glBindTexture(GL_TEXTURE_2D, g_zlut_tex);
|
||||
|
||||
CombinerInfo::get().setCombine( EncodeCombineMode( 0, 0, 0, TEXEL0, 0, 0, 0, 1, 0, 0, 0, TEXEL0, 0, 0, 0, 1 ) );
|
||||
|
@ -795,7 +795,7 @@ void GLSL_RenderDepth() {
|
|||
OGL_SwapBuffers();
|
||||
#endif
|
||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, pBuffer->m_FBO);
|
||||
glBindImageTexture(depthImageUnit, pBuffer->m_pDepthBuffer->depth_texture->glName, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
|
||||
glBindImageTexture(depthImageUnit, pBuffer->m_pDepthBuffer->m_pDepthTexture->glName, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
|
||||
|
||||
|
||||
glLoadIdentity();
|
||||
|
|
|
@ -1213,7 +1213,7 @@ void OGL_ClearDepthBuffer()
|
|||
if (config.frameBufferEmulation.enable && frameBufferList().getCurrent() == NULL)
|
||||
return;
|
||||
|
||||
DepthBuffer_ClearBuffer();
|
||||
depthBufferList().clearBuffer();
|
||||
|
||||
OGL_UpdateStates();
|
||||
glDisable( GL_SCISSOR_TEST );
|
||||
|
|
4
gDP.cpp
4
gDP.cpp
|
@ -325,7 +325,7 @@ void gDPSetTextureImage( u32 format, u32 size, u32 width, u32 address )
|
|||
void gDPSetDepthImage( u32 address )
|
||||
{
|
||||
address = RSP_SegmentToPhysical( address );
|
||||
DepthBuffer_SetBuffer( address );
|
||||
depthBufferList().saveBuffer(address);
|
||||
gDP.depthImageAddress = address;
|
||||
|
||||
#ifdef DEBUG
|
||||
|
@ -790,7 +790,7 @@ void gDPFillRectangle( s32 ulx, s32 uly, s32 lrx, s32 lry )
|
|||
return;
|
||||
}
|
||||
} else if (gDP.fillColor.color == DEPTH_CLEAR_COLOR) {
|
||||
DepthBuffer_SetBuffer( gDP.colorImage.address );
|
||||
depthBufferList().saveBuffer(gDP.colorImage.address);
|
||||
gDPFillRDRAM(gDP.colorImage.address, ulx, uly, lrx, lry, gDP.colorImage.width, gDP.colorImage.size, gDP.fillColor.color);
|
||||
OGL_ClearDepthBuffer();
|
||||
return;
|
||||
|
|
14
gSP.cpp
14
gSP.cpp
|
@ -1682,13 +1682,13 @@ void _copyDepthBuffer()
|
|||
// OpenGL has different format for color and depth buffers, so this trick can't be performed directly
|
||||
// To do that, depth buffer with address of current color buffer created and attached to the current FBO
|
||||
// It will be copy depth buffer
|
||||
DepthBuffer_SetBuffer(gDP.colorImage.address);
|
||||
depthBufferList().saveBuffer(gDP.colorImage.address);
|
||||
// Take any frame buffer and attach source depth buffer to it, to blit it into copy depth buffer
|
||||
FrameBuffer * pTmpBuffer = frameBufferList().findTmpBuffer(frameBufferList().getCurrent()->m_startAddress);
|
||||
DepthBuffer * pTmpBufferDepth = pTmpBuffer->m_pDepthBuffer;
|
||||
pTmpBuffer->m_pDepthBuffer = DepthBuffer_FindBuffer(gSP.bgImage.address);
|
||||
pTmpBuffer->m_pDepthBuffer = depthBufferList().findBuffer(gSP.bgImage.address);
|
||||
glBindFramebuffer(GL_READ_FRAMEBUFFER, pTmpBuffer->m_FBO);
|
||||
glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, pTmpBuffer->m_pDepthBuffer->renderbuf);
|
||||
glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, pTmpBuffer->m_pDepthBuffer->m_renderbuf);
|
||||
GLuint attachments[2] = { GL_COLOR_ATTACHMENT0, GL_DEPTH_ATTACHMENT };
|
||||
glDrawBuffers(2, attachments);
|
||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, frameBufferList().getCurrent()->m_FBO);
|
||||
|
@ -1698,10 +1698,10 @@ void _copyDepthBuffer()
|
|||
GL_DEPTH_BUFFER_BIT, GL_NEAREST
|
||||
);
|
||||
// Restore objects
|
||||
glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, pTmpBufferDepth->renderbuf);
|
||||
glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, pTmpBufferDepth->m_renderbuf);
|
||||
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
|
||||
// Set back current depth buffer
|
||||
DepthBuffer_SetBuffer(gDP.depthImageAddress);
|
||||
depthBufferList().saveBuffer(gDP.depthImageAddress);
|
||||
}
|
||||
#endif // GLES2
|
||||
|
||||
|
@ -1745,7 +1745,7 @@ void gSPBgRect1Cyc( u32 bg )
|
|||
loadBGImage(objScaleBg, true);
|
||||
|
||||
#ifndef GLES2
|
||||
if (gSP.bgImage.address == gDP.depthImageAddress || DepthBuffer_FindBuffer(gSP.bgImage.address) != NULL) {
|
||||
if (gSP.bgImage.address == gDP.depthImageAddress || depthBufferList().findBuffer(gSP.bgImage.address) != NULL) {
|
||||
_copyDepthBuffer();
|
||||
return;
|
||||
}
|
||||
|
@ -1830,7 +1830,7 @@ void gSPBgRectCopy( u32 bg )
|
|||
loadBGImage(objBg, false);
|
||||
|
||||
#ifndef GLES2
|
||||
if (gSP.bgImage.address == gDP.depthImageAddress || DepthBuffer_FindBuffer(gSP.bgImage.address) != NULL) {
|
||||
if (gSP.bgImage.address == gDP.depthImageAddress || depthBufferList().findBuffer(gSP.bgImage.address) != NULL) {
|
||||
_copyDepthBuffer();
|
||||
return;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user