1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-02 09:03:37 +00:00

Enable Framebuffer Emulation on the Raspberry Pi

renderbuffer code was written by gonetz, not me
This commit is contained in:
Logan McNaughton 2016-06-21 12:57:18 -06:00 committed by Sergey Lipskiy
parent cb54444b41
commit 1cbbea8183
6 changed files with 50 additions and 5 deletions

View File

@ -64,6 +64,7 @@ if(EXISTS "/opt/vc/include/bcm_host.h")
set(GLES2 ON)
add_definitions(
-DVC
-DUSE_DEPTH_RENDERBUFFER
)
include_directories(
"/opt/vc/include"

View File

@ -43,11 +43,7 @@ void Config::resetToDefaults()
generalEmulation.polygonOffsetUnits = 0.0f;
#endif
#ifdef VC
frameBufferEmulation.enable = 0;
#else
frameBufferEmulation.enable = 1;
#endif
frameBufferEmulation.copyDepthToRDRAM = cdDisable;
frameBufferEmulation.copyFromRDRAM = 0;
frameBufferEmulation.copyAuxToRDRAM = 0;

View File

@ -19,6 +19,7 @@ const GLuint depthImageUnit = 2;
DepthBuffer::DepthBuffer() : m_address(0), m_width(0), m_uly(0), m_lry(0),
m_depthImageFBO(0), m_pDepthImageTexture(nullptr), m_pDepthBufferTexture(nullptr),
m_depthRenderbuffer(0), m_depthRenderbufferWidth(0),
m_cleared(false), m_pResolveDepthBufferTexture(nullptr), m_resolved(false),
m_pDepthBufferCopyTexture(nullptr), m_copied(false)
{
@ -30,12 +31,14 @@ DepthBuffer::DepthBuffer() : m_address(0), m_width(0), m_uly(0), m_lry(0),
DepthBuffer::DepthBuffer(DepthBuffer && _other) :
m_address(_other.m_address), m_width(_other.m_width), m_uly(_other.m_uly), m_lry(_other.m_lry),
m_depthImageFBO(_other.m_depthImageFBO), m_pDepthImageTexture(_other.m_pDepthImageTexture), m_pDepthBufferTexture(_other.m_pDepthBufferTexture),
m_depthRenderbuffer(_other.m_depthRenderbuffer), m_depthRenderbufferWidth(_other.m_depthRenderbufferWidth),
m_cleared(_other.m_cleared), m_pResolveDepthBufferTexture(_other.m_pResolveDepthBufferTexture), m_resolved(_other.m_resolved),
m_pDepthBufferCopyTexture(_other.m_pDepthBufferCopyTexture), m_copied(m_copied)
{
_other.m_depthImageFBO = 0;
_other.m_pDepthImageTexture = nullptr;
_other.m_pDepthBufferTexture = nullptr;
_other.m_depthRenderbuffer = 0;
_other.m_pResolveDepthBufferTexture = nullptr;
_other.m_resolved = false;
_other.m_pDepthBufferCopyTexture = nullptr;
@ -50,6 +53,8 @@ DepthBuffer::~DepthBuffer()
textureCache().removeFrameBufferTexture(m_pDepthImageTexture);
if (m_pDepthBufferTexture != nullptr)
textureCache().removeFrameBufferTexture(m_pDepthBufferTexture);
if (m_depthRenderbuffer != 0)
glDeleteRenderbuffers(1, &m_depthRenderbuffer);
if (m_pResolveDepthBufferTexture != nullptr)
textureCache().removeFrameBufferTexture(m_pResolveDepthBufferTexture);
if (m_copyFBO != 0)
@ -157,24 +162,55 @@ void DepthBuffer::_initDepthBufferTexture(FrameBuffer * _pBuffer, CachedTexture
glBindTexture(GL_TEXTURE_2D, 0);
}
void DepthBuffer::_initDepthBufferRenderbuffer(FrameBuffer * _pBuffer)
{
if (m_depthRenderbuffer != 0)
return;
u32 height;
if (_pBuffer != NULL) {
m_depthRenderbufferWidth = (u32)(_pBuffer->m_pTexture->width);
height = (u32)(_pBuffer->m_pTexture->height);
} else {
if (config.frameBufferEmulation.nativeResFactor == 0) {
m_depthRenderbufferWidth = video().getWidth();
height = video().getHeight();
} else {
m_depthRenderbufferWidth = VI.width * config.frameBufferEmulation.nativeResFactor;
height = VI.height * config.frameBufferEmulation.nativeResFactor;
}
}
glGenRenderbuffers(1, &m_depthRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, m_depthRenderbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, fboFormats.depthInternalFormat, m_depthRenderbufferWidth, height);
}
void DepthBuffer::setDepthAttachment(GLenum _target)
{
#ifndef USE_DEPTH_RENDERBUFFER
#ifdef GL_MULTISAMPLING_SUPPORT
if (config.video.multisampling != 0)
glFramebufferTexture2D(_target, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D_MULTISAMPLE, m_pDepthBufferTexture->glName, 0);
else
#endif
glFramebufferTexture2D(_target, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_pDepthBufferTexture->glName, 0);
#else
glFramebufferRenderbuffer(_target, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_depthRenderbuffer);
#endif
m_copied = false;
m_resolved = false;
}
void DepthBuffer::initDepthBufferTexture(FrameBuffer * _pBuffer)
{
#ifndef USE_DEPTH_RENDERBUFFER
if (m_pDepthBufferTexture == nullptr) {
m_pDepthBufferTexture = textureCache().addFrameBufferTexture();
_initDepthBufferTexture(_pBuffer, m_pDepthBufferTexture, config.video.multisampling != 0);
}
#else
_initDepthBufferRenderbuffer(_pBuffer);
#endif
#ifdef GL_MULTISAMPLING_SUPPORT
if (config.video.multisampling != 0 && m_pResolveDepthBufferTexture == nullptr) {

View File

@ -25,6 +25,8 @@ struct DepthBuffer
GLuint m_depthImageFBO;
CachedTexture *m_pDepthImageTexture;
CachedTexture *m_pDepthBufferTexture;
GLuint m_depthRenderbuffer;
u32 m_depthRenderbufferWidth;
bool m_cleared;
// multisampling
CachedTexture *m_pResolveDepthBufferTexture;
@ -36,6 +38,7 @@ struct DepthBuffer
private:
void _initDepthBufferTexture(FrameBuffer * _pBuffer, CachedTexture *_pTexture, bool _multisample);
void _initDepthBufferRenderbuffer(FrameBuffer * _pBuffer);
void _DepthBufferTexture(FrameBuffer * _pBuffer);
};

View File

@ -707,16 +707,24 @@ void FrameBufferList::attachDepthBuffer()
{
if (m_pCurrent == nullptr)
return;
#ifdef VC
const GLenum discards[] = {GL_DEPTH_ATTACHMENT};
glDiscardFramebufferEXT(GL_FRAMEBUFFER, 1, discards);
#endif
DepthBuffer * pDepthBuffer = depthBufferList().getCurrent();
if (m_pCurrent->m_FBO > 0 && pDepthBuffer != nullptr) {
pDepthBuffer->initDepthImageTexture(m_pCurrent);
pDepthBuffer->initDepthBufferTexture(m_pCurrent);
#ifndef USE_DEPTH_RENDERBUFFER
#ifdef GLES2
if (pDepthBuffer->m_pDepthBufferTexture->realWidth == m_pCurrent->m_pTexture->realWidth) {
#else
if (pDepthBuffer->m_pDepthBufferTexture->realWidth >= m_pCurrent->m_pTexture->realWidth) {
#endif
#endif // GLES2
#else
if (pDepthBuffer->m_depthRenderbufferWidth == m_pCurrent->m_pTexture->realWidth) {
#endif // USE_DEPTH_RENDERBUFFER
m_pCurrent->m_pDepthBuffer = pDepthBuffer;
pDepthBuffer->setDepthAttachment(GL_DRAW_FRAMEBUFFER);
if (video().getRender().isImageTexturesSupported() && config.frameBufferEmulation.N64DepthCompare != 0)

View File

@ -15,6 +15,7 @@
#include <GLideN64_libretro.h>
#elif GLES2
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#define GL_DRAW_FRAMEBUFFER GL_FRAMEBUFFER
#define GL_READ_FRAMEBUFFER GL_FRAMEBUFFER
#define NO_BLIT_BUFFER_COPY